串行通信实验

要求:理解单片机串行口实现通信的各种工作方式,掌握单片机串行通信程序设计、调试方法

实验题目:甲乙两个单片机进行串行通信。采用12MHZ时钟频率晶振频率和方式1进行通信。甲机上有4*4键盘、一个七段数码管,乙机上有两个七段数码管;甲机发出按键显示内容,乙机接收后在数码管上交替显示。

串行通信实验_第1张图片

/********************甲机代码******************************/
#include
#define uchar unsigned char
#define uint unsigned int

//0-9,A-F,LUPN
uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,
					   0x92,0x82,0xf8,0x80,0x90,
					   0x88,0x83,0xc6,0xa1,0x86,0x8e};
uchar Pre_KeyNo=16,KeyNo=16;

void Delay(uint ms)	//延时子程序
{
	 uchar t;
	 while(ms--)
	 	for(t=0;t<120;t++) ;
}

void Keys_Scan()
{
	uchar Tmp;
	//P1端低四位接列、列的判断
	P1=0x0F;
	Delay(1);
	Tmp=P1^0x0F;
	switch(Tmp)
	{
		case 1:	KeyNo=0;break;
		case 2: KeyNo=1;break;
		case 4: KeyNo=2;break;
		case 8: KeyNo=3;break;
		default:KeyNo=16;//无键按下
	}
	//P1端口0-4五位接行,行的判断
	//翻转进行判断
	P1=0xF0;
	Delay(1);
	Tmp=P1>>4^0x0F;	//右移四位进行判断
	switch(Tmp)
	{
		case 1:	KeyNo+=0;break;
		case 2: KeyNo+=4;break;
		case 4: KeyNo+=8;break;
		case 8: KeyNo+=12;break;
		default:break;
	}
}

void putc_toSerialPort(uchar num)//发送数字
{
	SBUF=num;
	while(TI==0);
	TI=0;
}

void main()
{
	P0=0xFF;
	SCON=0X40;		//串口工作在方式1
	TMOD=0X20;	   //T1工作在模式2,8位自动装载
	PCON=0X00;	   //波特率不递增
	TH1=0XFD;	   //波特率9600
	TL1=0XFD;
	TI=0;
	TR1=1;//启动定时器
	while(1)
	{
		P1=0xF0;
		if(P1!=0xF0)
			Keys_Scan();
		if(Pre_KeyNo!=KeyNo)
		{
			P0=DSY_CODE[KeyNo];			//在数码管上显示数字
			putc_toSerialPort(KeyNo);	//发送数字
			Pre_KeyNo=KeyNo;
		}
		Delay(100);
	}	
}

/****************乙机代码**********************/
#include
#define uint unsigned int 
#define uchar unsigned char

//0-9,A-F,LUPN
uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,
					   0x92,0x82,0xf8,0x80,0x90,
					   0x88,0x83,0xc6,0xa1,0x86,0x8e};

void Delay(uint ms)	 //延时小程序
{
	uchar i;
	while(ms--)
		for(i=0;i<120;i++);
}

void main()//主程序
{
	uchar i;
	SCON=0X50;//串口模式1,8位异步,允许接受
	TMOD=0X20;//T1工作模式2,8位自动装载
	TH1=0XFD;//保持甲机的同一波特率
	TL1=0XFD;
	PCON=0X00;
	RI=0;
	TR1=1;
	P0=0xFF;
	P2=0xFF;
	while(1)
	{
		 if(RI)//接受
		 {
		 	RI=0;
			for(i=0;i<100;i++)
			{
				P0=DSY_CODE[SBUF];
				Delay(60);
				P0=0xFF;
				P2=DSY_CODE[SBUF];
				Delay(60);
				P2=0xFF;
			}
			
		 }
		// Delay(100);
	}	
}


你可能感兴趣的:(单片机89C51)