用九齐单片语法pwm方式 写一个九齐8051H单片机 单按键控制两个LED灯 10个档位的代码长按两秒开机 1挡两个灯亮设置为百分之50 2挡两个灯亮设置为百分之80 3挡两个灯亮设置为百分之100 4挡 两个灯闪烁 亮度设置为百分之百 5挡两个灯灭暂停0.5秒后开始爆闪 循环 6挡两个灯常亮然后闪烁 1秒后灭 然后再循环 7挡两个呼吸灯 灯暗百分之30 亮百分之100 8挡 两个呼吸灯 最暗到亮 依次循环 9挡 开始两个灯爆闪 然后两个灯开始正常闪烁 循环 10挡两个灯灯由暗到亮 然后开始爆闪 两个灯灯再由亮到暗 暗度到百分之50 然后两个灯开始闪烁 循环 长按两秒关机
时间: 2024-01-03 22:04:18 浏览: 138
好的,以下是使用九齐单片语法pwm方式写的8051单片机控制两个LED灯的代码:
```
#include <8051.h>
#define LED1 P1_0
#define LED2 P1_1
#define KEY P3_2
#define LONG_PRESS_TIME 2000 // 长按时间2秒
#define PWM_LEVEL_COUNT 10 // PWM的档位数量
#define PWM_START_LEVEL 1 // PWM的起始档位
unsigned char pwm_level = PWM_START_LEVEL; // 当前PWM档位
unsigned char is_long_press = 0; // 是否长按按键
unsigned int long_press_count = 0; // 长按计数器
unsigned char is_on = 0; // 是否开机
unsigned char is_paused = 0; // 是否暂停
void delay(unsigned int t) // 延时函数
{
unsigned int i, j;
for(i = 0; i < t; i++)
for(j = 0; j < 120; j++);
}
void pwm_control() // PWM控制函数
{
unsigned int on_time = 0; // LED亮的时间
unsigned int off_time = 0; // LED灭的时间
unsigned int total_time = 100; // PWM周期为100ms
switch(pwm_level)
{
case 1: on_time = 50; break; // 1档亮度为50%
case 2: on_time = 80; break; // 2档亮度为80%
case 3: on_time = 100; break; // 3档亮度为100%
case 4: on_time = 50; off_time = 50; break; // 4档闪烁
case 5: on_time = 0; off_time = 100; break; // 5档爆闪
case 6: on_time = 1000; off_time = 500; break; // 6档常亮闪烁
case 7: on_time = 30; off_time = 70; break; // 7档呼吸灯
case 8: on_time = 0; off_time = 0; break; // 8档最暗到最亮
case 9: on_time = 0; off_time = 0; break; // 9档爆闪+闪烁
case 10: on_time = 100; off_time = 100; break; // 10档渐变+爆闪
default: on_time = 0; off_time = 0; break; // 其他档位关闭LED
}
if(on_time != 0) // LED亮
{
LED1 = 1;
LED2 = 1;
delay(on_time);
}
if(off_time != 0) // LED灭
{
LED1 = 0;
LED2 = 0;
delay(off_time);
}
if(pwm_level == 4) // 4档闪烁
{
LED1 = ~LED1;
LED2 = ~LED2;
}
if(pwm_level == 5 && !is_paused) // 5档爆闪
{
LED1 = ~LED1;
LED2 = ~LED2;
delay(500);
}
if(pwm_level == 6) // 6档常亮闪烁
{
LED1 = 1;
LED2 = 1;
delay(1000);
LED1 = ~LED1;
LED2 = ~LED2;
delay(500);
}
if(pwm_level == 7) // 7档呼吸灯
{
unsigned char i;
for(i = 0; i < 100; i++)
{
LED1 = 1;
LED2 = 1;
delay(i * 3 + 30);
LED1 = 0;
LED2 = 0;
delay(100 - i * 3 - 30);
}
}
if(pwm_level == 8) // 8档最暗到最亮
{
unsigned char i;
for(i = 0; i < 100; i++)
{
LED1 = 1;
LED2 = 1;
delay(i);
LED1 = 0;
LED2 = 0;
delay(100 - i);
}
}
if(pwm_level == 9) // 9档爆闪+闪烁
{
if(!is_paused)
{
LED1 = ~LED1;
LED2 = ~LED2;
delay(500);
}
else
{
LED1 = 0;
LED2 = 0;
delay(500);
}
}
if(pwm_level == 10) // 10档渐变+爆闪
{
if(!is_paused)
{
unsigned char i;
for(i = 0; i < 100; i++)
{
LED1 = 1;
LED2 = 1;
delay(i);
LED1 = 0;
LED2 = 0;
delay(100 - i);
}
LED1 = 1;
LED2 = 1;
delay(500);
for(i = 0; i < 100; i++)
{
LED1 = 1;
LED2 = 1;
delay(100 - i);
LED1 = 0;
LED2 = 0;
delay(i);
}
LED1 = 0;
LED2 = 0;
delay(500);
}
else
{
LED1 = 0;
LED2 = 0;
delay(500);
}
}
}
void interrupt_key() interrupt 0 // 按键中断函数
{
if(!KEY) // 按键按下
{
long_press_count = 0;
is_long_press = 0;
TH0 = 0;
TL0 = 0;
TR0 = 1;
}
else // 按键松开
{
TR0 = 0;
if(is_long_press) // 长按
{
is_long_press = 0;
if(is_on) // 开机状态下长按关机
{
is_on = 0;
pwm_level = 0;
LED1 = 0;
LED2 = 0;
}
else // 关机状态下长按开机
{
is_on = 1;
pwm_level = PWM_START_LEVEL;
}
}
else // 短按
{
if(is_on) // 开机状态下切换档位
{
pwm_level++;
if(pwm_level > PWM_LEVEL_COUNT)
pwm_level = PWM_START_LEVEL;
}
}
}
// 清除中断标志位
IT0 = 0;
IE0 = 0;
}
void timer0() interrupt 1 // 定时器0中断函数
{
if(!KEY) // 按键按下
{
long_press_count++;
if(long_press_count >= LONG_PRESS_TIME / 10) // 长按2秒
{
is_long_press = 1;
TR0 = 0;
}
}
else // 按键松开
{
long_press_count = 0;
is_long_press = 0;
TR0 = 0;
}
// 清除中断标志位
TF0 = 0;
}
void main()
{
TMOD = 0x01; // 定时器0工作在模式1
TH0 = 0;
TL0 = 0;
TR0 = 0;
ET0 = 1; // 开启定时器0中断
IT0 = 1; // 外部中断0下降沿触发
EX0 = 1; // 开启外部中断0
while(1)
{
if(is_on) // 开机状态下控制LED
pwm_control();
else // 关机状态下等待按键
{
LED1 = 0;
LED2 = 0;
delay(500);
LED1 = 1;
LED2 = 1;
delay(500);
}
}
}
```
以上代码使用了定时器0中断和外部中断0来检测按键,并且使用了PWM控制LED的亮度。在长按2秒后可以开机或关机,在开机状态下按短按键可以切换PWM档位,在不同的PWM档位下LED的状态和亮度不同。
阅读全文