51單片機(jī)基于定時(shí)器0的硬件延時(shí)代碼
1 //晶振的頻率
2 #define OSC_FREQ (11059200UL)
3
4 //每個(gè)指令的振蕩周期數(shù)(4,6,12),注意,這里一定要仔細(xì)查看芯片手冊(cè)
5 //*12 - 早期的8051、8052及當(dāng)前的絕大部分51單片機(jī)
6 //*6 - Philips 的芯片
7 //*4 - Dallas
8 #define OSC_PER_INST (12)
9
10 //TIME 為定時(shí)時(shí)間 單位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 ;//清溢出標(biāo)志位
18
19 ET0 = 0; //關(guān)定時(shí)器0的中斷
20
21 TR0 = 1; //啟動(dòng)定時(shí)器
22
23 }
24
25 void start_Timeout5ms(){
26 //TMOD = ;
27
28 TH0 = PRELOAD5MS / 256;
29 TL0 = PRELOAD5MS % 256;
30 TF0 = 0 ;//清溢出標(biāo)志位
31
32 ET0 = 0; //關(guān)定時(shí)器0的中斷
33
34 TR0 = 1; //啟動(dòng)定時(shí)器
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超時(shí)
51 stop_Timeout();
52 */