模块训练:
一、PWM基本原理
1.占空比
2.脉宽周期与占空比
当PWM脉宽信号的频率确定时,脉宽周期也确定了,此时改变占空比即可。当利用PWM脉宽周期改变LED灯的亮度时,灯是低电平亮,所以将低电平占空比改成10%即可实现灯的亮度是10%
通过将脉宽周期分为多份再改变高低电平从而改变占空比实现PWM调光。
3.按键控制
通过状态控制按键,当按键按下时改变状态,再按下即再改变状态时即可实现按键循环切换LED灯亮度模式
二、程序代码
1.程序代码
#include <regx52.h>
sbit L1=P0^0;
sbit S7=P3^0;
unsigned pwm_duty;
//========定时器相关函数=============
unsigned char count=0;
unsigned char stat=0;
void InitTimer0()
{
TMOD=0X01;
TH0=(65535-100)/256;
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)
{
count=0;
}
}
//===================================
void SelectHC573()
{
P2=(P2&0X1F)|0X80;
}
//===========按键相关函数===============
void Delay(unsigned char t)
{
while(t--);
}
void ScanKey()
{
if(S7==0)
{
Delay(500);
if(S7==0)
{
switch(stat)
{
case 0:
pwm_duty=10;
TR0=1;
stat=1;
break;
case 1:
pwm_duty=50;
stat=2;
break;
case 2:
pwm_duty=90;
stat=3;
break;
case 3:
pwm_duty=0;
stat=0;
TR0=0;
break;
}
while(S7==0);
}
}
}
//=======================================
void main()
{
SelectHC573();
InitTimer0();
while(1)
{
ScanKey();
}
}