最近在上单片机原理及应用课程,做实验的时候遇到了软件延时程序如何计算延时时间的问题,经过一阵摸索终于领悟到其中奥秘......耶(比耶)。 延时函数是使用STC-ISP生成的,晶振为12MHz,指令集是STC-Y1(即89系列),使用do while()循环实现软件精确延时。下面讲解一下其中的延时时间是如何计算的。

1. 首先我们先设置断点是程序运行到进入delay_10ms()函数前,可以在图1右下角看到此时程序运行时间为0.00040800sec,此时我们看向反汇编窗口(Disassembly)。请注意圈出来的“LCALL delay_10ms”汇编指令,程序运行到代码“ int a=100 ”并完成赋值后往下运行遇到delay_10ms(),子程序调用指令LCALL 完成对delay_10ms()的调用,该指令消耗24个时钟周期,即 t1=2us。

图1

2. 接着点击调试中的单步执行按钮,使程序转到delay_10ms()中,图2可以看到,首先执行“ MOV R7,#0x14”(即 i=20),接着执行“MOV R6,#0x71”,查STC-ISP指令表可知将立即数赋值给寄存器指令“MOV Rn #data”消耗12个时钟周期,故上述两部共消耗 t2=2us。

图2

3. i,j赋值完再接着往下是执行do{}里面的内容“while(--j)”,“DJNZ  R6 , C:005D”指令的意思是寄存器R6里面的内容减1不为0则转移到“C:005D”处,即继续执行j自减。DJNZ指令消耗24个时钟周期,一共执行113次,即113 X 2us = 226us 。

4. 当j从113自减到0后,不满足DJNZ条件,则程序继续往下执行“ while(--i)”,即判断do while()的条件。该代码对应汇编指令为“ DJNZ  R7 , C:005D”,即i=20,自减1为19,不为0则转移到C:005D,继续执行j自减。注意,接下来的步骤很容易算错,很多人可能误以为j会再次从113开始自减,但实际不是的,前面存放 j=113 的寄存器R6从113自减到0后,此时再次自减 将从256开始,因为寄存器值从0开始减1后将会变成11111111,即256。这样,整个循环时间就很容易得出来了:t3 = 113 X 1 X 2us + 256 X 19 X 2us + 20 X 2us = 9954us

5. delay_10ms()程序结束后往下是 子程序返回指令RET,该指令功能是返回到子程序调用指令下一指令处,即返回进delay_ms()前的地方。该指令消耗24个时钟周期,故 t4 = 2us。

综上:可得delay_10ms()执行时间,t = t1 + t2 + t3 + t4 = 2 + 2 + 9954 + 2 = 10000us = 10ms。

验证:分别在进delay_10ms() 和 执行完delay_10ms()后设置断点调试,如图3,可得时间 :

t = 0.01040800sec - 0.00040800sec = 0.01000000sec,即10ms。

图3

(第一次写文章,写的不好请多多谅解哈)

