#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar i,flag;
void init_uart(void)   //串口初始化函数
{
	TMOD=0X20;    //设为定时器1工作方式2
	TH1=0XFD;     //T1定时器装初值（波特率设为9600bps）
	TL1=0XFD;     //T1定时器装初值
	TR1=1;        //启动定时器1
	SCON=0X50;    //设为串口工作方式1
	EA=1;         //开总中断
	ES=1;	      //开串口中断
}

void main (void)  //主函数
{
	init_uart();  //串口初始化
	while(1)
	{
		if(flag==1)     //办断flag是否等于1，如果等于1，说明单片机已接收完一帧的数据
		{
		    ES=0;      //把串口中断关掉，因为我们要把单片机接收到的这一帧数据往电脑发送
			      //过去，在数据发送之前，中断函数不能再接收下一帧数据，不然就乱了。
		    flag=0;     //接着把flag清0，让它再接收下一个数据时，再变为1
	            SBUF=i;      //往SBUF写入刚才i收到的数据，这时，单片机就会自动发送到电脑
		    while(!TI);  //办断一下TI有没有置1，如果TI等于0，说明没有发完，那么它会
                                 //一直在这里等待。如果发送完了，TI等于1，1取反的数为0，那么
                                 //就会跳出这一条语句
	            TI=0;     //发送完了，我们要把T1发送标记位清0
		    ES=1;    //然后我们打开串口中断，让中断函数进行下一个数据的接收。
		}
	}
}

void serial( ) interrupt 4   //串口串断服务函数
{
	RI=0;    //中断进来，我们把接收标志位RI清0，因为只有RI等于1时，才会进入中断。
	i=SBUF;  //接着我们用变量i把数据从SBUF读走
	flag=1;  //我们在这里设置一个标记位，让单片机每接收完一帧数据，让flag等于1。
}