/*-----------------------------------------------------------------------------------------------------------
程序功能：以16进制发送一个0-65535(两字节)数据之间的任一数，当单片机收到后在数码管上动态显示出来，波特率自定。

程序分析：
	1、本程序波特率设为9600。
	2、选择单片机串口方式1时，有效数据位只有8位（二进制），65535转化为二进制需要16位,换为十六进制也就是4位。
	   串口助手一次发送都是二位十六进制数发送的。由于这些原因，我们需要分两次传送数据，
	   先传16进制的前两位，再传后两位。
实验：
	例如，通过串口助手单片机发送16进制数0011给单片机，然后数码管显示出17（即，16进制的10进制数）。
	注意：程序下载后，需将单片机复位一次后，直接输入0011发送（输入的数据为4位16进制数）。
------------------------------------------------------------------------------------------------------------*/

#include<reg52.h> 
#define uchar unsigned char 
#define uint unsigned int 
uint a1,a2,num; 
uchar num1,flag; 
sbit dula=P2^6; //数码管段选
sbit wela=P2^7; //数码管位选
uchar code table[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; 

delay(uchar x)   //延时函数
{
	uchar a,b;
	for(a=x;a>0;a--)
		for(b=200;b>0;b--);
}

void display(uint value)  //显示子函数
{ 
	uchar wan,qian,bai,shi,ge;   //定义万千百十个位
	wan=value/10000;                
	qian=value%10000/1000; 
	bai=value%1000/100; 
	shi=value%100/10; 
	ge=value%10; 

	P0=0xff;
	wela=1;
	wela=0; 
	P0=table[wan];
	dula=1; 
	dula=0;
	P0=0xfe;       
	wela=1;
	wela=0; 
	delay(10);
	 
	P0=0xff;
	wela=1;
	wela=0; 
	P0=table[qian]; 
	dula=1; 
	dula=0; 
	P0=0xfd; 
	wela=1; 
	wela=0; 
	delay(10); 

	P0=0xff; 
	wela=1;
	wela=0;
	P0=table[bai]; 
	dula=1; 
	dula=0; 
	P0=0xfb; 
	wela=1; 
	wela=0; 
	delay(10); 
	
	P0=0xff; 
	wela=1;
	wela=0;
	P0=table[shi]; 
	dula=1; 
	dula=0; 
	P0=0xf7; 
	wela=1; 
	wela=0; 
	delay(10); 
	
	P0=0xff; 
	wela=1;
	wela=0;
	P0=table[ge]; 
	dula=1; 
	dula=0; 
	P0=0xef;
	wela=1; 
	wela=0; 
	delay(10); 
} 

void init_uart(void)   //串口初始化函数
{
	TMOD=0X20;     //设为定时器1工作方式2
	TH1=0XFD;      //波特率设为9600
	TL1=0XFD;      
	TR1=1;         //启动定时器1
	SCON=0X50;     //设为串口工作方式1
	EA=1;          //开总中断
	ES=1;	       //开串口中断
}

void main()  //主函数

{ 
	init_uart(); 
	while(1) 
	{ 
		display(num);  
	} 
}

void ser() interrupt 4     //串口中断函数
{ 
	num1++;                //设置循环变量num1 
	if(num1==1)            //num1=1,也就是传送数据的前两位
	{ 
		a1=SBUF;            //将第一次传送的数据给a1 
 		RI=0;              //置RI为0以便接收下一个数据

	} 
   if(num1==2)            //num1=2,也就是传送数据的后两位

	{  
		a2=SBUF;            //将第二次传送的数据给a2 
		num=(a1<<8)|a2;     //a1的低位数据向左移变成num的高位，低位空出，通过或运算将a2储存在num的最低位
 		RI=0;               //置RI为0以便接收下一个数据
  		num1=0;              

 	} 
}
