目前在单片机中有不少延时的方法:
1、使用循环函数延时:
void delay1ms(void) //误差 0us,延时1ms
{
unsigned char a,b;
for(b=199;b>0;b--)
for(a=1;a>0;a--);
}
可以用单片机精灵来获取更多延时,下载地址https://pan.baidu.com/s/1qYQeoig
这种延时方式虽然说可以比较精确的延时,但是他会一直占用cpu,延时期间cpu只能选择等待,无法执行其他事情,降低了cpu的使用效率。
2、使用定时器中断延时(C语言版)
void IinitTimer()
{
TMOD = 0x01; //工作方式1
TH0 = 0x0FC; //延时1ms的初值
TL0 = 0x18;
EA = 1; //开启中断
ET0 = 1; //开启定时器中断0
TR0 = 1; //开启定时器0
}
void TimerInterrupt(void) interrupt 1 //中断方式1
{
TH0 = 0x0FC;
TL0 = 0x18;
}
3、不使用中断
void IinitTimer()
{
TMOD = 0x01; //工作方式1
TH0 = 0x0FC; //延时1ms的初值
TL0 = 0x18;
EA = 1; //开启中断
ET0 = 1; //开启定时器中断0
TR0 = 1; //开启定时器0
}
void DelayMilliseconds(int time)
{
do
{
TH0 = 0x0FC;
TL0 = 0x18;
while(!TF0);
TF0 = 0;
}while(--time);
}
初值的计算:方式1
TH0 =(65536 - 时间*晶振频率/12)/ 256;
TL0 =(65536 - 时间*晶振频率/12)%256;
工作方式:
方式0:13位(8192 - 时间*晶振频率/12)/ 256;
方式2:8位 (256 - 时间*晶振频率/12)/ 16;