课程设计题十四:双机通信

要求:

        独立程序的串行接收/发送,两个单片机利用串行口进行方式1的全双工串行通信,两个单片机分别带有键盘和八段码数码管,当A单片机按下键盘上的数字时,该数字传送到B单片机上并显示在B单片机上连接的数码管上,反之亦然。可选的波特率为:1200,2400,4800,9600。

获取该程序的方式:

1、CSDN下载:

https://download.csdn.net/download/qq_38351824/11423493

2、关注微信公众号下载:

     ① 关注微信公众号:Tech云  

     ②

3、可以关注点赞并在下方评论,我给你邮箱发过去。

一、Protues仿真图:

课程设计题十四:双机通信_第1张图片

课程设计题十四:双机通信_第2张图片

课程设计题十四:双机通信_第3张图片

二、程序源码:

因为注释非常的全,这里就不再进行讲解了。

发送端:

/*******************************************************************************
================================================================================
【平    台】STC89C51_sumjess平台
【编    写】sumjess
【E-mail  】[email protected]
【软件版本】V2.0
【最后更新】2019年06月10日
【相关信息参考下列地址】
【网    站】
           https://blog.csdn.net/qq_38351824
           http://www.51hei.com/bbs/mcu-2-1.html
---------------------------------------------------------------------------------
【dev.env.】MDK4.02及以上版本
【Target  】STC89C51
第一次修订:2019/05/09
第二次修订:2019/05/21
第三次修订:2019/06/10
【problem 】
    (1)库内补充的不全面;
    (2)库内解释部分不全面;
    (3)库内还存在一定的bug;
【direction】
      下一步的目标就是把库继续集成!
【explain 】
      为了方便使用,我也自己写了很多的库,和优化了算法和表示方式!
【warning】
      目前程序中暂无错误 !   
---------------------------------------------------------------------------------
没有完美的代码,只有不断的奉献,大家一起努力;
赠人玫瑰手留余香,欢迎大家反馈bug!
================================================================================
********************************************************************************/
/*--------------------------------------------------------------------------------------------------------------------------------
说明:	    发送端单片机1程序:
			8*8矩阵键盘读取数码管显示,再由串口与单片机2进行通信;
			把单片机1读取的按键值发送给单片机2进行显示
MCU:	    AT89S52
晶振:	    11.0592MHZ
---------------------------------------------------------------------------------------------------------------------------------*/
#include
#include
#define uint unsigned int
#define uchar unsigned char

sbit D1=P3^6;   //数码管十位com1
sbit D2=P3^7;   //数码管个位com2
uchar shi,ge,num;
uchar temp;
uchar code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};

void delay(uint z);//延时函数
void display();		//显示函数
void keyscan();    //8*8_64矩阵键盘
void InitUART  (void);  //串口初始化
/*----------------------------------------------------------------------------------
					main()_程序入口
----------------------------------------------------------------------------------*/
void main()
{
	InitUART();//串口初始化
 	SBUF=0;
	while(1)
	{
		display();
		keyscan();
	}
}
/*------------------------------------------------
                    串口初始化
------------------------------------------------*/
void InitUART  (void)
{

    SCON  = 0x50;		        // SCON: 模式 1, 8-bit UART, 使能接收  
    TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重装
    TH1   = 0xFD;               // TH1:  重装值 9600 波特率 晶振 11.0592MHz  
    TR1   = 1;                  // TR1:  timer 1 打开                         
    EA    = 1;                  //打开总中断
    ES    = 1;                  //打开串口中断
} 
/*------------------------------------------------
                     串口中断程序
------------------------------------------------*/
void UART_SER (void) interrupt 4 //串行中断服务程序
{
 //   unsigned char Temp;          //定义临时变量 
   
   if(RI)                        //判断是接收中断产生
     {
	  RI=0;                       //标志位清零
	  num=SBUF;                   //读入缓冲区的值
   //   SBUF=num;                 //把接收到的值再发回单片机2
	 }
   if(TI)                        //如果是发送标志位,清零
     TI=0;
    
} 
 
