打印

延时子程序中的小问题!!

[复制链接]
3082|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
funfactory|  楼主 | 2010-12-10 14:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Void delay 02s (void)
//
延时0.2秒子程序




Unsigned char i,j,k;


for(i=20;i>0;i--)


{


for(j=20;j>0;j--)


{


for(k=248;k>248;k--)


{}
//2
个机器周期*248*1us

}
//
延时10ms=2*248*20次=9920us=9.92ms

}
//
循环2 0 次总延时=20次*10ms=0.2s



1.在for(k=248;k>248;k--)
{}
//2
个机器周期*248*1us中,为什么是两个机器周期,而不是1个?

(教材翻烂了都没找到答案,纠结,非常待解决)
2.延时程序怎样写会比较精确
3.大家一般是采用什么方式用延时程序的

相关帖子

沙发
funfactory|  楼主 | 2010-12-10 14:57 | 只看该作者
:)

使用特权

评论回复
板凳
dragon20100708| | 2010-12-10 15:29 | 只看该作者
相当于汇编程序中CJNE A,#DATA,REL ,此指令需要2个机器周期(个人看法)

使用特权

评论回复
地板
ayb_ice| | 2010-12-10 15:44 | 只看该作者
djnz
这要看反汇编

使用特权

评论回复
5
冯冯冯冯| | 2010-12-10 16:29 | 只看该作者
for指令是双周期指令,所以就是2*248*机器周期1us
单片机c语言的确很少提到c语句对应的机器周期。。

使用特权

评论回复
6
areshan| | 2010-12-10 16:37 | 只看该作者
请不要用C来算延时时间,因为C函数转成汇编的时候,编译器给你加了跳转,状态保存等语句。所以你算出来的时间永远要小于时间时间。最简单的办法是在keil下软件仿真一下,在delay函数执行前记下时间,按F10记下delay函数过后的时间,两个时间的差就是这个函数的运行时间!前提是晶振要设置成你实际用的晶振频率!!!!!!

使用特权

评论回复
7
funfactory|  楼主 | 2010-12-10 23:52 | 只看该作者
:(

使用特权

评论回复
8
funfactory|  楼主 | 2010-12-10 23:52 | 只看该作者
还是不明白!!;P

使用特权

评论回复
9
21_century| | 2010-12-11 00:11 | 只看该作者
机器周期那得看晶振的震荡频率了

使用特权

评论回复
10
冯冯冯冯| | 2010-12-11 08:03 | 只看该作者
假设你的晶振是12MHz,那么机器周期就是1us,for 指令是双周期的指令,还有调延时最好不要这样用汇编的机器周期算,不准确,就直接在keil仿真单步运行计算执行过的指令的时间。

使用特权

评论回复
11
流泪鲨鱼| | 2010-12-11 09:56 | 只看该作者
反汇编 看汇编指令时间来计算

使用特权

评论回复
12
wzxmcu| | 2010-12-11 12:20 | 只看该作者
不用这么纠结,用软件仿一下,就知道时间了,再调整一下就OK了

使用特权

评论回复
13
老鱼探戈| | 2010-12-11 12:28 | 只看该作者
用到 Delay();这样的延时函数 一般不要求时间准确,大概就可以了。
做精确定时也不会用LZ说的这种方法

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

68

帖子

1

粉丝