51单片机定时器应用:产生500Hz方波信号
一、实验目的
通过AT89C51单片机实现定时器/计数器的定时应用,具体要求:
1. 掌握定时器/计数器的工作原理
2. 掌握定时器/计数器的工作模式及工作方式
3. 掌握定时器初始化编程的基本步骤
二、实验原理
1. 定时器/计数器基本原理
51系列单片机内部含有两个定时器/计数器T0和T1,本质是16位的加法计数器,可实现对内部时钟脉冲信号的12分频信号或外部脉冲信号的计数。
定时器的核心在于计数:
- **定时模式**:对内部系统时钟进行计数(晶振频率的1/12)
- **计数模式**:对外部引脚(T0/P3.4或T1/P3.5)的脉冲信号进行计数
2. 定时器控制寄存器
TCON(定时器控制寄存器)
- TF1/TFO:定时器1/0溢出标志位
- TR1/TRO:定时器1/0运行控制位
- IE1/ITO:外部中断1/0请求标志
- IT1/ITO:外部中断1/0触发方式选择位
TMOD(定时器模式寄存器)
- GATE:门控位
- C/T:定时/计数模式选择位
- M1、M0:工作方式选择位(0-3四种模式)
3. 定时器工作模式
| M1 M0 | 工作模式 | 说明 |
| 0 0 | 模式0(13位) | 13位定时器/计数器 |
| 0 1 | 模式1(16位) | 16位定时器/计数器(最常用) |
| 1 0 | 模式2(8位自动重装) | 8位自动重装定时器/计数器 |
| 1 1 | 模式3(仅T0) | 两个8位定时器/计数器 |
4. 定时器初值计算
本实验要求产生500Hz的方波信号,方波周期为2ms,需要定时器每1ms触发一次中断。
已知:
- 晶振频率:fosc = 12MHz
- 机器周期:12/fosc = 1μs
- 定时器溢出值:65536
- 定时时间:1ms = 1000μs
则定时器初值为:
初值 = 65536 - 1000 = 64536 = 0xFC66
即TH0 = 0xFC,TL0 = 0x66
三、实验步骤
1. 硬件连接
在普中51实验板上找到蜂鸣器电路连接原理图:
- 蜂鸣器通常连接到P2.5引脚
- 通过三极管驱动(低电平有效)
- 单片机晶振频率设置为12MHz
2. 软件设计
编写代码实现500Hz方波输出:
#include <reg52.h>
// 定义蜂鸣器控制引脚
sbit BEEP = P2^5;
// 定时器0初始化函数
void Timer0_Init(void) {
TMOD = 0x01; // 设置定时器0为模式1(16位定时器)
TH0 = 0xFC; // 设置定时器初值(高8位)
TL0 = 0x66; // 设置定时器初值(低8位)
ET0 = 1; // 使能定时器0中断
EA = 1; // 开总中断
TR0 = 1; // 启动定时器0
}
// 定时器0中断服务程序
void Timer0_ISR(void) interrupt 1 {
TH0 = 0xFC; // 重新加载定时器初值(高8位)
TL0 = 0x66; // 重新加载定时器初值(低8位)
BEEP = !BEEP; // 翻转蜂鸣器引脚状态(产生方波)
}
// 主函数
void main(void) {
Timer0_Init(); // 初始化定时器0
while(1) { // 主循环空转,等待中断
// 所有功能通过定时器中断实现
}
}
```
3. 编译与烧录
1. 在Keil uVision中创建新项目,选择AT89C51单片机
2. 添加上述代码,编译生成HEX文件
3. 使用STC-ISP等烧录工具将HEX文件下载到单片机
4. 运行与测试
1. 设置晶振频率为12MHz
2. 运行程序,观察蜂鸣器状态
3. 使用示波器测量P2.5引脚波形,验证是否为500Hz方波
四、实验结果与分析
1. 定时器初始化分析
- `TMOD = 0x01`:设置定时器0为16位定时器模式
- `TH0 = 0xFC` 和 `TL0 = 0x66`:设置定时器初值,确保每1ms溢出一次
- `ET0 = 1` 和 `EA = 1`:开启定时器0中断和总中断
- `TR0 = 1`:启动定时器0
2. 中断服务程序分析
- 每次定时器溢出时,自动调用中断服务程序
- 重新加载定时器初值,确保下一次溢出时间仍为1ms
- 翻转BEEP引脚状态,形成方波信号
3. 频率验证
- 定时器每1ms触发一次中断,BEEP引脚状态翻转一次
- 方波周期为2ms,频率为1/2ms = 500Hz
- 符合实验要求
五、总结
1. 实验总结
通过本次实验,我们需要掌握:
- 51单片机定时器/计数器的工作原理
- 定时器的四种工作模式及应用场景
- 定时器初始化编程的基本步骤
- 定时器初值计算方法
2. 拓展应用
定时器在单片机系统中应用广泛:
- 产生精确的时间延迟
- 生成PWM信号控制电机、LED亮度
- 测量脉冲宽度或频率
- 实现定时任务调度
3. 常见问题及解决方法
- **定时器不准确**:检查晶振频率设置和初值计算
- **中断未触发**:检查中断使能位(ET0、EA)和中断向量号
- **方波不稳定**:确保中断服务程序执行时间短,不影响下次中断