#include"reg51.h"
#defineFOSC18432000L
#defineBAUD115200
#defineNONE_PARITY0//無校驗位
#defineODD_PARITY1//奇校驗
#defineEVEN_PARITY2//偶校驗
#defineMARK_PARITY3//標記校驗
#defineSPACE_PARITY4//空校驗
#definePARITYBITEVEN_PARITY
#defineS2RI0x01
#defineS2TI0x02
#defineS2RB80x04
#defineS2TB80x08
sfrAUXR=0x8e;
sfrS2CON=0x9a;
sfrS2BUF=0x9b;
sfrBRT=0x9c;
sfrIE2=0xaf;
bitbusy;
voidSendData(chardat);
voidSendString(char*s);
voidmain()
{
#if(PARITYBIT==NONE_PARITY)
S2CON=0x5a;//8位可變波特率(無校驗位)
#elif(PARITYBIT==ODD_PARITY)||(PARITYBIT==EVEN_PARITY)||(PARITYBIT==MARK_PARITY)
S2CON=0xda;//9位可變波特率,校驗位初始為1
#elif(PARITYBIT==SPACE_PARITY)
S2CON=0xd5;//9位可變波特率,校驗位初始為0
#endif
BRT=-(FOSC/32/BAUD);//設置獨立波特率發(fā)生器的重載初值
AUXR=0x14;//獨立波特率發(fā)生器工作在1T模式
IE2=0x01;//使能串口2中斷
EA=1;//開總中斷
SendString("STC12C5A60S2rnUART2Test!rn");
while(1);
}
voidUart2()interrupt8using1
{
if(S2CON&S2RI)
{
S2CON&=~S2RI;//清除接收完成標志
P0=S2BUF;//P0顯示串口數(shù)據(jù)
P2=(S2CON&S2RB8);//P2.2顯示校驗位
}
if(S2CON&S2TI)
{
S2CON&=~S2TI;//清除發(fā)送完成標志
busy=0;
}
}
voidSendData(chardat)
{
while(busy);//等待上個數(shù)據(jù)發(fā)送完成
ACC=dat;//取得偶校驗位P
if(P)//根據(jù)P來設置串口數(shù)據(jù)的校驗位
{
#if(PARITYBIT==ODD_PARITY)
S2CON&=~S2TB8;//置校驗位為0
#elif(PARITYBIT==EVEN_PARITY)
S2CON|=S2TB8;//置校驗位為1
#endif
}
else
{
#if(PARITYBIT==ODD_PARITY)
S2CON|=S2TB8;//置校驗位為1
#elif(PARITYBIT==EVEN_PARITY)
S2CON&=~S2TB8;//置校驗位為0
#endif
}
busy=1;
S2BUF=ACC;//發(fā)送數(shù)據(jù)
}
voidSendString(char*s)
{
while(*s)//判斷字符串結束標志
{
SendData(*s++);//發(fā)送字符
}
}