本文主要是介绍课程设计题十四:双机通信,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
要求:
独立程序的串行接收/发送,两个单片机利用串行口进行方式1的全双工串行通信,两个单片机分别带有键盘和八段码数码管,当A单片机按下键盘上的数字时,该数字传送到B单片机上并显示在B单片机上连接的数码管上,反之亦然。可选的波特率为:1200,2400,4800,9600。
获取该程序的方式:
1、CSDN下载:
https://download.csdn.net/download/qq_38351824/11423493
2、关注微信公众号下载:
① 关注微信公众号:Tech云
②
3、可以关注点赞并在下方评论,我给你邮箱发过去。
一、Protues仿真图:
二、程序源码:
因为注释非常的全,这里就不再进行讲解了。
发送端:
/*******************************************************************************
================================================================================
【平 台】STC89C51_sumjess平台
【编 写】sumjess
【E-mail 】1371129880@qq.com
【软件版本】V2.0
【最后更新】2019年06月10日
【相关信息参考下列地址】
【网 站】https://blog.csdn.net/qq_38351824http://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<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned charsbit 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 】1371129880@qq.com
【软件版本】V2.0
【最后更新】2019年06月10日
【相关信息参考下列地址】
【网 站】https://blog.csdn.net/qq_38351824http://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<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned charuchar 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);
}
这篇关于课程设计题十四:双机通信的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!