找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 5649|回復(fù): 1
收起左側(cè)

單片機雙機通信 雙向通信電路,程序及proteus仿真

[復(fù)制鏈接]
ID:137190 發(fā)表于 2016-9-11 23:38 | 顯示全部樓層 |閱讀模式
用max232芯片可以把2個單片機進行連接起來,實現(xiàn)雙機通信試驗,仿真原理圖如下:
0.png
0.png
2個單片機的程序及雙機通信仿真工程文件下載: 雙機通信--雙向通信.zip (78.98 KB, 下載次數(shù): 42)

甲機注意的問題
對于雙機通信而言,甲機和乙機初始化問題要格外注意:

voidinit()

{
   TMOD=0x20;
   TH1=0XFD;
   TL1=0XFD;
   SCON=0X50;
   TR1=1;
   EA=1;
   ES=1;
}
以后就直接對SCON進行賦值。這樣既省事,有正確。
還有就是發(fā)送函數(shù)模塊化:
void put(uchar c)
{
   SBUF=c;
   while(!TI);
   TI=0;
}
記得以后這樣用。
最后一個問題,也是本程序的亮點

voidser() interrupt 4

{
   if(RI==1)
   {
         a=SBUF;
         RI=0;
         P2=table[a];
   }
}
由于當(dāng)發(fā)送中斷發(fā)生的時候、接收中斷發(fā)生的時候。中斷號都是4,都會進入中斷子程序,這里就通過if(RI===1)
很巧妙的解決了這個問題。也就是說,只有接收中斷發(fā)生后才會執(zhí)行if內(nèi)部的程序。


-----------------------------------------------------------
乙機:
乙機注意的問題與甲機一樣,也是接收和發(fā)送。

程序:
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. uchar code table[]={
  5. 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  6. sbit led0=P0^0;
  7. sbit led1=P0^3;
  8. sbit key=P1^0;
  9. uchar count,a;
  10. void delay(uint z)
  11. {
  12.         uint i,j;
  13.         for(i=z;i>0;i--)
  14.                 for(j=110;j>0;j--);
  15. }
  16. void put(uchar c)
  17. {
  18.         SBUF=c;
  19.         while(!TI);
  20.         TI=0;
  21. }
  22. void init()
  23. {
  24.         TMOD=0x20;
  25.         TH1=0XFD;
  26.         TL1=0XFD;
  27.         SCON=0X50;
  28.         TR1=1;
  29.         EA=1;
  30.         ES=1;
  31. }
  32. void main()
  33. {
  34.         P2=0x00;
  35.         init();
  36.         while(1)
  37.         {
  38.                 if(key==0)
  39.                 {
  40.                         delay(10);
  41.                         if(key==0)
  42.                         {
  43.                                 while(!key);
  44.                                 count++;
  45.                                    if(count==5)
  46.                                    count=1;
  47.                         }
  48.                 }
  49.                                 switch(count)
  50.                                 {
  51.                                         case 1:
  52.                                                 put('A');
  53.                                                 led0=~led0;
  54.                                                 led1=1;
  55.                                                 break;
  56.                                         case 2:
  57.                                                 put('B');
  58.                                                 led1=~led1;
  59.                                                 led0=1;
  60.                                                 break;
  61.                                         case 3:
  62.                                                 put('C');
  63.                                                 led0=~led0;
  64.                                                 led1=~led1;
  65.                                                 break;
  66.                                         case 4:
  67.                                                 put('D');
  68.                                                 led0=0;
  69.                                                 led1=0;
  70.                                                 break;
  71.                                 }
  72.                         delay(100);
  73.         }
  74. }
  75. void ser() interrupt 4
  76. {
  77.         if(RI==1)
  78.         {
  79.                 a=SBUF;
  80.                 RI=0;
  81.                 P2=table[a];
  82.         }
  83. }
復(fù)制代碼
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit led0=P0^0;
  5. sbit led1=P0^3;
  6. sbit key=P1^0;
  7. uchar a;
  8. char count=-1;
  9. void delay(uint z)
  10. {
  11.         uint i,j;
  12.         for(i=z;i>0;i--)
  13.                 for(j=110;j>0;j--);
  14. }
  15. void put(uchar c)
  16. {
  17.         SBUF=c;
  18.         while(!TI);
  19.         TI=0;
  20. }
  21. void init()
  22. {
  23.         TMOD=0X20;
  24.         TH1=0XFD;
  25.         TL1=0XFD;
  26.         TR1=1;
  27.         SCON=0X50;
  28.         EA=1;
  29.         ES=1;
  30. }
  31. void main()
  32. {
  33.         init();
  34.         while(1)
  35.         {
  36.           if(key==0)
  37.           {
  38.                   delay(10);
  39.                 if(key==0)
  40.                 {
  41.                         while(!key);
  42.                         count++;
  43.                         if(count==10)
  44.                         count=0;
  45.                         put(count);        
  46.                 }
  47.           }
  48.                 switch(a)
  49.                 {
  50.                         case 'A':
  51.                                 led0=~led0;
  52.                                 led1=1;
  53.                                 break;
  54.                         case 'B':
  55.                                 led1=~led1;
  56.                                 led0=1;
  57.                                 break;
  58.                         case 'C':
  59.                                 led0=~led0;
  60.                                 led1=~led1;
  61.                                 break;
  62.                         case 'D':
  63.                                 led0=0;
  64.                                 led1=0;
  65.                 }
  66.                 delay(100);        
  67.         }        
  68. }
  69. void ser() interrupt 4
  70. {
  71.         if(RI==1)
  72.         {
  73.                 RI=0;
  74.                 a=SBUF;
  75.         }
  76. }
復(fù)制代碼






評分

參與人數(shù) 2黑幣 +11 收起 理由
Danny1710 + 10 很給力!
yyhyyhyyh + 1 贊一個!

查看全部評分

相關(guān)帖子

回復(fù)

使用道具 舉報

ID:107913 發(fā)表于 2016-9-22 20:50 | 顯示全部樓層
很好的啟發(fā),謝謝樓主
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

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