蓝桥杯单片机----PWM的基本控制
原创
©著作权归作者所有:来自51CTO博客作者wx6411ad6c4812c的原创作品,请联系作者获取转载授权,否则将追究法律责任
在CT107D单片机综合训练平台上,利用PWM脉宽信号实现独立按键S7对L1指示灯亮度变化的控制。
设计要求
1.PWM脉宽信号的频率为200Hz。
2.系统上电后L1指示灯处在熄灭状态。
3.L1指示灯有4种亮度模式,分别是完全熄灭、10%的亮度、50%的亮度和90%的亮度。
4.按下S7按键,循环切换L1指示灯的四种亮度模式。
PWM即脉冲宽度调制。脉冲宽度调制是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。
脉冲宽度调制是一种模拟控制方式,其根据相应载荷的变化来调制晶体管基极或MOS管栅极的偏置,来实现晶体管或MOS管导通时间的改变,从而实现开关稳压电源输出的改变。这种方式能使电源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字信号对模拟电路进行控制的一种非常有效的技术。
PWM控制技术以其控制简单,灵活和动态响应好的优点而成为电力电子技术最广泛应用的控制方式,也是人们研究的热点。由于当今科学技术的发展已经没有了学科之间的界限,结合现代控制理论思想或实现无谐振波开关技术将会成为PWM控制技术发展的主要方向之一。
上面是官方解释,PWM也可以称作占空比,即高电平占整个周期的多少,如果要实现上面的设计,例如10%的亮度,我们只需要让高电平占整个周期的十分之一就好了,假如一个周期为200us,那我们让高电平占20us,低电平占180us,即L1亮20us,灭180us。
#include<stc15f2k60s2.h>
#define uchar unsigned char //定义无符号字符类型uchar
#define uint unsigned int //定义无符号整型类型uint
void delayms(int ms); //延时函数
void allinit(); //初始化函数
void keyscan(); //独立按键函数
void Timer0Init(void); //1微秒@12.000MHz
uchar bz=0;
uint pwm,tt=0;
void main()//主函数
{
allinit(); //初始化函数
Timer0Init();
while(1)
{
keyscan(); //独立按键函数
}
}
void Timer0Init(void) //1微秒@12.000MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xF4; //设置定时初值
TH0 = 0xFF; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
EA = 1;ET0 = 1;
}
void time0() interrupt 1
{
tt++;
if(tt==pwm) //判断tt是否到了PWM设定值。0us-pwm值之间这一段为L1熄灭状态,到达pwm数值且在200us之间这一段为L1点亮
{
P2=0X80;P0=0XFE; //L1点亮
}
else if(tt==200) //判断tt是否完成了一个200us周期计数
{
tt=0; //tt清零
P2=0X80;P0=0XFF; //L1熄灭
}
}
void keyscan()//独立按键函数
{
if(P30==0) //判断P30是否等于0
{
delayms(5); //延时5ms
if(P30==0) //再次判断P30是否等于0
{
if(bz==0){bz=1;pwm=180;} //10%
else if(bz==1){bz=2;pwm=100;} //50%
else if(bz==2){bz=3;pwm=1;} //100%
else if(bz==3){bz=0;pwm=0;} //关灯
}
while(!P30); //如果按键不松开,则一直循环
}
}
void delayms(int ms)//延时函数
{
uint i,j;
for(i=ms;i>0;i--)
for(j=845;j>0;j--);
}
void allinit()//初始化函数
{
P2=0XA0;P0=0X00; //关闭蜂鸣器继电器
P2=0X80;P0=0XFF; //关闭所有LED灯
P2=0XC0;P0=0XFF; //选中所有数码管段选
P2=0XFF;P0=0XFF; //关闭所有数码管
}