单片机c语言中的精确延时程序,单片机精确毫秒延时函数
对于需要精确延时的应用场合,需要精确知道延时函数的具体延时时间。以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语言中的精确延时程序,单片机精确毫秒延时函数相关推荐
- 单片机中段程序_单片机c语言中的一小段程序解读
函数名称:System_CalculateSolubility()函数功能:采样ADC0832的电压值,换算成浮点数溶度值*************************************** ...
- 单片机c语言变频调速实验程序,单片机C语言实验例程80个
2017-6-14 20:20 上传 点击文件名下载附件 包含以下内容: [实验10]流水灯3\ [实验11]独立按键操作方法\ [实验12]多功能按键识别\ [实验13]开关控制LED(输入输出概念 ...
- 单片机C语言中的位运算符,单片机c语言教程第八课 运算符和表达式(位运算符)...
学过汇编的朋友都知道汇编对位的处理能力是很强的,但是单片机C语言也能对运算对象进行按位操作,从而使单片机C语言也能具有一定的对硬件直接进行操作的能力.位运算符的作用是按位对变量进行运算,但是并不改变参 ...
- 51单片机蜂鸣器演奏《小苹果》C语言程序,51单片机C语言蜂鸣器发声生日快乐播放程序...
<51单片机C语言蜂鸣器发声生日快乐播放程序>由会员分享,可在线阅读,更多相关<51单片机C语言蜂鸣器发声生日快乐播放程序(4页珍藏版)>请在人人文库网上搜索. 1.按键发音/ ...
- led的c语言程序,单片机C语言LED灯点亮程序完全版
<单片机C语言LED灯点亮程序完全版>由会员分享,可在线阅读,更多相关<单片机C语言LED灯点亮程序完全版(7页珍藏版)>请在人人文库网上搜索. 1.1例子1第二个灯亮#inc ...
- 单片机c语言左移的作用,[转载]单片机c语言中的左移右移
单片机c语言中的左移右移 左移 变量1 << 变量2 将变量1的二进制位值向左移动由变量2所指定的位数. 例如: a = 0x8f; // 10001111 a << 2; / ...
- c语言代码存放的区域 堆栈,C语言中内存分布及程序运行中(BSS段、数据段、代码段、堆栈)...
BSS段:(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简称.BSS段属于静态内存分配. 数据段 :数据 ...
- c语言常见错误分析和程序调试,C语言中常见错误分析及程序调试
总结分析了C语言中常见错误及程序调试的相关技巧,以提高初学者的编程能力. 2 8 2月 0年l 0 电脑学习 第6 期 C语言中常见错误分析及程序调试 陈伟' 陈东淼 摘要:总结分析了 C语言中常见错 ...
- C语言中打开一个应用程序可以调用或运行命令
C语言中打开一个应用程序可以调用或运行命令system(),也可以调用操作系统的API函数,比如Windows系统可以调用CreateProcess().ShellExecuteEx()等函数来打开一 ...
- 单片机c语言彩灯依次点亮不灭,单片机说课(点亮彩灯).ppt
<单片机应用技术>(中国劳动社会保障出版社),课题二点亮彩灯,,教材贯彻以任务驱动促进以学生为中心的教学方针,把激发学生的学习兴趣,培养学生思考问题.解决问题能力作为教学的根本目标.从实际 ...
最新文章
- 计算机组成原理答案郑秋梅,计算机组成原理-郑秋梅_习题.docx
- Python3.7模块之hashlib
- 微信公众平台“自定义回复”技巧
- 在Java中避免空检查
- kmp2-HDU1358 HUST1010 POJ2406 POJ2752
- 【MySQL】mysql 数据库名称 中间带有中划线问题
- linux恢复硬盘工具,linux硬盘数据恢复工具
- D3 BarChart
- 原型设计(顶会热词统计)
- emmet 工具的基本使用,总结
- 软件测试用mac还是windows,Boot Camp还是虚拟机?Mac+Win实测
- 系统学习NLP(四)--数据平滑
- Vue-Cli3 使用jquery
- 明链、暗链、黑链分别是什么意思
- 3GPP最新提案查询方法
- 基于模型的系统工程及数字工程技术研讨会
- ps还原上一步快捷键_photoshop恢复上一步操作的快捷键是什么
- 不管你学的是什么专业,你都应该多少懂些 (来自qq空间)(分享)(转载)
- jsp中点击img放大图片
- 研究生平均年薪26.5万!本科生20万!南京大学软件学院19年就这么高!