51单片机定时怎么实现
时间: 2023-07-16 22:13:06 浏览: 42
51单片机有两个定时器:定时器0和定时器1。
实现定时器的步骤如下:
1. 设置定时器工作模式:定时器可以工作在模式0、模式1、模式2和模式3。模式0是 13 位定时器,模式1是 16 位定时器,模式2是自动重载定时器,模式3是定时器与计数器模式。选择适合自己的模式。
2. 设置定时器初值:定时器的初值是一个计数器,根据计数器的值来确定定时器的工作时间。设置定时器初值需要写入定时器对应的寄存器 THx 和 TLx 中。
3. 开启定时器中断:定时器计数完成后,会产生中断,需要开启中断。定时器中断需要打开中断总开关,并且设置定时器中断优先级。
4. 启动定时器:开启定时器之前需要设置好定时器工作模式、初值和中断,然后再打开定时器开关,让定时器开始工作。
下面是一个基于定时器0的简单示例代码:
```c
#include <reg52.h> // 引入头文件
#define FREQ_OSC 11059200UL // 晶振频率
#define TIME_MS 10 // 定时器中断时间(毫秒)
sbit LED = P0^0; // LED 灯接在 P0.0 引脚上
void Timer0Init() // 定时器0初始化函数
{
TMOD &= 0xF0; // 设置工作模式为模式0
TH0 = (65536 - FREQ_OSC / 12 / 1000 * TIME_MS) / 256; // 设置定时器初值(高位)
TL0 = (65536 - FREQ_OSC / 12 / 1000 * TIME_MS) % 256; // 设置定时器初值(低位)
ET0 = 1; // 开启定时器中断
EA = 1; // 开启总中断
TR0 = 1; // 启动定时器
}
void main()
{
Timer0Init(); // 调用定时器初始化函数
while(1)
{
// do something
}
}
void Timer0() interrupt 1 // 定时器0中断服务函数
{
LED = ~LED; // LED 灯翻转
}
```
在上面的代码中,我们设置了定时器0的工作模式为模式0,初值为 65536 - FREQ_OSC / 12 / 1000 * TIME_MS,即每隔 TIME_MS 毫秒产生一次中断。在中断服务函数 Timer0 中,我们将 LED 灯翻转。