#include<reg51.h>
/* 串口2只能选定时器2作为波特率发生器 */
//注意串口2:RXD2~P1^0,TXD2~P1^1
//根据芯片手册说明,在单片机1T模式下(不12分频)串口在模式0(8位USART)波特率 = Sysclk/(65536-[T2H,T2L])/4
//这个宏定义就是根据波特率来就算定时器应该设定的初值
#define Baud_Rate(baud) (65536 - 11059200/4/baud)
//定义寄存器
sfr AUXR = 0x8e; //辅助寄存器
sfr T2H = 0xD6; //定时器2的高八位寄存器
sfr T2L = 0xD7; //定时器2的低八位寄存器
sfr S2CON = 0x9a; //USART2控制寄存器
sfr S2BUF = 0x9b; //USART2数据寄存器
void usart2_Init(unsigned int baud){
/*
S2CON:(只介绍和这里相关的)
最高位:模式选择位,0为模式0(默认),1为模式1
第五位:允许串行口接受位
最低位(S2RI):接收中断请求标志位
第二位(S2TI):发送中断请求标志位
*/
S2CON=0x10;
T2L = (unsigned char)(Baud_Rate(baud));
T2H = (unsigned char)(Baud_Rate(baud)>>8);
//开启定时器2 AUXR第五位是定时器2的开启位,第三位就是选择(当为1时)1T模式/12T模式
//这里选择的是1T模式(不12分频),如果要用12T模式,模特率就要在后面的式子再除以12
AUXR |= 0x14;
}
void main(){
//定义变量
unsigned char dat;
//初始化
usart2_Init(9600);
while(1){
//S2CON最低位是接收标志位
if(S2CON&0x01){
S2CON&=0xfe; //清除接收标志位
dat = S2BUF;
S2BUF = dat;
while((S2CON&0x02)==0); //等待发送完毕
S2CON&=0xfd; //清除发送标志位
}
}
}