STC12C5A16S2雙串口的使用
MCU:STC15C5A16S2
本文引用地址:http://butianyuan.cn/article/201611/315597.htm時(shí)鐘: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位可變波特率,無奇偶校驗(yàn)
TMOD=0X21; //設(shè)置定時(shí)器1,自動重裝數(shù)
TH1=256-Fclk/(BitRate*12*16); //計(jì)算定時(shí)器重裝值
TL1=256-Fclk/(BitRate*12*16);
PCON|=0X80; //波特率加倍
TR1=1; //開定時(shí)器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;
}
/********************************************************************
函數(shù)功能:串口中斷處理。
入口參數(shù):無。
返 回:無。
備 注:無。
********************************************************************/
void UartISR(void) interrupt 4
{
if(RI) //收到數(shù)據(jù)
{
if(Num>0)
{
Buf[4-Num]=SBUF;
Num--;
}
RI=0; //清中斷請求
}
}
/********************以上為串口1收發(fā)程序***********************/
/********************以下為串口2收發(fā)程序***********************/
void UartInit2()
{
S2CON=0X50; //8位可變波特率,無奇偶校驗(yàn)
BRT=RELOAD_COUNT;//波特率發(fā)生器裝載
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();
//接收電腦發(fā)來的數(shù)組
while(Num>0);
//把接收到的數(shù)組發(fā)給從機(jī)
UartSendByte2(Buf[0]);
UartSendByte2(Buf[1]);
UartSendByte2(Buf[2]);
UartSendByte2(Buf[3]);
//接收從機(jī)回來的數(shù)據(jù)
Num=4;
while(Num>0);
//把從機(jī)回來的數(shù)據(jù)發(fā)回給電腦
UartSendByte(BufBack[0]);
UartSendByte(BufBack[1]);
UartSendByte(BufBack[2]);
UartSendByte(BufBack[3]);
while(1);
}
評論