STC12C5A60S2单片机双串口通信,互相发送
STC12C5A60S2单片机拥有两个全双工串行通信接口,
串口1的功能及操作与传统51单片机串行相同;
特殊的是STC12C5A60S2单片机内部有一个独立波特率发生器,
串口1可以使用定时器1作为波特率发生器,也可以使用独立波特率发生器作为波特率发生器;
而串口2只能使用独立波特率发生器作为波特率发生器。
/*-----------------------------------------------
名称:STC12C5A60S2双串口通信,单片机后缀s2意思就是双串口
内容:9600波特率 双串口收发
接线:串口1 发送P3.1,接收P3.0
串口2 发送P1.3,接收P1.2
串口2具体引脚是可修改的。
STC12CSA60S2系列单片机串行口1对应的硬件部分是TxD/P3.1和RxD/P3.0引脚,串行口2对应的硬件部分是TxD2和RxD2。通过设置特殊功能寄存AUXR1中的S2_P4/AUXR1.4位,串行口2(UART2)功能可以在P1口和P4口之间任意切换。当串行口2功能在P1口实现时,对应的管脚是P1.2/RxD2和P1.3/IxD2。当串行口2功能在P4口实现时,对应的管脚是P4.2/RxD2和P4.3/TxD2。
------------------------------------------------*/
#include"stc12c5a60s2.h"
#include"delay.h"
#define S2RI 0x01 //串口2接收中断中断请求标志位
#define S2TI 0x02 //串口2发送中断请求标志位
unsigned char flag1,flag2,temp1,temp2;
unsigned char uart2Receive[100];
unsigned char uart1Receive[100];
unsigned int point1=0,point2=0;
unsigned char i;
/*------------------------------------------------
函数声明
------------------------------------------------*/
//void SendStr(unsigned char *s);
void UART_1SendOneByte(unsigned char c);
void UART_2SendOneByte(unsigned char c);
void uart1SendStr(unsigned char *s);
void uart2SendStr(unsigned char *s);
/*------------------------------------------------
串口初始化
------------------------------------------------*/
void InitUART (void)
{
SCON = 0x50; // SCON: 模式 1, 8-bit UART, 使能接收
TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit 重装
TH1 = 0xFD; // TH1: 重装值 9600 波特率
// 晶振 11.0592MHz
TR1 = 1; // TR1: timer 1 打开
EA = 1; //打开总中断
ES = 1; //打开串口中断
S2CON = 0x50; //串口2工作在方式1 10位异步收发
// S2REN=1允许接收
BRT = 0xFD; // 9600
AUXR = 0x10; //BRTR=1 独立波特率发生器开始计数
IE2 =0x01; //开串口2中断 ES2=1
}
/*------------------------------------------------
主函数
------------------------------------------------*/
void main (void)
{
InitUART();
DelayMs(100);
uart1SendStr("串口1初始化成功");
DelayMs(100);
uart2SendStr("串口2初始化成功");
while (1)
{
if(flag1==1)
{
flag1=0;
// uart2SendStr("串口1中断,串口2发送串口1接收的数据:");
uart1SendStr(uart1Receive);
for(i=0;i<=100;i++)
{
uart1Receive[i]=0;
}
}
if(flag2==1)
{
flag2=0;
// uart1SendStr("串口2中断,串口1发送串口2接收的数据:");
uart2SendStr(uart2Receive);
for(i=0;i<=100;i++)
{
uart2Receive[i]=0;
}
}
}
}
/*------------------------------------------------
1发送字符串
------------------------------------------------*/
void uart1SendStr(unsigned char *s)
{
while(*s!='\0')// \0 表示字符串结束标志,
//通过检测是否字符串末尾
{
UART_1SendOneByte(*s);
s++;
}
}
/*------------------------------------------------
2发送字符串
------------------------------------------------*/
void uart2SendStr(unsigned char *s)
{
while(*s!='\0') // \0 表示字符串结束标志,
//通过检测是否字符串末尾
{
UART_2SendOneByte(*s);
s++;
}
}
void UART_1SendOneByte(unsigned char c)
{
SBUF = c;
while(!TI); //?TI=0,????
TI = 0;
}
/****************串口2发送一个字符****************/
void UART_2SendOneByte(unsigned char c)
{
S2BUF = c;
while(!(S2CON&S2TI)); //?S2TI=0,????
S2CON&=~S2TI; //S2TI=0
}
/************串口1中断函数*************/
void UART_1Interrupt(void) interrupt 4
{
if(RI==1)
{
RI=0;
flag1=1;
temp1=SBUF;
uart1Receive[point1++]=temp1;
if(temp1=='\n')
{
flag1=1;
point1=0;
}
if(point1==100)
{
point1=0;
}
}
}
/************串口2中断函数*************/
void UART_2Interrupt(void) interrupt 8
{
EA = 0; //打开总中断
if(S2CON&S2RI)
{
S2CON&=~S2RI;
temp2=S2BUF;
uart2Receive[point2++]=temp2;
if(temp2=='\n')
{
point2=0;
flag2=1;
}
if(point2==100)
{
point2=0;
}
}
EA = 1; //打开总中断
}