用C语言编写一个程序,实现外部中断0控制数码管定时器每一秒加一,加到10后继续从零开始。外部中断1控制数码管定时器每一秒减一
时间: 2023-07-20 11:37:39 浏览: 105
好的,这是一个比较复杂的问题,但是我会尽力解答。首先,外部中断是通过硬件实现的,我们需要将外部中断0和1分别连接到相应的引脚上,然后设置相应的中断向量和中断服务程序。以下是一个可能的解决方案:
```c
#include <reg52.h> // 8051芯片头文件
// 数码管连接的引脚
sbit Dig1 = P2^0;
sbit Dig2 = P2^1;
sbit Dig3 = P2^2;
sbit Dig4 = P2^3;
// 数码管的段码表
unsigned char code LedChar[] = {
0xc0, // 0
0xf9, // 1
0xa4, // 2
0xb0, // 3
0x99, // 4
0x92, // 5
0x82, // 6
0xf8, // 7
0x80, // 8
0x90, // 9
};
// 定时器计数器
unsigned int cnt = 0;
// 定时器中断服务程序
void timer_isr() interrupt 1 {
TH0 = 0xfc; // 重新设置定时器初值
TL0 = 0x66;
cnt++; // 计数器加一
if (cnt == 10) cnt = 0; // 如果计数器达到10,就重置为0
}
// 外部中断0服务程序
void ext0_isr() interrupt 0 {
cnt++; // 计数器加一
if (cnt == 10) cnt = 0; // 如果计数器达到10,就重置为0
}
// 外部中断1服务程序
void ext1_isr() interrupt 2 {
cnt--; // 计数器减一
if (cnt == -1) cnt = 9; // 如果计数器减到-1,就重置为9
}
void main() {
// 初始化定时器
TMOD = 0x01; // 定时器0工作在模式1
TH0 = 0xfc; // 设置定时器初值
TL0 = 0x66;
ET0 = 1; // 允许定时器0中断
EA = 1; // 允许总中断
TR0 = 1; // 启动定时器0
// 初始化外部中断0和1
EX0 = 1; // 允许外部中断0
IT0 = 1; // 设置外部中断0触发方式为下降沿
EX1 = 1; // 允许外部中断1
IT1 = 1; // 设置外部中断1触发方式为下降沿
while (1) {
// 显示数码管
Dig1 = 1; Dig2 = 0; Dig3 = 0; Dig4 = 0;
P0 = LedChar[cnt % 10];
delay(1);
Dig1 = 0; Dig2 = 1; Dig3 = 0; Dig4 = 0;
P0 = LedChar[cnt / 10 % 10];
delay(1);
Dig1 = 0; Dig2 = 0; Dig3 = 1; Dig4 = 0;
P0 = LedChar[cnt / 100 % 10];
delay(1);
Dig1 = 0; Dig2 = 0; Dig3 = 0; Dig4 = 1;
P0 = LedChar[cnt / 1000 % 10];
delay(1);
}
}
// 延时函数,单位为毫秒
void delay(unsigned int ms) {
unsigned int i, j;
for (i = 0; i < ms; i++) {
for (j = 0; j < 114; j++);
}
}
```
以上程序使用了定时器0和外部中断0、1来实现数码管每一秒加一或减一的功能。其中,定时器0每隔1ms产生一次中断,计数器cnt每次中断加一或减一,当cnt达到10时,就重置为0或9。数码管的显示通过循环显示四位数码管来实现,延时函数使用了一个简单的循环延时。请注意,以上程序并没有经过实际测试,可能存在一些错误,仅供参考。
阅读全文