在51单片机中用外部中断0,且中断只收低电平出发,任意三个数码管循环显示,出现中断,任意一个LED亮
时间: 2023-05-28 15:02:22 浏览: 166
51单片机中断式扫描LED数码管显示
3星 · 编辑精心推荐
以下是基于 Keil C 编写的代码:
```c
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED = P1^0; // 控制 LED 的引脚
uchar code digit[10] = { // 显示 0~9 的数组
0xC0, // 0
0xF9, // 1
0xA4, // 2
0xB0, // 3
0x99, // 4
0x92, // 5
0x82, // 6
0xF8, // 7
0x80, // 8
0x90 // 9
};
void delay(uint t) { // 延时函数
uint i;
while (t--) {
for (i = 0; i < 1000; i++);
}
}
void display(uchar d1, uchar d2, uchar d3) { // 数码管显示函数
P0 = digit[d1];
P2 = 0x01; delay(1);
P0 = digit[d2];
P2 = 0x02; delay(1);
P0 = digit[d3];
P2 = 0x04; delay(1);
}
void main() {
uchar d1 = 0, d2 = 0, d3 = 0; // 数码管显示的数值
IT0 = 1; // 外部中断0触发方式:下降沿
EX0 = 1; // 开启外部中断0
EA = 1; // 开启总中断
while (1) { // 循环显示数码管
display(d1, d2, d3);
d1++; if (d1 >= 10) { d1 = 0; d2++; }
if (d2 >= 10) { d2 = 0; d3++; }
if (d3 >= 10) { d3 = 0; }
}
}
void INT0_isr() interrupt 0 { // 外部中断0的中断服务函数
LED = 1; // LED 亮
}
```
这里使用 P0-P2 控制数码管的显示,使用 P1^0 控制 LED 的亮灭。程序中使用循环显示数码管,并在外部中断0触发时将 LED 置为高电平。注意,为了让中断正常触发,需要将 P3.2 接一个按键,并在按下时使该引脚接地。
阅读全文