利用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();
}
}