九齐单片机 单键控制两个LED灯 有10个档位长按两秒开机 1挡灯亮设置为百分之50 2挡灯亮设置为百分之80 3挡灯亮设置为百分之100 4挡 灯闪烁 亮度设置为百分之百 5挡灯灭暂停0.5秒后开始爆闪 循环 6挡灯常亮然后闪烁 1秒后灭 然后再循环 7挡呼吸灯 灯暗百分之30 亮百分之100 8挡 呼吸灯 最暗到亮 依次循环 9挡 开始爆闪 然后开始正常闪烁 循环 10灯由暗到亮 然后开始爆闪 灯再由亮到暗 然后开始闪烁 循环 长按两秒关机 单按键
时间: 2024-01-03 15:04:18 浏览: 114
008 通过外部中断控制制小灯亮灭_通过外部中断控制小灯亮灭_
您想问的是如何用九齐单片机实现单键控制两个LED灯,并且有10个档位,长按两秒开机,单按键关机,具体档位功能如下:
- 1档:灯亮,亮度设置为百分之50
- 2档:灯亮,亮度设置为百分之80
- 3档:灯亮,亮度设置为百分之100
- 4档:灯闪烁,亮度设置为百分之百
- 5档:灯灭,暂停0.5秒后开始爆闪,循环
- 6档:灯常亮,然后闪烁1秒后灭,然后再循环
- 7档:呼吸灯,灯暗百分之30,亮百分之100
- 8档:呼吸灯,最暗到亮,依次循环
- 9档:开始爆闪,然后开始正常闪烁,循环
- 10档:灯由暗到亮,然后开始爆闪,灯再由亮到暗,然后开始闪烁,循环。
实现的代码如下:
```c
#include <reg52.h>
#define LED1 P1_0
#define LED2 P1_1
#define KEY P3_2
typedef unsigned char u8;
typedef unsigned int u16;
u8 timerCount; // 定时器计数器
u8 currentMode = 1; // 当前档位
// 档位对应的亮度值
u8 brightness[] = {50, 80, 100, 100, 0, 100, 100, 100, 0, 100};
// 判断按键是否被按下
u8 keyIsPressed() {
if (KEY == 0) {
timerCount = 0; // 计数器清零
while (KEY == 0) { // 等待按键释放
if (timerCount >= 200) { // 长按2秒
return 2; // 长按
}
}
return 1; // 短按
}
return 0; // 没有按键按下
}
// 定时器中断处理函数
void timerHandler() interrupt 1 {
TH0 = (65536 - 1000) / 256; // 重新赋值
TL0 = (65536 - 1000) % 256; // 重新赋值
timerCount++; // 计数器加一
}
// 初始化定时器
void initTimer() {
TMOD |= 0x01; // 设置为定时器0模式
TH0 = (65536 - 1000) / 256; // 计算重载值
TL0 = (65536 - 1000) % 256;
ET0 = 1; // 打开定时器0中断允许
EA = 1; // 打开总中断允许
TR0 = 1; // 启动定时器0
}
// 设置LED的亮度
void setBrightness(u8 b) {
u16 t = b * 10; // 计算延时时间
u8 i;
for (i = 0; i < 10; i++) {
if (i < b) {
LED1 = 1;
LED2 = 1;
} else {
LED1 = 0;
LED2 = 0;
}
while (t--); // 延时
t = b * 10; // 重新计算延时时间
}
}
// 灯闪烁
void blinkLED() {
u8 i;
for (i = 0; i < 5; i++) { // 闪烁5次
LED1 = 1;
LED2 = 1;
setBrightness(100);
LED1 = 0;
LED2 = 0;
setBrightness(0);
}
}
// 爆闪
void flashLED() {
u8 i;
for (i = 0; i < 5; i++) { // 闪烁5次
LED1 = 1;
LED2 = 1;
setBrightness(100);
LED1 = 0;
LED2 = 0;
setBrightness(0);
delay(500);
}
}
// 呼吸灯
void breatheLED() {
u8 i, j;
for (i = 0; i < 10; i++) { // 从暗到亮
for (j = 0; j < 10; j++) {
setBrightness(j);
}
}
for (i = 10; i > 0; i--) { // 从亮到暗
for (j = 0; j < 10; j++) {
setBrightness(j);
}
}
}
// 暂停
void delay(u16 ms) {
u16 i, j;
for (i = 0; i < ms; i++) {
for (j = 0; j < 114; j++);
}
}
// 切换档位
void switchMode() {
currentMode++;
if (currentMode > 10) {
currentMode = 1;
}
}
// 主函数
void main() {
u8 keyStatus = 0; // 按键状态,0表示未按下,1表示短按,2表示长按
initTimer(); // 初始化定时器
while (1) {
keyStatus = keyIsPressed(); // 检测按键状态
if (keyStatus == 1) { // 短按
switchMode(); // 切换档位
setBrightness(brightness[currentMode - 1]); // 设置亮度
} else if (keyStatus == 2) { // 长按
break; // 跳出循环,关机
}
switch (currentMode) { // 根据当前档位执行相应的操作
case 4:
blinkLED();
break;
case 5:
flashLED();
break;
case 6:
breatheLED();
break;
case 7:
setBrightness(30);
delay(100);
setBrightness(100);
delay(100);
break;
case 8:
breatheLED();
break;
case 9:
flashLED();
break;
case 10:
setBrightness(0);
delay(1000);
setBrightness(100);
delay(500);
setBrightness(0);
delay(1000);
break;
default:
setBrightness(brightness[currentMode - 1]);
break;
}
}
setBrightness(0); // 关闭LED灯
while (1); // 死循环
}
```
阅读全文