本实验旨在掌握51单片机定时器的配置和使用方法,实现精确的时间控制功能。通过实际案例,深入理解定时器的工作原理和应用技巧。具体目标包括:
51单片机内置的定时器主要包含以下部分:
定时器模式:
定时器计数值计算公式:
计数初值 = 65536 - (定时时间 × 晶振频率) / 12
例如:12MHz晶振,需要1ms定时:
计数初值 = 65536 - (0.001 × 12000000) / 12
计数初值 = 65536 - 1000 = 64536 (FC18H)
本实验需要的硬件连接非常简单:
#include <reg51.h>
sbit LED = P1^0; // LED连接到P1.0口
bit flag = 0; // LED状态标志位
// 定时器0中断服务函数
void Timer0_ISR() interrupt 1 {
TH0 = 0xFC; // 重装初值高字节
TL0 = 0x18; // 重装初值低字节
flag = !flag; // 翻转标志位
LED = flag; // 控制LED
}
// 定时器0初始化函数
void Timer0_Init(void) {
TMOD &= 0xF0; // 清零T0的控制位
TMOD |= 0x01; // 设置T0为模式1(16位定时器)
TH0 = 0xFC; // 1ms定时值
TL0 = 0x18;
ET0 = 1; // 使能T0中断
EA = 1; // 使能总中断
TR0 = 1; // 启动定时器0
}
void main() {
Timer0_Init(); // 初始化定时器0
while(1) {
// 主循环中可以执行其他任务
}
}
注意事项:
51单片机有Timer0和Timer1两个定时器,可以同时使用:
// Timer1中断服务函数
void Timer1_ISR() interrupt 3 {
TH1 = 0xFC; // 1ms定时
TL1 = 0x18;
// 其他任务
}
// 初始化两个定时器
void Timer_Init(void) {
// Timer0配置(同上)
TMOD |= 0x10; // 设置Timer1为模式1
TH1 = 0xFC;
TL1 = 0x18;
ET1 = 1; // 使能Timer1中断
TR1 = 1; // 启动Timer1
}