基本上就只是延遲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關閉
}
同場加碼8052 Timer2 UART設定程式。
回覆刪除//#include "reg_c51.h"
#include
/**
* FUNCTION_PURPOSE: This file set up uart in mode 1 (8 bits uart) with
* timer 2 in baud rate generator mode.
* FUNCTION_INPUTS: void
* FUNCTION_OUTPUTS: void
*/
extern void Timer2InterupUART(void){
SCON = 0x50; // uart in mode 1 (8 bit), REN=1
T2CON=0x30; //EXEN2=0; TR2=0; C/T2#=0; CP/RL2#=0;
//RCLK = 1; TCLK=1;
TH2=0xFF; // init value
TL2=0xD9; // init value
//RCAP2H=(65536-39)/255; // reload value, 115200 Bds at 11.059MHz
//RCAP2L=(65536-39)%255; // reload value, 115200 Bds at 11.059MHz
RCAP2H=0xFF; // reload value, 9600 Bds at 12MHz
RCAP2L=0xD9; // reload value, 9600 Bds at 12MHz
// ES = 1; // Enable serial interrupt
// EA = 1; // Enable global interrupt
TR2 = 1; // Timer 2 run
}