打印
[学习资料]

用单片机C语言精确延时(定时)的方法

[复制链接]
307|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
febgxu|  楼主 | 2023-3-26 22:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

 C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。那么用单片机C语言精确延时(定时)的方法都是怎样的呢?以下仅供参考!

  由于单片机C语言下利用软件延时不容易做到精确的定时,所以很多人在编写延时子程序的时候不能好好的把握延时的具体时间。C语言下,延时程序主要有以下几种:

  一:

  void delay(unsigned char k)

  {

  unsigned char i,k; //定义变量

  for(i=0;i<k;i++); //for循环语句

  }

  该程序在Keil环境下,会先将C语言转化成汇编语言,那么我们就可以根据汇编语言来计算出精确的`时间,转化具体步骤如下:

  CLR A ;指令1

  MOV R7,A ;指令2

  LOOP:

  INC R7 ;指令3

  CJNE R7,k,LOOP ;指令4

  这里,指令1,指令2和指令3各消耗1个机器周期,指令4消耗两个机器周期(可查文末附录表),而在12M的晶振下一个机器周期是1us,在这个过程中,指令1和指令2分别执行1次,即消耗1+1us,而指令3和指令4分别执行了k次,那么这样加起来,这个延时子程序所消耗的具体时间就是t=1+1+(1+2)*k=3k+2us。

  呵呵,这样说来,如果我们定义的k为100的话,这个延时子程序的精确时间就是302us。

  二:

  void delay(unsigned char i)

  {

  while(--i)

  {;}

  }

  同样的道理,将其反汇编,可以看到,只有一条语句:DJNZ i,$;

  该语句消耗2us,一共执行i次,所以总共消耗时间t=i*2us。

  三:

  下面的将形参换为整形int,这样的话,反汇编所执行的语句完全不同,用个具体的数字做例子:

  void delay()

  {

  unsigned int i=10000;

  while(--i)

  ;

  }

  反汇编后:

  4: unsigned int i=10000;

  C:0x0003 7F10 MOV R7,#0x10

  C:0x0005 7E27 MOV R6,#0x27

  5: while(--i)

  6: ;

  C:0x0007 EF MOV A,R7

  C:0x0008 1F DEC R7

  C:0x0009 7001 JNZ C:000C

  C:0x000B 1E DEC R6

  C:0x000C 14 DEC A

  C:0x000D 4E ORL A,R6

  C:0x000E 70F7 JNZ C:0007

  具体计算如下

  1.R7经过10H(16)次循环减为0:

  t1=10H*(1+1+2+1+1+2)

  2.R6经过27H*256次循环减为0:

  t2=27H*256*(1+1+2+1+1+2)+27H*1

  3.最后R7的是变为255,因此还要多出255次的循环:

  t3=255*(1+1+2+1+1+2)

  4.加上之前消耗的2us,总消耗时间:

  T=2+10H*(1+1+2+1+1+2)+27H*256*(1+1+2+1+1+2)+27H*1+255*(1+1+2+1+1+2)

  =2+16*7+39*256*7+39*1+255*7

  =71826us

  大约为72ms吧

  如果定义一个unsigned int i,那么延时计算公式为T=2+(i%256)*7+(i/256)*256*7+i/256+255*7

  关于其他类型的延时程序都可以按照这个方法对时间进行较为精确的计算。


使用特权

评论回复
沙发
timfordlare| | 2023-4-9 14:06 | 只看该作者
使用定时器中断 使用定时器中断来实现精确延时,可以在指定的时间中断一次,然后在中断服务子程序中将计数器加一,当计数器等于指定的数值时,则完成延时

使用特权

评论回复
板凳
nomomy| | 2023-4-9 14:33 | 只看该作者
使用循环语句 也可以使用循环语句,来模拟延时的功能

使用特权

评论回复
地板
janewood| | 2023-4-9 15:39 | 只看该作者
使用单片机C语言的延时函数,可以快速实现定时延时

使用特权

评论回复
5
mollylawrence| | 2023-4-9 15:49 | 只看该作者
在实际应用中需要进行实验和测试,不断调整参数,以获得更加精确的延时效果。

使用特权

评论回复
6
jonas222| | 2023-4-9 16:10 | 只看该作者
可以使用定时器来实现精确的延时操作。

使用特权

评论回复
7
maudlu| | 2023-4-9 17:48 | 只看该作者
延时时间也受到单片机的运行速度和其他因素的影响,可能会存在一定误差。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

38

主题

4832

帖子

2

粉丝