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

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

3天内不再提示

你会51单片机的精确延时吗?

璟琰乀 来源:嵌入式linux 作者:嵌入式linux 2020-11-05 10:40 次阅读

前言

对于某些对时间精度要求较高的程序,用 c 写延时显得有些力不从心,故需用到汇编程序。

本人通过测试,总结了 51 的精确延时函数(在 c 语言中嵌入汇编)分享给大家。至于如何在 c 中嵌入汇编大家可以去网上查查,这方面的资料很多,且很简单。

以 12MHz 晶振为例,12MHz晶振的机器周期为 1us,所以,执行一条单周期指令所用时间就是 1us,如 NOP 指令。下面具体阐述一下。

若要延时 1us,则可以调用_nop_();函数,此函数是一个 c 函数,其相当于一个 NOP 指令

使用时必须包含头文件 intrins.h

例如:

#include 《intrins.h》#include 《reg52.h》void main(void){ P1 = 0x0; _nop_(); //延时 1us P1 = 0xff;}

延时 5us,则可以写一个delay_5us()函数

delay_5us(){ #pragma asm nop #pragma endasm}

这就是一个延时 5us 的函数,只需要在需要延时 5us 时调用此函数即可。或许有人会问,只有一个 NOP 指令,怎么是延时 5us 呢?

答案是:

在调用此函数时,需要一个调用指令,此指令消耗 2个周期(即 2us);函数执行完 毕时要返回主调函数,需要一个返回指令,此指令消耗 2 个周期(2us)。调用和返回消耗了

2us + 2us = 4us。然后再加上一个NOP指令消耗 1us,不就是5us吗?

延时 10us。

我们编写一个 delay_10us()函数

delay_10us(){#pragma asmnopnopnopnopnopnop#pragma endasm}

这就是延时 10us 的函数。同延时 5us 函数一样,调用和返回消耗 4us,加上函数中的6个 NOP 指令6us,正好是10us。

此时有人不禁要问那么,任意微秒时,函数应该怎么写呢?

看我慢慢道来:首先,延时任意微秒我暂时没有想到,但是,我可以延时任意偶数微秒或延时任意奇数微秒, 也就是说,需要两个函数,一个函数专门实现任意偶数的微秒级延时,另一个函数专门实现 任意奇数的微秒级延时。只要有了这两个函数在,不就可以延时任意的微秒了吗!

首先我们来实现任意偶数的微秒级延时:

void delay_even_us(unsigned char even){ //任意偶数的微秒级延时#pragma asm1 mov a, r7 //为什么要用到 r7 呢,因为 r7 里面装的是函数的参数!!!// ^_^ 这句消耗 1 个周期2 subb a, #10H //这句看完程序我再解释 这句消耗 1 个周期3 mov b, #02H //这句看完程序我再解释 这句消耗 2 个周期4 div ab // 这句意思是 a/b ,商放在 a 里,余数放在 b 里 稍//后解释 这句消耗 4 个周期5 mov r0, a //这句消耗 1 个周期6 nop //这句消耗 1 个周期7 loop:8 djnz r0, loop //不等于 0 跳转指令,也就是说 r0 中的值若不为 0 的话,//就跳转到 loop 处 这句消耗 2 个周期#pragma endasm}

下面我们来分析一下为何这样写:为了方便分析,我给句子编上了序号。我们以延时 100us为例(delay_even_us(100))。

首先减去调用和返回的 4 个周期(4us)。再减去参数传递所消耗的2 个周期。因为 c 函数参数传递到汇编是需要消耗周期的。一共消耗了 6 个周期。也就是消 耗了 6us,还剩下 100us-6us=94us。

然后再看我再程序上面注释的各语句消耗时间:

从 1 句到 5 句一共消耗了 10 个周期(不信你数数^_^)。还剩下 94us-10us=84us。

现在就看第 8 句了,这句应该消耗 84 个周期才能达到我们延时 100us。而这句每执行一次消耗 2 个周期,也就是说 r0 的值应该为 84/2=42。

那么,怎样达到 r0=42 的呢?我们从第 1 句开始分析:

第 1 句中,r7 为 c 传递过来的参数,此例子中为 100.执行完此句后 a 的值为 100;

第 2 句中,将 a=a-16 = 100-16=84。此句结束后 a 的值为 84;

第 3 句中,给 b 赋值为 2;

第 4 句中,用 a 来除以 b。结果商存入 a 中,余数存入 b 中,此句结束后 a 的值为 a=a/b = 84/2= 42;

第 5 句,将 a 值赋给 r0,此句结束后 r0 的值为 42。

于是乎, r0 的值为 42 这个目的达到了。结合前面的分析,此程序是不是延时了 100us 呢?

答案当然是 “是”了!

这个函数可以实现任意偶数微秒(》=18)的延时的,不信的话可以带一个值进去算的。至于为什么值必须》=18us,用不着我解释了吧。

任意奇数的微秒级延时:

void delay_odd_us(unsigned char odd){#pragma asm1 mov a, r72 subb a, #0fH3 mov b, #02H4 div ab5 mov r0, a6 loop1:7 djnz r0, loop1#pragma endasm}

此即为任意奇数微秒的延时,和偶数延时一样的道理,不解释了。^_^

此函数的参数必须大于等于 17,请思考为什么?^_^

责任编辑:haq

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

    关注

    87

    文章

    10992

    浏览量

    206744
  • C语言
    +关注

    关注

    180

    文章

    7534

    浏览量

    128826
收藏 人收藏

    评论

    相关推荐

    stm32和51单片机的区别

    stm32和51单片机的区别 随着单片机的发展,市场上出现了很多种类和品牌的单片机,其中STM32和51
    发表于 11-20 13:18

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

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

    单片机学习R8200C、MQTT协议、网关、延时器、蜂鸣器

    ,必然要经过一扇门。同样,从一个网络向另一个网络发送信息,也必须经过一道“关口”,这道关口就是网关。顾名思义,网关就是一个网络连接到另一个网络的“关口”。 延时器: 什么是硬件延时定时器? 在51
    发表于 11-06 13:04

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

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

    32单片机51单片机的功能差异是什么?

    32单片机51单片机功能差在哪些方面
    发表于 10-31 06:19

    51单片机没有按复位按键有时候也复位的原因?

    51单片机复位原理,没有按复位按键有时候也复位
    发表于 10-30 07:01

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

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

    怎么编程去计算51单片机某个io口的输入高低电平时间?

    本人是个新手刚刚接触51单片机,怎么编程去计算51单片机某个io口的输入高低电平时间,比如我从P1.0口输入了一个方波信号,那么怎么通过单片机
    发表于 10-20 07:11

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

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

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

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

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

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

    51单片机定时器讲解

    前面我们讲解了通用IO输入输出,延时函数和外部中断,今天我们讲解单片机另一个重要的功能,定时器。顾名思义,定时器就是用来定时的,与延时函数的设置不同,延时函数是不
    发表于 07-14 16:22 1594次阅读
    <b class='flag-5'>51</b><b class='flag-5'>单片机</b>定时器讲解

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

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

    ARM单片机51单片机有什么区别

    ARM单片机51单片机都是嵌入式微控制器,它们都有自己的特点和应用领域。本文将介绍ARM单片机51
    的头像 发表于 05-08 13:58 2131次阅读

    基于AT89C51单片机光耦控制点亮和延时关闭照明设备Proteus仿真及程序

    基于AT89C51单片机光耦控制点亮和延时关闭照明设备Proteus仿真及程序
    发表于 05-05 10:26 3次下载