对于需要精确延时的应用场合,需要精确知道延时函数的具体延时时间。以C语言编写的单片机延时函数网上有两个不同的版本(都说是延时n毫秒),分别如下:

void delay(uint x) //延时X毫秒

{

uint y,z;

for(z=x;z>0;z--)

for(y=110;y>0;y--);

}

void delay_ms(uint n)   //延时n毫秒

{

uchar i;

while(n--)

{

for(i=0;i<120;i++);

}

}

上述两个函数的实现方法是一样的,只是给的时间常数不同,一个是110,另一个是120。近来工作因为对时间的精度要求很高,就特地验证了下这两个函数运行时所用的时间。 主程序为:

void main(void)

{

delay(1);

}

反汇编之后(推荐用C51智能反编译器,不过要手工加上ORG地址和END结束符):

标号                   指令                                    地址        机器码        机器周期

ORG 0000H

Q0000:             LJMP Q0021                        ;0000   02 00 21

;==========================================================================

ORG   0003H

Q0003:             SETB C                                ;0003   D3                       1

MOV   A,R7                                  ;0004   EF                        1

SUBB A,#00H                            ;0005   94 00                   1

MOV   A,R6                                 ;0007   EE                        1

SUBB A,#00H                             ;0008   94 00                    1

JC    Q0020                                 ;000A   40 14                    2

MOV   R5,#6EH                             ;000C   7D 6E                 1

MOV   R4,#00H                            ;000E   7C 00                   1

Q0010:          MOV   A,R5                            ;0010   ED                            1

DEC   R5                                    ;0011   1D                           1

JNZ   Q0015                                ;0012   70 01                      2

DEC   R4                                    ;0014   1C                          1

Q0015:             MOV   A,R5                          ;0015   ED                          1

ORL   A,R4                                ;0016   4C                           1

JNZ   Q0010                              ;0017   70 F7                          2

MOV   A,R7                               ;0019   EF                              1

DEC   R7                                  ;001A   1F                              1

JNZ   Q0003                             ;001B   70 E6                          2

DEC   R6                                  ;001D   1E                               1

SJMP Q0003                            ;001E   80 E3                          2

Q0020:             RET                                     ;0020   22                                 2

;====================RESET 00-7F AND SET SP=07H============================

ORG   0021H

Q0021:             MOV   R0,#7FH                         ;0021   78 7F

CLR   A                                       ;0023   E4

Q0024:             MOV   @R0,A                           ;0024   F6

DJNZ R0,Q0024                       ;0025   D8 FD

MOV   SP,#07H                        ;0027   75 81 07

LJMP Q002D                            ;002A   02 00 2D

;====================MAIN PROGRAM==========================================

ORG   002DH

Q002D:             MOV   R7,#01H                         ;002D   7F 01             1

MOV   R6,#00H                        ;002F   7E 00               1

LJMP Q0003                             ;0031   02 00 03          2

;==========================================================================

END

单步执行可以跟踪程序的运行,给个最终的结果就是总的执行机器周期数为 :

第一个函数:4+9+8*110+4+9=906

第二个函数:4+9+8*120+4+9=986

如果单片机的晶振是12M,则一个机器周期的时间为12/(12*10e6)=1us

可见第二个程序更接近1ms(0.986us)的时间,第一个是0.906us

当晶振是11.05926M时,第一个延时函数的精确延时时间是983us,第二个是1069.8us,可见第一个函数的延时时间更精确一些。

而且延时时间越长,误差就越大。

