0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

单片机延时是怎么实现的

单片机匠人 来源:张飞实战电子 作者:蔡琰老师 2021-10-12 17:18 次阅读

单片机延时大家程序中都会用到,那么怎么实现呢?通常我们有软件实现,就是语句循环;或者硬件实现,通过定时器/计数器。

对于精准而言,从实现语言方向看,底层语言有汇编C语言,通常我们单片机程序用C语言比较多,但是相对而言汇编更精准。从实现方式来看,有软件方式和硬件方式,那么对于C语言延时的方法哪种更精准呢?自然是定时器计数器的方式了,为什么呢?一起来看看吧。

1、软件延时-循环实现

在很多时候,定时器会被用作其他用途,不方便再用作计数了,所以这个时候就只能用软件方法延时。软件方法延时就是循环语句来实现。

通过使用带_NOP_();语句的函数实现,定义一系列不同的延时函数。我们都知道C语言最终通过编译生成汇编,所以一条C语言可能会反汇编成多条汇编语句,每条汇编指令都有指令周期,比如我们时钟是8Mhz的,那么一个指令周期就是125ns,那么NOP是一个空指令,占用一个指令周期。假如我们定义一个1ms的延时函数,那么函数里面全部用NOP指令也需要循环多次,那么循环语句也可能会有多条汇编实现,具体的根据编译器不同也不同,我们就很难精确的计算出实际的延时,那么计算大概也可以,然后最有效直接的方法就是通过示波器去测试然后再去调整循环数。不要太纠结计算数值,可以调试的。示波器测试方法更简单,在延时前后加一个引脚的输出反转信号就可以了。

到这里大家是不是觉得其实用汇编写延时函数就能做到精确了呢?相比较C语言,的确是汇编可以做到很精确的数值,因为我们可以确定每条指令的指令周期是多少,根据延时函数用到的所有指令都可以计算出来,最终计算得出比较精准的循环数值。

2、硬件延时-定时器/计数器实现

当然在大多情况下,我们还是会选择定时器来做延时处理,首先我们可以通过时钟配置定时器工作,获得精准计数,具体精准程度要看给定时器用的时钟了,内部时钟或者外部晶振的精度。可以实现极短时间的精确延时。

在实际应用中,定时常采用中断方式,通过对定时器的配置,获得中断方式和定时时间,然后通过判断计数值获得想要的延时效果,用这种方法从程序的执行效率和稳定性方面考虑都是最佳的方案。大部分项目主循环需要处理很多事情,如果在主循环中用软件延时方法难免需要等待过程,尤其是长延时的时候不能处理其他,如果好多外设在工作,会造成通信不上或者响应不及时。

总结:大部分程序中我们可以写个小的软件延时,必须等待的小延时可以用软件的实现,就可以省去对延时时间的判断了,等待就可以了。但是需要测试延时时间是否准确,或者可以直接用汇编写延时函数。硬件延时也有必要实现,根据实际需求去应用。

大部分延时应用过程中还是会有些误差的,这个是在多个小的误差基础上叠加的,是可以接受的。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    5991

    文章

    43904

    浏览量

    619617
  • 软件
    +关注

    关注

    67

    文章

    4321

    浏览量

    85411
  • C语言
    +关注

    关注

    180

    文章

    7513

    浏览量

    124138

原文标题:单片机延时的两种实现方法

文章出处:【微信号:gh_e7f294a514ca,微信公众号:单片机匠人】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    AvR单片机1us延时函数数怎么写

    在编写AvR单片机的1us延时函数之前,我们首先需要了解几个关键概念。 单片机延时函数是通过控制器在特定的时间间隔内执行一系列的指令来实现
    的头像 发表于 12-26 14:02 290次阅读

    单片机如何实现通讯 ?

    单片机如何实现通讯
    发表于 11-10 07:51

    单片机的编程中有什么好办法取代delay延时

    单片机的编程中 有什么好办法取代delay延时?不用中断,麻烦大神给写个例子供我学习一下,感谢!
    发表于 11-09 07:59

    51单片机中如果晶振是24KHZ,延时函数如何来计算出比较准确的延时

    51单片机中如果晶振是24KHZ,延时函数如何来计算出比较准确的延时延时是如何计算的,哪位大侠,给个计算的过程,谢谢!
    发表于 11-09 06:20

    请问51单片机for需要延时是怎样计算延时的?

    请问有谁知道51单片机for语句延时是怎么计算延时的? delayms(unsigned uchar ij) { for(i=1000;i>0;i--) for(j=110;j>0;j--); } 晶振频率为11.0
    发表于 10-31 07:35

    51单片机如何实现毫秒级精确延时

    51单片机如何实现毫秒级精确延时
    发表于 10-27 06:25

    请问单片机中断和延时有什么区别?

    单片机中断和延时有什么区别?​
    发表于 10-20 08:16

    用C语言如何写出单片机延时程序,且延时时间如何计算的?

    用C语言,如何写出单片机延时程序,且延时时间如何计算的?
    发表于 10-18 08:19

    51单片机怎么进行ns级延时

    51单片机怎么进行ns级延时
    发表于 10-17 07:36

    51单片机的交通灯延时问题怎么解决?

    关于51单片机的交通灯延时问题怎么解决?
    发表于 10-17 06:33

    如何确定一个晶振12M的单片机程序中延时程序延时的时间呢?

    请问如何确定一个晶振12M的单片机程序中延时程序延时的时间呢? 比如说12M晶振,晶振周期1/12微妙,一个机器周期包含12个晶振周期,所以12M晶振时机器周期=12x(1/12)微秒=1微秒
    发表于 09-27 08:30

    基于单片机用软件实现直流电机PWM调速系统

    介绍了基于单片机用PWM实现直流电机调整的基本方法,直流电机调速的相关知识,及PWM调整的基本原理和实现方法。重点介绍了基于MCS一51单片机的用软件产生PWM信号的途径,并介绍了一种
    发表于 09-22 07:56

    STM32单片机延时原理和延时函数方法

    当涉及到单片机编程时,延时是一项常见但关键的任务。在许多应用中,我们需要控制程序暂停一段时间,以实现精确的时间控制或协调不同设备之间的操作。本文将以STM32为例,介绍关于单片机
    发表于 08-09 09:13 8895次阅读

    基于51单片机点亮和延时关闭照明设备仿真源码

    基于51单片机点亮和延时关闭照明设备仿真设计
    发表于 05-22 16:00 0次下载

    如何实现单片机与CPLD通讯呢?

    单片机为P89V51RD2,CPLD为ATF1508AS,现在要实现单片机与CPLD的通讯,如何实现?希望能讲清原理和用VHDL语言实现,谢
    发表于 04-23 14:22