找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 11624|回复: 17
打印 上一主题 下一主题
收起左侧

单片机双机通信程序与原理图Proteus仿真-单片机与单片机通信

  [复制链接]
跳转到指定楼层
楼主
8x8矩阵按键显示,单片机1通过串口通信把矩阵按键的值发单片机2,在单片机2上的数码管上进行显示。

下面是仿真原理图在附件中可下载Proteus仿真工程文件,里面可以看清晰的原理图

单片机双机通信第1个单片机的程序:
  1. /*--------------------------------------------------------------------------------------------------------------------------------
  2.                 说明:            发送端单片机1程序:
  3.                                                   8*8矩阵键盘读取数码管显示,再由串口与单片机2进行通信;
  4.                                                       把单片机1读取的按键值发送给单片机2进行显示。

  5.                 MCU:            AT89S52
  6.                 晶振:            11.0592MHZ

  7.                             2015-12-30
  8. ---------------------------------------------------------------------------------------------------------------------------------*/
  9. #include<reg52.h>
  10. #include<intrins.h>
  11. #define uint unsigned int
  12. #define uchar unsigned char

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

  18. void delay(uint z);//延时函数
  19. void display();                //显示函数
  20. void keyscan();    //8*8_64矩阵键盘
  21. void InitUART  (void);  //串口初始化
  22. /*----------------------------------------------------------------------------------
  23.                                         main()_程序入口
  24. ----------------------------------------------------------------------------------*/
  25. void main()
  26. {
  27.         InitUART();//串口初始化
  28.          SBUF=0;
  29.         while(1)
  30.         {
  31.                 display();
  32.                 keyscan();
  33.         }
  34. }
  35. /*------------------------------------------------
  36.                     串口初始化
  37. ------------------------------------------------*/
  38. void InitUART  (void)
  39. {

  40.     SCON  = 0x50;                        // SCON: 模式 1, 8-bit UART, 使能接收  
  41.     TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重装
  42.     TH1   = 0xFD;               // TH1:  重装值 9600 波特率 晶振 11.0592MHz  
  43.     TR1   = 1;                  // TR1:  timer 1 打开                        
  44.     EA    = 1;                  //打开总中断
  45.     ES    = 1;                  //打开串口中断
  46. }
  47. /*------------------------------------------------
  48.                      串口中断程序
  49. ------------------------------------------------*/
  50. void UART_SER (void) interrupt 4 //串行中断服务程序
  51. {
  52. //   unsigned char Temp;          //定义临时变量
  53.    
  54.    if(RI)                        //判断是接收中断产生
  55.      {
  56.           RI=0;                      //标志位清零
  57.           num=SBUF;                 //读入缓冲区的值
  58.    //   SBUF=num;                 //把接收到的值再发回单片机2
  59.          }
  60.    if(TI)                        //如果是发送标志位,清零
  61.      TI=0;
  62.    
  63. }

  64. /*----------------------------------------------------------------------------------
  65.                                 延时        
  66. ----------------------------------------------------------------------------------*/
  67. void delay(uint z)
  68. {
  69.         uint i,j;
  70.         for(i=z;i>0;i--)
  71.         for(j=112;j>0;j--);
  72. }
  73. /*----------------------------------------------------------------------------------
  74.                                 显示        
  75. ----------------------------------------------------------------------------------*/
  76. void display()
  77. {         //num=23;
  78.         shi=num/10;
  79.         ge=num%10;

  80.         P2=table[shi];//显示十位
  81.         D1=0;
  82.         D2=1;
  83.         delay(5);
  84.         D1=1;

  85.         P2=table[ge];//显示个位
  86.         D2=0;
  87.         delay(5);
  88.         D2=1;
  89. }
  90. /*----------------------------------------------------------------------------------
  91.                                 矩阵键盘        
  92. ----------------------------------------------------------------------------------*/
  93. void keyscan()
  94. {
  95.         uchar temp,n,k;
  96.         n=0x7f;
  97.         for(k=0;k<8;k++)
  98.         {
  99.         P0=n;
  100.         temp=P1&0xff;
  101.         if(temp!=0xff)
  102.         {
  103.                 delay(3);
  104.                 temp=P1&0xff;
  105.                 if(temp!=0xff)
  106.                 {
  107.                         temp=P1;
  108.                         if(n==0x7f)
  109.                         {
  110.                         switch(temp)
  111.                         {
  112.                                 case 0xfe:num=1;SBUF=1;break;
  113.                                 case 0xfd:num=9;SBUF=9;break;
  114.                                 case 0xfb:num=17;SBUF=17;break;
  115.                                 case 0xf7:num=25;SBUF=25;break;
  116.                                 case 0xef:num=33;SBUF=33;break;
  117.                                 case 0xdf:num=41;SBUF=41;break;
  118.                                 case 0xbf:num=49;SBUF=49;break;
  119.                                 case 0x7f:num=57;SBUF=57;break;
  120.                         }        
  121.                         }
  122.                                 
  123.                         if(n==0xbf)
  124.                         {
  125.                         switch(temp)
  126.                         {
  127.                                 case 0xfe:num=2; SBUF=2;break;
  128.                                 case 0xfd:num=10;SBUF=10;break;
  129.                                 case 0xfb:num=18;SBUF=18;break;
  130.                                 case 0xf7:num=26;SBUF=26;break;
  131.                                 case 0xef:num=34;SBUF=34;break;
  132.                                 case 0xdf:num=42;SBUF=42;break;
  133.                                 case 0xbf:num=50;SBUF=50;break;
  134.                                 case 0x7f:num=58;SBUF=58;break;
  135.                         }
  136.                         }
  137.                                 
  138.                         if(n==0xdf)
  139.                         {
  140.                         switch(temp)
  141.                         {
  142.                                 case 0xfe:num=3; SBUF=3;break;
  143.                                 case 0xfd:num=11;SBUF=11;break;
  144.                                 case 0xfb:num=19;SBUF=19;break;
  145.                                 case 0xf7:num=27;SBUF=27;break;
  146.                                 case 0xef:num=35;SBUF=35;break;
  147.                                 case 0xdf:num=43;SBUF=43;break;
  148.                                 case 0xbf:num=51;SBUF=51;break;
  149.                                 case 0x7f:num=59;SBUF=59;break;
  150.                         }
  151.                         }
  152.                                 
  153.                         if(n==0xef)
  154.                         {
  155.                         switch(temp)
  156.                         {
  157.                                 case 0xfe:num=4; SBUF=4;break;
  158.                                 case 0xfd:num=12;SBUF=12;break;
  159.                                 case 0xfb:num=20;SBUF=20;break;
  160.                                 case 0xf7:num=28;SBUF=28;break;
  161.                                 case 0xef:num=36;SBUF=36;break;
  162.                                 case 0xdf:num=44;SBUF=44;break;
  163.                                 case 0xbf:num=52;SBUF=52;break;
  164.                                 case 0x7f:num=60;SBUF=60;break;
  165.                         }
  166.                         }
  167.                                 
  168.                         if(n==0xf7)
  169.                         {
  170.                         switch(temp)
  171.                         {
  172.                                 case 0xfe:num=5;SBUF=5;break;
  173.                                 case 0xfd:num=13;SBUF=13;break;
  174.                                 case 0xfb:num=21;SBUF=21;break;
  175.                                 case 0xf7:num=29;SBUF=29;break;
  176.                                 case 0xef:num=37;SBUF=37;break;
  177.                                 case 0xdf:num=45;SBUF=45;break;
  178.                                 case 0xbf:num=53;SBUF=53;break;
  179.                                 case 0x7f:num=61;SBUF=61;break;
  180.                         }
  181.                         }                     
  182.                                 
  183.                         if(n==0xfb)
  184.                         {
  185.                         switch(temp)
  186.                         {
  187.                                 case 0xfe:num=6;SBUF=6;break;
  188.                                 case 0xfd:num=14;SBUF=14;break;
  189.                                 case 0xfb:num=22;SBUF=22;break;
  190.                                 case 0xf7:num=30;SBUF=30;break;
  191.                                 case 0xef:num=38;SBUF=38;break;
  192.                                 case 0xdf:num=46;SBUF=46;break;
  193.                                 case 0xbf:num=54;SBUF=54;break;
  194.                                 case 0x7f:num=62;SBUF=62;break;
  195.                         }                           
  196.                         }

  197.                         if(n==0xfd)
  198.                         {
  199.                                 switch(temp)
  200.                         {
  201.                                 case 0xfe:num=7;SBUF=7;break;
  202.                                 case 0xfd:num=15;SBUF=15;break;
  203.                                 case 0xfb:num=23;SBUF=23;break;
  204.                                 case 0xf7:num=31;SBUF=31;break;
  205.                                 case 0xef:num=39;SBUF=39;break;
  206.                                 case 0xdf:num=47;SBUF=47;break;
  207.                                 case 0xbf:num=55;SBUF=55;break;
  208.                                 case 0x7f:num=63;SBUF=64;break;
  209.                                 }
  210.                                 }

  211.                         if(n==0xfe)
  212.                         {
  213.                                 switch(temp)
  214.                         {
  215.                                 case 0xfe:num=8; SBUF=8;break;
  216.                                 case 0xfd:num=16;SBUF=16;break;
  217.                                 case 0xfb:num=24;SBUF=24;break;
  218.                                 case 0xf7:num=32;SBUF=32;break;
  219.                                 case 0xef:num=40;SBUF=40;break;
  220.                                 case 0xdf:num=48;SBUF=48;break;
  221.                                 case 0xbf:num=56;SBUF=56;break;
  222.                                 case 0x7f:num=64;SBUF=64;break;
  223.                                 }
  224.                         }
  225.                         while(temp!=0xff)
  226.                         {
  227.                                 temp=P1&0xff;
  228.                         }
  229.                         }
  230.                 }
  231.                 n=_cror_(n,1);
  232.         }
  233. }
