蓝桥杯之PWM信号调制

模块: PWM信号调制 独立按键 流水灯

 功能:利用PWM信号调制来控制LED灯的亮度,利用独立按键s7 实现状态的转换 

1. 熄灭

2.10%亮度

3. 50%亮度

4. 90%亮度

 

#include 
#define uchar unsigned char
sbit led = P0^0;
sbit s7 = P3^0;

void HC138init (uchar n)
{
   switch (n)
   {
   	 case 4:
	   P2 = (P2&0x1f)|0x80;
	 break;	
     case 5:
	   P2 = (P2&0x1f)|0xa0;
	 break;
   }
}
//=======初始化函数 关闭相关外设 ==============
void CL_init ()
{
   HC138init (5);
   P0 = 0x00;
}
//==============================================



//========== 定时器相关函数===============
uchar count;
uchar pwm_duty = 0;
void timer0init () // 定时器初始化函数
{
   TMOD = 0x01;// 定时器0 16位不可自动重载模式
   TH0 = (65535 - 100) / 256;
   TL0 = (65535 - 100) % 256;  // PWM 信号频率为 100 Hz 把信号分成100份 每份 100us
   
   ET0 = 1;
   EA = 1;
     
}
void init () interrupt 1  // 定时器服务函数
{
   TH0 = (65535 - 100) / 256;
   TL0 = (65535 - 100) % 256; 
   
   count++;
   if(count == pwm_duty)  // 如果到达设置的份数后把灯熄灭 也就是从低电平变成高电平
   {
   	  led = 1;	// 灭灯
   }
   else if (count == 100) // 当count = 100 也就是已经到达一个周期 此时又要从高电平变成低电平
   {
   	 count = 0;
	 led = 0;
   }	 
}
//========================================


// =========按键相关的函数=================
void delay (uchar time) // 延时函数
{
   while(time--);
}
uchar stat = 0;	 // 用 stat 代表 4个 状态 0 代表 熄灭 1代表 10%亮度	   2代表 50%亮度  3代表 90%亮度
void keyscan ()	 // 按键扫描
{
  if(s7 == 0)
  {
  	 delay (100);
	 if(s7 == 0)
	 {
	    switch (stat)
		{
		   case 0:
		     led = 0;
			 TR0 = 1;
			 pwm_duty = 10;
			 stat = 1;
		   break;
		   
		   case 1:
			 pwm_duty = 50;
			  TR0 = 1;
			 stat = 2;
		   break;
		  
		   case 2:
			 pwm_duty = 90;
			  TR0 = 1;
			 stat = 3;
		   break;
		   
		   case 3:
		    led = 1;
		    TR0 = 0;
			stat = 0;
		   break;
		}
		while (s7 == 0);
	 }
  }
}
//==========================================
void main ()
{
    timer0init();
	CL_init();
	HC138init(4);
	P0 = 0xff;  
	while(1)
	{
	   keyscan ();
	}
}

 

你可能感兴趣的:(蓝桥杯之PWM信号调制)