#include <STC12C5A60S2.H>
#include "intrins.h"
#define FOSC 11059200L
#define BAUD 9600
#define S2RI 0x01; //串口2接收bit
#define S2TI 0x02; //串口2发送bit
void Delay500ms() //@11.0592MHz
{
unsigned char i, j, k;
i = 22;
j = 3;
k = 227;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void InitUart()
{
SCON=0x50;
TMOD=0x20;
TH1=TL1=-(FOSC/12/32/BAUD);
TR1=1;
TI=1;
}
void InitUart2()
{
S2CON=0x50;
AUXR|=0x14;
BRT=-(FOSC/32/BAUD);
S2CON|=S2TI;
}
void SendData2(unsigned char dat)
{
bit busy=S2CON&S2TI;
while(!busy)
{
busy=S2CON&S2TI;
}
S2CON&=~S2TI;
S2BUF=dat;
}
void SendData(unsigned char dat)
{
while(!TI);
TI=0;
SBUF=dat;
}
void main()
{
unsigned char ch = 0;
InitUart();
InitUart2();
while(1)
{
SendData(ch);
SendData2(ch);
ch++;
if(ch==8) ch=0;
Delay500ms();
Delay500ms();
}
}
如果需要定时器1也工作在12T模式,则需要做如下修改:
void InitUart()
{
SCON=0x50;
AUXR|=0x40;
TMOD=0x20;
TH1=TL1=-(FOSC/32/BAUD);
TR1=1;
TI=1;
}
此时修改BAUD的宏定义为115200,即可实现115200的波特率。
如果两个串口波特率相同,还可以直接修改成如下,并节省出一个定时器。
void InitUart()
{
SCON=0x50;
AUXR|=0x41;
TI=1;
}