/*----------------------------------------------------------------------------------
				延时	
----------------------------------------------------------------------------------*/
void delay(uint z)
{
	uint i,j;
	for(i=z;i>0;i--)
	for(j=112;j>0;j--);
}
/*----------------------------------------------------------------------------------
				显示	
----------------------------------------------------------------------------------*/
void display()
{	 //num=23;
	shi=num/10;
	ge=num%10;

	P2=table[shi];//显示十位
	D1=0;
	D2=1;
	delay(5);
	D1=1;

	P2=table[ge];//显示个位
	D2=0;
	delay(5);
	D2=1;
}
/*----------------------------------------------------------------------------------
				矩阵键盘	
----------------------------------------------------------------------------------*/
void keyscan()
{
	uchar temp,n,k;
	n=0x7f;
	for(k=0;k<8;k++)
	{
	P0=n;
	temp=P1&0xff;
	if(temp!=0xff)
	{
		delay(3);
		temp=P1&0xff;
		if(temp!=0xff)
		{
			temp=P1;
			if(n==0x7f)
			{
			switch(temp)
			{
				case 0xfe:num=1;SBUF=1;break;
				case 0xfd:num=9;SBUF=9;break;
				case 0xfb:num=17;SBUF=17;break;
				case 0xf7:num=25;SBUF=25;break;
				case 0xef:num=33;SBUF=33;break;
				case 0xdf:num=41;SBUF=41;break;
				case 0xbf:num=49;SBUF=49;break;
				case 0x7f:num=57;SBUF=57;break;
			}	
			}
				
			if(n==0xbf)
			{
			switch(temp)
			{
				case 0xfe:num=2; SBUF=2;break;
				case 0xfd:num=10;SBUF=10;break;
				case 0xfb:num=18;SBUF=18;break;
				case 0xf7:num=26;SBUF=26;break;
				case 0xef:num=34;SBUF=34;break;
				case 0xdf:num=42;SBUF=42;break;
				case 0xbf:num=50;SBUF=50;break;
				case 0x7f:num=58;SBUF=58;break;
			}
			}
				
			if(n==0xdf)
			{
			switch(temp)
			{
				case 0xfe:num=3; SBUF=3;break;
				case 0xfd:num=11;SBUF=11;break;
				case 0xfb:num=19;SBUF=19;break;
				case 0xf7:num=27;SBUF=27;break;
				case 0xef:num=35;SBUF=35;break;
				case 0xdf:num=43;SBUF=43;break;
				case 0xbf:num=51;SBUF=51;break;
				case 0x7f:num=59;SBUF=59;break;
			}
			}
				
			if(n==0xef)
			{
			switch(temp)
			{
				case 0xfe:num=4; SBUF=4;break;
				case 0xfd:num=12;SBUF=12;break;
				case 0xfb:num=20;SBUF=20;break;
				case 0xf7:num=28;SBUF=28;break;
				case 0xef:num=36;SBUF=36;break;
				case 0xdf:num=44;SBUF=44;break;
				case 0xbf:num=52;SBUF=52;break;
				case 0x7f:num=60;SBUF=60;break;
			}
			}
				
			if(n==0xf7)
			{
			switch(temp)
			{
				case 0xfe:num=5;SBUF=5;break;
				case 0xfd:num=13;SBUF=13;break;
				case 0xfb:num=21;SBUF=21;break;
				case 0xf7:num=29;SBUF=29;break;
				case 0xef:num=37;SBUF=37;break;
				case 0xdf:num=45;SBUF=45;break;
				case 0xbf:num=53;SBUF=53;break;
				case 0x7f:num=61;SBUF=61;break;
			}
			}		     
				
			if(n==0xfb)
			{
			switch(temp)
			{
				case 0xfe:num=6;SBUF=6;break;
				case 0xfd:num=14;SBUF=14;break;
				case 0xfb:num=22;SBUF=22;break;
				case 0xf7:num=30;SBUF=30;break;
				case 0xef:num=38;SBUF=38;break;
				case 0xdf:num=46;SBUF=46;break;
				case 0xbf:num=54;SBUF=54;break;
				case 0x7f:num=62;SBUF=62;break;
			}			   
			}

			if(n==0xfd)
			{
				switch(temp)
			{
				case 0xfe:num=7;SBUF=7;break;
				case 0xfd:num=15;SBUF=15;break;
				case 0xfb:num=23;SBUF=23;break;
				case 0xf7:num=31;SBUF=31;break;
				case 0xef:num=39;SBUF=39;break;
				case 0xdf:num=47;SBUF=47;break;
				case 0xbf:num=55;SBUF=55;break;
				case 0x7f:num=63;SBUF=64;break;
				}
				}

			if(n==0xfe)
			{
				switch(temp)
			{
				case 0xfe:num=8; SBUF=8;break;
				case 0xfd:num=16;SBUF=16;break;
				case 0xfb:num=24;SBUF=24;break;
				case 0xf7:num=32;SBUF=32;break;
				case 0xef:num=40;SBUF=40;break;
				case 0xdf:num=48;SBUF=48;break;
				case 0xbf:num=56;SBUF=56;break;
				case 0x7f:num=64;SBUF=64;break;
				}
			}
			while(temp!=0xff)
			{
				temp=P1&0xff;
			}
			}
		}
		n=_cror_(n,1);
	}
}

