51连接7seg 外部中断连接按钮 使用定时器延时2s,7seg显示1,led点亮
时间: 2024-01-02 14:02:24 浏览: 77
下面是一个使用定时器和外部中断控制7段数码管和LED的C51程序示例:
```c
#include <reg51.h>
sbit LED = P2^0;
sbit D1 = P1^0;
sbit D2 = P1^1;
sbit D3 = P1^2;
sbit D4 = P1^3;
sbit KEY = P3^2;
void delay();
void timer0_isr() interrupt 1;
void key_isr() interrupt 0;
int count = 0;
int show_num = 0;
void main() {
TMOD = 0x01; // 设置定时器0为模式1
TH0 = 0xFC; // 设置计时初值
TL0 = 0x66;
TR0 = 1; // 启动定时器0
ET0 = 1; // 开启定时器0中断
EA = 1; // 开启总中断
IT0 = 1; // 设置外部中断0为下降沿触发
EX0 = 1; // 开启外部中断0
while (1) {
if (show_num == 1) { // 如果show_num为1,7段数码管显示1
D1 = 0;
D2 = 1;
D3 = 1;
D4 = 1;
} else { // 否则,7段数码管不显示任何数字
D1 = 1;
D2 = 1;
D3 = 1;
D4 = 1;
}
if (KEY == 0) { // 如果按下按钮
LED = 1; // 点亮LED
count = 0; // 计数器清零
TR0 = 1; // 启动定时器0
while (KEY == 0); // 等待按钮松开
}
}
}
void delay() {
int i;
for (i = 0; i < 500; i++); // 空转一段时间
}
void timer0_isr() interrupt 1 {
count++; // 计数器加1
if (count == 4000) { // 如果计数器累加到4000
TR0 = 0; // 停止定时器0
count = 0; // 计数器清零
show_num = 1; // 设置显示数字为1
delay(); // 稍作延时
show_num = 0; // 显示数字清零
}
}
void key_isr() interrupt 0 {
LED = 0; // 关闭LED
}
```
在这个程序中,我们使用了定时器0的模式1,每次计时65536个机器周期后会触发定时器中断。我们设置了计时初值为62208,这样每次计时65536 - 62208 = 3328个机器周期,也就是每秒钟大约计时4000次。我们在定时器中断服务程序中累加一个计数器,当计数器累加到4000时,说明已经延迟了一秒钟,我们就停止定时器0,将显示数字设置为1,稍作延时后再将显示数字清零,实现了两秒钟的延迟。在延迟期间,我们在主函数中判断是否按下按钮,如果按下按钮,就点亮LED并启动定时器0,等待延迟结束后关闭LED。如果未按下按钮,则不进行任何操作。外部中断0被设置为下降沿触发,这样当按钮被按下时就会触发中断,关闭LED。7段数码管的控制使用了P1口的4个引脚,通过设置这些引脚的状态来控制数码管的显示。
阅读全文