10-PWM脉冲宽度调制

利用PWM脉宽信号实现按键S7对L1指示灯亮度变化的控制
具体要求:
1、PWM脉宽的信号的频率为100Hz
2、系统上电后L1指示灯处在熄灭状态
3、L1指示灯有4种亮度模式,分别是完全熄灭、10%的亮度、50%的亮度和90%的亮度
4、按下按键S7按键,循环切换L1指示灯的4种亮度模式。

定时器实现脉宽信号的输出,
按键实现4种状态的循环。
而每次状态的改变需要调整的是工作状态和PWM的占空比。
因为频率是确定的,所以PWM的周期就是一定的。需要改变的是占空比。比如说把脉冲设成100个单位,如果低电平点亮,那么10%亮度就是指90个高电平,10个低电平,也就是10%的占空比。

#include "reg52.h"

sbit L1 = P0^0;
sbit S7 = P3^0;

void SelectHC573()
{
 P2 = ( P2 & 0x1f) | 0x80;
}

//==================定时器相关函数============
unsigned char count = 0; //用来记中断产生多少次
unsigned char pwm_duty = 0;//记占空比的变量

void InitTimer0()
{
  TMOD = 0x01;  //定时器0的16位计数器
  TH0 = (65535-100)/256;			//100Hz是10ms,也就是10000us=100us*100
  TL0 =  (65535-100)%256;

  ET0=1;
  EA=1;
  //TR0=1;  //一般这个时候就把脉冲打开了,但这个程序中可以先不打开。

}

void ServiceTimer0() interrupt 1
{
  TH0 = (65535-100)/256;			//初值重装
  TL0 =  (65535-100)%256;

  count++;
  if(count <= pwm_duty)
  {
     L1 = 0;
  }
  
  else if(count <= 100)
  {
    L1 = 1;
  }
  else if(count==100)
  {
   L1 = 0;
   count = 0;
  }
}
//=============================================

//==================按键相关函数==============
void Delay(unsigned char t)
{
 while(t--);
}

unsigned char stat=0;

void ScanKeys()
{
   if(S7==0)
   {
      Delay(100);
	  if(S7==0)
	  {
	      switch (stat)
		  {
		    case 0: L1=0;TR0=1;pwm_duty=10;stat=1;break;
            case 1: pwm_duty = 50; stat = 2;break;
			case 2: pwm_duty = 90; stat = 3;break;
			case 3: L1=1;TR0=0;stat = 0; break;
		  }

		  while(S7==0);
	  }
   }
}
//==================================================
 void main()
 {
	 SelectHC573();
	 InitTimer0();
	 while(1)
	 {
		ScanKeys();
	 }
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值