接收端:

/*******************************************************************************
================================================================================
【平    台】STC89C51_sumjess平台
【编    写】sumjess
【E-mail  】[email protected]
【软件版本】V2.0
【最后更新】2019年06月10日
【相关信息参考下列地址】
【网    站】
           https://blog.csdn.net/qq_38351824
           http://www.51hei.com/bbs/mcu-2-1.html
---------------------------------------------------------------------------------
【dev.env.】MDK4.02及以上版本
【Target  】STC89C51
第一次修订:2019/05/09
第二次修订:2019/05/21
第三次修订:2019/06/10
【problem 】
    (1)库内补充的不全面;
    (2)库内解释部分不全面;
    (3)库内还存在一定的bug;
【direction】
      下一步的目标就是把库继续集成!
【explain 】
      为了方便使用,我也自己写了很多的库,和优化了算法和表示方式!
【warning】
      目前程序中暂无错误 !   
---------------------------------------------------------------------------------
没有完美的代码,只有不断的奉献,大家一起努力;
赠人玫瑰手留余香,欢迎大家反馈bug!
================================================================================
********************************************************************************/
/*--------------------------------------------------------------------------------------------------------------------------------
说明:	    接收端单片机2程序:
			读取数码管显示,由串口与单片机1进行通信;
			接收单片机1读取的8*8矩阵键盘按键值并在数码管上进行显示
MCU:	    AT89S52
晶振:	    11.0592MHZ
---------------------------------------------------------------------------------------------------------------------------------*/
#include		   
#include
#define uint unsigned int
#define uchar unsigned char

uchar shi,ge,num;
uchar code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};

void delay(uint z);//延时函数
void display();		//显示函数
void InitUART  (void);  //串口初始化
/*----------------------------------------------------------------------------------
					main()_程序入口
----------------------------------------------------------------------------------*/
void main()
{
	InitUART(); 
 	SBUF=0;
	while(1)
	{
		display();
	}
}
/*------------------------------------------------
                    串口初始化
------------------------------------------------*/
void InitUART  (void)
{
    SCON  = 0x50;		        // SCON: 模式 1, 8-bit UART, 使能接收  
    TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重装
    TH1   = 0xFD;               // TH1:  重装值 9600 波特率 晶振 11.0592MHz  
    TR1   = 1;                  // TR1:  timer 1 打开                         
    EA    = 1;                  //打开总中断
    ES    = 1;                  //打开串口中断
} 
/*------------------------------------------------
                     串口中断程序
------------------------------------------------*/
void UART_SER (void) interrupt 4 //串行中断服务程序
{
   
   if(RI)                        //判断是接收中断产生
     {
	  RI=0;                      //标志位清零
	  num=(int)SBUF;                 //读入缓冲区的值
    //  SBUF=0;                 //把接收到的值再发回单片机1
	 }
   if(TI)                        //如果是发送标志位,清零
     TI=0;
    
} 
 
/*----------------------------------------------------------------------------------
			                           延    时	
----------------------------------------------------------------------------------*/
void delay(uint z)
{
	uint i,j;
	for(i=z;i>0;i--)
	for(j=112;j>0;j--);
}
/*----------------------------------------------------------------------------------
				显示	
----------------------------------------------------------------------------------*/
void display()
{//	 num=23;
	shi=num/10;
	ge=num%10;

	P2=table[shi];//显示十位
	delay(5);

	P1=table[ge];//显示个位
	delay(5);
}

你可能感兴趣的:(北京交通大学海滨学院单片机课设,STC51精通+项目)