找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 14045|回復(fù): 17
收起左側(cè)

單片機(jī)雙機(jī)通信程序與原理圖Proteus仿真-單片機(jī)與單片機(jī)通信

  [復(fù)制鏈接]
ID:99600 發(fā)表于 2015-12-30 00:40 | 顯示全部樓層 |閱讀模式
8x8矩陣按鍵顯示,單片機(jī)1通過串口通信把矩陣按鍵的值發(fā)單片機(jī)2,在單片機(jī)2上的數(shù)碼管上進(jìn)行顯示。
0.png
下面是仿真原理圖在附件中可下載Proteus仿真工程文件,里面可以看清晰的原理圖 1.png

單片機(jī)雙機(jī)通信第1個(gè)單片機(jī)的程序:
  1. /*--------------------------------------------------------------------------------------------------------------------------------
  2.                 說明:            發(fā)送端單片機(jī)1程序:
  3.                                                   8*8矩陣鍵盤讀取數(shù)碼管顯示,再由串口與單片機(jī)2進(jìn)行通信;
  4.                                                       把單片機(jī)1讀取的按鍵值發(fā)送給單片機(jī)2進(jìn)行顯示。

  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;   //數(shù)碼管十位com1
  14. sbit D2=P3^7;   //數(shù)碼管個(gè)位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);//延時(shí)函數(shù)
  19. void display();                //顯示函數(shù)
  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 //串行中斷服務(wù)程序
  51. {
  52. //   unsigned char Temp;          //定義臨時(shí)變量
  53.    
  54.    if(RI)                        //判斷是接收中斷產(chǎn)生
  55.      {
  56.           RI=0;                      //標(biāo)志位清零
  57.           num=SBUF;                 //讀入緩沖區(qū)的值
  58.    //   SBUF=num;                 //把接收到的值再發(fā)回單片機(jī)2
  59.          }
  60.    if(TI)                        //如果是發(fā)送標(biāo)志位,清零
  61.      TI=0;
  62.    
  63. }

  64. /*----------------------------------------------------------------------------------
  65.                                 延時(shí)        
  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];//顯示個(gè)位
  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. }
復(fù)制代碼

雙機(jī)通信單片機(jī)2程序:
  1. /*--------------------------------------------------------------------------------------------------------------------------------
  2.                 說明:            接收端單片機(jī)2程序:
  3.                                                   讀取數(shù)碼管顯示,由串口與單片機(jī)1進(jìn)行通信;
  4.                                                       接收單片機(jī)1讀取的8*8矩陣鍵盤按鍵值并在數(shù)碼管上進(jìn)行顯示。

  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);//延時(shí)函數(shù)
  16. void display();                //顯示函數(shù)
  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 //串行中斷服務(wù)程序
  47. {
  48.    
  49.    if(RI)                        //判斷是接收中斷產(chǎn)生
  50.      {
  51.           RI=0;                      //標(biāo)志位清零
  52.           num=SBUF;                 //讀入緩沖區(qū)的值
  53.     //  SBUF=0;                 //把接收到的值再發(fā)回單片機(jī)1
  54.          }
  55.    if(TI)                        //如果是發(fā)送標(biāo)志位,清零
  56.      TI=0;
  57.    
  58. }

  59. /*----------------------------------------------------------------------------------
  60.                                 延時(shí)        
  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];//顯示個(gè)位
  78.         delay(5);
  79. }
復(fù)制代碼


8x8矩陣鍵盤-兩機(jī)串口通信.zip

80.25 KB, 下載次數(shù): 191, 下載積分: 黑幣 -5

單片機(jī)與單片機(jī)通信

評(píng)分

參與人數(shù) 2黑幣 +85 收起 理由
暗光 + 35 共享資料的黑幣獎(jiǎng)勵(lì)!
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

ID:99905 發(fā)表于 2016-1-1 12:40 | 顯示全部樓層

回帖獎(jiǎng)勵(lì) +5

這單片機(jī)通訊硬件用交叉連接,以一控多
回復(fù)

使用道具 舉報(bào)

ID:99538 發(fā)表于 2016-1-6 20:49 | 顯示全部樓層
請(qǐng)問你用這么多鍵有什么作用,
回復(fù)

使用道具 舉報(bào)

ID:14181 發(fā)表于 2016-3-28 15:46 | 顯示全部樓層
黑金幣不足,只能頂一下了。
回復(fù)

使用道具 舉報(bào)

ID:169626 發(fā)表于 2017-5-11 22:24 | 顯示全部樓層
黑幣不夠用 ...頂一頂
回復(fù)

使用道具 舉報(bào)

ID:208802 發(fā)表于 2017-6-7 15:05 來自手機(jī) | 顯示全部樓層
3到15字符 發(fā)表于 2017-5-11 22:24
黑幣不夠用 ...頂一頂

頂一下
回復(fù)

使用道具 舉報(bào)

ID:212355 發(fā)表于 2017-6-19 21:18 | 顯示全部樓層
在嗎  為什么從機(jī)數(shù)碼管的十位跟各位一直是相同的
回復(fù)

使用道具 舉報(bào)

ID:186455 發(fā)表于 2017-9-11 15:13 | 顯示全部樓層
頂頂吧
回復(fù)

使用道具 舉報(bào)

ID:194625 發(fā)表于 2018-12-27 11:24 | 顯示全部樓層
這個(gè)不錯(cuò),值得購(gòu)買
回復(fù)

使用道具 舉報(bào)

ID:455344 發(fā)表于 2018-12-28 09:34 | 顯示全部樓層
有匯編的程序嗎?老哥
回復(fù)

使用道具 舉報(bào)

ID:426975 發(fā)表于 2019-4-26 11:03 | 顯示全部樓層
頂一下
回復(fù)

使用道具 舉報(bào)

ID:524294 發(fā)表于 2019-4-29 11:04 | 顯示全部樓層
感謝分享
回復(fù)

使用道具 舉報(bào)

ID:456878 發(fā)表于 2019-5-3 19:54 | 顯示全部樓層
正需要這個(gè),謝謝
回復(fù)

使用道具 舉報(bào)

ID:564426 發(fā)表于 2019-6-17 11:57 | 顯示全部樓層
感謝&#128591;&#128591;感謝樓主分享
回復(fù)

使用道具 舉報(bào)

ID:389070 發(fā)表于 2019-7-17 22:49 | 顯示全部樓層
為什么我模擬出來的是一機(jī)顯示46,而二機(jī)顯示的是66,一機(jī)29,二機(jī)99.求解
回復(fù)

使用道具 舉報(bào)

ID:283606 發(fā)表于 2019-7-24 11:50 | 顯示全部樓層
牛皮,請(qǐng)求引用
回復(fù)

使用道具 舉報(bào)

ID:648072 發(fā)表于 2019-12-3 11:01 | 顯示全部樓層
做得挺好,點(diǎn)贊
回復(fù)

使用道具 舉報(bào)

ID:729340 發(fā)表于 2020-6-10 17:59 | 顯示全部樓層
感謝分享
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表