打印
[经验分享]

硬件延时和软件延时两种,各有优劣。

[复制链接]
900|34
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
梅花香自123|  楼主 | 2024-8-23 00:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在单片机中,实现延时的常用方法分为硬件延时和软件延时两种,各有优劣。

1. 硬件延时
硬件延时通常借助于定时器或计数器来实现,具备以下优势:

精确性:硬件延时通过定时器计数,能够提供精确的时间控制。
高效性:定时器运行在后台,不占用CPU资源,允许CPU继续处理其他任务。
定时器/计数器延时的实现
假设使用12 MHz的晶振,可以通过设置定时器的初值和模式来实现不同的延时时间。以下是一个简单的硬件延时示例:

c
void Timer0_Delay_ms(unsigned int ms) {
    // 设置定时器模式
    TMOD = 0x01;  // Timer0工作在模式1(16位定时器)

    while (ms--) {
        TH0 = 0xFC;  // 设置高8位
        TL0 = 0x18;  // 设置低8位
        TR0 = 1;     // 启动定时器
        while (TF0 == 0);  // 等待定时器溢出
        TR0 = 0;     // 停止定时器
        TF0 = 0;     // 清除溢出标志
    }
}

使用特权

评论回复
沙发
梅花香自123|  楼主 | 2024-8-23 00:29 | 只看该作者
2软件延时
软件延时则通过循环结构来实现,通常用于定时器资源被占用的情况下。

2.1 短暂延时
软件延时可以通过简单的空循环实现,示例如下:

c
void Delay_us(unsigned int us) {
    while (us--) {
        _nop_();  // 每个_NOP_()指令大约占用1微秒(在12 MHz下)
    }
}

使用特权

评论回复
板凳
梅花香自123|  楼主 | 2024-8-23 00:30 | 只看该作者
2.2 嵌套延时
复杂的延时可以通过多层循环来实现,例如:

c
void Delay_ms(unsigned int ms) {
    unsigned int i, j;
    for (i = 0; i < ms; i++) {
        for (j = 0; j < 123; j++) {
            _nop_();  // 适当调节循环次数以达到所需延时
        }
    }
}

使用特权

评论回复
地板
梅花香自123|  楼主 | 2024-8-23 00:34 | 只看该作者
延时时间的测量与计算
3.1 使用示波器测量
通过在延时函数前后对某个引脚进行置位和清零,使用示波器测量该引脚的电平变化,可以精确测量延时的实际时间。

c
sbit T_point = P1^0;

void Dly1ms(void) {
    unsigned int i;
    T_point = 1;  // 置高电平
    for (i = 0; i < 124; i++) {;}
    T_point = 0;  // 置低电平
}

使用特权

评论回复
5
梅花香自123|  楼主 | 2024-8-23 00:34 | 只看该作者
3.2 通过反汇编计算延时时间
可以在Keil中通过反汇编代码来分析延时函数的执行时间。例如,在Keil的反汇编窗口中,查看循环结构对应的汇编代码,可以精确计算每个循环所消耗的机器周期。

使用特权

评论回复
6
梅花香自123|  楼主 | 2024-8-23 00:34 | 只看该作者
结论
硬件延时适用于对精度要求高且需要释放CPU资源的场合。
软件延时简单灵活,适用于短时间延时和对精度要求不高的场合。
延时时间的精确计算与测量可以通过示波器和反汇编分析来实现,确保程序的延时精度满足设计需求。

使用特权

评论回复
7
uytyu| | 2024-9-13 16:35 | 只看该作者
硬件延时通常使用定时器/计数器来实现,能够提供比软件延时更精确的时间控制。

使用特权

评论回复
8
jkl21| | 2024-9-13 19:48 | 只看该作者
硬件延时适用于对延时精度要求高、时间较长且系统资源充足的场合

使用特权

评论回复
9
rosemoore| | 2024-9-13 20:47 | 只看该作者
软件延时可以通过编程实现,可以根据实际需求随时调整延时时间。例如,可以通过改变循环次数或调整延时函数的参数来轻松地改变延时的长度。这种灵活性使得软件延时在不同的应用场景中都能得到广泛应用。

使用特权

评论回复
10
lzmm| | 2024-9-14 11:13 | 只看该作者
软件延时通常通过简单的循环来实现,代码直观且易于理解。

使用特权

评论回复
11
wwppd| | 2024-9-14 11:54 | 只看该作者
硬件延时通常使用单片机内置的定时器/计数器来实现。定时器可以在没有CPU干预的情况下独立运行,根据预设的时间产生中断或触发特定事件。

使用特权

评论回复
12
elsaflower| | 2024-9-14 15:29 | 只看该作者
使用硬件定时器通常需要处理中断,这可能会引入额外的开销。

使用特权

评论回复
13
jackcat| | 2024-9-14 18:45 | 只看该作者
软件延时通常是指在程序中通过循环或递归调用来实现延时。

使用特权

评论回复
14
earlmax| | 2024-9-14 20:37 | 只看该作者
软件延时通常是通过编写一段循环执行的空操作代码来实现的,通过控制循环次数和循环体内的指令数量来达到延时的目的。

使用特权

评论回复
15
yeates333| | 2024-9-14 21:24 | 只看该作者
设置和使用硬件定时器可能需要更多的编程工作,特别是在需要精确调整定时的情况下。

使用特权

评论回复
16
sanfuzi| | 2024-9-14 22:48 | 只看该作者
对于简单的延时需求,如短暂的闪烁或简单的时序控制,可以使用软件延时,代码实现简单,资源占用少。

使用特权

评论回复
17
abotomson| | 2024-9-15 15:58 | 只看该作者
硬件延时的设置通常需要通过特定的寄存器进行配置,一旦设置好后,修改起来相对比较麻烦。而且,硬件延时的时间长度通常是固定的或者只能在一定范围内进行调整,缺乏软件延时那样的灵活性。例如,如果需要根据不同的情况动态调整延时时间,硬件延时可能就不太适用。

使用特权

评论回复
18
lzmm| | 2024-9-15 16:49 | 只看该作者
通过编写简单的循环程序即可实现,不需要额外的硬件支持

使用特权

评论回复
19
qiufengsd| | 2024-9-15 18:24 | 只看该作者
使用硬件延时需要占用单片机的定时器资源,这在资源有限的单片机上可能是一个问题。

使用特权

评论回复
20
biechedan| | 2024-9-15 21:35 | 只看该作者
如果系统需要同时处理多个任务,非阻塞的软件延时或硬件延时可能是更好的选择。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

87

主题

1054

帖子

0

粉丝