at89c51检测into0和into1两个外部中断时间差的程序无LED
时间: 2024-02-06 15:09:46 浏览: 81
以下是基于AT89C51单片机的检测INT0和INT1两个外部中断时间差的程序(无LED):
```
#include <reg51.h>
#define FREQ_OSC 12000000UL // 晶振频率,单位Hz
#define TIMER_PRESCALER 12 // 定时器预分频系数
#define TIMER_TICK_US ((1.0 / (FREQ_OSC / TIMER_PRESCALER)) * 1000000) // 定时器中断周期,单位us
sbit INT0_PIN = P3^2; // INT0引脚
sbit INT1_PIN = P3^3; // INT1引脚
volatile unsigned int int0_counter = 0; // INT0计数器
volatile unsigned int int1_counter = 0; // INT1计数器
void timer_init()
{
TMOD |= 0x01; // 定时器0工作在模式1
TH0 = 0; // 定时器0计数初值为0
TL0 = 0;
ET0 = 1; // 允许定时器0中断
TR0 = 1; // 启动定时器0
}
void int0_isr() interrupt 0
{
int0_counter++; // INT0计数器加1
}
void int1_isr() interrupt 2
{
int1_counter++; // INT1计数器加1
}
void main()
{
unsigned int int0_count_1 = 0; // 第一次INT0触发时的计数值
unsigned int int1_count_1 = 0; // 第一次INT1触发时的计数值
unsigned int int0_count_2 = 0; // 第二次INT0触发时的计数值
unsigned int int1_count_2 = 0; // 第二次INT1触发时的计数值
unsigned int time_diff = 0; // INT0和INT1触发时间差,单位us
timer_init(); // 初始化定时器
EA = 1; // 允许中断
while (1)
{
if (INT0_PIN == 0) // 如果INT0触发
{
while (INT0_PIN == 0); // 等待INT0松开
int0_count_1 = int0_counter; // 记录INT0第一次触发时的计数值
while (INT1_PIN == 1); // 等待INT1触发
int0_count_2 = int0_counter; // 记录INT0第二次触发时的计数值
time_diff = (int0_count_2 - int0_count_1) * TIMER_TICK_US; // 计算INT0和INT1触发时间差
printf("INT0 and INT1 time difference: %u us\n", time_diff); // 输出时间差
}
if (INT1_PIN == 0) // 如果INT1触发
{
while (INT1_PIN == 0); // 等待INT1松开
int1_count_1 = int1_counter; // 记录INT1第一次触发时的计数值
while (INT0_PIN == 1); // 等待INT0触发
int1_count_2 = int1_counter; // 记录INT1第二次触发时的计数值
time_diff = (int1_count_2 - int1_count_1) * TIMER_TICK_US; // 计算INT0和INT1触发时间差
printf("INT0 and INT1 time difference: %u us\n", time_diff); // 输出时间差
}
}
}
```
这个程序使用了定时器0和外部中断0、1来检测两个外部中断的时间差。当INT0或INT1触发时,程序会等待另一个中断触发,并记录两次中断的计数值,然后计算时间差并输出。注意,这个程序使用了printf函数来输出结果,因此需要将程序下载到支持串口通信的单片机上才能看到输出结果。
阅读全文