|
发表于 2023-8-16 22:49:47
|
显示全部楼层
本帖最后由 mmxx2015 于 2023-8-16 23:08 编辑
其实,不需要会汇编就可以大概算一下,只要会看指令表,不过,好像赛元没有提供指令表。
一般死循环等待延时不会太长,参数不需要long那大,只需要unsigned char就够用了,你这段程序大概改成这样就简单多了:
- void delay_ms_v2(unsigned char ms)
- {
- unsigned char i,j;
-
- //_push_(IE); //保存IE
- //EA=0;
- do
- {
- i=10; //延时时间=2T+(i*11196T)+(((i-1)*5)+3)T=12010T
- do
- {
- j=239; //延时时间=((2+((j-1)*5)+3)+1)T=11196T
- while(--j);
- _nop_();
- }while(--i);
-
- //clear_wdt(); //清看门狗
-
- }while(--ms);
-
- //_pop_(IEN0); //恢复IE
- }
复制代码 这段程序会编译成这样:
- ; void delay_ms_v2(unsigned char ms)
- RSEG ?PR?_delay_ms_v2?MAIN
- _delay_ms_v2:
- USING 0
- ; SOURCE LINE # 23
- ;---- Variable 'ms?143' assigned to Register 'R7' ----
- ; {
- ; SOURCE LINE # 24
- ?C0012:
- ; unsigned char i,j;
- ;
- ;
- ; //_push_(IE); //保存IE
- ; //EA=0;
- ;
- ; do
- ; {
- ; SOURCE LINE # 32
- ;
- ; i=10; //延时时间=2T+(i*11196T)+(((i-1)*5)+3)T=12010T
- ; SOURCE LINE # 34
- ;---- Variable 'i?144' assigned to Register 'R6' ----
- MOV R6,#0AH ---- 2T
- ?C0015:
- ; do
- ; {
- ; SOURCE LINE # 36
- ; j=239; //延时时间=((2+((j-1)*5)+3)+1)T=11196T
- ; SOURCE LINE # 37
- ;---- Variable 'j?145' assigned to Register 'R5' ----
- MOV R5,#0EFH ---- 2T
- ?C0016:
- ; while(--j);
- ; SOURCE LINE # 38
- DJNZ R5,?C0016 ---- 3T/5T
- ?C0017:
- ; _nop_();
- ; SOURCE LINE # 39
- NOP ---- 1T
- ; }while(--i);
- ; SOURCE LINE # 40
- DJNZ R6,?C0015 ---- 3T/5T
- ;
- ; //clear_wdt(); //清看门狗
- ;
- ; }while(--ms);
- ; SOURCE LINE # 44
- DJNZ R7,?C0012 ---- 3T/5T
- ;
- ; //_pop_(IEN0); //恢复IE
- ; }
- ; SOURCE LINE # 47
- RET
- ; END OF _delay_ms_v2
复制代码 大部分的延时指令由DJNZ R*实现,对照指令表,DJNZ R*不跳转(=0)时用时3T,跳转(!=0)时用时5T,也就是说,延时时间=5T*(R*-1)+3T。
系统时钟=12MHz时,不考虑ms计数用时,上述程序1mS计时时间=12010T/12MHz=1.000833333333333mS。
|
|