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


 1 //晶振的頻率
 2 #define OSC_FREQ (11059200UL)
 3 
 4 //每個指令的振盪周期數(4,6,12),注意,這里一定要仔細查看芯片手冊
 5 //*12 - 早期的8051、8052及當前的絕大部分51單片機
 6 //*6 - Philips 的芯片
 7 //*4 - Dallas
 8 #define OSC_PER_INST (12)
 9 
10 //TIME 為定時時間 單位MS
11 #define PRELOAD1MS (65536 - 1*(UINT16)(OSC_FREQ/(OSC_PER_INST*1000)))
12 #define PRELOAD5MS (65536 - 5*(UINT16)(OSC_FREQ/(OSC_PER_INST*1000)))
13 
14 void start_Timeout1ms(){
15     TH0 = PRELOAD1MS / 256;
16     TL0 = PRELOAD1MS % 256;
17     TF0 = 0 ;//清溢出標志位
18 
19     ET0 = 0;    //關定時器0的中斷
20 
21     TR0 = 1;    //啟動定時器
22 
23 }
24 
25 void start_Timeout5ms(){
26     //TMOD = ;
27 
28     TH0 = PRELOAD5MS / 256;
29     TL0 = PRELOAD5MS % 256;
30     TF0 = 0 ;//清溢出標志位
31 
32     ET0 = 0;    //關定時器0的中斷
33 
34     TR0 = 1;    //啟動定時器
35 
36 }
37 
38 void stop_Timeout(){
39     TR0 = 0;
40 }
41 
42 void Delay5ms(){
43     start_Timeout5ms();
44     while(!_testbit_(TF0));
45     stop_Timeout();
46 }
47 
48 /* 用法 
49 start_Timeout1ms();
50 while(!TF0);    //等待T0超時
51 stop_Timeout();
52 */

以上為轉載,沒經過驗證


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM