stc双串口的运用:
MCU:STC15C5A16S2
时钟:11.0592
S2SMOD=1,BRTX12=1;
串口波特率:9600
#include
#define uint8 unsigned char
#define uint16 unsigned int
#define Fclk 11059200UL /*运用22.1184M晶体*/
#define BitRate 9600UL /*波特率界说为9600*/
#define RELOAD_COUNT 0Xb8
volatile uint8 Buf[4]={0x00,0x00,0x00,0x00};//
volatile uint8 BufBack[4]={0x00,0x00,0x00,0x00};
uint8 Num=4;
void UartInit()
{
SCON=0X50;//8位可变波特率,无奇偶校验
TMOD=0X21; //设置定时器1,主动重装数
TH1=256-Fclk/(BitRate*12*16); //核算定时器重装值
TL1=256-Fclk/(BitRate*12*16);
PCON|=0X80; //波特率加倍
TR1=1; //开定时器1
REN=1; //答应接纳
ES=1; //答应串口1中止
EA=1; //开总中止
}
void UartSendByte(unsigned char i)
{
ES=0;
TI=0;
SBUF=i;
while(TI==0);
TI=0;
ES=1;
}
/********************************************************************
函数功用:串口中止处理。
进口参数:无。
返 回:无。
备 注:无。
********************************************************************/
void UartISR(void) interrupt 4
{
if(RI) //收到数据
{
if(Num>0)
{
Buf[4-Num]=SBUF;
Num–;
}
RI=0; //清中止请求
}
}
/********************以上为串口1收发程序***********************/
/********************以下为串口2收发程序***********************/
void UartInit2()
{
S2CON=0X50; //8位可变波特率,无奇偶校验
BRT=RELOAD_COUNT;//波特率发生器装载
AUXR=0X1c;
IE2=0X01; //答应串口2中止
EA=1;
}
void UartSendByte2(unsigned char i)
{
uint8 temp=0;
IE2=0X00;
S2CON=S2CON&0XFD;
S2BUF=i;
do{
temp=S2CON;
temp=temp&0x02;
}while(temp==0);
S2CON=S2CON&0XFD;
IE2=0X01;
}
void UartISR2(void) interrupt 8
{
unsigned char k=0;
k=S2CON;
k=k&0X01;
if(k==1)
{
S2CON=S2CON&0XFE;
if(Num>0)
{
BufBack[4-Num]=S2BUF;//
Num–;
}
}
else
{
S2CON=S2CON&0XFD;
}
}
void main()
{
UartInit();
UartInit2();
//接纳电脑发来的数组
while(Num>0);
//把接纳到的数组发给从机
UartSendByte2(Buf[0]);
UartSendByte2(Buf[1]);
UartSendByte2(Buf[2]);
UartSendByte2(Buf[3]);
//接纳从机回来的数据
Num=4;
while(Num>0);
//把从机回来的数据发回给电脑
UartSendByte(BufBack[0]);
UartSendByte(BufBack[1]);
UartSendByte(BufBack[2]);
UartSendByte(BufBack[3]);
while(1);
}