单片机C语言编程中,编一个延时约1s的语句

资料上看到一个是双重循环的:
for(i=1000;i>0;i--)
for(j=1000;j>0;j--);上面说这是延时约1s的
可我运行的时候它至少有4、5秒,这是咋回事?
是软件问题么??
采用的晶振是12MHz的

双重循环,共有循环 1000 × 1000 = 一百万遍。
每一遍,如果是1us,才能是延时约1s。
但是,晶振是12MHz,一条汇编的指令就至少是1us,C语言的语句,就要更多。
在编写延时函数之前,首先确认一下系统对晶振的分频系数,从而确定每个单周期指令执行所需的时间,一般的单片机都将指令执行周期设置为1us,这样就可以写一个比较接近1秒的延时函数了。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-02-11
双重循环,共有循环 1000 × 1000 = 一百万遍。
每一遍,如果是1us,才能是延时约1s。
但是,晶振是12MHz,一条汇编的指令就至少是1us,C语言的语句,就要更多。
所以至少有4、5秒,是很正常的。
第2个回答  推荐于2017-10-03
不同的晶振,其延时语句并不一样
最佳的做法是使用定时器
51单片机中跟定时器相关的控制器主要是4个,分别为
IE寄存器,用于控制定时器中断开关
TMOD寄存器用于选择定时器工作方式
TH0和TL0用于存放单片机初始值

EA=1;
TMOD=0X01;选择工作方式1
TH0=(65535-1000)/256;
TL0=(65535-1000)%256;
然后在中断服务函数里面进行判断即可。
第3个回答  2011-02-24
5楼说的很对,12M晶振进入单片机要自动四分频,换算成机器周期是0.33us,一个for语句的时间大概是9s左右,一百万遍需要9s左右本回答被提问者采纳
第4个回答  2011-02-11
我来总结一下。。

clock()函数返回程序从开始执行到函数执行时所经过的时间,一般经过
1ms / CLOCK_PER_SEC ,clock()函数的返回值会增加1 。。

CLOCK_PER_SEC 为time.h文件中定义的宏,每个编译器都不一样。。
TC中这样定义: #define CLOCKS_PER_SEC 18.2
VC/BCC中这样定义: #define CLOCKS_PER_SEC 1000.0

现在分析函数的执行过程。。

函数传过来的是秒数,但是函数需要clock函数来延时,所以需要把秒数转化成
sec*CLOCL_PER_SEC,才能和clock函数返回值作比较。。

说的很清楚了,LZ应该明白了。。
相似回答