采用外部中断控制定时器,数码管显示
时间: 2023-06-19 14:03:13 浏览: 156
7、外部中断控制数码管显示(程序+仿真).zip
这是一种常见的嵌入式系统应用,以下是一个简单的例子:
假设你要实现一个1ms的定时器,并且每次到达时间时,数码管会显示一个数字,比如从0到9,循环显示。
首先,你需要一个外部中断引脚,例如P1.0。当P1.0引脚有一个上升沿时,你的程序会被中断执行。你需要在程序中设置中断服务程序(ISR),以便在此时执行一些操作。
其次,你需要设置一个定时器,例如T0,用于定时1ms。在定时器的计数器到达预设值时,定时器会产生一个中断,你需要在此时执行ISR。
最后,你需要在ISR中编写代码来控制数码管显示数字。你可以通过一个变量来存储当前的数字,每次ISR执行时,将变量加1,如果达到9,则从0开始循环。
以下是一个简单的示例代码,你可以根据自己的需要进行修改和调整。
```c
#include <reg51.h>
sbit LED = P2^0; // 数码管控制引脚
sbit KEY = P1^0; // 外部中断引脚
unsigned char num = 0; // 当前要显示的数字
void Timer0_Init()
{
TMOD &= 0xF0; // 设置T0为16位定时器
TMOD |= 0x01;
TH0 = 0xFC; // 设置定时器初值为65536-5000=60536
TL0 = 0x18;
ET0 = 1; // 允许T0中断
TR0 = 1; // 启动T0
}
void External_Init()
{
IT0 = 1; // 设置为下降沿触发
EX0 = 1; // 允许外部中断
EA = 1;
}
void Timer0_ISR() interrupt 1
{
TH0 = 0xFC;
TL0 = 0x18;
num++; // 数字加1
if (num > 9) num = 0; // 超过9,从0开始
P0 = 0xFF; // 关闭数码管
LED = 0; // 选择第一个数码管
P0 = ~(1 << num); // 显示数字
}
void External_ISR() interrupt 0
{
// do nothing, just clear the interrupt flag
KEY = 0;
}
void main()
{
Timer0_Init();
External_Init();
while (1) {}
}
```
阅读全文