stc89c52单片机定时器T2输入捕获
时间: 2023-09-24 10:14:30 浏览: 393
STC89C52单片机的定时器T2可以用来实现输入捕获功能。输入捕获是指在外部信号的上升沿或下降沿触发定时器,记录定时器的值,以实现对外部信号的精确计时。
输入捕获的实现步骤如下:
1. 设置T2为捕获模式,可以选择上升沿或下降沿触发捕获。
2. 在T2中断服务程序中,读取捕获寄存器的值,即可得到输入信号的高电平或低电平时间。
3. 根据需要,可以将输入信号的时间转换为需要的单位,例如秒、毫秒等。
下面给出一个输入捕获的示例代码:
```c
#include <STC89C5xRC.H>
unsigned int high_time; // 高电平时间
unsigned int low_time; // 低电平时间
unsigned int input_freq; // 输入信号频率
// T2中断服务程序
void T2_ISR() interrupt 5
{
static unsigned char capture_flag = 0; // 捕获标记
static unsigned int capture_value = 0; // 捕获值
if (capture_flag == 0) // 第一次捕获到上升沿
{
capture_value = TH2 * 256 + TL2; // 记录捕获值
capture_flag = 1; // 设置捕获标记为1
TR2 = 0; // 停止T2计数
TH2 = 0; // 清零定时器高字节
TL2 = 0; // 清零定时器低字节
TF2 = 0; // 清除T2中断标志位
TR2 = 1; // 重新启动T2计数
}
else // 第二次捕获到下降沿
{
high_time = capture_value; // 记录高电平时间
low_time = TH2 * 256 + TL2; // 记录低电平时间
input_freq = 1000000 / (high_time + low_time); // 计算输入信号频率
capture_flag = 0; // 捕获标记清零
TR2 = 0; // 停止T2计数
TH2 = 0; // 清零定时器高字节
TL2 = 0; // 清零定时器低字节
TF2 = 0; // 清除T2中断标志位
TR2 = 1; // 重新启动T2计数
}
}
void main()
{
TMOD = 0x10; // T1为16位定时器,T2为捕获模式
TH1 = 0xFC; // 定时1ms
TL1 = 0x18;
TH2 = 0; // 清零定时器高字节
TL2 = 0; // 清零定时器低字节
TR1 = 1; // 启动T1计数
ET2 = 1; // T2中断使能
EA = 1; // 总中断使能
while(1);
}
```
在上述代码中,我们使用了定时器T1来产生一个1ms的中断,在T2中断服务程序中实现输入捕获的功能。当T2捕获到上升沿时,记录捕获值,并设置捕获标记为1;当T2捕获到下降沿时,计算高电平时间、低电平时间和输入信号频率,并清零捕获标记。在主函数中,启动T1计数、使能T2中断和总中断。
阅读全文