void DelayMS(uint x) { uchar t; while(x--) for(t=0;t<120;t++); } 晶体振动器是12M的,和t是什么关系呐

 我来答
学富嘟嘟
2012-09-03 · 超过16用户采纳过TA的回答
知道答主
回答量:32
采纳率:0%
帮助的人:30.7万
展开全部
晶振为12M表明它1秒震动12*(10的6次方)次,并有这麽多个时钟周期;上述函数是一个延时函数,它定义为延时x微秒;如果函数为void DelayMS(uint x) { uchar t; while(x--) for(t=0;t<12000(注意数量级);t++); },函数大概会执行x微秒,但是用C写的函数(汇编的话误差会小一些)并不是那么精确,会出现一定的误差,除非是 不断的根据实际延时结果尝试修改 t 以达到当中for循环延时1微秒的效果。
t和12M晶振本身没什么关系,但硬要说有关系的话,就是晶振越大,每一次for循环t的上界就会变得越大才能满足延时1微秒的效果。
追问
那这个 12M 和 t 的上限120有什么关系么   ???
追答
这个120应该改成12000,他是由12M晶振推算出来的,如果你理解12M晶振什么意思就会明白为什么t的上限为12000(上限为12000并不能得到准确的延时效果,需要你实际的调试程序改变上限)
来自:求助得到的回答
百度网友247f6335c
2018-10-11 · 超过19用户采纳过TA的回答
知道答主
回答量:57
采纳率:60%
帮助的人:17万
展开全部
for(i=0;i<120;i++);需要循环执行120次才结束本次循环,每次循环需要执行“MOV传送指令(1-2个机器周期)”、“比较判断CJNE(2个机器周期)”、“JNC判零转移(2机器周期)”、等大约8-9个机器周期。执行for循环一次大约需要1000个机器周期,以晶振位12M的单片机系统(一个机器周期消耗时间大约是1us),执行120次需要1MS的时间。 总的来说相当于标一个1MS的刻度吧。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
kenlee_gz
2012-09-02 · TA获得超过494个赞
知道小有建树答主
回答量:457
采纳率:33%
帮助的人:354万
展开全部
t越大,延时就越长,但它们之间的关系比较难以用数学形式表达,除非你把程序转为汇编,计算程序每个循环用到的周期数,然后再跟时钟周期相乘,太麻烦。对这个函数,通常我们使用一个IO口来测试这个延时是否准确,不准确就调整t的值。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
mdc9
2014-03-22 · TA获得超过442个赞
知道小有建树答主
回答量:230
采纳率:100%
帮助的人:63.9万
展开全部
120是对的,这是很多参考书上的延时函数,12M晶振的话,反汇编后计算出延时时间为 x×1ms
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式