#include <STC15F2K60S2.H> //包含STC15F2K60S2单片机寄存器定义文件
2./*****
函数名:串行口1初始化
调用:SerialIni();
参数:无
返回值:无
*****/
void SerialIni(){
//SCON &= 0x2E; //先对需要设置的位进行清零 0010 1110 因为SCON所有位都是用于设置串行口1,所以这句可省略。
SCON = 0x50; /* SM0/FE | SM1 | SM2 | REN | TB8 | RB8 | TI | RI 设置串行口的工作方式1(SM0 SM1 0 1)即8位可变波特率方式;允许接收)*/
AUXR &= 0xBE; //先对需要设置的位进行清零 1011 1110
AUXR |= 0x00; /* T0x12 | T1x12 | UART_M0x6 | T2R | T2_C/T(T上画) | T2x12 | EXTRAM | S1ST2 定时器1时钟为Focs/12,即12T;串口1选择定时器1为波特率发生器。S1ST2:串行口1波特率发生器选择位。0:选择定时器1作为串行口1波特率发生器。 1:选择定时器2作为串行口1的波特率发生器,此时定时器1得到释放,可以作为独立的定时器使用。*/
TMOD &= 0x0F; //先清零定时器1的设置(高4位设置定时器1,低4位设置定时器0)
TMOD |= 0x20; /* GATE | C/T(T上画) | M1 | M0 | GATE | C/T(T上画) | M1 | M0 (定时器工作方式2)使用定时器1作为波特率发生器。*/
TH1 = 0xfd; //8位自动重装方式,TH1用于重置TL1初值。2的SMOD次方/32*(定时器1的溢出率或定时器2的溢出率)
TL1 = 0xfd; //晶振11.0592MHz,设置波特率为9600bps。SMOD属于PCON寄存器,为1时,波特率翻倍。
TR1=1; //定时器1启动
ES = 1; //开放串口中断
EA = 1; //开放CPU中断
}
3.
void main(void)
{
SerialIni(); //运行串口初始化函数
while(1){
} //等待中断()
}
4.
//中断函数
void Uart2(void) interrupt 4 using 1
{
unsigned char mydata;
if(RI) //如果是接收中断
{
RI=0;
mydata = SBUF; //将接收缓冲区的数据保存到mydata变量中
SBUF = ~mydata; //将接收到的数据按位取反后发回
}
else //如果是发送中断,将TI清0
TI = 0;
}