51单片机C语延时分析

2020-02-05 09:12发布

C语写的,单片机AT89S52,编译器KEIL2。
无聊的东西。
      
有错请大家指出啊,谢谢。

/****************C语*******************/
void delay(uint delaytime)
{
       while(delaytime--);
}

/****************汇编******************/

C:0x0840        EF          MOV             A,R7                                        //1个机器周期
C:0x0841        1F          DEC              R7                                           //1个机器周期
C:0x0842        AC06      MOV             R4,0x06                                   //1个机器周期
C:0x0844        7001      JNZ               C:0847                                    //2个机器周期
C:0x0846        1E          DEC              R6                                          //1个机器周期
C:0x0847        4C          ORL              A,R4                                       //1个机器周期
C:0x0848        70F6       JNZ              delay(C:0x0840)                       //2个机器周期
C:0x084A        22          RET                                                           //2个机器周期
/**************************************/
运行时间(周期):
8*[(R7+1)+256*R6]+1*R6+2
平均时间约为8个机器周期
占用资源:ACC,R4,R6,R7


/**************************************/



/****************C语*******************/
void delay(uint delaytime)
{
       while(--delaytime);
}

/****************汇编******************/

C:0x0840        EF          MOV             A,R7                                       //1个机器周期
C:0x0841        1F          DEC              R7                                          //1个机器周期
C:0x0842        7001      JNZ               C:0845                                   //2个机器周期
C:0x0844        1E          DEC              R6                                         //1个机器周期
C:0x0845        14          DEC              A                                          //1个机器周期
C:0x0846        4E          ORL              A,R6                                      //1个机器周期
C:0x0847        70F7       JNZ              delay(C:0x0840)                      //2个机器周期
C:0x084A        22          RET                                                          //2个机器周期
/**************************************/
运行时间(周期):
6*(R7+256*R6)+1*R6+2
平均时间约为6个机器周期
占用资源:ACC,R6,R7


/**************************************/




/****************C语*******************/
void delay(uint delaytime)
{
       for(;delaytime==0;--delaytime);
}

/****************汇编******************/

C:0x0840        EF          MOV             A,R7                                        //1个机器周期
C:0x0841        4E          ORL              A,R7                                        //1个机器周期
C:0x0842        7007      JNZ               C:084B                                    //2个机器周期
C:0x0844        EF          MOV             A,R7                                       //1个机器周期
C:0x0845        1F          DEC              R7                                          //1个机器周期
C:0x0846        70F8      JNZ               delay(C:0x0840)                       //2个机器周期
C:0x0848        1E          DEC              R6                                          //1个机器周期
C:0x0849        80F5      SJMP             delay(C:0x0840)                       //2个机器周期
C:0x084B        22          RET                                                           //2个机器周期
/**************************************/
运行时间(周期):
4+8*(R7+256*R6)+3*R6+2
平均时间约为8个机器周期
占用资源:ACC,R6,R7


/**************************************/
void delay(uint delaytime)
{
       for(;delaytime==0;delaytime--);
}
同上一样 for(;delaytime==0;--delaytime);。
/**************************************/


所以延时程序里面个人感觉while(--delaytime);不错,但是是3的倍数。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。