51单片机 用c语言 调用-nop- 编一个 延时一秒 程序

2024-11-25 17:45:38
推荐回答(2个)
回答1:

这么给你说吧,不同的编译器同样的C语言语句编译出来的时间不完全一致,举个简单例子;
for(i=0,i<=100;i++)
for(j=0;j<=10;j++);

for(i=0,i<=10;i++)
for(j=0;j<=100;j++);
其实理论上来讲,这个时间都是一个指令周期*10*100,对吧,但是实际效果而讲,这两个时间不一样,都知道可以实现跳转的指令机器周期有几种,到底编译器是如何实现的,我们可以通过编译之后看它对应的汇编语句(编译器中一般都可以看到),然后通过计算汇编的时间,才基本能确定你用C编译之后这个延时程序到底延时多少,如果你换个编译器,比如从keil转到wave,又不能确定时间是否一致;其实你到网上看看,对于时间要求很严格的地方,延时程序基本都是汇编写的,大不了是C和汇编嵌套,或者用定时器;如果你说的是大概一秒的话,那么你百度一下就是一大堆;我做个一个表,即使用定时器,藐视很准确,其实走上一天可能就差几秒甚至几分钟,因为C语言中的中断程序,以及每次进入中断退出中断的指令周期,这些你都要考虑在内,这样你才能做的很准;有点说偏题了。我的意思就是你要真的要把一秒作准,请用汇编或参考汇编,还要把每个语句的执行时间考虑在内,这样你才能做的很准确

回答2:

你的意思是完全用_nop()_延时1s?
这太坑爹了吧
用定时器吧
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
EA=1;
TR0=1;
中断里面来个++count>=20就是1s啊
比延时函数精确多了