51单片机的延时问题

adong76 2010-01-26 05:43:38
51单片机在延时,用c来写代码,
void delay(unsigned int i)
{
while(--i);//执行一次--i是多长时间?

}
所用单片机为AT89s51,晶振为12MHZ,用这个程序来延时,精度有多高啊,调用此函数delay(35530)延时的时间多少啊;

汇编延时一秒的程序
delay:MOV R7,#10
D1: MOV R6,#200
D2: MOV R5,#248
DJNZ R5,$
DJNZ R6,D2
DJNZ R7,D1
RET
END
所用单片机为AT89s51,晶振为12MHZ,一个指令周期为1us,时间的计算是怎样的,小弟对汇编不是很熟悉,
...全文
294 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ykhufuhai 2010-01-27
  • 打赏
  • 举报
回复
keil 上面不是有个计时器的啊 每条C语言的时间都有的 自己计算就可以了
爱吃西红柿-zy 2010-01-27
  • 打赏
  • 举报
回复
keil上边调试的时候可以看看执行一次要多长时间
JAZZLAM 2010-01-27
  • 打赏
  • 举报
回复
c的软件延时不精确,不过可以软件算下,还是汇编的好!
churenxh 2010-01-27
  • 打赏
  • 举报
回复
仍以1秒延时为例
  DEL:MOV R7,#10 1指令周期1
  DEL1:MOV R6,#0FFH 1指令周期10
  DEL2:MOV R5,#80H 1指令周期255*10=2550
  KONG:NOP 1指令周期128*255*10=326400
  DJNZ R5,$ 2指令周期2*128*255*10=652800
  DJNZ R6,DEL2 2指令周期2*255*10=5110
  DJNZ R7,DEL1 2指令周期2*10=20
  RET 2
  延时时间=1+10+2550+326400+652800+5110+20+2 =986893µs约为1s
  整理得:延时时间=[(3*第一层循环+3)*第二层循环+3]*第三层循环+3 ⑩
ialwaysgo 2010-01-26
  • 打赏
  • 举报
回复
经验告诉我们,这时候是示波器说了算!!

用你的延时程序写个方波的形成程序,之后看方波的周期
daition340 2010-01-26
  • 打赏
  • 举报
回复
?C0002:
; while(--i);//执行一次--i是多长时间?
; SOURCE LINE # 10
MOV A,R7
DEC R7
JNZ ?C0005
DEC R6
?C0005:
DEC A
ORL A,R6
JNZ ?C0002
;
; } ; SOURCE LINE # 12
?C0004:
RET
; END OF _delay


大约8个周期吧··
zhugjbest 2010-01-26
  • 打赏
  • 举报
回复
要看这段c的汇编了,然后算周期了
这段代码有点问题哦!
宇帆 2010-01-26
  • 打赏
  • 举报
回复
汇编可以用指令周期 计算的
C是算不准的
kyzf 2010-01-26
  • 打赏
  • 举报
回复
楼主 有示波器吗?

自己想办法弄台示波器 进行精确测试下。

另外你可以通过示波器测试出1ms的延时程序,以后就调用它实现其他的延时。
Great_Bug 2010-01-26
  • 打赏
  • 举报
回复
C语言的,自己测量一下就知道了,不好算

汇编的,可以数周期数,不过现在有时候会涉及到多种类型的核,还是测量一下可靠些.

27,374

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