51单片机c语言延时时间计算,单片机定时器延迟时间计算
关于时间单位1s=1000ms毫秒=10-3秒
1ms=1000us微秒=10-6秒
1us=1000ns纳秒=10-9秒
1ns=1000ps皮秒=10-12秒
1ps=1000fs飞秒=10-15秒
目前51单片机只能精确到微秒级,若对时间精度要求较高,需达到微秒级,则一般需用汇编语言编程,若只需达到秒或毫秒级,则用C语言编程就可满足要求。
==》作为预备知识,建议先了解下机器周期、数据类型和存储器类型,可以参照
机器周期:http://www.51hei.com/bbs/dpj-43300-1.html
数据类型:http://www.51hei.com/bbs/dpj-43301-1.html
存储器类型:http://www.51hei.com/bbs/dpj-43302-1.html
==》下面先介绍汇编语言编程
根据定时时间长度可以编制不同循环重数的程序。
===》单循环延迟程序
MOV R7,#TIME
LOOP:NOP 1机器周期
NOP 1机器周期
DJNZ R7,LOOP 2机器周期
延迟时间=4 X T X TIME
以常见的12M晶振为例,则一个机器周期T=1us
因为R7是8位寄存器,所以TIME只能为char型,其值域为0~255
则定时范围为 4us~1020us
===》双循环延时程序
MOV R7,#TIME1 1机器周期
LOOP1:MOV R6,#TIME2 1机器周期
LOOP2:NOP 1机器周期
NOP 1机器周期
DJNZ R6,LOOP2 2机器周期
DJNZ R7,LOOP1 2机器周期
延时时间=(TIME2 X 4 +2+1) X TIME1 X T+T
定时范围为 8us~260 866us
===》三重循环延时程序
MOV R7,#TIME1 1机器周期
LOOP1:MOV R6,#TIME2 1机器周期
LOOP2:MOV R5,#TIME3 1机器周期
LOOP3:NOP 1机器周期
NOP 1机器周期
DJNZ R5,LOOP3 2机器周期
DJNZ R6,LOOP2 2机器周期
DJNZ R7,LOOP1 2机器周期
延迟时间=((TIME3 X 4 +2+1) X TIME2 +2+1) X TIME1 X T +T
定时范围为 11us~66 521 341us
根据需要还可以编写4重5重或更多重程序,满足不同延时需要。
==》C语言编程
C语言中通过循环结构的程序达到延时的目的,还可以通过循环嵌套满足不同的定时要求,常用循环语句有以下三种:
while(表达式){语句;}
do{语句;}while(表达式)
for(表达式1;表达式2;表达式3){语句;}
我是通过keil仿真时数汇编指令的数目来确定循环语句执行时间的(我不知道是不是还有更好的方法),结果如下:
====》while语句
下面的例子可以不看,后面跟着结果。
例子:int i; while(i<1000); {i++;}
keil编译成的汇编代码循环执行段为:
循环代码 消耗的机器周期
C:0x0003 C3 CLR C 1
C:0x0004 E509 MOV A,0x09 1
C:0x0006 94E8 SUBB A,#0xE8 1
C:0x0008 E508 MOV A,0x08 1
C:0x000A 6480 XRL A,#P0(0x80) 1
C:0x000C 9483 SUBB A,#DPH(0x83) 1
C:0x000E 500A JNC C:001A 2
5: {i++;}
C:0x0010 0509 INC 0x09 1
C:0x0012 E509 MOV A,0x09 1
C:0x0014 70ED JNZ main(C:0003) 2
根据每条指令的机器周期可以确定,循环一次消耗的机器周期数为:12个
依然以12M晶振为例,每个机器周期为1us,则循环一次耗时12us,循环一千次耗时12 000us
(signed int)i 能取到的最大值为32767,所以此循环语句的定时范围为10us~393 204us
====》do while 语句
同样例子后面有结果,可以不看例子。
例子: int i=10; do{i--;} while(i>0);
keil编译的汇编程序循环段代码:
循环段代码 消耗的机器周期
C:0x0007 EF MOV A,R7 1
C:0x0008 1F DEC R7 1
C:0x0009 7001 JNZ C:000C 2
C:0x000B 1E DEC R6
5: while(i>0);
C:0x000C D3 SETB C 1
C:0x000D EF MOV A,R7 1
C:0x000E 9400 SUBB A,#0x00 1
C:0x0010 EE MOV A,R6 1
C:0x0011 6480 XRL A,#P0(0x80) 1
C:0x0013 9480 SUBB A,#P0(0x80) 1
C:0x0015 50F0 JNC C:0007 2
循环一次消耗的机器周期数:12个
晶振12M,i 最大值32767,定时范围:10us~393 204us
====》for语句
例子: int i; for(i=1000;i>0;i--);
循环段代码 消耗的机器周期
C:0x0007 EF MOV A,R7 1
C:0x0008 1F DEC R7 1
C:0x0009 7001 JNZ C:000C 2
C:0x000B 1E DEC R6
C:0x000C EF MOV A,R7 1
C:0x000D 4E ORL A,R6 1
C:0x000E 70F7 JNZ C:0007 2
循环一次消耗的机器周期数:8个
依然以12M晶振为例,则定时范围:6us~262 136us
for语句中,若 i 定义为 unsigned int ,则 i 的最大值可取65535,则定时范围:6us~524 280us
51单片机c语言延时时间计算,单片机定时器延迟时间计算相关推荐
- pic单片机c语言延时程序,PIC单片机C语言精确控制时间
很多朋友说C不能精确控制延时时间,不能像汇编那样直观.其实不然,对延时函数深入了解一下就能设计出一个理想的筐架出来.一般我们都用for(VX=100:--X){:}此句等同于X=100:while(- ...
- 51c语言延时作用,51单片机C语言延时函数怎么定义和使用
描述 51单片机C语言延时函数怎么定义 C语言定义延时函数主要通过无意义指令的执行来达到延时的目的.C程序中可使用不同类型的变量来进行延时设计.经实验测试,使用unsigned char类型具有比un ...
- c语言延时系统,基于VB的单片机C语言延时程序各参数计算系统
仪器仪表用户 doi:10.3969/j.issn.1671-1041.2011.04.013 □科研设计成果□ 基于VB的单片机C语言延时程序各参数计算系统 刘 1 锋,林 奕 2 (1.武汉理工大 ...
- pic单片机延时程序C语言,PIC单片机C语言延时程序和循环子程序实现方法
PIC单片机C语言延时程序和循环子程序实现方法 很多朋友说C中不能精确控制延时时间,不能象汇编那样直观. 其实不然,对延时函数深入了解一下就能设计出一个理想的框价出来. 一般的我们都用 for(x=1 ...
- 51单片机c语言试题及答案,单片机C语言期末考试题..
单片机C语言期末考试题..,单片机的c语言应用程序设计,单片机c语言编程,51单片机c语言程序100例,单片机c语言,单片机c语言编程思想,c语言开发单片机,c语言单片机程序,新概念51单片机c语言教 ...
- 关于C语言延时时间的问题
回答了一个关于C语言延时时间的问题,题目给出延时函数如下: delay(unsigned int x) {while(x--);} delay(unsigned int x) {for (i =0, ...
- 51单片机c语言延时计算软件,51单片机精确延时程序大集合+初值计算工具
在论坛上看到不少不错的延时程序,整理如下共同分享: 精确延时计算公式: 延时时间=[(2*第一层循环+3)*第二层循环+3]*第三层循环+5 ;延时5秒左右 DELAY5S:PUSH 04H;2个 ...
- 89c52单片机c语言延时程序计算 脉冲,89C52单片机定时器延时时间的计算与程序解析 - STC89C52单片机定时器/计数器详解(含程序和定时器2)...
STC单片机STC89C52RC定时器延时时间的计算 延时时间要根据晶振频率计算,不同板子可能有所不同. 时钟周期: 1/时钟源,在我现在这块板子上,晶振频率是11.0592M,也就是时钟周期是 1/ ...
- 51单片机c语言延时库,51单片机c语言---延时
1,_nop_()适用于us级的少量延时 标准的C语言中没有空语句.但在单片机的C语言编程中,经常需要用几个空指令产生短延时的效果. 这在汇编语言中很容易实现,写几个nop就行了.本文引用地址:htt ...
最新文章
- git安装和使用案例
- 如何在Django中以GROUP BY查询?
- 【从蛋壳到满天飞】JS 数据结构解析和算法实现-哈希表
- 防火墙简单组网方案之双机热备
- 内存的字符与打印出来的字符集的区别
- 【送书福利8本】YYDS《剑指Offer》,百万程序员人手一册
- python 残差图_python 残差图
- python画二维数组散点图_2个numpy二维数组的散点图
- python的命名空间_python命名空间(namespace)
- ARTIF:实时威胁智能识别框架
- 是否可以将现有图表导入到 think-cell?
- JAVA实现发短信功能
- torch 中的 stft、torchaudio 中的 Spectrogram、Melscale、MelSpectrogram 的使用
- 修改 mac 截图默认保存位置
- 斯坦福大学公开课:机器学习的动机与应用
- 云锵基金 2019 年 03 月简报
- BLE蓝牙应用生成Android/iOS APP以及小程序
- 大数据分析技术种类与应用
- SQL14	从titles表获取按照title进行分组,注意对于重复的emp_no进行忽略。
- JSTL 计算时间差