例:SCON=0X50; //把SM1置1,方式1工作方式;把REN置1,串口允许接收位;01010000 (8位串口,波特率从定时器1来的,波特率=((2^SMOD)/32)*(1/定时器1的溢出时间)),
例:TMOD=0X20; //8位自动装载定时器 00100000
例:PCON=0X80;,把SMOD置1;工作方式1,2,3的波特率加倍,1000 0000
例:TR1=1;启动定时器1;
例:ES=1;打开串口中断 EA=1;打开总中断
#include "reg51.h"
typedef unsigned char u8;
typedef unsigned int u16;
#define FOSC 12000000L
#define BAUD 4800
#define SMOD_2 2 //(2的SMOD次方)
#define T1MS (256-FOSC*SMOD_2/384/BAUD)
void usartinit()
{
SCON=0X50; //寄存器模式 SM0=0,SM1=1方式1(8位串口,波特率从定时器1来的,波特率=((2^SMOD)/32)*(1/定时器1的溢出时间)),
//REN=1,串口允许接收位,01010000
TMOD=0X20; //8位自动装载定时器
PCON=0X80; //设置SMOD置1,波特率提高一倍,
TH1=T1MS; //波特率数值
TL1=T1MS; //波特率数值
TR1=1; //启动定时器1
ES=1; //打开串口中断
EA=1; //打开总中断
}
void main()
{
usartinit(); //调用子函数
while(1); //让它循环
}
void usart () interrupt 4 //编写外部中断号4
{
u8 receivedata; //变量
if(RI==1) //接收完数据由硬件自动置RI=1;判断是否接收完成
{
receivedata=SBUF; // 保存串口发送的数据
RI=0; //软件清0
SBUF=(receivedata+1); //将接收到的数据通过receivedata返回给Pc机串口
//SBUF 是一个寄存器,作为一个缓冲区,当单片机准备接收数据时,会先把数据放到SBUF中,然后再接收,
//发送也是,当单片机准备发送数据时,会先把数据放到SBUF中,然后再发送出去。
while(!TI); //发送完通过while循环判断,等待发送完成
TI=0; //只有发送完,我们才通过软件清零,这样才可以进行下一次发送
}
}