[应用方案] 使用定时器生成精确延时

[复制链接]
 楼主| 铁血丹心LLLL 发表于 2025-1-19 23:52 | 显示全部楼层 |阅读模式
本帖最后由 铁血丹心LLLL 于 2025-1-19 23:54 编辑

定时器/计数器应用实例通过 HC15P013A0 的 8 位定时器/计数器,可以实现定时任务、外部事件计数等功能。

以下提供几个常见应用场景的代码示例。

3.使用定时器生成精确延时3.1 定时器配置在定时模式下,定时器从一个初始值开始计数,直到溢出为止。通过设置合适的预分频器和计数初值,可以控制定时器的溢出时间,从而实现精确的延时。
假设系统时钟频率为 8 MHz,我们希望定时器产生 1 毫秒的时间延迟。由于定时器是 8 位的,其最大计数值为 255,因此需要设置合适的预分频器。
3.2 硬件配置
  • 系统时钟频率:假设为 8 MHz。
  • 定时器预分频器:设定为 64。
  • 定时器溢出时间:1 毫秒。
3.3 计算定时器溢出的频率系统时钟为 8 MHz,预分频器为 64,则定时器的时钟频率为:


由于定时器是 8 位的,最大计数值为 255,所以计数器的溢出时间为:



为了实现 1 毫秒的延时,我们可以设置定时器的初值为:



3.4 代码实现
#define TIMER0  (*(volatile unsigned char*)0x10)  // 定时器寄存器地址
#define TMSK    (*(volatile unsigned char*)0x11)  // 定时器中断掩码寄存器地址
#define TCTL    (*(volatile unsigned char*)0x12)  // 定时器控制寄存器地址

void delay_ms(unsigned int ms) {
    // 配置定时器为定时模式,使用预分频器
    TCTL = 0x04;  // 设置定时器工作模式,并启用定时器

    // 设置定时器预分频器为 64
    TCTL |= 0x40; // 选择分频器为 64

    while(ms--) {
        // 设置定时器初始值
        TIMER0 = 127;  // 设置定时器初值

        // 等待定时器溢出
        while (TMSK & 0x01) {
            // 等待定时器溢出中断标志清零
        }
    }
}







键盘手没手 发表于 2025-2-27 11:41 | 显示全部楼层
定时器是 8 位的,它的最大计数值是 255。为了产生 1 毫秒的延时,我们首先需要计算出定时器的溢出时间。
yangjiaxu 发表于 2025-2-27 13:17 | 显示全部楼层
定时器延时确实好用,而且很多时候也是必选的一种延时方法
呐咯密密 发表于 2025-3-28 16:39 | 显示全部楼层
通用定时器做延时啊
shenxiaolin 发表于 2025-3-28 20:52 | 显示全部楼层
学习一下
地瓜patch 发表于 2025-3-28 23:04 | 显示全部楼层
不错的工具,试用一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

74

主题

541

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部