單片機(jī)精確延時(shí)幾種方式
目前在單片機(jī)中有不少延時(shí)的方法:
1、使用循環(huán)函數(shù)延時(shí):
void delay1ms(void) //誤差 0us,延時(shí)1ms
{
unsigned char a,b;
for(b=199;b>0;b--)
for(a=1;a>0;a--);
}
可以用單片機(jī)精靈來獲取更多延時(shí),下載地址https://pan.baidu.com/s/1qYQeoig
這種延時(shí)方式雖然說可以比較精確的延時(shí),但是他會(huì)一直占用cpu,延時(shí)期間cpu只能選擇等待,無法執(zhí)行其他事情,降低了cpu的使用效率。
2、使用定時(shí)器中斷延時(shí)(C語言版)
void IinitTimer()
{
TMOD = 0x01; //工作方式1
TH0 = 0x0FC; //延時(shí)1ms的初值
TL0 = 0x18;
EA = 1; //開啟中斷
ET0 = 1; //開啟定時(shí)器中斷0
TR0 = 1; //開啟定時(shí)器0
}
void TimerInterrupt(void) interrupt 1 //中斷方式1
{
TH0 = 0x0FC;
TL0 = 0x18;
}
3、不使用中斷
void IinitTimer()
{
TMOD = 0x01; //工作方式1
TH0 = 0x0FC; //延時(shí)1ms的初值
TL0 = 0x18;
EA = 1; //開啟中斷
ET0 = 1; //開啟定時(shí)器中斷0
TR0 = 1; //開啟定時(shí)器0
}
void DelayMilliseconds(int time)
{
do
{
TH0 = 0x0FC;
TL0 = 0x18;
while(!TF0);
TF0 = 0;
}while(--time);
}
初值的計(jì)算:方式1
TH0 =(65536 - 時(shí)間*晶振頻率/12)/ 256;
TL0 =(65536 - 時(shí)間*晶振頻率/12)%256;
工作方式:
方式0:13位(8192 - 時(shí)間*晶振頻率/12)/ 256;
方式2:8位 (256 - 時(shí)間*晶振頻率/12)/ 16;