STC12C5A60S2串口演示程序
扫描二维码
随时随地手机看文章
#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);//设置独立波特率发生器的重载初值
AUXR=0x14;//独立波特率发生器工作在1T模式
IE2=0x01;//使能串口2中断
EA=1;//开总中断
SendString("STC12C5A60S2rnUART2Test!rn");
while(1);
}
voidUart2()interrupt8using1
{
if(S2CON&S2RI)
{
S2CON&=~S2RI;//清除接收完成标志
P0=S2BUF;//P0显示串口数据
P2=(S2CON&S2RB8);//P2.2显示校验位
}
if(S2CON&S2TI)
{
S2CON&=~S2TI;//清除发送完成标志
busy=0;
}
}
voidSendData(chardat)
{
while(busy);//等待上个数据发送完成
ACC=dat;//取得偶校验位P
if(P)//根据P来设置串口数据的校验位
{
#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;//发送数据
}
voidSendString(char*s)
{
while(*s)//判断字符串结束标志
{
SendData(*s++);//发送字符
}
}