关于延时
void delay(uint c)
{ uint a,b;
for(a=0;a<c;a++)
for(b=0;b<550;b++)
;
}
精确的时间跟你的时钟周期有关~~~ 以上程序段可以直接调用 eg: delay(100);
你也可以编一个定时1Ms 1S的程序:
eg:
void delay1ms(uint delay1ms) //STC11F60XE,22.1184M,1ms
{
uint i,j;
for(;delay1ms>0;delay1ms--)
for(i=0;i<7;i++)
for(j=0;j<210;j++);
}
这样你就可以直接调用: 如延时23ms : delay1ms(23);
使用计时器或定时器中断更准确
1、中断方式
void timerX_ISR(void)
{
DelayMS++;
}
int main(void)
{
while(1){
.....
DelayMS = 0;
while(DelayMS < 9);
......
}
return 0;
}
将定时器设定为1ms一次中断,从0-9表示10ms延时
当然你也可以不用等待,用if判断,延时的时候去干点别的事情
2、计时器查询方式
void DelayMS(unsigned int delay_ms)
{
unsigned int time1,time2, temp;
time1 = TIMx_CNT; //使用某个计时器,记录当前时刻
delay_ms = delay_ms * TICK_PER_MS ; //将延迟的MS数转换成计时器的次数
do{
time2 = TIMx_CNT;
if(time2 >= time1){
temp = (time2 - time1);
}
else{
temp = (0xFFFFFFFF - (time1-time2) +1 ); //假设是32位的计时器,溢出的时候
}
}while( (temp < delay_ms ) && ( delay_ms != 0) )
}
设置好定时器,不用开中断,增计数。
这个方式有一个缺点,最多延时时间只能是计时器的周期的最大值
如果是32位的也够折腾了,如果是16位的,可以适当计时时钟,假设是1us加1,
可以最长延时65.535ms,周期改为10us最长就可以延时655.35ms了
如果是1us,TICK_PER_MS 的值就是1000,10us就是100,其他类推
如果需要较长的延时,那就多调用几次吧