导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→发表看法:[fengjian99]Keil c51 C程序延时时间[推荐]



No.50556
作者:fengjian99
邮件:gj_92839@163.com
ID:109039
登陆:21次
文章数:33篇
最后登陆IP:113.97.226.101
最后登陆:2010/10/26 15:08:32
注册:2008/4/24 14:26:22
财富:296
发帖时间:2009/2/25 17:53:39
发贴者IP:116.25.70.151
标题:fengjian99:Keil c51 C程序延时时间[推荐]
摘要:No.50556Keil c51 C程序延时时间[推荐] 如果你要很精确的延时,可以使用定时器,C语言的定时比较难计算,你可以用KEIL里的软件仿真看看运行你的子程序需要多少时间,这样是最清楚的了。当然,如果你的编程能力已经达到比较高的水平就另一个说法,只要程序简洁,C或汇编都一样的高效率。下面我发一些别人的见解用C语言实现延时程序,首先想到的就是C常用的循环语句。下面这段代码是我经常在网上看到的:
void delay2(unsigned char i){  for(; i != 0; i--);}
到底这段代码能达到多高的精度呢?为了直接衡量这段代码的效果,我把 Keil C 根据这段代码产生的汇编代码找了出来:            
; FUNCTION _delay2 (BEGIN)                      
; SOURCE LINE # 18
;---- Variable "i" assigned to Register "R7" ----                      ; SOURCE LINE # 19                      ; SOURCE LINE # 20
0000     ?C0007:
0000 EF        MOV   A,R7
0001 6003       JZ   ?C001
00003 1F        DEC   R7
0004 80FA       SJMP  ?C0007                      
; SOURCE LINE # 21
0006     ?C0010:
0006 22        RET          
; FUNCTION _delay2 (END)

真是不看不知道~~~一看才知道这个延时程序是多么的不准点~~~光看主要的那四条语句,就需要6个机器周期。也就是说,它的精度顶多也就是6us而已,这还没算上一条 lcall 和一条 ret。如果我们把调用函数时赋的i值根延时长度列一个表的话,就是:
i  delay time/us0  61  122  18
...因为函数的调用需要2个时钟周期的lcall,所以delay time比从函数代码的执行时间多2。顺便提一下,有的朋友写的是这样的代码:

void delay2(unsigned char i)
{  unsigned char a;  
for(a = i; a != 0; a--);}
可能有人认为这会生成更长的汇编代码来,但是事实证明:      
; FUNCTION _delay2 (BEGIN)                      ; SOURCE LINE # 18;
---- Variable "i" assigned to Register "R7" ----                      ; SOURCE LINE # 19                      
; SOURCE LINE # 21;
---- Variable "a" assigned to Register "R7" ----
0000     ?C0007:
0000 EF        MOV   A,R7
0001 6003       JZ   ?C001
00003 1F        DEC   R7
0004 80FA       SJMP  ?C0007                      
; SOURCE LINE # 22
0006     ?C0010:
0006 22        RET          
; FUNCTION _delay2 (END)

其生成的代码是一样的。不过这的确不是什么好的习惯。因为这里实在没有必要再引入多余的变量。我们继续讨论正题。有的朋友为了得当更长的延时,甚至用了这样的代码:

void delay2(unsigned long i){  for(; i != 0; i--);}
这段代码产生的汇编代码是什么样子的?其实不用想也知道它是如何恐怖的$#^%&%$......让我们看一看:       

; FUNCTION _delay2 (BEGIN)                      
;SOURCE LINE # 18
0000 8F00    R   MOV   i+03H,R7
0002 8E00    R   MOV   i+02H,R6
0004 8D00    R   MOV   i+01H,R5
0006 8C00    R   MOV   i,R4                      ; SOURCE LINE # 19                      
; SOURCE LINE # 20
0008     ?C0007:
0008 E4        CLR   A
0009 FF        MOV   R7,A
000A FE        MOV   R6,A
000B FD        MOV   R5,A
000C FC        MOV   R4,A
000D AB00    R   MOV   R3,i+03H
000F AA00    R   MOV   R2,i+02H
0011 A900    R   MOV   R1,i+01H
0013 A800    R   MOV   R0,i
0015 C3        CLR   C
0016 120000   E   LCALL  ?C?ULCMP
0019 601A       JZ   ?C0010
001B E500    R   MOV   A,i+03H
001D 24FF       ADD   A,#0FFH
001F F500    R   MOV   i+03H,A
0021 E500    R   MOV   A,i+02H
0023 34FF       ADDC  A,#0FFH
0025 F500    R   MOV   i+02H,A
0027 E500    R  ......

>>返回讨论的主题



  发表回复
用户名   *您没有注册?
密码   *
验证码   * .
标题   *
心情
随便说说    我回答你    最新发现    得意的笑   
气死我了    真是没劲    坚决同意    表示反对   
大家过来    好奇怪哟    懒得理它    大家小心   
文件上传
内容


字体:      字体大小:    颜色:
粗体 斜体 下划线 居中 超级连接 Email连接 图片 Flash图片 Shockwave文件 realplay视频文件 Media Player视频文件 QuickTime视频文件 引用 飞行字 移动字 发光字 阴影字 查看更多的心情图标 背景音乐
点击加入表情
                         
选项
有回复时用短消息通知您?

   




老古网执行:31毫秒 最大:7276毫秒 查询6次