5/18/2012

8052延遲程式Library

以下是我最近對8052在計時器上的研究程式。
基本上就只是延遲1ms的程式,因為裡頭有個迴圈,可以透過函數傳值(傳遞數值)的方式去指定需要多少延遲時間。
假設DelayX1msTimer2(1000)為例子,傳入的值是”1000”的時候,代表這個函數要延遲一秒鐘。

請不要說這個程式有錯,因為沒有main()主程式。因為這是函式庫的程式
看到『extern 』這個字了沒?

或多或少也得公開一點原始碼,省得有人說我『這個人不過就是個找不到答案想要免費解答,結果得到STFW安慰獎就開始爆走的人而以,的確不專業和不敬業』
 這是什麼鳥話?這是中文嗎?連標點符號都沒有。


#include
#include "timerAPI.h"
#define AT8052

/*

本程式依照創用CC規範,也就是說,愛怎麼用就怎麼用,就算拿去賺錢我,只要別讓我知道就好。

設計者:Ethan

設計日期:2012/5/5

程式功能:內部計時,TR啟動,
DelayX1msTimer1Mode0 == Timer1,Mode0 1ms延遲產生程式;
DelayX1msTimer1Mode0 == Timer1,Mode1 1ms延遲產生程式;
DelayX1msTimer0Mode0 == Timer0,mode0 1ms延遲產生程式;
DelayX1msTimer0Mode0 == Timer0,mode0 1ms延遲產生程式;
DelayX1msTimer2      == Timer0,mode0 1ms延遲產生程式;
*/

//Timer 2,內部計數,溢位重新載入,TR啟動,計時1ms副程式
//Count=延遲時間
//Count=1000,延遲一秒
//Count=10000,延遲十秒
//僅限在8052上使用

#ifdef AT8052

extern void DelayX1msTimer2(unsigned int count){

      RCAP2H=TH2=(65536-1000)/256;  //設定TIMER2重新載入時間
      RCAP2L=TL2=(65536-1000)%256;
    //因為使用Timer2,會自動重新載入設定
    while(count){
        TR2=1;
        while(TF2 ==0);
        TF2=0;
        count--;  
    }
    TR2=0;
}

#endif


//Timer 1,Mode 0 ,內部計數,TR啟動,計時1ms副程式
//Count=延遲時間
//Count=1000,延遲一秒
//Count=10000,延遲十秒
extern void DelayX1msTimer1Mode0(unsigned int count){
    //13位元計數,所以是2^13=8192
    //TLx=(計數位元數-計數次數)%256
    //THx=(計數位元數-計數次數)/256
     TL1=(8192-1000)%32;
    TH1=(8192-1000)/32;
    TR1=1;//Timer 0啟動
    while (count)
    {
        //TF,計數溢位旗標,數到了就會變為0
        while(TF1==0);
        //重新設定Timer 0
        TL1=(8192-1000)%32;
        TH1=(8192-1000)/32;
        TF1=0;
        count--;
    }
     TR1=0;//Timer 0關閉
 }


//Timer 0,Mode 0 ,內部計數,TR啟動,計時1ms副程式
//Count=延遲時間
//Count=1000,延遲一秒
//Count=10000,延遲十秒
extern void DelayX1msTimer0Mode0(unsigned int count){
    //13位元計數,所以是2^13=8192
    //TLx=(計數位元數-計數次數)%256
    //THx=(計數位元數-計數次數)/256
     TL0=(8192-1000)%32;
    TH0=(8192-1000)/32;
    TR0=1;//Timer 0啟動
    while (count)
    {
        //TF,計數溢位旗標,數到了就會變為0
        while(TF0==0);
        //重新設定Timer 0
        TL0=(8192-1000)%32;
        TH0=(8192-1000)/32;
        TF0=0;
        count--;
    }
     TR0=0;//Timer 0關閉
 }

//Timer 0,Mode 1 ,內部計數,TR啟動,計時1ms副程式
//Count=延遲時間
//Count=1000,延遲一秒
//Count=10000,延遲十秒
extern void DelayX1msTimer0Mode1(unsigned int count){
    //16位元計數,所以是2^16=65535
    //TLx=(計數位元數-計數次數)%256
    //THx=(計數位元數-計數次數)/256
     TL0=(65536-1000)%256;
    TH0=(65536-1000)/256;
    TR0=1;//Timer 0啟動
    while (count)
    {
        //TF,計數溢位旗標,數到了就會變為0
        while(TF0==0);
        //重新設定Timer 0
        TL0=(65536-1000)%256;
        TH0=(65536-1000)/256;
        TF0=0;
        count--;
    }
     TR0=0;//Timer 0關閉
 }

//Timer 1,Mode 1 ,內部計數,TR啟動,計時1ms副程式
//Count=延遲時間
//Count=1000,延遲一秒
//Count=10000,延遲十秒
extern void DelayX1msTimer1Mode1(unsigned int count){
    //16位元計數,所以是2^16=65535
    //TLx=(計數位元數-計數次數)%256
    //THx=(計數位元數-計數次數)/256
     TL1=(65536-1000)%256;
    TH1=(65536-1000)/256;
    TR1=1;//Timer 0啟動
    while (count)
    {
        //TF,計數溢位旗標,數到了就會變為0
        while(TF1==0);
        //重新設定Timer 0
        TL1=(65536-1000)%256;
        TH1=(65536-1000)/256;
        TF1=0;
        count--;
    }
     TR1=0;//Timer 0關閉
 }


Google
Creative Commons License markscat的異想世界markscat製作,以創用CC 姓名標示-非商業性-相同方式分享 2.5 台灣 授權條款釋出。