STC12C5A60S2 单片机是一款功能比较强大的单片机,具有两个全双工串行通信接口。其中,串口1的功能及操作与传统51单片机串行口相同,但内部有一个独立波特率发生器,可以选择定时器1或独立波特率发生器作为波特率发生器。而串口2只能使用独立波特率发生器。
下面是一段双串口通信的程序示例:
/***********************************************************************
时间:2012.11.24
芯片:STC12C5A60S2
晶振:22.1184MHz
波特率:9600bps
引脚定义:
串口1:发送端口P3.1,接收端口P3.0
串口2:发送端口P3.2,接收端口P3.3
***********************************************************************/
#include <STC12C5A60S2.H>
#define FOSC 22118400UL
#define BAUD 9600
void UART1_Init()
{
SCON = 0x50;
TMOD = 0x20;
TH1 = 256 - FOSC/12/32/BAUD;
TL1 = TH1;
ET1 = 0;
TR1 = 1;
}
void UART2_Init()
{
S2CON = 0x50;
T2L = (65536 - FOSC/4/BAUD);
T2H = (65536 - FOSC/4/BAUD) >> 8;
AUXR |= 0x14;
AUXR &= 0xFE;
IE2 |= 0x01;
}
void UART1_SendByte(unsigned char dat)
{
SBUF = dat;
while(TI == 0);
TI = 0;
}
unsigned char UART1_ReceiveByte()
{
unsigned char dat;
while(RI == 0);
dat = SBUF;
RI = 0;
return dat;
}
void UART2_SendByte(unsigned char dat)
{
S2BUF = dat;
while(!TI2);
TI2 = 0;
}
unsigned char UART2_ReceiveByte()
{
unsigned char dat;
while(!RI2);
dat = S2BUF;
RI2 = 0;
return dat;
}
void main()
{
UART1_Init();
UART2_Init();
while(1)
{
unsigned char dat1, dat2;
dat1 = UART1_ReceiveByte();
dat2 = UART2_ReceiveByte();
UART1_SendByte(dat2);
UART2_SendByte(dat1);
}
}
这段代码演示了如何利用STC12C5A60S2单片机的双串口通信功能,通过串口1接收数据,然后通过串口2发送出去;同时通过串口2接收数据,然后通过串口1发送出去,实现了双串口之间的数据交换。通过这个例子,展示了STC12C5A60S2单片机在双串口通信方面的强大功能和灵活性。