sunny-2819 发表于 2020-7-1 11:24:52

51单片机的延时函数怎么计算?

本人刚学单片机,请问下例语句的延时时间计算,谢谢!

void delay(uchar t)
{
    uchar t1;
    unsigned long t2;
    for(t1=0;t1<t;t1++)
    {
      for(t2=0;t2<4000;t2++);   
    }
    TR0=0;
}

20061002838 发表于 2020-7-1 12:37:21

C程序没办法直接计算,要具体看生成的汇编程序

这里推荐一个本人很久前写的延时函数,C语言写的,延时飞常准

https://wenku.baidu.com/view/cafedacfa1c7aa00b52acb87

void delayms(unsigned char t)
{   
   unsigned char j;
   unsigned char i;

   do
   {
j=3;
   do
      {
          i=165;   
      do
               {   
          --i;
               }
      while(i!=0);
       --j;
          }
       while(j!=0);
   --t;
   }
   while(t!=0);
}
该程序延时时基为1ms,所以最大延时时间是255ms
下面是反编译的汇编程序
C:0x0031    7E03   MOV      R6,#0x03

C:0x0033    7DA5   MOV      R5,#0xA5

C:0x0035    DDFE   DJNZ   R5,C:0035

C:0x0037    DEFA   DJNZ   R6,C:0033

C:0x0039    DFF6   DJNZ   R7,delayms(C:0031)

C:0x003B    22       RET
延时时间计算公式如下:
((R5*2 + 2+1)*R6+2+1)R7
假设R7=1,上式为(165*2+3)*3+2+1 =1002us!!!!!

peteryzm 发表于 2020-7-1 14:00:49

while1里面翻转单片机引脚,加入延时函数,上示波器看

xunke 发表于 2020-7-1 14:44:47

先看编译后生成汇编指令,再去查手册指令表相应指令执行的时钟周期个数,算出每条指令的执行时间,你的延时程序每条指令的执行时间累加起来就是了,有的不好懂,下面举个例子,
比如: MOVC   A, @A+DPRT 是4个时钟周期的指令,若系统时钟是12MHz的,这个条指令执行一次所用的时间就是 4 * 1/12 (us) 。

Dew_maple 发表于 2020-7-1 15:09:18

如果用STC的单片机,可以通过其ISP工具中的软件延时计算器进行计算

sunny-2819 发表于 2020-7-1 16:13:32

20061002838 发表于 2020-7-1 12:37
C程序没办法直接计算,要具体看生成的汇编程序

这里推荐一个本人很久前写的延时函数,C语言写的,延时飞常 ...

谢谢,汇编完全看不懂!{:smile:}

rclong 发表于 2020-7-1 16:26:31

STC下程序那个ISP软件里有代码生成器
能够根据需要自动生成相应的延迟函数代码和定时器代码

duxingkei 发表于 2020-7-1 22:14:19

如果是入门的话,会用就行,没必要精准计算;
当你真正做项目时才会明白,做时间延时或计时,都是用定时器中断产生基准时钟比如5ms标志,在主循环用计时器计时扩展的,做基准时钟的倍数计时或延时非常精准;
页: [1]
查看完整版本: 51单片机的延时函数怎么计算?