定时器训练(UAV2101~UAV2105)

发布时间 2023-12-10 15:52:32作者: 一郎哥哥

例子001、51单片机定时器训练

下面是一份基本的 51 定时器控制代码#include <reg52.h> // 8051 头文件


// 定义时钟频率为 12MHz
#define FOSC 12000000UL
// 定义波特率为 9600
#define BAUDRATE 9600
// 定义定时器重装值
#define TIMER_RELOAD_VALUE 65535-50000+1

sbit LED=P1^0; // 定义 LED 灯连接的端口

// 初始化定时器0
void Init_Timer0()
{
    TMOD |= 0x01; // 将定时器0工作方式设置为模式1
    TH0 = TIMER_RELOAD_VALUE / 256; // 计算定时器重装值的高8位并赋值
    TL0 = TIMER_RELOAD_VALUE % 256; // 计算定时器重装值的低8位并赋值
    EA = 1; // 开启全局中断
    ET0 = 1; // 开启定时器0中断
    TR0 = 1; // 开启定时器0
}

// 定时器0中断处理函数
void Timer0_ISR() interrupt 1
{
    TH0 = TIMER_RELOAD_VALUE / 256; // 计算定时器重装值的高8位并赋值
    TL0 = TIMER_RELOAD_VALUE % 256; // 计算定时器重装值的低8位并赋值
    LED = ~LED; // LED 灯取反
}

// 主函数
void main()
{
    Init_Timer0(); // 初始化定时器0
    while(1); // 保持程序运行
}
这份代码中,我们使用定时器0来控制 LED 灯的闪烁。定时器的工作方式被设置为模式1,并且每次重装时赋值为 TIMER_RELOAD_VALUE,即计算出的定时时间。开启定时器0中断后,每当定时器0计数到 TIMER_RELOAD_VALUE 时,会触发中断处理函数 Timer0_ISR(),在其中将计数值重新赋为 TIMER_RELOAD_VALUE 并将 LED 灯进行取反操作。

在你的具体应用中,你可以根据需要更改定时时间和控制操作。