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

2024-03-10 19:30

本文主要是介绍课程设计题十四:双机通信,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

要求:

        独立程序的串行接收/发送,两个单片机利用串行口进行方式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);
}

这篇关于课程设计题十四:双机通信的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/795283

相关文章

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

vue2 组件通信

props + emits props:用于接收父组件传递给子组件的数据。可以定义期望从父组件接收的数据结构和类型。‘子组件不可更改该数据’emits:用于定义组件可以向父组件发出的事件。这允许父组件监听子组件的事件并作出响应。(比如数据更新) props检查属性 属性名类型描述默认值typeFunction指定 prop 应该是什么类型,如 String, Number, Boolean,

linux中使用rust语言在不同进程之间通信

第一种:使用mmap映射相同文件 fn main() {let pid = std::process::id();println!(

C++编程:ZeroMQ进程间(订阅-发布)通信配置优化

文章目录 0. 概述1. 发布者同步发送(pub)与订阅者异步接收(sub)示例代码可能的副作用: 2. 适度增加缓存和队列示例代码副作用: 3. 动态的IPC通道管理示例代码副作用: 4. 接收消息的超时设置示例代码副作用: 5. 增加I/O线程数量示例代码副作用: 6. 异步消息发送(使用`dontwait`标志)示例代码副作用: 7. 其他可以考虑的优化项7.1 立即发送(ZMQ_IM

VB和51单片机串口通信讲解(只针对VB部分)

标记:该篇文章全部搬自如下网址:http://www.crystalradio.cn/thread-321839-1-1.html,谢谢啦            里面关于中文接收的部分,大家可以好好学习下,题主也在研究中................... Commport;设置或返回串口号。 SettingS:以字符串的形式设置或返回串口通信参数。 Portopen:设置或返回串口

深入理解TCP通信

这大概是自己博客上面第三次写TCP通信demo了,总是写同样的内容也不太好啊,不过每一次都比前一次进步一点。这次主要使用了VIM编辑工具、gdb调试、wireshirk、netstat查看网络状态。 参考《C++服务器视频教程》、《Unix网络编程》 一、VIM常用命令 vim server.cpp #打开一个文件:w 写入文件:wq 保存并退出:q! 不保存退出显示行号

十四、我们应当怎样做需求分析:子用例与扩展用例

用例模型作为UML中4+1视图中非常重要的一员,非常集中地体现了面向对象的分析与设计思想。用例模型将现实世界中连续的一个一个业务流程,按照场景划分到了一个一个的用例中。由于场景的出现,使得用例中的业务流程存在着高度的内聚性,从而成为了日后各种对象的雏形。同时,在用例分析中,又将那些存在于各个用例中的,相同或相近的业务操作提取出来,形成一个一个的子用例或扩展用例,又体现了面向对象设计中的复用性。现在

电子电气架构---私有总线通信和诊断规则

电子电气架构—私有总线通信和诊断规则 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节能减排。 无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事.而不是让内心的烦躁、

【C++STL(十四)】一个哈希桶简单模拟实现unordered_map/set

目录 前言 一、改造哈希桶 改造结点类 改造主体  模板参数改造  迭代器(重点) 改造完整哈希桶 unordered_map模拟实现 unordered_set模拟实现 前言 前面的文章都有说unordered_map/set的底层结构就是哈希表,严格来说是哈希桶,那么接下来我们就尝试使用同一个哈希桶来模拟实现一下。整体的逻辑和一棵红黑树封装map/set类似,所以