久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1878|回復: 0
打印 上一主題 下一主題
收起左側(cè)

求助單片機多機通信源程序仿真問題

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:802694 發(fā)表于 2020-7-23 20:05 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
下面是郭天祥課本源碼:
新概念51單片機,11.4


單片機源程序如下:
  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();                                                        //若地址錯發(fā)復位信號
  26.                 else                                                                //地址相符
  27.                 {
  28.                         TB8=0;                                                        //清地址標志
  29.                         SBUF=command;                                        //發(fā)命令,數(shù)據(jù)幀發(fā),命令是主函數(shù)輸入
  30.                         while(TI!=1);
  31.                         TI=0;
  32.                         while(RI!=1);
  33.                         RI=0;
  34.                         aa=SBUF;                                                //接受從機狀態(tài)字
  35.                         if((aa&0x08)==0x08)                                //若命令未被接受發(fā)復位信號
  36.                         {
  37.                                 TB8=1;
  38.                                 err();
  39.                         }
  40.                         else
  41.                         {
  42.                                 if(command==0x01)                        //是發(fā)送命令
  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];                        //發(fā)送數(shù)據(jù)
  52.                                                                 p+=tbuf[i];
  53.                                                                 while(TI!=1)
  54.                                                                 TI=0;
  55.                                                         }
  56.                                                         SBUF=p;                                                //發(fā)送校驗和
  57.                                                         while(TI!=1);
  58.                                                         TI=0;
  59.                                                         while(RI!=1);
  60.                                                         RI=0;
  61.                                                 }
  62.                                                 while(SBUF!=0);                                        //接受不正確,重新發(fā)送
  63.                                                 TB8=1;                                                        //置地址標志
  64.                                                 return(0);
  65.                                         }
  66.                                 }
  67.                                 else
  68.                                 {
  69.                                         if((aa&0x02)==0x02)                        //是接受命令,從機準備好發(fā)送
  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;                        //接受數(shù)據(jù)
  79.                                                                         p+=rbuf[i];
  80.                                                                         
  81.                                                                 }
  82.                                                                 while(RI!=1);
  83.                                                                 RI=0;
  84.                                                                 if(SBUF==p)
  85.                                                                 {
  86.                                                                         SBUF=0x00;                                //校驗和相同發(fā)“00”
  87.                                                                         while(TI!=1)
  88.                                                                         TI=0;
  89.                                                                         break;
  90.                                                                 }
  91.                                                                 else
  92.                                                                 {
  93.                                                                         SBUF=0xff;                                //校驗和不同發(fā)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發(fā)送
  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,發(fā)地址命令
  142.         ES=1;
  143.         EA=1;                                                        //開串行口中斷
  144.         while(1)
  145.         {
  146.                 tready=1;
  147.                 rready=1;
  148.         }                                                                        //假定準備好發(fā)送和接受
  149. }

  150. void ssio(void) interrupt 4
  151. {
  152.         uchar a;
  153.         RI=0;
  154.         ES=0;                                                                        //關(guān)串行中斷
  155.         if(SBUF!=SLAVE2)
  156.         {
  157.                 ES=1;
  158.                 goto reti;
  159.         }
  160.         SM2=0;                                                                        //取消監(jiān)聽狀態(tài)
  161.         SBUF=SLAVE2;                                                                //從本地址發(fā)回
  162.         while(TI!=1);                                                        
  163.         TI=0;
  164.         while(RI!=1);
  165.         RI=0;
  166.         if(RB8==1)                                                                //是復位信號,恢復監(jiān)聽
  167.         {
  168.                 SM2=1;
  169.                 ES=1;
  170.                 goto reti;
  171.         }
  172.         a=SBUF;                                                                        //接受命令
  173.         if(a==0x01)                                                                //主機接受的數(shù)據(jù)
  174.         {
  175.                 if(rready==1)
  176.                         SBUF=0x01;                                                //接受準備好發(fā)狀態(tài)
  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();                                                                //接受數(shù)據(jù)
  190.         }
  191.         else
  192.         {
  193.                 if(a==0x02)                                                        //從機向主機發(fā)送數(shù)據(jù)
  194.                 {
  195.                         if(tready==1)
  196.                                 SBUF=0x02;                                        //發(fā)送準備好狀態(tài)
  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();                                                        //發(fā)送數(shù)據(jù)
  211.                 }
  212.                 else
  213.                 {
  214.                         SBUF=0x80;                                                //命令非法,發(fā)送狀態(tài)
  215.                         while(TI!=1);
  216.                         TI=0;
  217.                         SM2=1;
  218.                         ES=1;                                                        //恢復監(jiān)聽
  219.                 }
  220.         }
  221.         reti:;
  222.         
  223. }

  224. void str(void)                                                                //發(fā)送數(shù)據(jù)塊
  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];                                        //發(fā)送數(shù)據(jù)塊
  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);                                                        //主機接受不正確,重新發(fā)送
  245.         SM2=1;
  246.         ES=1;
  247. }

  248. void sre(void)                                                                //接受數(shù)據(jù)塊
  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;                                                        //接受數(shù)據(jù)
  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;                                                        //校驗和相同發(fā)“00”
  269.                 }
  270.                 else
  271.                 {
  272.                         SBUF=0xff;                                                //校驗和不同發(fā)ff重新接受
  273.                         while(TI!=0);
  274.                         TI=0;
  275.                 }
  276.         }
  277.         SM2=1;
  278.         ES=1;
  279. }
復制代碼

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

課本源碼有明顯2處紕漏修改了一下,但是proteus仿真沒有結(jié)果,求助大神幫分析下

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 拍戏被cao翻了h承欢 | 日本成人中文字幕 | 天天综合操 | 亚洲在线电影 | 在线黄av| 国产一区在线免费观看视频 | www.国产日本 | 国产免费一区二区 | 国产日韩欧美激情 | 精品视频99| 欧美日日 | 亚洲免费视频播放 | 欧洲毛片 | 欧美精品网 | av官网在线| 自拍中文字幕 | 精品视频一区二区三区四区 | 在线中文字幕日韩 | 亚洲综合国产 | 毛片免费在线 | 精品国产一区二区三区免费 | 麻豆久久久9性大片 | 国产精品永久免费观看 | 日本精品国产 | 国产精品1区 | 亚洲国产一区二区三区 | 亚洲精品不卡 | 欧美日一区| 久久亚洲综合 | 成人国产在线视频 | 日韩在线一区二区 | 精品国产一级 | 9191av| 日本三级网 | 美国av片在线观看 | 日韩成人在线播放 | 国产在线区 | 欧美区在线 | 日韩欧美中文字幕在线观看 | 久久久久久艹 | av在线一区二区三区 |