51单片机中断魔法:双按钮操控8灯上下流动程序全揭秘!
# 51单片机中断控制LED流水灯程序 这是一个基于51单片机的程序,使用两个外部中断按钮控制8个LED灯的流动方向:一个按钮触发从上往下流动,另一个按钮触发从下往上流动。 ```c #include <reg51.h> #define LED_PORT P1 // 假设8个LED连接在P1端口 // 定义按钮引脚 sbit UP_BUTTON = P3^2; // INT0 (P3.2) sbit DOWN_BUTTON = P3^3; // INT1 (P3.3) // 全局变量存储当前流动方向 unsigned char flow_direction = 0; // 0:从上往下, 1:从下往上 // 延时函数 void delay_ms(unsigned int ms) { unsigned int i, j; for(i = 0; i < ms; i++) for(j = 0; j < 123; j++); } // 外部中断0服务函数 (从上往下) void int0_isr() interrupt 0 { flow_direction = 0; } // 外部中断1服务函数 (从下往上) void int1_isr() interrupt 2 { flow_direction = 1; } void main() { // 初始化LED端口 LED_PORT = 0xFF; // 初始状态LED全灭 // 设置中断触发方式 IT0 = 1; // INT0下降沿触发 IT1 = 1; // INT1下降沿触发 // 开启中断 EX0 = 1; // 允许INT0中断 EX1 = 1; // 允许INT1中断 EA = 1; // 开启总中断 while(1) { if(flow_direction == 0) { // 从上往下流动 LED_PORT = 0xFE; // 11111110 (第一个灯亮) delay_ms(200); LED_PORT = 0xFD; // 11111101 delay_ms(200); LED_PORT = 0xFB; // 11111011 delay_ms(200); LED_PORT = 0xF7; // 11110111 delay_ms(200); LED_PORT = 0xEF; // 11101111 delay_ms(200); LED_PORT = 0xDF; // 11011111 delay_ms(200); LED_PORT = 0xBF; // 10111111 delay_ms(200); LED_PORT = 0x7F; // 01111111 (最后一个灯亮) delay_ms(200); } else { // 从下往上流动 LED_PORT = 0x7F; // 01111111 (最后一个灯亮) delay_ms(200); LED_PORT = 0xBF; // 10111111 delay_ms(200); LED_PORT = 0xDF; // 11011111 delay_ms(200); LED_PORT = 0xEF; // 11101111 delay_ms(200); LED_PORT = 0xF7; // 11110111 delay_ms(200); LED_PORT = 0xFB; // 11111011 delay_ms(200); LED_PORT = 0xFD; // 11111101 delay_ms(200); LED_PORT = 0xFE; // 11111110 (第一个灯亮) delay_ms(200); } } } ``` ## 程序说明 1. 使用P1端口连接8个LED灯 2. 使用P3.2(INT0)和P3.3(INT1)连接两个按钮 3. 按下INT0按钮触发从上往下流动 4. 按下INT1按钮触发从下往上流动 5. 使用delay_ms函数控制LED流动速度 ## 硬件连接注意事项 1. LED需要串联限流电阻(通常220Ω-1kΩ) 2. 按钮需要连接上拉电阻(通常10kΩ) 3. 确保按钮按下时产生稳定的低电平信号 ## 优化建议 1. 可以使用查表法简化LED显示代码 2. 可以增加按键消抖处理 3. 可以添加更多的流动模式 ## 三条额外需要注意的逻辑点 1. 中断服务函数中不应执行耗时操作,这里只是简单改变方向标志 2. 实际应用中应考虑按键消抖,可以在中断中设置标志,在主循环中处理 3. 如果需要更精确的延时,可以使用定时器代替软件延时 ######[AI写代码神器 | 999点数解答 | 2025-04-26 10:34:16]
- Java JFrame 实现多界面跳转:含登录、注册及个人信息管理功能(讯飞星火 | 503点数解答 | 2024-06-06 23:49:29)407
- 超详细!用复杂 HTML 代码打造功能丰富网站,含特色搜索与展示(字节豆包 | 572点数解答 | 2024-11-17 07:58:26)273
- C++ 实现:求解使序列为空的最小操作次数及代码优化要点(阿里通义 | 462点数解答 | 2024-12-21 17:35:25)442
- C++ 求解序列清空最小操作次数:贪心算法与哈希表的巧妙运用(百度文心 | 812点数解答 | 2024-12-21 17:36:14)584
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)338
- jQuery 实现动态操作 DOM:打造可增删任务的待办事项列表应用(百度文心 | 1015点数解答 | 2024-10-26 23:41:22)447
- jQuery 打造实用待办事项列表:输入添加、点击删除一步到位!(阿里通义 | 1139点数解答 | 2024-10-29 08:44:48)361
- jQuery 实现动态操作 DOM:打造带添加与删除功能的待办事项列表应用(阿里通义 | 687点数解答 | 2024-10-29 09:25:06)376
- jQuery 实战:打造可添加与删除任务的待办事项列表应用(字节豆包 | 499点数解答 | 2024-10-29 20:40:48)287
- 期末考试成绩比拼:找出最厉害学生的代码实现及注意要点(DeepSeek | 257点数解答 | 2025-12-16 12:24:03)60
- C++实现:输出指定区间内排除特定数字和范围的所有数(DeepSeek | 138点数解答 | 2025-07-19 20:44:46)363
- Python代码:依据风速精准判断风力等级(字节豆包 | 148点数解答 | 2025-11-11 21:28:13)85