复制代码

双机通信单片机2程序:
  1. /*--------------------------------------------------------------------------------------------------------------------------------
  2.                 说明:            接收端单片机2程序:
  3.                                                   读取数码管显示,由串口与单片机1进行通信;
  4.                                                       接收单片机1读取的8*8矩阵键盘按键值并在数码管上进行显示。

  5.                 MCU:            AT89S52
  6.                 晶振:            11.0592MHZ

  7.                             2015-12-30
  8. ---------------------------------------------------------------------------------------------------------------------------------*/
  9. #include<reg52.h>                  
  10. #include<intrins.h>
  11. #define uint unsigned int
  12. #define uchar unsigned char

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

  15. void delay(uint z);//延时函数
  16. void display();                //显示函数
  17. void keyscan();    //8*8_64矩阵键盘
  18. void InitUART  (void);  //串口初始化
  19. /*----------------------------------------------------------------------------------
  20.                                         main()_程序入口
  21. ----------------------------------------------------------------------------------*/
  22. void main()
  23. {
  24.         InitUART();
  25.          SBUF=0;
  26.         while(1)
  27.         {
  28.                 display();
  29.         }
  30. }
  31. /*------------------------------------------------
  32.                     串口初始化
  33. ------------------------------------------------*/
  34. void InitUART  (void)
  35. {

  36.     SCON  = 0x50;                        // SCON: 模式 1, 8-bit UART, 使能接收  
  37.     TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重装
  38.     TH1   = 0xFD;               // TH1:  重装值 9600 波特率 晶振 11.0592MHz  
  39.     TR1   = 1;                  // TR1:  timer 1 打开                        
  40.     EA    = 1;                  //打开总中断
  41.     ES    = 1;                  //打开串口中断
  42. }
  43. /*------------------------------------------------
  44.                      串口中断程序
  45. ------------------------------------------------*/
  46. void UART_SER (void) interrupt 4 //串行中断服务程序
  47. {
  48.    
  49.    if(RI)                        //判断是接收中断产生
  50.      {
  51.           RI=0;                      //标志位清零
  52.           num=SBUF;                 //读入缓冲区的值
  53.     //  SBUF=0;                 //把接收到的值再发回单片机1
  54.          }
  55.    if(TI)                        //如果是发送标志位,清零
  56.      TI=0;
  57.    
  58. }

  59. /*----------------------------------------------------------------------------------
  60.                                 延时        
  61. ----------------------------------------------------------------------------------*/
  62. void delay(uint z)
  63. {
  64.         uint i,j;
  65.         for(i=z;i>0;i--)
  66.         for(j=112;j>0;j--);
  67. }
  68. /*----------------------------------------------------------------------------------
  69.                                 显示        
  70. ----------------------------------------------------------------------------------*/
  71. void display()
  72. {//         num=23;
  73.         shi=num/10;
  74.         ge=num%10;

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

  77.         P1=table[ge];//显示个位
  78.         delay(5);
  79. }
