用单片机C语言精确延时(定时)的方法

2023-10-26

用单片机C语言精确延时(定时)的方法

作者:51hei   来源:原创   点击数:…  更新时间:2009年09月29日   【字体:大 中 小】

  最近在忙着单片机的项目,偶尔停下来小结了一下最近的收获,还是有不少可贵的收益的。

  本人在闲暇的时候对单片机C语言下的各类延时程序做了下总结。由于单片机C语言下利用软件延时不容易做到精确的定时,所以很多人在编写延时子程序的时候不能好好的把握延时的具体时间。C语言下,延时程序主要有以下几种:

一:

void delay(unsigned char k)
{

 unsigned char i,k;  //定义变量
 for(i=0;i<k;i++);      //for循环语句

}

该程序在Keil环境下,会先将C语言转化成汇编语言,那么我们就可以根据汇编语言来计算出精确的时间,转化具体步骤如下:

 CLR A   ;指令1
 MOV R7,A ;指令2  
LOOP:
   INC R7  ;指令3
   CJNE  R7,k,LOOP    ;指令4

这里,指令1,指令2和指令3各消耗1个机器周期,指令4消耗两个机器周期(可查此表得知:http://www.51hei.com/mcuteach/1312.html),而在12M的晶振下一个机器周期是1us,在这个过程中,指令1和指令2分别执行1次,即消耗1+1us,而指令3和指令4分别执行了k次,那么这样加起来,这个延时子程序所消耗的具体时间就是t=1+1+(1+2)*k=3k+2us。

呵呵,这样说来,如果我们定义的k为100的话,这个延时子程序的精确时间就是302us。  

二:

void delay(unsigned char i)
{
while(--i)
{;}
} 

同样的道理,将其反汇编,可以看到,只有一条语句:DJNZ  i,$;

该语句消耗2us,一共执行i次,所以总共消耗时间t=i*2us。

三:

下面的将形参换为整形int,这样的话,反汇编所执行的语句完全不同,用个具体的数字做例子:

void delay()
{
 unsigned int i=10000;
 while(--i)
;
}

反汇编后:

     4:         unsigned int i=10000;

C:0x0003    7F10     MOV      R7,#0x10
C:0x0005    7E27     MOV      R6,#0x27

     5:         while(--i)
     6: ;
C:0x0007    EF       MOV      A,R7
C:0x0008    1F       DEC      R7
C:0x0009    7001     JNZ      C:000C
C:0x000B    1E       DEC      R6
C:0x000C    14       DEC      A
C:0x000D    4E       ORL      A,R6
C:0x000E    70F7     JNZ      C:0007

具体计算如下

1.R7经过10H(16)次循环减为0:
t1=10H*(1+1+2+1+1+2)
2.R6经过27H*256次循环减为0:
t2=27H*256*(1+1+2+1+1+2)+27H*1
3.最后R7的是变为255,因此还要多出255次的循环:
t3=255*(1+1+2+1+1+2)
4.加上之前消耗的2us,总消耗时间:
T=2+10H*(1+1+2+1+1+2)+27H*256*(1+1+2+1+1+2)+27H*1+255*(1+1+2+1+1+2)
=2+16*7+39*256*7+39*1+255*7
=71826us
大约为72ms吧
如果定义一个unsigned int i,那么延时计算公式为T=2+(i%256)*7+(i/256)*256*7+i/256+255*7

关于其他类型的延时程序都可以按照这个方法对时间进行较为精确的计算。

如果你懒得计算我还给大家推荐一个简单的方法:就是用keil的软件仿真功能来仿真出C语句执行的时间,具体方法可以看这里:http://www.51hei.com/bbs/dpj-4711-1.html

昨天熬夜整理的,从这个程序中可以看出单片机C语言和汇编语言的一些区别,希望对大家有帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用单片机C语言精确延时(定时)的方法 的相关文章

  • javaEE企业级框架ssm知识点整合【思维导图】

    ssm Spring SpringMVC Mybatis 框架是轻量级javaEE应用开发最受欢迎的一种组合框架之一 使用这种框架的项目使JavaEE架构具有高度可维护性和可扩展性 同时极大地提高了项目的开发效率 降低了开发和维护的成本 而

随机推荐

  • webkit和webkit2的区别

    转自 http blog csdn net shunzi 1984 article details 6196483 原文地址 https trac webkit org wiki WebKit2 webkit2为了在API层支持多进程改变了
  • Linux “/“ 分区扩容

    前言 扩容是一项很简单的工作 但是有时候因为长时间没有操作过扩容 指令会比较生疏 因此写一篇扩容的文档 方便在再次失忆的情况下能快速回忆起操作流程 逻辑卷扩容的流程 创建PV gt 扩容VG gt 扩容LV 以下是扩容的详细流程 1 查看当
  • 人工智能梯度下降的优化器SGD、Momentum、AdaGrad、Adam的数学原理以及无框架实现

    系列文章目录 人工智能 梯度下降的原理和手写实现 文章目录 系列文章目录 前言 一 梯度下降优化器是什么 二 SGD优化方法 1 SGD是什么 2 SGD的数学原理 3 SGD的实现 4 SGD的缺陷 三 Momentum优化方法 1 Mo
  • 为什么公司规定所有接口都必须加上分布式锁,你知道吗?

    上一篇文章我们聊了聊Redisson这个开源框架对Redis分布式锁的实现原理 如果有不了解的兄弟可以看一下 都2022年了 出去面试连分布式锁的源码你都不会画 今天就给大家聊一个有意思的话题 每秒上千订单场景下 如何对分布式锁的并发能力进
  • 如何通过代码获取framedebugger里面的drawcall信息

    最近想做个性能工具 用来分析当前drawcall里面的具体调用 不知道unity有没有获取数据的具体接口 不过framedebugger里面的确有相关数据 这是方案一 另外一个方案是hook 理论上应该参考下renderdoc的实现应该就可
  • 使用scrapy爬取数据

    安装scrapy 使用清华镜像 打开PyCharm 安装scrapy框架 pip install i https pypi tuna tsinghua edu cn simple scrapy 新建一个名为python scrapy的项目
  • 深入浅出图解CNN-卷积神经网络

    首先 介绍一下卷积的来源 它经常用在信号处理中 用于计算信号的延迟累积 假设一个信号发生器每个时刻t产生一个信号xt 其信息的衰减率为wk 即在k 1个时间步长后 信息为原来的wk 倍 假设w1 1 w2 1 2 w3 1 4 时刻t收到的
  • linux查找目录下的所有文件中是否含有某个字符串

    Linux查找文件内容的常用命令方法 从文件内容查找匹配指定字符串的行 grep 被查找的字符串 文件名 例子 在当前目录里第一级文件夹中寻找包含指定字符串的 in文件 grep thermcontact in 从文件内容查找与正则表达式匹
  • [论文阅读]《Database Maanagement Systems》-第六章

    第六章 QUERY BY EXAMPLE QBE 查询示例 QBE P201 P216 Example is always more efficacious than precept 身教胜于言教 榜样总是比教训更有效 precept 规则
  • openGL之API学习(一七三)glsl如何设置版本version和兼容性

    version 120 version 120 core version 120 compatibility version 300 es GLSL ES 提供了一个 version 指令来指定着色器使用的GLSL ES的版本 如果不指定G
  • c++ 日志输出库 spdlog 简介

    spdlog是一个开源的 快速的 仅有头文件的C 11 日志库 它提供了向流 标准输出 文件 系统日志 调试器等目标输出日志的能力 它支持的平台包括Windows Linux Mac Android iOS 官方参考 https githu
  • 后缀自动机(SAM)——黑盒使用方案

    首先讲下后缀自动机吧 会写一下部分必要的原理 其他的原理不做解释 代码未讲解的部分希望能当做黑盒来使用 既不了解具体原理但知道其性质以及如何使用 我实在是佩服发明出AC自动机 回文自动机 后缀自动机这人 前置知识 AC自动机中的Fail树
  • 如何使用Chrome浏览器模拟弱网情况

    点击谷歌浏览器图标 打开浏览器后 按下F12键 弹出开发者工具窗口 刷新网页 页面的加载速度为597ms 在开发者工具中 点击Online 在弹出的菜单中点击Slow 3G 慢速3G网络 重新加载网站 发现页面的加载速度变慢了 变成6 5s
  • openssl engine在tls中的应用

    openssl engine的实现和原理在上一篇文章 https blog csdn net liu942947766 article details 128837041 spm 1001 2014 3001 5502 openssl en
  • MATLAB随机生成m个三维坐标点,且各个坐标点之间的距离不小于n

    randi函数 randi max m n 生成均匀分布的随机整数 max生成的随机整数最大值 生成m行n列的矩阵 编写函数sampling function x y z sampling lowx upx lowy upy lowz up
  • 第五篇:进阶篇 发动机的噪声特性

    本专栏分享传统NVH知识点 从声学理论 材料声学 汽车噪声振动分析 车辆及其零部件甚至原材料的声学测试方法等多维度介绍汽车NVH 一些专用术语同时给出了中英文对照 欢迎新人 同行 爱好者一起交流 由于内容写的较为仓促 有误的地方欢迎大家批评
  • JS优化方法(使用最新的js方法)

    1 带有多个条件的if语句 将多个值放在一个数组中 然后调用数组的includes方法 longhand 直接的 if x abc x def x ghi x jkl logic 逻辑 shorthand 速记 if abc def ghi
  • 【FFmpeg】 音视频解码详细流程

    目录 一 视频解码流程 二 FFMPEG解码流程 三 FFmpeg解码函数 四 FFmpeg解码的数据结构 五 FFmpeg数据结构简介 六 FFmpeg数据结构分析 七 像素数据转换 八 FFMPEG解码 九 FFMPEG解码 视频播放
  • Donation-树形dp-建图

    题目网址 链接 int head maxn int n m cnt tot ll a maxn b maxn c maxn id maxn int fa maxn int lson maxn rson maxn struct node in
  • 用单片机C语言精确延时(定时)的方法

    用单片机C语言精确延时 定时 的方法 作者 51hei 来源 原创 点击数 更新时间 2009年09月29日 字体 大 中 小 最近在忙着单片机的项目 偶尔停下来小结了一下最近的收获 还是有不少可贵的收益的 本人在闲暇的时候对单片机C语言下