?? mode1_master.c
字號(hào):
//////////////UART0 模式1主機(jī)程序/////////////////
//////TX0線為P0.0,RX0線為P0.1,TX0采用T2為波特率產(chǎn)生源,RX0采用T1為波特率產(chǎn)生源///////
/////////////mode1_master.c//////////////////////
#include <C8051F040.h>
typedef unsigned char uchar;
typedef unsigned int uint;
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 aa[6]={0x31,0x32,0x33,0x34,0x35,0x36};
xdata uchar res[6];
xdata uchar k;
xdata uchar t;
enum {aalen=6};//定義發(fā)送數(shù)據(jù)長(zhǎng)度
void delay1ms(uint time);
void uart0_ini();
void t1_ini();
void t1_baud(uchar t1h);
void t2_ini();
void t2_baud(uint t2reload);
void config (void) ;
void uart0_ini(){
SFRPAGE = 0x00;
SADEN0 = 0x00;
// SADEN0為UART0從機(jī)地址控制寄存器,0表示相應(yīng)位地址不參加過(guò)濾,即該位地址值為0或1均為有效地址
SADDR0 = 0x00;
// SADDR0為UART0從機(jī)地址設(shè)置寄存器
SSTA0 = 0x01;
// SMOD0=0,UART0波特率2分頻禁止
//TX時(shí)鐘源為T(mén)2,RX時(shí)鐘源為T(mén)1
SCON0 = 0x50;
//工作在模式1,為8bit可變波特率通訊
SCON0 &= 0xFC; //將TI0和RI0清零
IE|=0x10;
t1_ini();
t2_ini();
}
void t1_ini(){
SFRPAGE = 0x00;
CKCON = 0x10; // T1采用系統(tǒng)時(shí)鐘,不分頻
TMOD = 0x20; // T1為8bit自動(dòng)重載模式
TCON = 0x40; // TR1置1,啟動(dòng)定時(shí)器
}
void t1_baud(uchar val){//T1溢出率設(shè)置,溢出率為(T1時(shí)鐘頻率)/(val)
SFRPAGE = 0x00;
TH1 = ~val+1;
TL1 = TH1;
}
void t2_ini(){
SFRPAGE = 0x00;
TMR2CF = 0x08;
//T2為系統(tǒng)時(shí)鐘不分頻,計(jì)數(shù)方向?yàn)樵鲋涤?jì)數(shù)
TMR2CN = 0x04; // TR2置1,啟動(dòng)定時(shí)器
}
void t2_baud(uint t2reload){//T2溢出率設(shè)置,溢出率為(T2時(shí)鐘頻率)/(t2reload)
SFRPAGE = 0x00;
RCAP2=~t2reload+1;
TMR2=RCAP2;
}
void config (void) {
WDTCN = 0x07; //看門(mén)狗禁止
WDTCN = 0xDE;
WDTCN = 0xAD;
SFRPAGE = 0x0F;
XBR0 = 0x04; // 將UART0 TX0配置到P0.0口,RX0配置到P0.1口
XBR1 = 0x00; //
XBR2 = 0x40; // Crossbar 交叉開(kāi)關(guān)配置使能
XBR3 = 0x00; //
SFRPAGE = 0x0F;
P0MDOUT = 0x00; // TX0和RX0為開(kāi)漏模式,故宜加上拉電阻
P1MDIN = 0xFF; // Input configuration for P1
SFRPAGE = 0x0F;
CLKSEL = 0x00;
OSCXCN = 0x00;
OSCICN = 0x84;
//采用內(nèi)部晶振,為24.5MHZ8分頻
} //End of config
void main(){
config();
uart0_ini();
t1_baud(10);//設(shè)置波特率為系統(tǒng)時(shí)鐘320分頻,3062500/320=9570,即波特率約為9600bps
t2_baud(10);//設(shè)置波特率為系統(tǒng)時(shí)鐘160分頻,3062500/160=19140,即波特率約為19200bps
EA=1;
k=0;
t=0;
SFRPAGE=0x00;
SBUF0=aa[k];//啟動(dòng)發(fā)送
while(1){
if(k>=aalen){
SFRPAGE=0x00;
TR2=0;//停止定T2時(shí)器,從而停止發(fā)送
}
if(t>=aalen){
SFRPAGE=0x00;
TR1=0;//停止定T1時(shí)器,從而停止接收
}
}
}
void uart0_ISR() interrupt 4{//全雙工發(fā)送接收
SFRPAGE=0x00;
if(SCON0&0x01){
res[t]=SBUF0;//將接收數(shù)據(jù)保存到res
t++;
SCON0&=0xfe;
}
if(SCON0&0x02){
k++;
SBUF0=aa[k];//從aa數(shù)組中取數(shù)據(jù)發(fā)送
SCON0&=0xfd;
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -