单片机精确延时几种方式

2019-04-15 12:17发布

目前在单片机中有不少延时的方法: 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;