关于时间单位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语言延时时间计算,单片机定时器延迟时间计算相关推荐

  1. pic单片机c语言延时程序,PIC单片机C语言精确控制时间

    很多朋友说C不能精确控制延时时间,不能像汇编那样直观.其实不然,对延时函数深入了解一下就能设计出一个理想的筐架出来.一般我们都用for(VX=100:--X){:}此句等同于X=100:while(- ...

  2. 51c语言延时作用,51单片机C语言延时函数怎么定义和使用

    描述 51单片机C语言延时函数怎么定义 C语言定义延时函数主要通过无意义指令的执行来达到延时的目的.C程序中可使用不同类型的变量来进行延时设计.经实验测试,使用unsigned char类型具有比un ...

  3. c语言延时系统,基于VB的单片机C语言延时程序各参数计算系统

    仪器仪表用户 doi:10.3969/j.issn.1671-1041.2011.04.013 □科研设计成果□ 基于VB的单片机C语言延时程序各参数计算系统 刘 1 锋,林 奕 2 (1.武汉理工大 ...

  4. pic单片机延时程序C语言,PIC单片机C语言延时程序和循环子程序实现方法

    PIC单片机C语言延时程序和循环子程序实现方法 很多朋友说C中不能精确控制延时时间,不能象汇编那样直观. 其实不然,对延时函数深入了解一下就能设计出一个理想的框价出来. 一般的我们都用 for(x=1 ...

  5. 51单片机c语言试题及答案,单片机C语言期末考试题..

    单片机C语言期末考试题..,单片机的c语言应用程序设计,单片机c语言编程,51单片机c语言程序100例,单片机c语言,单片机c语言编程思想,c语言开发单片机,c语言单片机程序,新概念51单片机c语言教 ...

  6. 关于C语言延时时间的问题

    回答了一个关于C语言延时时间的问题,题目给出延时函数如下: delay(unsigned int x) {while(x--);} delay(unsigned int x) {for (i =0, ...

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

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

  8. 89c52单片机c语言延时程序计算 脉冲,89C52单片机定时器延时时间的计算与程序解析 - STC89C52单片机定时器/计数器详解(含程序和定时器2)...

    STC单片机STC89C52RC定时器延时时间的计算 延时时间要根据晶振频率计算,不同板子可能有所不同. 时钟周期: 1/时钟源,在我现在这块板子上,晶振频率是11.0592M,也就是时钟周期是 1/ ...

  9. 51单片机c语言延时库,51单片机c语言---延时

    1,_nop_()适用于us级的少量延时 标准的C语言中没有空语句.但在单片机的C语言编程中,经常需要用几个空指令产生短延时的效果. 这在汇编语言中很容易实现,写几个nop就行了.本文引用地址:htt ...

最新文章

  1. git安装和使用案例
  2. 如何在Django中以GROUP BY查询?
  3. 【从蛋壳到满天飞】JS 数据结构解析和算法实现-哈希表
  4. 防火墙简单组网方案之双机热备
  5. 内存的字符与打印出来的字符集的区别
  6. 【送书福利8本】YYDS《剑指Offer》,百万程序员人手一册
  7. python 残差图_python 残差图
  8. python画二维数组散点图_2个numpy二维数组的散点图
  9. python的命名空间_python命名空间(namespace)
  10. ARTIF:实时威胁智能识别框架
  11. 是否可以将现有图表导入到 think-cell?
  12. JAVA实现发短信功能
  13. torch 中的 stft、torchaudio 中的 Spectrogram、Melscale、MelSpectrogram 的使用
  14. 修改 mac 截图默认保存位置
  15. 斯坦福大学公开课:机器学习的动机与应用
  16. 云锵基金 2019 年 03 月简报
  17. BLE蓝牙应用生成Android/iOS APP以及小程序
  18. 大数据分析技术种类与应用
  19. SQL14 从titles表获取按照title进行分组,注意对于重复的emp_no进行忽略。
  20. JSTL 计算时间差

热门文章

  1. html如何选择爱好,兴趣.html
  2. 计算机图形学与可视化计算OPENGL 个人作业一
  3. Vue实现 在线考试型倒计时
  4. Windows系统查看CUDA版本号
  5. Opencv学习笔记 - 使用opencvsharp和期望最大化
  6. 图像处理(图像学习)的基础必备知识
  7. tableau了解一
  8. QT中引入WinPcap
  9. 计算机组成原理考试简答题
  10. 程序员玩跨界,路子有多野?网友:太疯狂!