模块: PWM信号调制 独立按键 流水灯
功能:利用PWM信号调制来控制LED灯的亮度,利用独立按键s7 实现状态的转换
1. 熄灭
2.10%亮度
3. 50%亮度
4. 90%亮度
#include <STC15F2K60S2.H>
#define uchar unsigned char
sbit led = P0^0;
sbit s7 = P3^0;
void HC138init (uchar n)
{
switch (n)
{
case 4:
P2 = (P2&0x1f)|0x80;
break;
case 5:
P2 = (P2&0x1f)|0xa0;
break;
}
}
//=======初始化函数 关闭相关外设 ==============
void CL_init ()
{
HC138init (5);
P0 = 0x00;
}
//==============================================
//========== 定时器相关函数===============
uchar count;
uchar pwm_duty = 0;
void timer0init () // 定时器初始化函数
{
TMOD = 0x01;// 定时器0 16位不可自动重载模式
TH0 = (65535 - 100) / 256;
TL0 = (65535 - 100) % 256; // PWM 信号频率为 100 Hz 把信号分成100份 每份 100us
ET0 = 1;
EA = 1;
}
void init () interrupt 1 // 定时器服务函数
{
TH0 = (65535 - 100) / 256;
TL0 = (65535 - 100) % 256;
count++;
if(count == pwm_duty) // 如果到达设置的份数后把灯熄灭 也就是从低电平变成高电平
{
led = 1; // 灭灯
}
else if (count == 100) // 当count = 100 也就是已经到达一个周期 此时又要从高电平变成低电平
{
count = 0;
led = 0;
}
}
//========================================
// =========按键相关的函数=================
void delay (uchar time) // 延时函数
{
while(time--);
}
uchar stat = 0; // 用 stat 代表 4个 状态 0 代表 熄灭 1代表 10%亮度 2代表 50%亮度 3代表 90%亮度
void keyscan () // 按键扫描
{
if(s7 == 0)
{
delay (100);
if(s7 == 0)
{
switch (stat)
{
case 0:
led = 0;
TR0 = 1;
pwm_duty = 10;
stat = 1;
break;
case 1:
pwm_duty = 50;
TR0 = 1;
stat = 2;
break;
case 2:
pwm_duty = 90;
TR0 = 1;
stat = 3;
break;
case 3:
led = 1;
TR0 = 0;
stat = 0;
break;
}
while (s7 == 0);
}
}
}
//==========================================
void main ()
{
timer0init();
CL_init();
HC138init(4);
P0 = 0xff;
while(1)
{
keyscan ();
}
}