侵权投诉

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

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》voidmain(void){P1=0x0;_nop_();//延时1usP1=0xff;}

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

delay_5us(){#pragmaasmnop#pragmaendasm}

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

答案是:

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

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

延时10us。

我们编写一个delay_10us()函数

delay_10us(){#pragmaasmnopnopnopnopnopnop#pragmaendasm}

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

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

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

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

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

下面我们来分析一下为何这样写:为了方便分析,我给句子编上了序号。我们以延时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,用不着我解释了吧。

任意奇数的微秒级延时:

voiddelay_odd_us(unsignedcharodd){#pragmaasm1mova,r72subba,#0fH3movb,#02H4divab5movr0,a6loop1:7djnzr0,loop1#pragmaendasm}

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

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

责任编辑:haq

收藏 人收藏
分享:

评论

相关推荐

C语言程序设计实用教程

在各章的讲解穿插典型实例进行说明。本书的写作以基本功能介绍(穿插实例)为主,每章最后以一个比较典型的....
发表于 02-26 16:17 5次 阅读
C语言程序设计实用教程

Linux内核进程调度schedule深入理解的详细资料说明

本文以 linux-2.4.10为例主要分析 Linux进程调度模块中的 schedule函数及其相....
发表于 02-26 16:17 6次 阅读
Linux内核进程调度schedule深入理解的详细资料说明

Ubuntu中Git使用教程

Linus在1991年创建了开源的Linux,从此,Linux系统不断发展,已经成为最大的服务器系统....
发表于 02-26 15:01 5次 阅读
Ubuntu中Git使用教程

Linux中的declare/typeset命令功能简介

1.功能简介 declare(别名 typeset)属 Shell 内建命令,用于申明 Shell ....
的头像 Linux爱好者 发表于 02-26 14:18 52次 阅读
Linux中的declare/typeset命令功能简介

Linux中cut命令的格式和选项说明

1.命令简介 cut 是一个选取命令,以行为单位,选择性输出符合条件的内容到标准输出。 cut 命令....
的头像 Linux爱好者 发表于 02-26 14:13 48次 阅读
Linux中cut命令的格式和选项说明

Linu中col命令的介绍和示例

1.命令简介 col(control)命令是一个标准输入文本过滤器,它从标准输入读取内容,过滤掉控制....
的头像 Linux爱好者 发表于 02-26 14:08 84次 阅读
Linu中col命令的介绍和示例

Linux驱动中的platform总线详解

platform总线是学习linux驱动必须要掌握的一个知识点。 一、概念 嵌入式系统中有很多的物理....
的头像 Linux爱好者 发表于 02-26 14:02 145次 阅读
Linux驱动中的platform总线详解

Linux的内核定制方法详细说明

本文档的主要内容详细介绍的是Linux的内核定制方法详细说明
发表于 02-26 11:14 4次 阅读
Linux的内核定制方法详细说明

Linux的内核定制方法详细说明

本文档的主要内容详细介绍的是Linux的内核定制方法详细说明
发表于 02-26 11:14 6次 阅读
Linux的内核定制方法详细说明

DSP芯片的应用总结详细资料说明

数字信号处理( Digital Signal Processing ,简称DSP )是一门涉及许多学....
发表于 02-25 11:52 26次 阅读
DSP芯片的应用总结详细资料说明

Android内核开发实践的详细资料说明

Android作为 Google公司推出的一款手机开发平台,其本身是基于 linux内核的。 Goo....
发表于 02-25 11:52 23次 阅读
Android内核开发实践的详细资料说明

干货分享:C语言函数大全和C语言程序实例~

对于初学C语言以至于单片机的,很好的例程练习和C语言函数查阅资料,对于程序员笔试题也是很好的借鉴。 ...
发表于 02-25 11:30 132次 阅读
干货分享:C语言函数大全和C语言程序实例~

如何在Linux下实现H.264解码器的优化

H.264是 ITU-T VCGE和 ISO MPEG联合开发的最新视频标准。它虽然具有很多优良性能....
发表于 02-25 11:06 10次 阅读
如何在Linux下实现H.264解码器的优化

怎么制作寻迹小车?

智能小车现在差不多是竞赛或者DIY中的主流了,寻迹,壁障,遥控什么的,相信大家也都见得很多了,这次就大家探讨一下寻迹小车...
发表于 02-25 07:26 0次 阅读
怎么制作寻迹小车?

一文汇总Linux常规的硬件基础命令

cat /proc/cpuinfo # 查看 CPU 核心数,架构,名字,频率,缓存,指令集等命令
的头像 陈翠 发表于 02-24 11:16 107次 阅读
一文汇总Linux常规的硬件基础命令

使用LabVIEW的鼠标坐标反馈

当事件发生时,鼠标的位置坐标是很重要的信息,有时我们也需要提取鼠标坐标的历史轨迹来作为分析问题的工具....
发表于 02-24 08:00 19次 阅读
使用LabVIEW的鼠标坐标反馈

uboot是怎么传参给内核的?

uboot是怎么传参给内核的? linux怎么进行内存管理? 进程和线程的区别是什么 ...
发表于 02-24 07:56 0次 阅读
uboot是怎么传参给内核的?

Linux中如何加入led驱动及测试程序?

Linux中加入led驱动及测试程序详解
发表于 02-24 07:27 0次 阅读
Linux中如何加入led驱动及测试程序?

C语言编程的基本规范有哪些?

为了提高源程序的质量和可维护性,从而最终提高软件产品生产力,特编写此规范。本标准规定了程序设计人员进行程序设计时必须遵循...
发表于 02-24 07:22 0次 阅读
C语言编程的基本规范有哪些?

Linux内核新增的异构内存管理会带来什么不一样?

Linux 内核新增的异构内存管理(HMM)会带来什么不一样?...
发表于 02-24 07:20 0次 阅读
Linux内核新增的异构内存管理会带来什么不一样?

火星首个开源Linux系统以及飞行软件框架F Prime

从保护罩中被释放后,“毅力号”火星车将被吊车悬挂,通过尼龙绳和负责信号、控制指令传输的电缆,连接“吊....
的头像 传感器技术 发表于 02-23 15:51 156次 阅读
火星首个开源Linux系统以及飞行软件框架F Prime

Linux系统中split命令的常用示例

1.命令简介 split 命令用于将一个大文件分割成较小的文件,默认每 1000 行分割成一个小文件....
的头像 Linux爱好者 发表于 02-23 11:36 109次 阅读
Linux系统中split命令的常用示例

Linux 5.12将修复系统意外关机的问题

Linux 5.11 上个星期才发布稳定版,Linux 5.12 目前仍在开发过程中。在 Linux....
的头像 Linux爱好者 发表于 02-23 11:35 180次 阅读
Linux 5.12将修复系统意外关机的问题

Linux中的fdisk命令简介

1.命令简介 fdisk 命令用于创建和维护磁盘分区表。它采用传统的问答式界面,而不是类似于 fdi....
的头像 Linux爱好者 发表于 02-23 11:24 117次 阅读
Linux中的fdisk命令简介

美国“毅力号”给火星送去Linux系统以及手机芯片?

“确认着陆!毅力号安全到达火星表面。”   就在今天凌晨4点55分,美国“毅力号”不经变轨,直接冲入....
的头像 Linux爱好者 发表于 02-23 11:16 180次 阅读
美国“毅力号”给火星送去Linux系统以及手机芯片?

Linux中iconv命令的简介和使用方法

1.命令简介 iconv命令是用来转换文件的编码方式,比如它可以将UTF8编码的转换成GB18030....
的头像 Linux爱好者 发表于 02-23 11:14 172次 阅读
Linux中iconv命令的简介和使用方法

Linux中的vim命令说明

1.简介 vim 是 Linux 操作系统中最通用的全屏幕文本编辑器,是 vi 的增强版(vi iM....
的头像 Linux爱好者 发表于 02-23 11:06 136次 阅读
Linux中的vim命令说明

ETCD集群的工作原理和高可用技术细节介绍

【导读】新年快乐!本文介绍了etcd集群的工作原理和高可用技术细节。 etcd 简介 coreos ....
的头像 Linux爱好者 发表于 02-23 10:54 131次 阅读
ETCD集群的工作原理和高可用技术细节介绍

Linux基础千锤百炼的学习课件免费下载

本文档的主要内容详细介绍的是Linux基础千锤百炼的学习课件免费下载。
发表于 02-23 08:00 5次 阅读
Linux基础千锤百炼的学习课件免费下载

C与VB语言联合在proteus上仿真实例的工程文件免费下载

本文档的主要内容详细介绍的是C与VB语言联合在proteus上仿真实例的工程文件免费下载。
发表于 02-23 08:00 10次 阅读
C与VB语言联合在proteus上仿真实例的工程文件免费下载

单片机应用编程技巧那些常见的问题有哪些?

C语言和汇编语言在开发单片机时各有哪些优缺点?   C或汇编语言可以用于单片机,C++能吗?   搞单片机...
发表于 02-23 06:10 0次 阅读
单片机应用编程技巧那些常见的问题有哪些?

Linux释放内存的方法

一般系统是不会自动释放内存的 关键的配置文件/proc/sys/vm/drop_caches。这个文....
的头像 陈翠 发表于 02-21 10:34 121次 阅读
Linux释放内存的方法

Linux后台启动程序的方式

通常在Linux系统运行某个程序的时候会占用当前终端控制台,当会话控制台结束后程序也随之关闭,那如何....
的头像 陈翠 发表于 02-21 10:32 143次 阅读
Linux后台启动程序的方式

Linux内核内存泄漏怎么办?

什么是内存泄漏: 程序向系统申请内存,使用完不需要之后,不释放内存还给系统回收,造成申请的内存被浪费....
的头像 Linuxer 发表于 02-20 17:14 239次 阅读
Linux内核内存泄漏怎么办?

谈一谈Linux让实时任务独占CPU的事

本文主要讨论在高实时要求、高效能计算、DPDK等领域,Linux如何让某一个线程排他性独占CPU;独....
的头像 Linuxer 发表于 02-20 17:11 249次 阅读
谈一谈Linux让实时任务独占CPU的事

嵌入式C语言的高级用法

内存管理 我们需要知道——变量,其实是内存地址的一个抽像名字罢了。在静态编译的程序中,所有的变量名都....
的头像 玩转单片机 发表于 02-20 14:25 123次 阅读
嵌入式C语言的高级用法

美国毅力号携带Linux系统和骁龙801登陆月球

“确认着陆!毅力号安全到达火星表面。”就在昨天凌晨4点55分,美国“毅力号”不经变轨,直接冲入火星大....
的头像 如意 发表于 02-20 09:56 390次 阅读
美国毅力号携带Linux系统和骁龙801登陆月球

疯壳Android嵌入式Linux平板开发教程4-1Linux引导过程

详情地址:https://fengke.club/GeekMart/views/offline/android 购买链接:https://fengke.club/GeekMart/su_fHnaDyD1o...
发表于 02-19 14:36 101次 阅读
疯壳Android嵌入式Linux平板开发教程4-1Linux引导过程

疯壳Android嵌入式Linux平板开发教程3-8GPS

详情地址: 购买链接: 视频地址: GPS:接入GPS天线,打开菜单—GPS TEST—进行搜索附近位置点,需要将...
发表于 02-19 14:18 101次 阅读
疯壳Android嵌入式Linux平板开发教程3-8GPS

疯壳Android嵌入式Linux平板开发教程3-7摄像头

详情地址: 摄像头:菜单—摄像头,摄像头在板子左下方。 ...
发表于 02-19 14:17 0次 阅读
疯壳Android嵌入式Linux平板开发教程3-7摄像头

美国国防高级研究计划局(DARPA)将与Linux基金会合作

美国国防高级研究计划局(DARPA)将与Linux基金会合作,促进开放的5G、边缘计算、人工智能和物....
的头像 我快闭嘴 发表于 02-19 09:28 260次 阅读
美国国防高级研究计划局(DARPA)将与Linux基金会合作

Linux 5.12带来避免设备过热损坏的DTPM功耗控制特性

Linux 5.12的推送请求不断涌入新开放的合并窗口,这个合并窗口预计会在4月底看到它的稳定版本。....
的头像 工程师邓生 发表于 02-18 17:32 242次 阅读
Linux 5.12带来避免设备过热损坏的DTPM功耗控制特性

因北美严寒与暴风雪 Linux 5.12合并窗口被迫暂停

本周,美国多个州遭遇冬季寒潮,部分区域迎来罕见的低温和暴风雪,各地基础设施建设与监管漏洞导致能源供应....
的头像 工程师邓生 发表于 02-18 15:05 301次 阅读
因北美严寒与暴风雪 Linux 5.12合并窗口被迫暂停

苹果M1处理器成功运行Linux

万物皆可Linux,这绝非一句玩笑话,苹果M1处理器已经可以成功运行它了。
的头像 如意 发表于 02-05 15:49 532次 阅读
苹果M1处理器成功运行Linux

讲解Linux之快速查找被删除的文件

日常运维过程中,我们经常需要处理磁盘空间问题,当接到告警后,第一时间会去找那些大文件,一般比如 Ce....
的头像 如意 发表于 02-04 16:29 467次 阅读
讲解Linux之快速查找被删除的文件

使用单片机C语言程序实现电子秤仿真设计的实例免费下载

本文档的主要内容详细介绍的是使用单片机C语言程序实现电子秤仿真设计的实例免费下载。
发表于 02-04 16:25 113次 阅读
使用单片机C语言程序实现电子秤仿真设计的实例免费下载

C语言开发单片机为啥都是全局变量形式?

全局变量简直就是嵌入式系统的戈兰高地。冲突最激烈的双方是: 1. 做控制的工程师; 2. 做非嵌入式....
发表于 02-04 06:14 37次 阅读
C语言开发单片机为啥都是全局变量形式?

C语言多线程的详细教程资料说明

Windows是一个多任务的系统,如果你使用的是windows 2000及其以上版本,你可以通过任务....
发表于 02-03 17:02 47次 阅读
C语言多线程的详细教程资料说明

智能手机市场根据其软件分为两种不同的类型-Android和iOS

有一个移动操作系统Ubuntu的所谓的触摸,基于流行的Linux发行- Ubuntu Linux系统....
的头像 倩倩 发表于 02-03 14:45 404次 阅读
智能手机市场根据其软件分为两种不同的类型-Android和iOS

Linux内核包的构建和安装详解

许多各种各样的UNIX和 Linux软件是源码形式的压缩文件。这些一样的安装包在编译后运行在不同的机....
发表于 02-03 10:40 38次 阅读
Linux内核包的构建和安装详解

51单片机C语言常用模块与综合系统设计实例精讲的PDF电子书免费下载

《51单片机C语言常用模块与综合系统设计实例精讲》全书针对目前最通用流行的51单片机系列,通过大量典....
发表于 02-03 10:40 74次 阅读
51单片机C语言常用模块与综合系统设计实例精讲的PDF电子书免费下载

如何在C代码中插入寄存器?

对于逻辑级数较高的路径,常用的方法之一是在其中插入流水寄存器,将路径打断,从而降低逻辑延迟,这在HD....
的头像 Lauren的FPGA 发表于 02-02 17:07 302次 阅读
如何在C代码中插入寄存器?

Verilog数字系统设计教程的PDF电子书免费下载

数字信号处理(DSP)系统的研究人员一直在努力寻找各种优化的算法来解决相关的信号处理问题。当他们产生....
发表于 02-02 16:19 48次 阅读
Verilog数字系统设计教程的PDF电子书免费下载

id命令:用于查看真实有效的用户ID和组ID

1.命令简介 id 命令用于查看真实有效的用户 ID(UID)和组 ID(GID)。 2.命令格式 ....
的头像 Linux爱好者 发表于 02-02 14:51 215次 阅读
id命令:用于查看真实有效的用户ID和组ID

readelf命令:用于读取ELF格式文件的详细信息

1.功能简介 readelf 用于读取 ELF(Executable and Linkable Fo....
的头像 Linux爱好者 发表于 02-02 14:45 259次 阅读
readelf命令:用于读取ELF格式文件的详细信息

16岁高中生为一台无法正常使用的iPhone 7成功移植了Ubuntu 20.04

近日,国外一名 16 岁的开发者发布了一则视频,展示自己为一台已经无法正常使用的 iPhone 7 ....
的头像 Linux爱好者 发表于 02-02 14:35 369次 阅读
16岁高中生为一台无法正常使用的iPhone 7成功移植了Ubuntu 20.04

pidof命令:用于查找指定名称进程的进程ID

1.命令简介 pidof 命令用于查找指定名称进程的进程ID,是命令 killall5 的一个软链接....
的头像 Linux爱好者 发表于 02-02 14:16 254次 阅读
pidof命令:用于查找指定名称进程的进程ID

as命令:用于将汇编代码编译为二进制代码

  1.命令简介 as 命令是二进制工具集 GNU Binutils 的一员,是 GNU 推出的一款....
的头像 Linux爱好者 发表于 02-02 14:03 227次 阅读
as命令:用于将汇编代码编译为二进制代码

strings命令:用于打印文件中可打印字符串

  1.命令简介 strings 命令是二进制工具集 GNU Binutils 的一员,用于打印文件....
的头像 Linux爱好者 发表于 02-02 13:53 186次 阅读
strings命令:用于打印文件中可打印字符串

瑞萨电子推出业界首款基于清晰源代码格式的IEEE1588同步软件

全新完整时钟解决方案将IEEE1588软件与瑞萨时钟芯片相结合,提供更高设计灵活性,大幅降低数据包延....
发表于 02-02 13:46 1317次 阅读
瑞萨电子推出业界首款基于清晰源代码格式的IEEE1588同步软件

AM4379 AM437x ARM Cortex-A9 微处理器 (MPU)

TI AM437x高性能处理器基于ARM Cortex-A9内核。 这些处理器通过3D图形加速得到增强,可实现丰富的图形用户界面,还配备了协处理器,用于进行确定性实时处理(包括EtherCAT,PROFIBUS,EnDat等工业通信协议)。该器件支持高级操作系统(HLOS)。基于Linux的® 可从TI免费获取。其它HLOS可从TI的设计网络和生态系统合作伙伴处获取。 这些器件支持对采用较低性能ARM内核的系统升级,并提供更新外设,包括QSPI-NOR和LPDDR2等存储器选项。 这些处理器包含功能方框图中显示的子系统,并且后跟相应的“说明”中添加了更多信息说明。 处理器子系统基于ARM Cortex-A9内核,PowerVR SGX™图形加速器子系统提供3D图形加速功能以支持显示和高级用户界面。 可编程实时单元子系统和工业通信子系统(PRU-ICSS与ARM内核分离,允许单独操作和计时,以实现更高的效率和灵活性.PRU-ICSS支持更多外设接口和EtherCAT,PROFINET,EtherNet /IP,PROFIBUS,以太网Powerlink,Sercos,EnDat等...
发表于 09-25 11:51 220次 阅读
AM4379 AM437x ARM Cortex-A9 微处理器 (MPU)