微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STC12C5A16S2双串口的使用

STC12C5A16S2双串口的使用

时间:11-18 来源:互联网 点击:
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);
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top