一、要求
在CT107D单片机综合训练平台上,利用PWM脉宽信号实现独立按键S7对L1指示灯亮度变化控制。
(1)PWM脉宽信号的频率为100Hz。
(2)系统上电后L1处于熄灭状态。
(3)L1有4种亮度模式,分别是完全熄灭、10%的亮度、50%的亮度和90%的亮度。
(4)按下S7按键,循环切换L1指示灯的四种亮度模式。
二、分析
PWM脉冲信号频率为100Hz,则它的周期为10ms = 10000us = 100 * 100us即100等份的100us。由此将定时时间设置为100us,占空比则可以设置为其对应的等份。
三、程序
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
sbit L1 = P0^0;
sbit s7 = P3^0;
void delay_ms(uchar xms) //@11.0592MHz
{
uchar i,j;
while(xms)
{
_nop_();
_nop_();
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
xms--;
}
}
void channel_select(uchar n) //通道选择
{
switch(n)
{
case 4 :
P2 = (P2 & 0x1f) | 0x80;
break;
case 5 :
P2 = (P2 & 0x1f) | 0xa0;
break;
case 6 :
P2 = (P2 & 0x1f) | 0xc0;
break;
case 7 :
P2 = (P2 & 0x1f) | 0xe0;
break;
}
}
//------------------PWM调制----------------------
uchar count = 0;
uchar pwm;
void timer0_init()
{
TMOD = 0x01;
TH0 = (65536 - 100)/256; //100us
TL0 = (65536 - 100)%256;
EA = 1;
ET0 = 1;
}
void service_timer0() interrupt 1
{
TH0 = (65536 - 100)/256;
TL0 = (65536 - 100)%256;
count++;
if(count <= pwm)
{
L1 = 0;
}
else if(count < 100)
{
L1 = 1;
}
else if(count == 100)
{
L1 = 0;
count = 0;
}
}
//-----------------------------------------------
//------------------按键-------------------------
uchar flag = 0;
void key_scanf()
{
if(s7 == 0)
{
delay_ms(50);
if(s7 == 0)
{
switch(flag)
{
case 0 : //flag = 0表示LED处于熄灭状态
L1 = 0;
TR0 = 1; //开启定时器
pwm = 10; //设置led为10%的亮度
flag = 1; //flag = 1表示led处于10%亮度状态
break;
case 1 :
pwm = 50;
flag = 2;
break;
case 2:
pwm = 90;
flag = 3;
break;
case 3 :
L1 = 1; //灭灯
TR0 = 0; //关闭pwm
flag = 0;
break;
}
while(s7 == 0);
}
}
}
//-----------------------------------------------
void system_init()
{
channel_select(5);
P0 = 0x00;
channel_select(4);
P0 = 0xff;
}
void main()
{
system_init();
timer0_init();
channel_select(4);
L1 = 1;
while(1)
{
key_scanf();
}
}