STC12C5A16S2双串口的使用
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);
}
STC12C5A16S2双串 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)