?? pca_uart0.c.c
字號:
//////////////用PCA檢測UART0特波率調試程序/////////////////
/////////////pca_UART0.c//////////////////////
#include <C8051F040.h> // Register definition file.
typedef unsigned char uchar;
typedef unsigned int uint;
typedef unsigned long ulong;
sfr16 RCAP2=0xca;
sfr16 RCAP3=0xca;
sfr16 RCAP4=0xca;
sfr16 TMR4=0xcc;
sfr16 TMR3=0xcc;
sfr16 TMR2=0xcc;
sfr16 PCA0CP0=0xfb;
sfr16 PCA0CP1=0xfd;
sfr16 PCA0CP2=0xe9;
sfr16 PCA0CP3=0xeb;
sfr16 PCA0CP4=0xed;
sfr16 PCA0CP5=0xe1;
xdata uchar k;
xdata uchar t;
enum {aalen=3};
sbit p00=P0^0;
uchar testdata;//發送測試數據
void delay1ms(uint time);
void uart0_ini();
void t1_ini();
void t1_baud(uchar val);
void t2_ini();
void t2_baud(uint t2reload);
void config (void) ;
xdata ulong pcacap0[40];
void uart0_ini(){
SFRPAGE = 0x00;
SADEN0 = 0x00;
// SADEN0為UART0從機地址控制寄存器,0表示相應位地址不參加過濾,即該位地址值為0或1均為有效地址
SADDR0 = 0x00;
// SADDR0為UART0從機地址設置寄存器
SSTA0 = 0x01;
// SMOD0=0,UART0波特率2分頻禁止
//TX時鐘源為T2,RX時鐘源為T1
SCON0 = 0x50;
//工作在模式1
SCON0 &= 0xFC; //將TI0和RI0清零
IE|=0x10;
t1_ini();
t2_ini();
}
void t1_ini(){
SFRPAGE = 0x00;
CKCON = 0x10; // T1采用系統時鐘,不分頻
TMOD = 0x20; // T1為8bit自動重載模式
TCON = 0x40; // TR1置1,啟動定時器
}
void t1_baud(uchar val){//T1溢出率設置,溢出率為(T1時鐘頻率)/(val)
SFRPAGE = 0x00;
TH1 = ~val+1;
TL1 = TH1;
}
void t2_ini(){
SFRPAGE = 0x00;
TMR2CF = 0x08;
//T2為系統時鐘不分頻,計數方向為增值計數
TMR2CN = 0x04; // TR2置1,啟動定時器
}
void t2_baud(uint t2reload){//T2溢出率設置,溢出率為(T2時鐘頻率)/(t2reload)
SFRPAGE = 0x00;
RCAP2=~t2reload+1;
TMR2=RCAP2;
}
void pca0ini(){//PCA CEX4配置為正負邊沿均捕捉
SFRPAGE=0x00;
PCA0CPM0 = 0x31;
PCA0CPL0 = 0x00;
PCA0CPH0 = 0x00;
}
void pcaini(){
SFRPAGE=0x00;
PCA0MD=0x09;
PCA0CN=0x40;
EIE1|=0x08;
}
void config(){
//看門狗禁止
WDTCN = 0x07;
WDTCN = 0xDE;
WDTCN = 0xAD;
SFRPAGE = 0x0F;
//交叉開關配置,TX0=P0.0;RX0=P0.1,CEX0=P0.2,將TX0與CEX0相連
XBR0 = 0x34;
XBR1 = 0x00;
XBR2 = 0x40;
XBR3 = 0x00;
//管腳輸出配置,P0口為開漏輸出,其中P0.6接上拉電阻,P0為數字輸入口
SFRPAGE = 0x0F;
P0MDOUT = 0x00;
P1MDIN = 0xFF;
//晶振配置,采用內部晶振8分頻
SFRPAGE = 0x0F;
CLKSEL = 0x00;
OSCXCN = 0x00;
OSCICN = 0x84;
}
void main(){
config();
uart0_ini();
t1_baud(0x24);
t2_baud(100);
pcaini();
pca0ini();
EA=1;
k=0;
t=0;
testdata=0xaa;
SFRPAGE=0x00;
SBUF0=testdata;//啟動發送
while(1){
if(k>=aalen){
SFRPAGE=0x00;
//TR2=0;//停止定T2時器,從而停止發送
}
if(t>=aalen){
SFRPAGE=0x00;
//TR1=0;//停止定T1時器,從而停止接收
}
}
}
void uart0_ISR() interrupt 4{//全雙工發送接收
uchar temp;
SFRPAGE=0x00;
if(SCON0&0x01){
t++;
temp=SBUF0;
SCON0&=0xfe;
}
if(SCON0&0x02){
k++;
SBUF0=testdata;//從aa數組中取數據發送
SCON0&=0xfd;
}
}
void PCA_ISR(void) interrupt 9 {
static xdata uchar num1=0;
static xdata uint tmpcnt=0;
SFRPAGE = 0x00;
if(CF){
CF=0;
}
if(CCF0){
pcacap0[num1]=PCA0CP0-tmpcnt;
tmpcnt=PCA0CP0;
if(!p00)
pcacap0[num1]+=10000000L;//若P0.0上一檢測周期為邏輯1,數據加上10000000L與邏輯0相區別
num1++;
if(num1>=100){
num1=0;
}
CCF0=0;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -