当前位置:   article > 正文

51指令、时钟周期、STC自动生成的延时函数时间计算

stc自动生成的延时函数时间计算

目录

周期:

while语句:

do while语句: 


周期:

振荡周期:时钟周期也称为振荡周期,定义为时钟频率的倒数。12MHz晶振的时钟周期就是1/12 us、1MHz就是1us。
状态周期:2个振荡周期为1个状态周期。
机器周期:1个机器周期含6个状态周期,12个时钟周期。指令周期是取出一条指令并执行这条指令的时间。12MHz晶振的机器周期就是12*1/12us=1us。
指令周期:完成一条指令所需的时间就是指令周期,不同的指令,指令周期也不一样。它是指CPU完成一条操作的所需的全部时间。

机器周期=6状态周期=12振荡周期

一个nop指令占用一个机器周期,也就是12个时钟周期。

调用函数需要两个机器周期,结束函数需要两个机器周期。

  1. void delay(unsigned int t)//10us
  2. {
  3. while(t--);
  4. }
  5. void Delay10us() //@12.000MHz STC工具生成
  6. {
  7. unsigned char i;
  8. _nop_();
  9. i = 2;
  10. while (--i);
  11. }
  12. //这两个函数分别掉调用时的真正时间
  13. delay(1);//422-449 20
  14. delay(2);//486 40
  15. delay(3);//532 50
  16. delay(4);//589 60
  17. delay(5);//655 70
  18. delay(6);//731 80
  19. delay(7);//817 80
  20. delay(8);//912 100
  21. delay(9);//1017 100
  22. delay(10);//1132 100
  23. delay(100);//2126 1000
  24. Delay10us();//2137 10 可见STC自动生成的函数还是非常准确的

---------------------------------------------------------------------------------------------------------------------------------

-------------------------以下是用来算STC工具自动生成的延时函数的时间计算方法--------------------------

while语句

  1. while(--x);
  2. 如果条件成立然后执行一次空语句,如果条件不成立,则执行下一指令。
  3. 时间公式为[2*x-1]us。
  1. void Delay512us()//2us //@12.000MHz
  2. {
  3. unsigned char i;//1us
  4. _nop_();//1us
  5. i = 253;//1us
  6. while (--i);//2*253-1=505us
  7. }//2us

do while语句: 

  1. do
  2.     {
  3.         while (--j);
  4.     } while (--i);
  5. 不管什么条件先执行花括号里面的程序:while、空程序
  6. do执行一遍占用1us
  7. 花括号内时间公式为约2*x-1us。
  8. 然后执行花括号外的while,如果为真,则执行空程序然后再执行一遍do,假则不执行。
  9. 当i>1,j=0时,在执行一遍do,这时j溢出变为从255开减。
  10. 花括号外的时间公式也为2*x-1us。
  1. void Delay519us()//2us //@12.000MHz
  2. {
  3. unsigned char i, j;//1us
  4. _nop_();//1us
  5. i = 1;//1us
  6. j = 255;//1us
  7. do//1us
  8. {
  9. while (--j);//2*255-1=509us
  10. } while (--i);//1us
  11. }//2us
  1. void Delay520us()//2us //@12.000MHz
  2. {
  3. unsigned char i, j;//1us
  4. i = 1;//1us
  5. j = 0;//1us
  6. do//1us
  7. { //刚开始j=0,0--溢出为255,然后从255开始减,越等于从256开始减
  8. while (--j);//2*256-1=511us
  9. } while (--i);//1us
  10. }//2us
  1. void Delay522us()//2us //522us和524us延时函数一样有误差,加起来为523us @12.000MHz
  2. {
  3. unsigned char i, j;//1us
  4. i = 2;//1us
  5. j = 1;//1us
  6. do//i=2,运行两边2*1=2us
  7. { //先再1开始执行一遍用1us,执行第一遍的时候1-到0了
  8. while (--j);//第二遍先空指令然后0到255,再从255开始减,约等于从256开始2*256-1=511us
  9. } while (--i);//第一遍2到1执行空程序然后在执行一遍,第二遍1到0不再往后执行了,2*2-1=3us
  10. }//2us
  1. void Delay526us()//2us //@12.000MHz
  2. {
  3. unsigned char i, j;//1us
  4. i = 2;//1us
  5. j = 2;//1us
  6. do//i=2,运行两边2*1=2us
  7. { //第一遍从2开始 2*2-1=3us
  8. while (--j);//第二遍约等于从256开始2*256-1=511us
  9. } while (--i);//第一遍2到1执行空程序然后在执行一遍,第二遍1到0不再往后执行了,3us
  10. }//2us
  1. void Delay1ms()//2us //@12.000MHz
  2. {
  3. unsigned char i, j;//1us
  4. i = 2;//1us
  5. j = 239;//1us
  6. do//i=2,运行两边2*1=2us
  7. { //第一遍从239开始2*239-1=477us
  8. while (--j);//第二遍约等于从256开始2*256-1=511us
  9. } while (--i);//第一遍2到1执行空程序然后在执行一遍,第二遍1到0不再往后执行了,3us
  10. }//2us
  1. void Delay1040us()//2us //@12.000MHz
  2. {
  3. unsigned char i, j;//1us
  4. i = 3;//1us
  5. j = 2;//1us
  6. do//3*1=3us
  7. { //第一遍从2开始2*(2-1)+1=3us,第二遍第三遍从256开始2*2*(256-1)+1=1022us
  8. while (--j);//1022+3=1025us
  9. } while (--i);//2*(3-1)+1=5us
  10. }//2us
  1. void Delay132ms()//2us //@12.000MHz
  2. {
  3. unsigned char i, j, k;//1us
  4. _nop_();//1us
  5. i = 2;//1us
  6. j = 1;//1us
  7. k = 201;//1us
  8. do//i=2,2us
  9. {
  10. do //第一遍先执行一遍循环do-while-while 1+2*(201-1)+1+1=403us然后i=1了
  11. { //第二遍jk都为0了,从256开始
  12. while (--k);//k执行一遍需要511us,但是j=256,所以要256*511=130816us do也要执行256遍 +256us
  13. } while (--j);//2*(256-1)+1=511us
  14. } while (--i);//2*(2-1)+1=3us
  15. }//2us

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/972035
推荐阅读
相关标签
  

闽ICP备14008679号