历史上的今天
返回首页

历史上的今天

今天是:2024年09月29日(星期日)

正在发生

2019年09月29日 | 课程设计题十四:双机通信

2019-09-29 来源:eefocus

要求:


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

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

推荐阅读

史海拾趣

Everspin Technologies公司的发展小趣事

Everspin一直致力于MRAM技术的创新和发展。其中,自旋转移力矩MRAM(STT-MRAM)是该公司的重要技术之一。Everspin在平面内和垂直磁隧道结(MTJ)STT-MRAM位单元的开发方面取得了显著成果,并积累了超过600项有效专利和应用的知识产权组合。这些技术的创新和专利的积累,使得Everspin在MRAM市场中保持了领先地位。

FUJITSU(富士通)公司的发展小趣事

Everspin一直致力于MRAM技术的创新和发展。其中,自旋转移力矩MRAM(STT-MRAM)是该公司的重要技术之一。Everspin在平面内和垂直磁隧道结(MTJ)STT-MRAM位单元的开发方面取得了显著成果,并积累了超过600项有效专利和应用的知识产权组合。这些技术的创新和专利的积累,使得Everspin在MRAM市场中保持了领先地位。

C&K公司的发展小趣事

近年来,C&K在保持开关业务稳定发展的同时,还积极寻求新的增长点。为此,公司宣布成立了一个新的部门——C&K航空航天部。这个新部门旨在将公司在开关领域的专业技术与航空航天领域的需求相结合,为客户提供更先进、更可靠的系统解决方案。这一举措不仅展示了C&K在技术创新方面的实力,也为其未来的发展打开了新的大门。

这五个故事从不同角度展现了C&K公司在电子行业中的发展历程和成就。从磁芯记忆到微型开关的转型、成为世界领先的开关制造商、被ITT Industries收购与保持独立品牌、通过收购扩大全球业务与制造能力以及成立航空航天部拓展新领域,每一个阶段都充满了挑战与机遇。正是凭借着对技术创新的执着追求和对市场需求的敏锐洞察,C&K得以在激烈的竞争中脱颖而出,成为电子行业中的佼佼者。

Harris公司的发展小趣事

在过去的四十年中,Hammond将业务重心扩展到了美国和国际市场。通过在全球各地设立办事处和建立分销网络,Hammond成功地将其产品和服务推广到了世界各地。这一战略转型不仅极大地提升了Hammond的品牌影响力,还为其带来了更加广阔的市场空间和增长潜力。

倍思特(BEST)公司的发展小趣事

二战后,随着全球经济的复苏和电气产品的爆炸性需求,Hammond迎来了前所未有的发展机遇。在1950年代和1960年代,Hammond积极扩展产品线,成为变压器、机架、机柜以及电气和电子行业外壳的领先供应商。同时,公司还进行了多次战略性收购,进一步巩固了其在北美电气OEM市场的地位,成为磁性材料的主要供应商之一。

Crydom公司的发展小趣事

在过去的四十年中,Hammond将业务重心扩展到了美国和国际市场。通过在全球各地设立办事处和建立分销网络,Hammond成功地将其产品和服务推广到了世界各地。这一战略转型不仅极大地提升了Hammond的品牌影响力,还为其带来了更加广阔的市场空间和增长潜力。

问答坊 | AI 解惑

直 流 稳 压 电 源

  直 流 稳 压 电 源 …

查看全部问答>

LM3S8962学习心得2010.5.24

最新的学习心得,该学生目前已经能够写一点简单的程序了,呵呵~~~~ …

查看全部问答>

关于手写板的问题

我现在在用89S51外扩8255来控制一个32*32的红外二级对管阵列,就是其中心是一个手写板性质的东西。 1、现在,老师要求我先对这个手写板进行采样(怎么采样)? 2、MFC上做一个相应的界面,在这个界面上,读出我在这个手写板上画下的图像,请问下 ...…

查看全部问答>

vc6.0+ddk报错调试问题

我用的是vc6.0+xpddk。调试passthru的时候,在output栏里点击报的错误,不能回到程序错误的地方。但是调试其他DDK带的PASSTHRU是不会出现这种情况的。 请问这是怎么回事啊 急死了…

查看全部问答>

【我给xilinx资源中心做贡献】三线SPI接口的VHDL源码

三线SPI接口的VHDL源码说明:该段代码为三线制SPI接口(CS,SDA,SCK)的源码,像一般的AD或者DA器件或者时钟芯片如DS1302采用的都是这种接口.本段代码是 我的的一个系统中的一个接口部分,功能比较简单,实现的功能是通过12个SCK完成一次数据的设定.经过 ...…

查看全部问答>

LPC11U14 PS2 协议

有没有人用LPC11xx 的普通GPIO模拟过PS2协议的收发啊,程序怎么实现啊。谢谢!…

查看全部问答>

论坛管理员要求补充信息的邮件被QQ邮箱判为垃圾邮件啦

今天查看了一下QQ邮箱的垃圾邮件,发现了一个管理员要求补全信息的邮件,还好论坛的资料更新过已经收到板子啦,没收到的兄弟们注意查查垃圾邮件哦…

查看全部问答>

之前买了个beaglebone black,感觉有不少坑啊

XDS100仿真器去掉了,Jtag接口还要自己焊上去。习惯了裸板编程,这下可有点不知所措了。。。 听说c2000 launchpad 上的xds100 V2 可以仿真其他的器件,不知道各位有没有吃灰的,低价转让一个呗。。。。 [ 本帖最后由 airqj 于 2013-9-29 13:48 编 ...…

查看全部问答>

2014 TI 联赛最终参考赛题

本帖最后由 paulhyde 于 2014-9-15 02:54 编辑  …

查看全部问答>