51单片机延时程序的延时时间计算相关推荐

  1. 51单片机c语言延时计算软件,51单片机精确延时程序大集合+初值计算工具

    在论坛上看到不少不错的延时程序,整理如下共同分享: 精确延时计算公式: 延时时间=[(2*第一层循环+3)*第二层循环+3]*第三层循环+5 ;延时5秒左右 DELAY5S:PUSH   04H;2个 ...

  2. c语言中延时时间计算,能精确计算C语言延时程序中延时时间的小工具(转)

    能精确计算C语言延时程序中延时时间的小工具 Emu51Form是一个软仿真计时器 具体使用方法为: 1.打开 keil\tools,ini 文件,在它的c51栏中加入 AGSI9=Emu51Form. ...

  3. 24c512 c语言程序,24C32~24C512的51单片机读写程序

    24C32~24C512的51单片机读写程序 来源:-- 作者:-- 浏览:3875 时间:2016-08-10 14:18 标签: 摘要: AT89S52 晶振频率为11.0592MHz 指令周期: ...

  4. 51单片机利用8266获取网络时间

    51单片机利用8266获取网络时间 我现在是成都一所不出名的二本院校大三学生,第一次来到CSDN,趁有时间,把我之前做的项目,其中一个模块拿出来和大家分享,我也是小白,希望提出宝贵意见.OK,废话不多 ...

  5. c语言编写51单片机中断程序,执行过程是怎样的?

    Q:c语言编写51单片机中断程序,执行过程是怎样的? 例如程序: #include<reg52.h>   void main(void)   {    EA=1;      //开放总中断 ...

  6. 51单片机计算机加减乘除,51单片机加减乘除程序.doc

    51单片机加减乘除程序 #include //STC51单片机头文件 #define uchar unsigned char #define uint unsigned int uint key; u ...

  7. 51单片机C51程序

    51单片机51单片机 C51程序 C51程序 学习C51程序之前需要对C语言有一定的了解和学习:这里只介绍与C语言有区别的地方: 具体的不同如下: 1.C51中增加了几种针对MSC-51单片机的特有数 ...

  8. 台达触摸屏modbusRTU与51单片机通讯台达屏与郭天祥51单片机通讯程序

    台达触摸屏modbusRTU与51单片机通讯台达屏与郭天祥51单片机通讯程序亲测过好用,P1口led显示8个位的状态上传给触摸屏,d2至d7为16数据寄存器能写能读,数码管显示当前写入的数码id=60 ...

  9. 51单片机容易串电,用USB转ttl(ch340)给51单片机下载程序,接上TX,RX,板子上的灯就亮了,怎么解决?

    1 原理框架图: 2 原理图: 51单片机要冷启动下载程序,就是先点下载,然后再给单片机上电,上述的电路设计解决了在用USB转ttl为51单片机下载程序时串电的问题.

  10. c51单片机时钟程序汇编语言,51单片机汇编语言--延时程序的延时时间

    请高手帮我分析以下延时程序所占的时钟周期. 求解释: DELAY:  MOV  R6, #13 DELAY1: MOV  R5, #250 DELAY2: NOP DJNZ  R5, DELAY2 D ...

最新文章

  1. 【设计模式】享元模式
  2. 我在React Native中构建时获得的经验教训
  3. intellij (org.jdom.input.JDOMParseException) Error on line 1: 前言中不允许有内容。
  4. NS2源码图示---数据链路层 (转帖)
  5. 基于Winsock API的VC网络编程实战
  6. Zedboard学习(五):MIO与EMIO操作
  7. GetSafeHwnd()函数
  8. MySQL查询的进阶操作--联合查询
  9. Source Insight 4怎么取消函数结束提示字符
  10. ie传递给系统调用的数据区域太小_【Linux系列】系统调用
  11. UDT中select异常
  12. static,构造器,执行顺序
  13. linux android真机测试
  14. VSFTP的PASSIVE模式的防火墙设置
  15. android 磁盘日志记录,GitHub - xflyandroid/XLog: 一个简易的日志打印框架(支持打印策略自定义,默认提供2种策略:logcat打印和磁盘打印)...
  16. 张超超OC基础回顾01_类的创建,申明属性,以及本质
  17. 从Q-learning到PPO大全 深度强化学习总结和理解
  18. java socket php_Web架构(二)PHP Socket与Java ServerSocket交互
  19. 采集51job职位数量画图后发邮件
  20. httpclient-4.3.6工具类,方便直接使用

热门文章

  1. 基于stm32的减速直流电机PID算法控制
  2. 开源正在吞噬软件,开源RPA厚积薄发
  3. 信用卡一样大小的(小型电脑):树莓派
  4. win7计算机不显示摄像头图标不见了,win7系统摄像头图标不见怎么办?
  5. 【三】Apache的管理及优化
  6. 使用wxml2canvas将微信小程序页面转为图片
  7. 各主板黑苹果dsdt补丁_关于B75主板的DSDT警告修改和睡眠相关修改
  8. unique mapped reads
  9. org.hibernate.StaleStateException: Batch update returned unexpected row cou...
  10. MapReduce-读取文件写入HBase