51微控制器基於定時器0的硬體延時程式碼
阿新 • • 發佈:2019-02-17
//晶振的頻率
#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();
以上為轉載,沒經過驗證