单片机 反馈式双芯片串口传输 (作业--管)

1.Proteus 8             

 2.Kile c51

发送端

#include<reg51.h>
#include<stdio.h>
#define uint unsigned int
#define uchar unsigned char
uint code num[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};	//数码管的数字0-f共阳	
uchar code mum[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴  1-f不带小数点
uchar code mum1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//共阴  1-9带小数点
uchar code kk[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};// 控制第几个数码管1-8
sbit p=PSW^0;  //p定为pws寄存器的第0位 ,即奇偶效验位

void det()  //延时函数
{
	uint i=0;
	TMOD=0x02;         //方式2 T0 
	TH0=0x06;
	TL0=0x06;
	TR0=1;
	while(1)
	{
		while(TF0==1)
		{
			i++;
			if(i==40)     //1s  250*4000=1000000us=1s
			{
				break;
			}
		}
	
	}
}


void chaxun()  ///判断1-16键 确定位置
{
		uchar a,b,c;
		P1=0xf0;
		a=P1;
		P1=0x0f;
		b=P1;
		a=a|b;
		if(a==0xee)
		{
			P2=mum[0];
			c=P2;
			TB8=p;
			SBUF=c;
			while(TI==0);
			;
			TI=0;
		}
		
		else if(a==0xde)
		{
			P2=mum[1];
			c=P2;
			TB8=p;
			SBUF=c;
			while(TI==0);
			;
			TI=0;
		}
		
		else if(a==0xbe)
		{
			
			P2=mum[2];
			c=P2;
			TB8=p;
			SBUF=c;
			while(TI==0);
			;
			TI=0;
		}
		else if(a==0x7e)
		{
			P2=mum[3];
			c=P2;
			TB8=p;
			SBUF=c;
			while(TI==0);
			;
			TI=0;
		}
		else if(a==0xed)
		{
			P2=mum[4];
			c=P2;
			TB8=p;
			SBUF=c;
			while(TI==0);
			;
			TI=0;
		}
		else if(a==0xdd)
		{
			P2=mum[5];
			c=P2;
			TB8=p;
			SBUF=c;
			while(TI==0);
			;
			TI=0;
		}
		else if(a==0xbd)
		{
			
			P2=mum[6];
			c=P2;
			TB8=p;
			SBUF=c;
			while(TI==0);
			;
			TI=0;
		}
		else if(a==0x7d)
		{
			
			P2=mum[7];
			c=P2;
			TB8=p;
			SBUF=c;
			while(TI==0);
			;
			TI=0;
		}
		else if(a==0xeb)
		{
			
			P2=mum[8];
			c=P2;
			TB8=p;
			SBUF=c;
			while(TI==0);
			;
			TI=0;
		}
		else if(a==0xdb)
		{
			
			P2=mum[9];
			c=P2;
			TB8=p;
			SBUF=c;
			while(TI==0);
			;
			TI=0;
		}
		else if(a==0xbb)
		{
			
			P2=mum[10];
			c=P2;
			TB8=p;
			SBUF=c;
			while(TI==0);
			;
			TI=0;
		}
		else if(a==0x7b)
		{
			
			P2=mum[11];
			c=P2;
			TB8=p;
			SBUF=c;
			while(TI==0);
			;
			TI=0;
		}
		else if(a==0xe7)
		{
			
			P2=mum[12];
			c=P2;
			TB8=p;
			SBUF=c;
			while(TI==0);
			;
			TI=0;
		}
		else if(a==0xd7)
		{
			
			P2=mum[13];
			c=P2;
			TB8=p;
			SBUF=c;
			while(TI==0);
			;
			TI=0;
		}
		else if(a==0xb7)
		{
			
			P2=mum[14];
			c=P2;
			TB8=p;
			SBUF=c;
			while(TI==0);
			;
			TI=0;
		}
		else if(a==0x77)
		{
			
			P2=mum[15];
			c=P2;
			TB8=p;
			SBUF=c;
			while(TI==0);
			;
			TI=0;
		}
}
void recive()
{
	uint a,b,c;
	while(RI==0);
	RI=0;
	a=SBUF;
	if(a==0x00)
	{
		
	}
		
	

}

void main()
{
	uint i,j;
	SCON=0xd0;   //串行口初始化为 方式3
	ES=1;        //允许串行口中断
	EA=1;					//允许全局中断
	PCON=0x00;     /// SMOD=0;
	TMOD=0x20;    //T1 工作在方式2
	TH1=0xf4;     //初值定义
	TL1=0xf4;  
	TR1=1;        //开始计时
	while(1)
	{
		chaxun();
		recive();
	}
}

接收端

#include<reg51.h>
#include<stdio.h>
#define uint unsigned int
#define uchar unsigned char
uint code num[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};	//数码管的数字0-f共阳	
uchar code mum[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴  1-f不带小数点
uchar code mum1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//共阴  1-9带小数点
uchar code kk[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};// 控制第几个数码管1-8
sbit p=PSW^0;

void det()  //延时函数
{
	uint i=0;
	TMOD=0x02;         //方式2 T0 
	TH0=0x06;
	TL0=0x06;
	TR0=1;
	while(1)
	{
		while(TF0==1)
		{
			i++;
			if(i==40)     //1s  250*4000=1000000us=1s
			{
				break;
			}
		}
	
	}
}


uchar receive()
{
	uchar a,c;
	while(RI==0);
	;
	RI=0;
	ACC=SBUF;
	if(RB8==p)
	{
		c=ACC;
		///
		a=0x00;
		TB8=p;
		SBUF=a;
		while(TI==0);
		TI=0;
		//	
		return c;
	}
	/*
	else
	{
		c=ACC;
		return c;
	}
		*/
}

int main()
{
	uint i,j,c;
	SCON=0xd0;   //串行口初始化为 方式3
	ES=1;        //允许串行口中断
	EA=1;					//允许全局中断
	PCON=0x00;     /// SMOD=0;
	TMOD=0x20;    //T1 工作在方式2
	TH1=0xf4;     //初值定义
	TL1=0xf4;  
	TR1=1;        //开始计时
	REN=1;
	while(1)
	{
		P2=receive();
	}
}

知识在书上都有!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值