51单片机 用c语言 调用-nop- 编一个 延时一秒 程序
发布网友
发布时间:2022-05-05 03:32
我来回答
共2个回答
热心网友
时间:2022-06-28 23:15
这么给你说吧,不同的编译器同样的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语言中的中断程序,以及每次进入中断退出中断的指令周期,这些你都要考虑在内,这样你才能做的很准;有点说偏题了。我的意思就是你要真的要把一秒作准,请用汇编或参考汇编,还要把每个语句的执行时间考虑在内,这样你才能做的很准确追问C语言中 怎样嵌入 汇编的 求教
追答具体的做法太多了,刚给你搜索了一下,百度中答案相当多,顺便给你找了一个,我感觉写的挺详细的,希望对你有帮助,http://wenku.baidu.com/view/30d7a98a6529647d272852d9.html
比如#include "reg52.h"
void main()
{
P2=1;
#pragma asm
mov P3,#55h
#pragma endasm
P2=0;
while(1);
}
这是我刚刚弄的一个示例;
热心网友
时间:2022-06-28 23:15
你的意思是完全用_nop()_延时1s?
这太坑爹了吧
用定时器吧
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
EA=1;
TR0=1;
中断里面来个++count>=20就是1s啊
比延时函数精确多了