模块训练:
一、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();}
}