大家都知道精确延时在很多时候是很需要的,可是对于一直用c来写程序的人很难知道自己写的delay 到底延时多久。
举个例子吧,例如i2c的延时,有时需要delay 4个us,那我只需要写出一个delay为1us的 然后再循环几次就差不多了。虽然循环会来带误差,只要循环次数少些,也不会太大的。
如何呢确定一个1us的延时,大家可以写一个delay;
void delay_us (unsigned short n)
{
unsigned short i;
for(n;n>0n--)
for(i=0;i<10;i++);
}
接下来就是while(1)
{
LED = 0;
delay_us(1);
LED = 1;
delay_us(1);
}
然后用示波器测量出IO口高低电平的时间就好了,不断修改 for(i=0;i<10;i++);中的i<10 ,直到接近1us就好了
六楼的是,
另外,这样的程序在不同型号的51上由于指令周期不一样,程序兼容性无法保证.
对定好的设计挺好用的,不过有时为了能准一些,来回调整调整时间也不少。还有us多和少的误差也不一样
这个和晶体的频率相关,为什么不做成一个自动计算的函数,而需要自己不断去改程序代码。在avrgcc中,_delay_ms()函数就是这样的,使用方便,不用每次都是调整延时的参数。
用示波器抓的话,得有一个触发源,你这么设置?设置为上升沿出发吗?
用高级语言写循环延迟,是实在没有办法时的办法,因为:
①.中断响应的时机和次数难以控制,无疑这是影响时间精度的要素,如关中断执行延迟则势必使系统的实时性大打折扣;
②.实际延迟时间和编译器及所设置的优化级别有关,编译器重装或遇更新时可能会使执行代码发生变化;
③.程序维护(如修改或升级)时若身边没有可供动作确认目标机,则新产生出的代码不放心。
所以,最好还是用定时器。
恩,你说的这个相对复杂的情况下了,上面基本是真对新手的。
我记得有个叫单片机精灵的小工具也可以写出“精确”的延时。只不过和你的不太一样哈。
用汇编应该会更精确,将汇编嵌进来就可以了,要么用定时器吧