找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机双机通信 双向通信电路,程序及proteus仿真

[复制链接]
跳转到指定楼层
楼主
用max232芯片可以把2个单片机进行连接起来,实现双机通信试验,仿真原理图如下:


2个单片机的程序及双机通信仿真工程文件下载: 双机通信--双向通信.zip (78.98 KB, 下载次数: 41)

甲机注意的问题
对于双机通信而言,甲机和乙机初始化问题要格外注意:

voidinit()

{
   TMOD=0x20;
   TH1=0XFD;
   TL1=0XFD;
   SCON=0X50;
   TR1=1;
   EA=1;
   ES=1;
}
以后就直接对SCON进行赋值。这样既省事,有正确。
还有就是发送函数模块化:
void put(uchar c)
{
   SBUF=c;
   while(!TI);
   TI=0;
}
记得以后这样用。
最后一个问题,也是本程序的亮点

voidser() interrupt 4

{
   if(RI==1)
   {
         a=SBUF;
         RI=0;
         P2=table[a];
   }
}
由于当发送中断发生的时候、接收中断发生的时候。中断号都是4,都会进入中断子程序,这里就通过if(RI===1)
很巧妙的解决了这个问题。也就是说,只有接收中断发生后才会执行if内部的程序。


-----------------------------------------------------------
乙机:
乙机注意的问题与甲机一样,也是接收和发送。

程序:
  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. }
复制代码
  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. }
复制代码






评分

参与人数 2黑币 +11 收起 理由
Danny1710 + 10 很给力!
yyhyyhyyh + 1 赞一个!

查看全部评分

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

使用道具 举报

沙发
ID:107913 发表于 2016-9-22 20:50 | 只看该作者
很好的启发,谢谢楼主
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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