51單片機基於定時器0的硬件延時代碼

原文地址:http://www.cnblogs.com/scdyxcc/archive/2013/01/25/2876107.html

//晶振的頻率
 #define OSC_FREQ (11059200UL)

  //每個指令的振盪週期數(4,6,12),注意,這裏一定要仔細查看芯片手冊
  //*12 - 早期的8051、8052及當前的絕大部分51單片機
  //*6 - Philips 的芯片
  //*4 - Dallas
  #define OSC_PER_INST (12)

 //TIME 爲定時時間 單位MS
 #define PRELOAD1MS (65536 - 1*(UINT16)(OSC_FREQ/(OSC_PER_INST*1000)))
 #define PRELOAD5MS (65536 - 5*(UINT16)(OSC_FREQ/(OSC_PER_INST*1000)))

void start_Timeout1ms(){
     TH0 = PRELOAD1MS / 256;
     TL0 = PRELOAD1MS % 256;
     TF0 = 0 ;//清溢出標誌位

     ET0 = 0;    //關定時器0的中斷

     TR0 = 1;    //啓動定時器

 }

 void start_Timeout5ms(){
     //TMOD = ;

     TH0 = PRELOAD5MS / 256;
     TL0 = PRELOAD5MS % 256;
     TF0 = 0 ;//清溢出標誌位

     ET0 = 0;    //關定時器0的中斷

     TR0 = 1;    //啓動定時器

 }

 void stop_Timeout(){
     TR0 = 0;
 }

 void Delay5ms(){
     start_Timeout5ms();
     while(!_testbit_(TF0));
     stop_Timeout();
 }

 /* 用法 
 start_Timeout1ms();
 while(!TF0);    //等待T0超時
 stop_Timeout();

以上爲轉載,沒經過驗證

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章