打印

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

[复制链接]
7259|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
su2006|  楼主 | 2009-1-6 16:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
红心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芯片)

使用特权

评论回复
5
computer00| | 2009-1-7 15:07 | 只看该作者

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

使用特权

评论回复
6
su2006|  楼主 | 2009-1-8 13:45 | 只看该作者

用Proteus应该如何仿真

使用特权

评论回复
7
李冬发| | 2009-1-9 12:22 | 只看该作者

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

使用特权

评论回复
8
qdfywhj| | 2009-1-9 22:42 | 只看该作者

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

使用特权

评论回复
9
quakegod| | 2009-1-12 19:35 | 只看该作者

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

用定时器定时吧,又准又节省MCU时间
我们不能一直做一个初学者,一定要向高手转变,
什么时候转变呢,就是现在,也就是随时,只要有机会
一般来讲,除非对外部IO存取等需要短时间延时的地方用到延时语句
在系统刚刚启动需要初始化设备时也可以用延时,但是这些延时都是很短的,而且没有准确度要求的,且长延时等待到一定时候是可以跳出的。
剩下的地方都尽量用定时器,可以1个定时器多用,当然程序会复杂些,
但是这样才会写出功能更多性能更好的程序。

我以我的拙作来举一下例子。
我的程序里,定时器固定跑在20kHz的定时上,当然不同系统可能会有些差异,低的可能在8K左右,高的可能到40kHz抑或是80KHz以上,这里就用20Khz举例,
那么定时周期就是50uS,凡是需要延时时间超过50uS的,一律用定时器来完成。
而一般的外部IO操作所需要的延时还不到1uS,剩下很多MCU时间来进行多任务处理,实时性也能达到要求。凡是需要定时的,都是从20KHz分频得到。
另外,如果有两个任务1个需要1mS执行一次,每次执行10uS,另一个需要每2mS执行一次,每次需要执行20uS,但是每个的定时误差都要求不能超过5uS,怎么安排这两个任务的顺序呢,这个问题看起来不好解决,其实可以用定时中断的不同相位来解决,任务1在每0mS,1mS,2mS,...执行,而任务2在每0.5mS,2.5mS,4.5mS...执行,这样就能同时满足两个任务的实时性要求。

延时本身是不能精确的,即使在这个系统上精确,但是到别的系统也不精确了,移植性太差,而且,如果中断也会影响延时的准确度,如果想准确,就一定要屏蔽中断,但是这样一来,系统就丧失也实时性性能。
所以有一说“短的用延时,长的用定时”

使用特权

评论回复
10
wi2c| | 2009-1-13 10:17 | 只看该作者

如果要精确延时

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

使用特权

评论回复
11
wi2c| | 2009-1-13 10:21 | 只看该作者

还有一种

你去数指令的执行周期数
似乎在仿真时软件有一个计数器的
然后按你的晶振去算啦

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

66

主题

132

帖子

0

粉丝