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

发布者:TranquilMind最新更新时间:2019-09-29 来源: eefocus关键字:双机通信  单片机  STC89C51 手机看文章 扫描二维码
随时随地手机看文章

要求:


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


一、Protues仿真图:

二、程序源码:

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

发送端:

/*******************************************************************************

================================================================================

【平    台】STC89C51_sumjess平台

【编    写】sumjess

【E-mail  】1371129880@qq.com

【软件版本】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  】1371129880@qq.com

【软件版本】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()_程序入口

----------------------------------------------------------------------------------*/

[1] [2]
关键字:双机通信  单片机  STC89C51 引用地址:课程设计题十四:双机通信

上一篇:51单片机pwm信号模拟
下一篇:课程设计题十三:乒乓球比赛

推荐阅读最新更新时间:2024-11-02 04:57

MCU软件基准测试实用技巧:编译器优化能力评测指引
在MCU开发和应用中,工程师都需要进行MCU的能力测试,通用的做法是用Benchmark(基准)程序来测试。然而,在做基准测试时,编译器的优化能力也在测试结果中有较为明显的影响,同一套硬件平台,选用不同的编译器和不同的优化选项,可能得出的结果相差较大。 为了最大程度释放MCU的性能,在基准测试中取得最理想的结果,往往需要工程师不仅对自身的硬件比较了解,更需要深入了解编译器的优化原理,并灵活应用,才能在基准测试中发挥出MCU的全部性能。IAR Systems作为全球知名的嵌入式工具厂商,其编译器在优化能力上有独特的优势,MCU配合IAR的编译器往往能够得出较好的基准测试结果。 本文以已在MCU领域内广泛使用的IAR Embe
[嵌入式]
<font color='red'>MCU</font>软件基准测试实用技巧:编译器优化能力评测指引
MCS-51单片机访问超大容量存储器的实现
1 引言 MCS-51系列单片机有着优越的性价比,因此应用面宽,使用量也非常大;然而它只有16位地址线,最大能访问的存储空间为64K,且扩展接口与存储器统一编址,扩展接口会占用大量的地址空间,致使该系列单片机在数据量大的数据采集系统中,存储空间明显不足。 笔者最近在开发一数据采集系统时,经分析、探索,找到了解决的办法。 2 使用大容量存储器的原理 2.1 使扩展接口不占用单片机的存储地址空间 由于MCS-51单片机的扩展接口与存储器统一编址,采用常规的方法扩展接口时会占用大量的地址空间,而多数应用系统均会要求扩展接口(本例有七段LED的段输出口、位输出口、键盘口各一个),为此,使扩展接口不占用单片机的存储地址
[单片机]
MCS-51<font color='red'>单片机</font>访问超大容量存储器的实现
7-基于51单片机的二氧化碳浓度检测报警系统仿真
具体实现功能 由STC89C52单片机+二氧化碳传感器+LCD1602液晶显示屏+按键+蜂鸣器+指示灯+电源构成。 具体功能: ①二氧化碳传感器测得二氧化碳数据后经过单片机处理,由LCD1602实时显示,第一行显示测得的浓度值,第二行显示报警阈值; ②可通过按键设置二氧化碳报警阈值; ③测得的甲醛浓度在正常范围时,绿灯亮,超过报警阈值时,红灯亮,蜂鸣器响,开始声光报警。 单片机介绍 51单片是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C51为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。具
[单片机]
7-基于51<font color='red'>单片机</font>的二氧化碳浓度检测报警系统仿真
用VMLAB进行AVR单片机硬件/软件协仿真
前言 在单片机应用开发过程中,当源文件的编译成功后,就要进行仿真调试工作。仿真调试可分为两大类--芯片级仿真和代码级仿真。芯片级仿真是指使用仿真软件和ICE硬件工具相配合,在实际硬件上进行仿真调试工作;而代码级仿真则完全在计算机上完成,不需要硬件的参与。两种类型的仿真各有特点,使用的场合不同。本文基于VMLAB,讲述了进行AVR单片机硬件/软件协同仿真的方法。 VMLAB的全称为:VisualMicroLab。它针对于AVR以及ST62系列单片机设计,是一个单片机的虚拟原型(virtualprototype)框架(frame),它可以提供给用户一个真正意义上的虚拟微控制器(MCU)设计实验室。它具有强大的多窗口、多文件的编
[工业控制]
用VMLAB进行AVR<font color='red'>单片机</font>硬件/软件协仿真
基于80C196MC单片机的自动定位系统
1引言 包装机上卷筒型包装纸印有连续的商标,当机器开动时,连续的标纸由送纸辊牵引向机器内输送,再经切纸刀辊将连续标纸分切成单张的包装纸。刀辊每旋转一周,切下一张包装纸,若要使实际切纸线与理论切纸线重合,送纸辊的直径和单张包装纸的长度必须满足严格的数学关系。由于送纸辊加工有公差,包装机工作过程中卷筒的半径逐渐减小,标纸所受张力发生变化等等因素,使得刀辊切下的包装纸和理论切纸线之间有偏差,即使这种偏差很小。例如,某张标纸偏差只有01mm,刀辊速度为300r/min,机器运行10min,累计偏差即达300mm。此时,包装纸上的图案就会明显偏离正确位置,不符合工艺要求。然而,随着经济的发展和人们审美情趣的提高,人们对商品的包装效
[单片机]
基于80C196MC<font color='red'>单片机</font>的自动定位系统
msp430单片机控制lcd1602显示C程序
//MSP430写的1602液晶显示程序2011/8/26//硬件连接 //P4 数据口 P3.7---E P3.6---RW P3.5----RS #include msp430x14x.h #define uint unsigned int #define rw(x) P3OUT=(P3OUT&(~BIT6))|(x?BIT6:0); unsigned char table0 = hankouxueyuan ; unsigned char table1 = dianzisheji ; //**************延时**
[单片机]
单片机中data,idata,xdata,pdata,code区别
很多 单片机 初学者甚至有些用老工程师对data,idata,xdata,pdata,code这些东西一直都搞不明白是怎么回事。最近看到一篇关于keil中data,idata,xdata,pdata,code的问题的文章,转过来跟大家分享一下! 从数据存储类型来说,8051系列单片机有片内、片外程序存储器,片内、片外数据存储器,片内程序存储器还分直接寻址区和间接寻址类型,分别对应code、data、xdata、idata以及根据51系列单片机特点而设定的pdata类型,使用不同的存储器,将使程序执行效率不同,在编写C51程序时,最好指定变量的存储类型,这样将有利于提高程序执行效率(此问题将在后面专门讲述)。与ANSI-C稍有不同
[单片机]
基于事件一目标驱动的人机界面设计
引 言   人机界面(human-computer interface),又称用户界面、人机交互、人机接口等,是人与机器之间传递、交换信息的媒介.是用户使用计算机系统的综合操作环境。在商品竞争中,一个应用系统的成功与否在某种程度上也取决于用户使用界面的感受好坏,因此,人机界面的设计在应用系统的设计中有着重要的作用。嵌入式系统强调人机界面操作的实时性,简单化,强调在特定平台上特定应用的时间空间效率。在传统的小系统设计中。程序设计一般采用前后台工作方式。应用程序是一个无限的循环,循环中调用相应的函数完成相应的操作,时间相关性很强的关键操作(crltical operation)是靠中断服务来保证的。因为中断服务提供的信息一直要等到后台
[应用]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved