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

资料上看到一个是双重循环的:for(i=1000;i>0;i--)for(j=1000;j>0;j--);上面说这是延时约1s的可我运行的时候它至少有4、5秒,这是咋回事... 资料上看到一个是双重循环的:
for(i=1000;i>0;i--)
for(j=1000;j>0;j--);上面说这是延时约1s的
可我运行的时候它至少有4、5秒,这是咋回事?
是软件问题么??
采用的晶振是12MHz的
展开
 我来答
斯坦恩贝格(北京)电子有限公司
2015-09-06 · 斯坦恩贝格生产销售“希曼顿”牌固态继电器、电力调整器,温控器
斯坦恩贝格(北京)电子有限公司
斯坦恩贝格生产销售“希曼顿”牌固态继电器、电力调整器,温控器
向TA提问
展开全部
双重循环,共有循环 1000 × 1000 = 一百万遍。
每一遍,如果是1us,才能是延时约1s。
但是,晶振是12MHz,一条汇编的指令就至少是1us,C语言的语句,就要更多。
在编写延时函数之前,首先确认一下系统对晶振的分频系数,从而确定每个单周期指令执行所需的时间,一般的单片机都将指令执行周期设置为1us,这样就可以写一个比较接近1秒的延时函数了。
做而论道
高能答主

2011-02-11 · 把复杂的事情简单说给你听
知道大有可为答主
回答量:3万
采纳率:80%
帮助的人:1.1亿
展开全部
双重循环,共有循环 1000 × 1000 = 一百万遍。
每一遍,如果是1us,才能是延时约1s。
但是,晶振是12MHz,一条汇编的指令就至少是1us,C语言的语句,就要更多。
所以至少有4、5秒,是很正常的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
lphaff
推荐于2017-10-03 · TA获得超过2.4万个赞
知道大有可为答主
回答量:1565
采纳率:72%
帮助的人:609万
展开全部
不同的晶振,其延时语句并不一样
最佳的做法是使用定时器
51单片机中跟定时器相关的控制器主要是4个,分别为
IE寄存器,用于控制定时器中断开关
TMOD寄存器用于选择定时器工作方式
TH0和TL0用于存放单片机初始值

EA=1;
TMOD=0X01;选择工作方式1
TH0=(65535-1000)/256;
TL0=(65535-1000)%256;
然后在中断服务函数里面进行判断即可。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
mikintash
2011-02-24
知道答主
回答量:1
采纳率:0%
帮助的人:0
展开全部
5楼说的很对,12M晶振进入单片机要自动四分频,换算成机器周期是0.33us,一个for语句的时间大概是9s左右,一百万遍需要9s左右
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
fgfxr03
2011-02-11 · TA获得超过151个赞
知道答主
回答量:236
采纳率:100%
帮助的人:0
展开全部
我来总结一下。。

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应该明白了。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(6)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式