目前在單片機中有不少延時的方法:
1、使用循環(huán)函數(shù)延時:
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只能選擇等待,無法執(zhí)行其他事情,降低了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;