51单片机中C语言延时是如何计算的?

[复制链接]
8120|10
 楼主| su2006 发表于 2009-1-6 16:21 | 显示全部楼层 |阅读模式
51单片机中C语言延时是如何计算的?<br />例如:for(n=0;n&lt100;n++);
红心j 发表于 2009-1-6 16:49 | 显示全部楼层

(1)实测(2)看编译后的程序

  
computer00 发表于 2009-1-7 00:27 | 显示全部楼层

一般不计算,通过仿真或者使用示波器测量。计算太麻烦

不同的系统又不一样,即使同样的系统,跟优化等级、寄存器使用情况等也有关。
 楼主| su2006 发表于 2009-1-7 14:09 | 显示全部楼层

1S

假如要设定1S定时,N值应该是多少呢???(Keil3开发平台,用AT89C51芯片)
computer00 发表于 2009-1-7 15:07 | 显示全部楼层

把程序写好,然后用示波器测量,不断调整N值,直到1s

  
 楼主| su2006 发表于 2009-1-8 13:45 | 显示全部楼层

用Proteus应该如何仿真

  
李冬发 发表于 2009-1-9 12:22 | 显示全部楼层

运行前记下定时器的值,运行后再看看定时器的值...

  
qdfywhj 发表于 2009-1-9 22:42 | 显示全部楼层

自己试试,用仿真器一仿真 就知道了 不用算

  
quakegod 发表于 2009-1-12 19:35 | 显示全部楼层

如果是1秒的延时就不要用延时了

用定时器定时吧,又准又节省MCU时间<br />我们不能一直做一个初学者,一定要向高手转变,<br />什么时候转变呢,就是现在,也就是随时,只要有机会<br />一般来讲,除非对外部IO存取等需要短时间延时的地方用到延时语句<br />在系统刚刚启动需要初始化设备时也可以用延时,但是这些延时都是很短的,而且没有准确度要求的,且长延时等待到一定时候是可以跳出的。<br />剩下的地方都尽量用定时器,可以1个定时器多用,当然程序会复杂些,<br />但是这样才会写出功能更多性能更好的程序。<br /><br />我以我的拙作来举一下例子。<br />我的程序里,定时器固定跑在20kHz的定时上,当然不同系统可能会有些差异,低的可能在8K左右,高的可能到40kHz抑或是80KHz以上,这里就用20Khz举例,<br />那么定时周期就是50uS,凡是需要延时时间超过50uS的,一律用定时器来完成。<br />而一般的外部IO操作所需要的延时还不到1uS,剩下很多MCU时间来进行多任务处理,实时性也能达到要求。凡是需要定时的,都是从20KHz分频得到。<br />另外,如果有两个任务1个需要1mS执行一次,每次执行10uS,另一个需要每2mS执行一次,每次需要执行20uS,但是每个的定时误差都要求不能超过5uS,怎么安排这两个任务的顺序呢,这个问题看起来不好解决,其实可以用定时中断的不同相位来解决,任务1在每0mS,1mS,2mS,...执行,而任务2在每0.5mS,2.5mS,4.5mS...执行,这样就能同时满足两个任务的实时性要求。<br /><br />延时本身是不能精确的,即使在这个系统上精确,但是到别的系统也不精确了,移植性太差,而且,如果中断也会影响延时的准确度,如果想准确,就一定要屏蔽中断,但是这样一来,系统就丧失也实时性性能。<br />所以有一说“短的用延时,长的用定时”
wi2c 发表于 2009-1-13 10:17 | 显示全部楼层

如果要精确延时

建议用定时器,非想这么弄你就看汇编的代码,因为你的for里如果是int会比char多出几条的指令的,可以搞的非常精确的,不会看汇编那就想前几位说的,用示波器看,没有的话,keil是可以软仿真的,你可以串口输出到屏幕然后看表就成了
wi2c 发表于 2009-1-13 10:21 | 显示全部楼层

还有一种

你去数指令的执行周期数<br />似乎在仿真时软件有一个计数器的<br />然后按你的晶振去算啦
您需要登录后才可以回帖 登录 | 注册

本版积分规则

66

主题

132

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部