定時器延時算法設計

1.江蘇宏雲JMT系列芯片函數

注意註釋中有部分寫的不太對,spa

2.初始化定時器,產生1mS自加中斷線程

//56M時鐘 code

u16,16位自加最多能夠計時 1~65536/2 計時不會出錯blog

/*
;功能:在56M時鐘下產生1mS中斷
*/
void timer1Init()
{
    TMOD|=0x10;//16bit定時,不使能GATE門 
    TL1=0x40;//56M下配置0x2540即1mS
    TH1=0x25;
}
/*
;功能:timer1中斷,1mS計數timer_mS_count自加一次
*/
void ISR_timer1DelyCnt() interrupt 3
{
    TR1=0;
    pinLed1_PA1=~pinLed1_PA1;
    timer_mS_count++;//1mS中斷
    TL1=0x40;//56M下配置0x2540即1mS
    TH1=0x25;
    TR1=1;
}
/*
;功能:設置須要延時的時間,單位由timer_mS_count自加中斷間隔決定,mS
;入參:須要的mS計時數
;返回值:用於做爲函數checkDelay()的入參檢測對應的時間是否到達
*/
//下面兩個函數配合使用達到延時做用
u16 setDelay(u16 mySet_mS_Timer)
{
      return(timer_mS_count + mySet_mS_Timer - 1);                                             
}
/*
;功能:用來檢測是否到達所配置的時間點
;入參:函數setDelay()設置的mS對應的返回值
;返回值:0表示時間未到
;                1表示時間到達
*/
u8 checkDelay (u16 mySetTimer)//返回非零表示計時結束
{
     return(((mySetTimer - timer_mS_count) & 0x8000) >> 8);//當(t - timer_mS_count)爲正則&以後爲0,當變爲負數後由於是無符號整數,產生無窮大,那麼非零
}
/*
;功能:組合函數時間精確計時,單線程模式計時
;入參:計時時長,單位:mS
*/
void delay_ms(u16 mydealyTimer)//延時多少mS
{
     u16 timerRelCount;
     timerRelCount = setDelay(mydealyTimer);//設置mS對應的計數值
     while (!checkDelay(timerRelCount));//檢測計數值一直到時間到達爲止
}

u8,8位自加最多能夠計時1 ~ 256/2計時不會出錯it

 
u8 mySet_mS_Timer ;

/*
;功能:在56M時鐘下產生1mS中斷 */ void timer1Init() { TMOD|=0x10;//16bit定時,不使能GATE門 TL1=0x40;//56M下配置0x2540即1mS TH1=0x25; } /* ;功能:timer1中斷,1mS計數timer_mS_count自加一次 */ void ISR_timer1DelyCnt() interrupt 3 { TR1=0; pinLed1_PA1=~pinLed1_PA1; timer_mS_count++;//1mS中斷 ,u8 TL1=0x40;//56M下配置0x2540即1mS TH1=0x25; TR1=1; } /* ;功能:設置須要延時的時間,單位由timer_mS_count自加中斷間隔決定,mS ;入參:須要的mS計時數 ;返回值:用於做爲函數checkDelay()的入參檢測對應的時間是否到達 */ //下面兩個函數配合使用達到延時做用 u8 setDelay(u8 mySet_mS_Timer) { return(timer_mS_count + mySet_mS_Timer - 1); } /* ;功能:用來檢測是否到達所配置的時間點 ;入參:函數setDelay()設置的mS對應的返回值 ;返回值:0表示時間未到 ; 1表示時間到達 */ u8 checkDelay (u8 mySetTimer)//返回非零表示計時結束 { return((mySetTimer - timer_mS_count) & 0x80 );//當(t - timer_mS_count)爲正則&以後爲0,當變爲負數後由於是無符號整數,產生無窮大,那麼非零 } /* ;功能:組合函數時間精確計時,單線程模式計時 ;入參:計時時長,單位:mS */ void delay_ms(u8 mydealyTimer)//延時多少mS { u16 timerRelCount; timerRelCount = setDelay(mydealyTimer);//設置mS對應的計數值 while (!checkDelay(timerRelCount));//檢測計數值一直到時間到達爲止 }
相關文章
相關標籤/搜索