那一块不明白的可以下方留言,帮你解读
# include"reg51.h"
//CPU和片上外设--串行口之间的主从关系
typedef unsigned int u16;
sbit led=P1^0;
void serialportinit()
{
TMOD=0X20;//选择定时器T1,采用工作方式2---8位自动重装载
TH1=0XF3; // 根据选择的波特率---4800,按照公式进行计算(选择溢出率)
TL1=0XF3; //根据自动重装载的工作原理,高8位的初值(不变)会赋给低8位
//TCON是的中断标志位TF1硬件自动置1
PCON=0X80;//SMOD置1功率倍增
TR1=1; //前面只是为了启动定时器T1而已,没有让其申请中断
SCON=0X50;//选择工作方式1---10位异步收发器,其中REN置1允许串行接收数据
ES=1;
EA=1;//串行通信中断
}
void main()
{
serialportinit();/*执行到此,调用该函数,然后该函数满足中断条件,
进入中断服务函数
*/
while(1);
}
void serialport() interrupt 4 //中断号为1
{
u16 receivedata;
receivedata=SBUF;//将缓冲区的数据赋给软件变量
RI=0;/*RI为接收数据中断标志位,RI置1时申请中断(内部硬件自动完成)
当RI置1说明这一帧数据cpu已经接收完成,因为是内部硬件完成,
所以需要软件将该位置0取消此次申请,这样才能等待下一次的接收
让cpu(SBUF)接收下一个数据
因为只有10位数据停止位过来时,硬件才能将RI置为1*/
SBUF=receivedata;//这时候的SBUF是发送数据时的缓冲区
while(!T1);/*判断如果该10位数据还在发送中,执行该死循环,如果
发送完成硬件将T1置1*/
TI=0;//执行到该步就说明发送这一帧数据完成,软件置0
}