找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1784|回复: 0
收起左侧

求助单片机多机通信源程序仿真问题

[复制链接]
ID:802694 发表于 2020-7-23 20:05 | 显示全部楼层 |阅读模式
下面是郭天祥课本源码:
新概念51单片机,11.4
51hei截图20200723200353.png 51hei截图20200723200420.png 51hei截图20200723200402.png

单片机源程序如下:
  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. #define SLAVE2 0x02                                                //从机地址02
  5. #define BN 16
  6. uchar rbuf[16];
  7. uchar tbuf[16];
  8. void err(void)
  9. {
  10.         SBUF=0xff;
  11.         while(TI!=1);
  12.         TI=0;
  13. }
  14. uchar master(uchar addr,uchar command)
  15. {
  16.         uchar aa,i,p;
  17.         while(1)
  18.         {
  19.                 SBUF=addr;                                                        //呼叫地址
  20.                 while(TI!=1);
  21.                 TI=0;
  22.                 while(RI!=1);
  23.                 RI=0;                                                                //等待从机回答
  24.                 if(SBUF!=addr)
  25.                         err();                                                        //若地址错发复位信号
  26.                 else                                                                //地址相符
  27.                 {
  28.                         TB8=0;                                                        //清地址标志
  29.                         SBUF=command;                                        //发命令,数据帧发,命令是主函数输入
  30.                         while(TI!=1);
  31.                         TI=0;
  32.                         while(RI!=1);
  33.                         RI=0;
  34.                         aa=SBUF;                                                //接受从机状态字
  35.                         if((aa&0x08)==0x08)                                //若命令未被接受发复位信号
  36.                         {
  37.                                 TB8=1;
  38.                                 err();
  39.                         }
  40.                         else
  41.                         {
  42.                                 if(command==0x01)                        //是发送命令
  43.                                 {
  44.                                         if((aa&0x01)==0x01)                        //从机准好就绪
  45.                                         {
  46.                                                 do
  47.                                                 {
  48.                                                         p=0;                                                //清校验和
  49.                                                         for(i=0;i<BN;i++)
  50.                                                         {
  51.                                                                 SBUF=tbuf[i];                        //发送数据
  52.                                                                 p+=tbuf[i];
  53.                                                                 while(TI!=1)
  54.                                                                 TI=0;
  55.                                                         }
  56.                                                         SBUF=p;                                                //发送校验和
  57.                                                         while(TI!=1);
  58.                                                         TI=0;
  59.                                                         while(RI!=1);
  60.                                                         RI=0;
  61.                                                 }
  62.                                                 while(SBUF!=0);                                        //接受不正确,重新发送
  63.                                                 TB8=1;                                                        //置地址标志
  64.                                                 return(0);
  65.                                         }
  66.                                 }
  67.                                 else
  68.                                 {
  69.                                         if((aa&0x02)==0x02)                        //是接受命令,从机准备好发送
  70.                                         {        
  71.                                                         while(1)
  72.                                                         {
  73.                                                                 p=0;                                                //清校验和
  74.                                                                 for(i=0;i<BN;i++)
  75.                                                                 {
  76.                                                                         while(RI!=1);
  77.                                                                         RI=0;
  78.                                                                         rbuf[i]=SBUF;                        //接受数据
  79.                                                                         p+=rbuf[i];
  80.                                                                         
  81.                                                                 }
  82.                                                                 while(RI!=1);
  83.                                                                 RI=0;
  84.                                                                 if(SBUF==p)
  85.                                                                 {
  86.                                                                         SBUF=0x00;                                //校验和相同发“00”
  87.                                                                         while(TI!=1)
  88.                                                                         TI=0;
  89.                                                                         break;
  90.                                                                 }
  91.                                                                 else
  92.                                                                 {
  93.                                                                         SBUF=0xff;                                //校验和不同发ff重新接受
  94.                                                                         while(TI!=1);
  95.                                                                         TI=0;
  96.                                                                
  97.                                                                 }
  98.                                                         }
  99.                                                         TB8=1;                                                        //置地址标志
  100.                                                         return(0);
  101.                                         }
  102.                                        
  103.                                        
  104.                                 }        
  105.                         }
  106.                 }
  107.         }
  108. }

  109. void main()
  110. {
  111.         TMOD=0x20;                                                //T/C1定义为方式2
  112.         TL1=0xfd;
  113.         TH1=0xfd;                                                //置初值
  114.         PCON=0x00;
  115.         TR1=1;
  116.         SCON=0xf8;                                                //串行口方式3
  117.         master(SLAVE2,0x01);                                //命令从机02接受
  118.         master(SLAVE2,0x02);                                //命令从机02发送
  119.         while(1);
  120.         
  121. }

  122. 从机
  123. //=======================================================================================
  124. #include <reg52.h>
  125. #define uchar unsigned char
  126. #define SLAVE2 0x02
  127. #define BN 16
  128. uchar code trbuf[16]={"congji transmit"};
  129. uchar rebuf[16];
  130. bit tready;
  131. bit rready;

  132. void str(void);
  133. void sre(void);
  134. void main(void)
  135. {
  136.         TMOD=0x20;                                                //T/C1定义为方式2
  137.         TL1=0xfd;
  138.         TH1=0xfd;                                                //置初值
  139.         PCON=0x00;
  140.         TR1=1;
  141.         SCON=0xf0;                                                //串行口方式3,TB8=1,发地址命令
  142.         ES=1;
  143.         EA=1;                                                        //开串行口中断
  144.         while(1)
  145.         {
  146.                 tready=1;
  147.                 rready=1;
  148.         }                                                                        //假定准备好发送和接受
  149. }

  150. void ssio(void) interrupt 4
  151. {
  152.         uchar a;
  153.         RI=0;
  154.         ES=0;                                                                        //关串行中断
  155.         if(SBUF!=SLAVE2)
  156.         {
  157.                 ES=1;
  158.                 goto reti;
  159.         }
  160.         SM2=0;                                                                        //取消监听状态
  161.         SBUF=SLAVE2;                                                                //从本地址发回
  162.         while(TI!=1);                                                        
  163.         TI=0;
  164.         while(RI!=1);
  165.         RI=0;
  166.         if(RB8==1)                                                                //是复位信号,恢复监听
  167.         {
  168.                 SM2=1;
  169.                 ES=1;
  170.                 goto reti;
  171.         }
  172.         a=SBUF;                                                                        //接受命令
  173.         if(a==0x01)                                                                //主机接受的数据
  174.         {
  175.                 if(rready==1)
  176.                         SBUF=0x01;                                                //接受准备好发状态
  177.                 else
  178.                         SBUF=0x00;
  179.                 while(TI!=1)
  180.                 TI=0;
  181.                 while(RI!=1)
  182.                 RI=0;
  183.                 if(RB8==1)
  184.                 {
  185.                         SM2=1;
  186.                         ES=1;
  187.                         goto reti;
  188.                 }
  189.                 sre();                                                                //接受数据
  190.         }
  191.         else
  192.         {
  193.                 if(a==0x02)                                                        //从机向主机发送数据
  194.                 {
  195.                         if(tready==1)
  196.                                 SBUF=0x02;                                        //发送准备好状态
  197.                         else
  198.                                 SBUF=0x00;
  199.                         while(TI!=1);
  200.                         TI=0;
  201.                         while(RI!=1);
  202.                         RI=0;
  203.                         if(RB8==1)
  204.                         {
  205.                                 SM2=1;
  206.                                 ES=1;
  207.                                 goto reti;
  208.                                 
  209.                         }
  210.                         str();                                                        //发送数据
  211.                 }
  212.                 else
  213.                 {
  214.                         SBUF=0x80;                                                //命令非法,发送状态
  215.                         while(TI!=1);
  216.                         TI=0;
  217.                         SM2=1;
  218.                         ES=1;                                                        //恢复监听
  219.                 }
  220.         }
  221.         reti:;
  222.         
  223. }

  224. void str(void)                                                                //发送数据块
  225. {
  226.         uchar p,i;
  227.         tready=0;
  228.         do
  229.         {
  230.                 p=0;                                                                //清校验和
  231.                 for(i=0;i<BN;i++)
  232.                 {
  233.                         SBUF=trbuf[i];                                        //发送数据块
  234.                         p+=trbuf[i];
  235.                         while(TI!=1);
  236.                         TI=0;
  237.                 }
  238.         SBUF=p;
  239.         while(TI!=1);
  240.         TI=0;
  241.         while(RI!=1);
  242.         RI=0;
  243.         }
  244.         while(SBUF!=0);                                                        //主机接受不正确,重新发送
  245.         SM2=1;
  246.         ES=1;
  247. }

  248. void sre(void)                                                                //接受数据块
  249. {
  250.         uchar p,i;
  251.         rready=0;
  252.         while(1)
  253.         {
  254.                 p=0;                                                                //清校验和
  255.                 for(i=0;i<BN;i++)
  256.                 {
  257.                         while(RI!=1);               
  258.                         RI=0;                                                        //接受数据
  259.                         rebuf[i]=SBUF;
  260.                         p+=rebuf[i];
  261.                         
  262.                 }
  263.                 while(RI!=1);
  264.                 RI=0;
  265.                 if(SBUF==P)
  266.                 {
  267.                         SBUF=0x00;
  268.                         break;                                                        //校验和相同发“00”
  269.                 }
  270.                 else
  271.                 {
  272.                         SBUF=0xff;                                                //校验和不同发ff重新接受
  273.                         while(TI!=0);
  274.                         TI=0;
  275.                 }
  276.         }
  277.         SM2=1;
  278.         ES=1;
  279. }
复制代码

//===========================================================================

课本源码有明显2处纰漏修改了一下,但是proteus仿真没有结果,求助大神帮分析下

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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