51单片机定时/计数器应用
时间: 2025-02-01 12:26:00 浏览: 48
### 51单片机定时器与计数器应用实例
#### 使用定时器实现LED闪烁控制
通过设置定时器来精确控制时间间隔,可以用来驱动外部设备。例如,利用定时器0每隔一定的时间触发一次中断,在中断服务程序中改变LED的状态。
```c
#include <reg52.h>
sbit LED = P1^0;
void Timer0_Init(void){
TMOD |= 0x01; // 设置T0为模式1 (16位定时/计数器)
TH0 = (65536-50000)/256; // 装载初值,假设晶振频率为12MHz
TL0 = (65536-50000)%256;
}
void main(){
EA = 1; // 开启总中断使能
ET0 = 1; // 开启定时器0中断允许
TR0 = 1; // 启动定时器0
while(1){ // 主循环等待中断发生
;
}
}
// 中断服务函数定义
void Timer0_ISR() interrupt 1{
static bit led_state = 0;
TH0 = (65536-50000)/256; // 重新装载初值
TL0 = (65536-50000)%256;
if(!led_state){
LED = 0; // 关闭LED
led_state = !led_state;
}else{
LED = 1; // 打开LED
led_state = !led_state;
}
}
```
这段代码展示了如何配置并使用定时器0来创建一个简单的延时功能,从而让连接到P1.0端口上的LED每过一段时间就切换状态[^1]。
#### 利用计数器测量外部信号周期
当需要对外部事件进行计数时,则可采用计数器方式工作。比如要计算输入方波的周期长度,可以通过检测上升沿或下降沿的变化次数来进行统计。
```c
#include <reg52.h>
unsigned int count_value;
void Counter_Init(void){
TMOD &= 0xF0; // 清除低四位
TMOD |= 0x05; // T1作为计数器,模式2(自动重装8位)
TH1 = 0xFF; // 设定最大计数值
TL1 = 0xFF;
}
void main(){
EA = 1; // 总中断开启
EX0 = 1; // 外部中断INT0允许
IT0 = 1; // 下降沿触发
TR1 = 1; // 启动计数器T1
while(1){
; // 循环等待中断到来
}
}
void External_Interrupt() interrupt 0 using 1 {
count_value++; // 对每次中断增加计数值
TH1 = 0xFF; // 重启计数器
TL1 = 0xFF;
}
```
此部分说明了怎样初始化计数器以及编写相应的中断处理子程序去响应外部中断请求,并记录下发生的次数[^2]。
阅读全文
相关推荐

















