找回密码
 注册
关于网站域名变更的通知
查看: 365|回复: 2
打印 上一主题 下一主题

单片机延时的两种实现方法

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-10-14 13:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
' G2 K* L% o4 U9 `3 X
单片机延时大家程序中都会用到,那么怎么实现呢?通常我们有软件实现,就是语句循环;或者硬件实现,通过定时器/计数器7 H- [8 v1 ^$ k/ D' V- ?

$ P7 T. T3 d* ]: K2 _0 |9 g- @0 K( f+ Y2 a- H, X: H! h, C' l' Y
对于精准而言,从实现语言方向看,底层语言有汇编和C语言,通常我们单片机程序用C语言比较多,但是相对而言汇编更精准。从实现方式来看,有软件方式和硬件方式,那么对于C语言延时的方法哪种更精准呢?自然是定时器计数器的方式了,为什么呢?一起来看看吧。' K4 X3 P( \9 D* N3 ?
% ?5 T) \: Y0 @% p% m! v5 I
1、软件延时-循环实现
5 @. C* w- u- I8 @4 k7 v, Z& ^- M. y" v# d7 h
在很多时候,定时器会被用作其他用途,不方便再用作计数了,所以这个时候就只能用软件方法延时。软件方法延时就是循环语句来实现。7 b- p! w- P5 w: ]3 t, H
" D+ s. j9 c) V) Y% ^$ Y
通过使用带_NOP_();语句的函数实现,定义一系列不同的延时函数。我们都知道C语言最终通过编译生成汇编,所以一条C语言可能会反汇编成多条汇编语句,每条汇编指令都有指令周期,比如我们时钟是8Mhz的,那么一个指令周期就是125ns,那么NOP是一个空指令,占用一个指令周期。假如我们定义一个1ms的延时函数,那么函数里面全部用NOP指令也需要循环多次,那么循环语句也可能会有多条汇编实现,具体的根据编译器不同也不同,我们就很难精确的计算出实际的延时,那么计算大概也可以,然后最有效直接的方法就是通过示波器去测试然后再去调整循环数。不要太纠结计算数值,可以调试的。示波器测试方法更简单,在延时前后加一个引脚的输出反转信号就可以了。# T7 D; l# Z; K$ S- ~

, t1 k( Y" k+ N/ ^: c1 a8 y$ \到这里大家是不是觉得其实用汇编写延时函数就能做到精确了呢?相比较C语言,的确是汇编可以做到很精确的数值,因为我们可以确定每条指令的指令周期是多少,根据延时函数用到的所有指令都可以计算出来,最终计算得出比较精准的循环数值。
. m: S# D" M+ q; s0 N$ X3 |- \6 A9 K  V. [+ r' q
2、硬件延时-定时器/计数器实现. R  w5 r8 S+ V* [! J- j+ y# x4 N

# z* r9 ^0 V  \7 [6 Q! R当然在大多情况下,我们还是会选择定时器来做延时处理,首先我们可以通过时钟配置定时器工作,获得精准计数,具体精准程度要看给定时器用的时钟了,内部时钟或者外部晶振的精度。可以实现极短时间的精确延时。
- l# y+ k& P, ]! L7 k$ }  ^' R4 }, O0 h4 m
在实际应用中,定时常采用中断方式,通过对定时器的配置,获得中断方式和定时时间,然后通过判断计数值获得想要的延时效果,用这种方法从程序的执行效率和稳定性方面考虑都是最佳的方案。大部分项目主循环需要处理很多事情,如果在主循环中用软件延时方法难免需要等待过程,尤其是长延时的时候不能处理其他,如果好多外设在工作,会造成通信不上或者响应不及时。
. z, d7 A2 D; Q' T% j
/ }2 O+ N/ t/ H) p# t总结:大部分程序中我们可以写个小的软件延时,必须等待的小延时可以用软件的实现,就可以省去对延时时间的判断了,等待就可以了。但是需要测试延时时间是否准确,或者可以直接用汇编写延时函数。硬件延时也有必要实现,根据实际需求去应用。9 }0 z: ?' I! U

% A( {( m6 G. `. s# I大部分延时应用过程中还是会有些误差的,这个是在多个小的误差基础上叠加的,是可以接受的。

% M6 t9 e) b( |. |0 F

该用户从未签到

2#
发表于 2021-10-14 13:51 | 只看该作者
软件方法延时就是循环语句来实现

该用户从未签到

3#
发表于 2021-10-14 13:52 | 只看该作者
在实际应用中,定时常采用中断方式
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-10-6 23:18 , Processed in 0.125000 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表