at89c51检测into0和into1两个外部中断时间差的程序
时间: 2024-02-06 09:09:45 浏览: 79
以下是AT89C51检测INT0和INT1两个外部中断时间差的程序示例:
```
#include <reg51.h>
#include <stdio.h>
sbit LED = P1^0; // LED控制引脚
unsigned int t1, t2, dt;
void Timer0_Init() // 定时器0初始化函数
{
TMOD |= 0x01; // 设定定时器0为模式1
TH0 = 0; // 设定计时初始值
TL0 = 0;
TR0 = 1; // 启动定时器0
}
void INT0_Init() // 外部中断0初始化函数
{
IT0 = 1; // 设定INT0触发方式为下降沿触发
EX0 = 1; // 使能外部中断0
EA = 1; // 全局中断使能
}
void INT1_Init() // 外部中断1初始化函数
{
IT1 = 1; // 设定INT1触发方式为下降沿触发
EX1 = 1; // 使能外部中断1
EA = 1; // 全局中断使能
}
void main()
{
Timer0_Init(); // 初始化定时器0
INT0_Init(); // 初始化外部中断0
INT1_Init(); // 初始化外部中断1
while(1)
{
if(dt > 0) // 若时间差大于0,则表示INT0先触发
{
printf("INT0先触发,时间差为:%d\n", dt);
LED = 1; // 点亮LED
}
else if(dt < 0) // 若时间差小于0,则表示INT1先触发
{
printf("INT1先触发,时间差为:%d\n", -dt);
LED = 0; // 熄灭LED
}
}
}
void INT0_ISR() interrupt 0 // 外部中断0中断服务函数
{
TR0 = 0; // 关闭定时器0
t1 = TH0 * 256 + TL0; // 记录INT0触发时间
TH0 = 0; // 重置计时器0值
TL0 = 0;
TR0 = 1; // 启动定时器0
}
void INT1_ISR() interrupt 2 // 外部中断1中断服务函数
{
TR0 = 0; // 关闭定时器0
t2 = TH0 * 256 + TL0; // 记录INT1触发时间
TH0 = 0; // 重置计时器0值
TL0 = 0;
TR0 = 1; // 启动定时器0
dt = t2 - t1; // 计算时间差
}
```
以上程序通过使用定时器0和外部中断0、1来记录两个外部中断的触发时间,并计算时间差。当时间差大于0时,表示INT0先触发,LED点亮;当时间差小于0时,表示INT1先触发,LED熄灭。
阅读全文