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

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

QQ登錄

只需一步,快速開始

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

求助單片機(jī)多機(jī)通信源程序仿真問題

[復(fù)制鏈接]
ID:802694 發(fā)表于 2020-7-23 20:05 | 顯示全部樓層 |閱讀模式
下面是郭天祥課本源碼:
新概念51單片機(jī),11.4
51hei截圖20200723200353.png 51hei截圖20200723200420.png 51hei截圖20200723200402.png

單片機(jī)源程序如下:
  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. #define SLAVE2 0x02                                                //從機(jī)地址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;                                                                //等待從機(jī)回答
  24.                 if(SBUF!=addr)
  25.                         err();                                                        //若地址錯(cuò)發(fā)復(fù)位信號(hào)
  26.                 else                                                                //地址相符
  27.                 {
  28.                         TB8=0;                                                        //清地址標(biāo)志
  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;                                                //接受從機(jī)狀態(tài)字
  35.                         if((aa&0x08)==0x08)                                //若命令未被接受發(fā)復(fù)位信號(hào)
  36.                         {
  37.                                 TB8=1;
  38.                                 err();
  39.                         }
  40.                         else
  41.                         {
  42.                                 if(command==0x01)                        //是發(fā)送命令
  43.                                 {
  44.                                         if((aa&0x01)==0x01)                        //從機(jī)準(zhǔn)好就緒
  45.                                         {
  46.                                                 do
  47.                                                 {
  48.                                                         p=0;                                                //清校驗(yàn)和
  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ā)送校驗(yàn)和
  57.                                                         while(TI!=1);
  58.                                                         TI=0;
  59.                                                         while(RI!=1);
  60.                                                         RI=0;
  61.                                                 }
  62.                                                 while(SBUF!=0);                                        //接受不正確,重新發(fā)送
  63.                                                 TB8=1;                                                        //置地址標(biāo)志
  64.                                                 return(0);
  65.                                         }
  66.                                 }
  67.                                 else
  68.                                 {
  69.                                         if((aa&0x02)==0x02)                        //是接受命令,從機(jī)準(zhǔn)備好發(fā)送
  70.                                         {        
  71.                                                         while(1)
  72.                                                         {
  73.                                                                 p=0;                                                //清校驗(yàn)和
  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;                                //校驗(yàn)和相同發(fā)“00”
  87.                                                                         while(TI!=1)
  88.                                                                         TI=0;
  89.                                                                         break;
  90.                                                                 }
  91.                                                                 else
  92.                                                                 {
  93.                                                                         SBUF=0xff;                                //校驗(yàn)和不同發(fā)ff重新接受
  94.                                                                         while(TI!=1);
  95.                                                                         TI=0;
  96.                                                                
  97.                                                                 }
  98.                                                         }
  99.                                                         TB8=1;                                                        //置地址標(biāo)志
  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);                                //命令從機(jī)02接受
  118.         master(SLAVE2,0x02);                                //命令從機(jī)02發(fā)送
  119.         while(1);
  120.         
  121. }

  122. 從機(jī)
  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.         }                                                                        //假定準(zhǔn)備好發(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)                                                                //是復(fù)位信號(hào),恢復(fù)監(jiān)聽
  167.         {
  168.                 SM2=1;
  169.                 ES=1;
  170.                 goto reti;
  171.         }
  172.         a=SBUF;                                                                        //接受命令
  173.         if(a==0x01)                                                                //主機(jī)接受的數(shù)據(jù)
  174.         {
  175.                 if(rready==1)
  176.                         SBUF=0x01;                                                //接受準(zhǔn)備好發(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)                                                        //從機(jī)向主機(jī)發(fā)送數(shù)據(jù)
  194.                 {
  195.                         if(tready==1)
  196.                                 SBUF=0x02;                                        //發(fā)送準(zhǔn)備好狀態(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;                                                        //恢復(fù)監(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;                                                                //清校驗(yàn)和
  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);                                                        //主機(jī)接受不正確,重新發(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;                                                                //清校驗(yàn)和
  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;                                                        //校驗(yàn)和相同發(fā)“00”
  269.                 }
  270.                 else
  271.                 {
  272.                         SBUF=0xff;                                                //校驗(yàn)和不同發(fā)ff重新接受
  273.                         while(TI!=0);
  274.                         TI=0;
  275.                 }
  276.         }
  277.         SM2=1;
  278.         ES=1;
  279. }
復(fù)制代碼

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

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

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久久久亚洲精品国产 | 天天色天天射天天干 | 男女视频网站 | 日韩精品在线免费观看 | 精品一区二区三区中文字幕 | 色婷婷激情 | 国产伦精品一区二区三区照片91 | 亚洲欧美在线观看 | 国产成人网 | 欧美一区二区在线播放 | 久久伊人影院 | 中文字幕在线播放第一页 | 97精品一区二区 | 久久亚洲一区二区三区四区 | 免费看一级毛片 | 一区二区免费 | 欧美在线a | 男女国产网站 | 色伊人久久 | 国产精品7777777 | 日韩在线视频一区二区三区 | 国产三级大片 | 欧美日韩在线不卡 | 国产成人av电影 | 久久91精品国产一区二区 | 亚洲精品视频免费观看 | 午夜爽爽爽男女免费观看影院 | 日韩精品一区二区三区视频播放 | 国产区一区二区三区 | 国产毛片久久久久久久久春天 | 一区二区电影 | av一区二区在线观看 | 91av视频在线观看 | 人人鲁人人莫人人爱精品 | 二区在线观看 | 亚洲视频在线观看 | 国产成人a亚洲精品 | 911影院| 久久精品色欧美aⅴ一区二区 | 99这里只有精品 | 97超碰成人|