单片机c语言中的精确延时程序,单片机精确毫秒延时函数相关推荐

  1. 单片机中段程序_单片机c语言中的一小段程序解读

    函数名称:System_CalculateSolubility()函数功能:采样ADC0832的电压值,换算成浮点数溶度值*************************************** ...

  2. 单片机c语言变频调速实验程序,单片机C语言实验例程80个

    2017-6-14 20:20 上传 点击文件名下载附件 包含以下内容: [实验10]流水灯3\ [实验11]独立按键操作方法\ [实验12]多功能按键识别\ [实验13]开关控制LED(输入输出概念 ...

  3. 单片机C语言中的位运算符,单片机c语言教程第八课 运算符和表达式(位运算符)...

    学过汇编的朋友都知道汇编对位的处理能力是很强的,但是单片机C语言也能对运算对象进行按位操作,从而使单片机C语言也能具有一定的对硬件直接进行操作的能力.位运算符的作用是按位对变量进行运算,但是并不改变参 ...

  4. 51单片机蜂鸣器演奏《小苹果》C语言程序,51单片机C语言蜂鸣器发声生日快乐播放程序...

    <51单片机C语言蜂鸣器发声生日快乐播放程序>由会员分享,可在线阅读,更多相关<51单片机C语言蜂鸣器发声生日快乐播放程序(4页珍藏版)>请在人人文库网上搜索. 1.按键发音/ ...

  5. led的c语言程序,单片机C语言LED灯点亮程序完全版

    <单片机C语言LED灯点亮程序完全版>由会员分享,可在线阅读,更多相关<单片机C语言LED灯点亮程序完全版(7页珍藏版)>请在人人文库网上搜索. 1.1例子1第二个灯亮#inc ...

  6. 单片机c语言左移的作用,[转载]单片机c语言中的左移右移

    单片机c语言中的左移右移 左移 变量1 << 变量2 将变量1的二进制位值向左移动由变量2所指定的位数. 例如: a = 0x8f; // 10001111 a << 2; / ...

  7. c语言代码存放的区域 堆栈,C语言中内存分布及程序运行中(BSS段、数据段、代码段、堆栈)...

    BSS段:(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简称.BSS段属于静态内存分配. 数据段 :数据 ...

  8. c语言常见错误分析和程序调试,C语言中常见错误分析及程序调试

    总结分析了C语言中常见错误及程序调试的相关技巧,以提高初学者的编程能力. 2 8 2月 0年l 0 电脑学习 第6 期 C语言中常见错误分析及程序调试 陈伟' 陈东淼 摘要:总结分析了 C语言中常见错 ...

  9. C语言中打开一个应用程序可以调用或运行命令

    C语言中打开一个应用程序可以调用或运行命令system(),也可以调用操作系统的API函数,比如Windows系统可以调用CreateProcess().ShellExecuteEx()等函数来打开一 ...

  10. 单片机c语言彩灯依次点亮不灭,单片机说课(点亮彩灯).ppt

    <单片机应用技术>(中国劳动社会保障出版社),课题二点亮彩灯,,教材贯彻以任务驱动促进以学生为中心的教学方针,把激发学生的学习兴趣,培养学生思考问题.解决问题能力作为教学的根本目标.从实际 ...

最新文章

  1. 计算机组成原理答案郑秋梅,计算机组成原理-郑秋梅_习题.docx
  2. Python3.7模块之hashlib
  3. 微信公众平台“自定义回复”技巧
  4. 在Java中避免空检查
  5. kmp2-HDU1358 HUST1010 POJ2406 POJ2752
  6. 【MySQL】mysql 数据库名称 中间带有中划线问题
  7. linux恢复硬盘工具,linux硬盘数据恢复工具
  8. D3 BarChart
  9. 原型设计(顶会热词统计)
  10. emmet 工具的基本使用,总结
  11. 软件测试用mac还是windows,Boot Camp还是虚拟机?Mac+Win实测
  12. 系统学习NLP(四)--数据平滑
  13. Vue-Cli3 使用jquery
  14. 明链、暗链、黑链分别是什么意思
  15. 3GPP最新提案查询方法
  16. 基于模型的系统工程及数字工程技术研讨会
  17. ps还原上一步快捷键_photoshop恢复上一步操作的快捷键是什么
  18. 不管你学的是什么专业,你都应该多少懂些 (来自qq空间)(分享)(转载)
  19. jsp中点击img放大图片
  20. 研究生平均年薪26.5万!本科生20万!南京大学软件学院19年就这么高!

热门文章

  1. AEJoy —— 表达式之模拟超越与反弹(五)【JS】
  2. ARINC429数据总线简介
  3. JDK和JRE区别和联系
  4. 什么是人工智能?(科普)
  5. 学校计算机联想硬盘保护系统管理员密码,联想硬盘保护系统管理员密码是多少...
  6. 【AI识人】OpenPose:实时多人2D姿态估计 | 附视频测试及源码链接
  7. Mac下安装Adobe pr
  8. itextPDF生成表格的pdf
  9. 树莓派:Adafruit的I2C SSD1306 OLED驱动
  10. 如何截图一张完整的表_表格太长怎么截图