找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4212|回复: 9
收起左侧

stc89c52单片机请问两种延时有什么区别?

[复制链接]
ID:592477 发表于 2019-9-16 18:36 来自手机 | 显示全部楼层 |阅读模式
12m晶振,delayus(25)等于延时55us吧?为啥在ds18b20的写字节里用delayu(55)时不能正常显示?
F82EB1A3-7B02-4945-BE6C-CC199CE0842C.jpeg
96403920-6CAD-432A-8B20-A74C3AFACBDC.jpeg
回复

使用道具 举报

ID:277550 发表于 2019-9-16 22:38 | 显示全部楼层
循环的效果是一样的,前者没有写 _nop_() 后者则写,,,,,写了_nop_()更标准一些
回复

使用道具 举报

ID:235200 发表于 2019-9-16 23:38 | 显示全部楼层
delayus(55)不一定是55us,delayu(55)更加不是55us了,在C语言中的延时程序很难控制到us,只是使用延时程序能够满足DS18B20的读写时序关系就能读出或写入数据,你使用两种不同的延时,肯定有一种不符合读写时序
回复

使用道具 举报

ID:386381 发表于 2019-9-16 23:59 来自手机 | 显示全部楼层
你怎么知道是55us,仿真了吗?
回复

使用道具 举报

ID:208271 发表于 2019-9-17 10:09 | 显示全部楼层
直接进入调试模式,看看执行一次需要多长时间,这样做演示函数不能理所当然的,要模拟。
回复

使用道具 举报

ID:612416 发表于 2019-9-17 10:18 | 显示全部楼层
肯定delayus(55)比delayu(55)延时时间更长啊。
_nop_是空操作,占用一个指令周期,while(i--)还有判断、自减操作,是好几个指令周期。
回复

使用道具 举报

ID:598826 发表于 2019-9-17 12:48 | 显示全部楼层
最好从编译出来的汇编代码来比较,看每个循环执行用了几个指令周期
回复

使用道具 举报

ID:612663 发表于 2019-9-17 16:55 | 显示全部楼层
12m晶振下,你的delayu()执行一次就10us+了。
回复

使用道具 举报

ID:582082 发表于 2019-9-17 20:45 | 显示全部楼层
肯定delayus(55)比delayu(55)延时时间更长啊。 _nop_是空操作,占用一个指令周期,while(i--)还有判断、自减操作,是好几个指令周期
回复

使用道具 举报

ID:155507 发表于 2019-9-17 21:13 | 显示全部楼层
最好从编译出来的汇编代码来比较

  1.   20          void delayus(unsigned char i)
  2.   21          {
  3.   22   1        while(i--);
  4.   23   1      }
  5.   24          void delayu(unsigned char i)
  6.   25          {
  7.   26   1        unsigned char a;
  8.   27   1        for(a=0; a<i; a++)
  9.   28   1        {
  10.   29   2          _nop_();
  11.   30   2        }
  12.   31   1      }

  13. 下面来说说汇编的传统计算方法:


  14. 指令周期、机器周期与时钟周期
  15.        指令周期:CPU执行一条指令所需要的时间称为指令周期,它是以机器周期为单位的,指令不同,所需的机器周期也不同。
  16.        时钟周期:也称为振荡周期,一个时钟周期 =晶振的倒数。
  17.        MCS-51单片机的一个机器周期=6个状态周期=12个时钟周期。
  18.        MCS-单片机的指令有单字节、双字节和三字节的,它们的指令周期不尽相同,一个单周期指令包含一个机器周期,即12个时钟周期,所以一条单周期指令被执行所占时间为12*(1/12000000)=1us。

  19. 了解了上面这些我们来看一个例子

  20. 汇编延时子程序的延时计算问题
  21. 对于程序
  22.              ; FUNCTION _delayus (BEGIN)
  23.                                            ; SOURCE LINE # 20
  24. ;---- Variable 'i' assigned to Register 'R7' ----
  25.                                            ; SOURCE LINE # 21
  26.     ?C0008:
  27.                                                                                         ; SOURCE LINE # 22
  28.               MOV     R6,AR7 ;2指令周期
  29.               DEC     R7     ;1指令周期
  30.               MOV     A,R6   ;1指令周期
  31.               JNZ     ?C0008 ;2指令周期
  32.     ?C0009:
  33.                                                                                         ; SOURCE LINE # 23
  34.     ?C0010:
  35.               RET            ;2指令周期
  36.     ; FUNCTION _delayus (END)

  37. R7 * (2+1+1+2) + 2
  38. 整个循环执行完应该是 =(R7 * 6) + 2  指令周期


  39.              ; FUNCTION _delayu (BEGIN)
  40.                                            ; SOURCE LINE # 24
  41. ;---- Variable 'i' assigned to Register 'R7' ----
  42.                                            ; SOURCE LINE # 25
  43.                                            ; SOURCE LINE # 27
  44. ;---- Variable 'a' assigned to Register 'R6' ----
  45.               CLR     A       ;1指令周期
  46.               MOV     R6,A    ;1指令周期
  47.     ?C0011:
  48.               MOV     A,R6    ;1指令周期
  49.               CLR     C       ;1指令周期
  50.               SUBB    A,R7    ;1指令周期
  51.               JNC     ?C0014  ;2指令周期
  52.                                   ; SOURCE LINE # 28
  53.                                   ; SOURCE LINE # 29
  54.               NOP             ;1指令周期
  55.                                   ; SOURCE LINE # 30
  56.               INC     R6      ;1指令周期
  57.               SJMP    ?C0011  ;2指令周期
  58.                                   ; SOURCE LINE # 31
  59.     ?C0014:
  60.               RET             ;2指令周期
  61.     ; FUNCTION _delayu (END)

  62. (1+1+1+2)+ R7 *  (1+1+2+1+1+1+2) +1 +1 +2
  63. 整个循环执行完应该是        = (R7 * 9) + 9  指令周期


  64. 还说明一下:

  65. nop指令或者_nop_(); 函数占一个机器周期,
  66.    在stc单片机的12T模式下一个机器周期是一个振荡周期的12分频,如果你的晶振是12MHZ,那你的一个机器周期就是1微秒.一个nop指令的执行时间也就是1US

  67.    当在6T模式(下载的时候可选择模式)下12M晶振的时候,一个nop就是0.5US了.


复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表