复制代码


8x8矩阵键盘-两机串口通信.zip

80.25 KB, 下载次数: 186, 下载积分: 黑币 -5

单片机与单片机通信

评分

参与人数 2黑币 +85 收起 理由
暗光 + 35 共享资料的黑币奖励!
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:99905 发表于 2016-1-1 12:40 | 只看该作者

回帖奖励 +5

这单片机通讯硬件用交叉连接,以一控多
回复

使用道具 举报

板凳
ID:99538 发表于 2016-1-6 20:49 | 只看该作者
请问你用这么多键有什么作用,
回复

使用道具 举报

地板
ID:14181 发表于 2016-3-28 15:46 | 只看该作者
黑金币不足,只能顶一下了。
回复

使用道具 举报

5#
ID:169626 发表于 2017-5-11 22:24 | 只看该作者
黑币不够用 ...顶一顶
回复

使用道具 举报

6#
ID:208802 发表于 2017-6-7 15:05 来自手机 | 只看该作者
3到15字符 发表于 2017-5-11 22:24
黑币不够用 ...顶一顶

顶一下
回复

使用道具 举报

7#
ID:212355 发表于 2017-6-19 21:18 | 只看该作者
在吗  为什么从机数码管的十位跟各位一直是相同的
回复

使用道具 举报

8#
ID:186455 发表于 2017-9-11 15:13 | 只看该作者
顶顶吧
回复

使用道具 举报

9#
ID:194625 发表于 2018-12-27 11:24 | 只看该作者
这个不错,值得购买
回复

使用道具 举报

10#
ID:455344 发表于 2018-12-28 09:34 | 只看该作者
有汇编的程序吗?老哥
回复

使用道具 举报

11#
ID:426975 发表于 2019-4-26 11:03 | 只看该作者
顶一下
回复

使用道具 举报

12#
ID:524294 发表于 2019-4-29 11:04 | 只看该作者
感谢分享
回复

使用道具 举报

13#
ID:456878 发表于 2019-5-3 19:54 | 只看该作者
正需要这个,谢谢
回复

使用道具 举报

14#
ID:564426 发表于 2019-6-17 11:57 | 只看该作者
感谢&#128591;&#128591;感谢楼主分享
回复

使用道具 举报

15#
ID:389070 发表于 2019-7-17 22:49 | 只看该作者
为什么我模拟出来的是一机显示46,而二机显示的是66,一机29,二机99.求解
回复

使用道具 举报

16#
ID:283606 发表于 2019-7-24 11:50 | 只看该作者
牛皮,请求引用
回复

使用道具 举报

17#
ID:648072 发表于 2019-12-3 11:01 | 只看该作者
做得挺好,点赞
回复

使用道具 举报

18#
ID:729340 发表于 2020-6-10 17:59 | 只看该作者
感谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表