<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 51單片機(jī)多機(jī)通信協(xié)議

          51單片機(jī)多機(jī)通信協(xié)議

          作者: 時(shí)間:2016-11-30 來(lái)源:網(wǎng)絡(luò) 收藏
          //-----------------------------------------------------------------------
          //----------------接收部分---------------------------------------------
          case 4:
          {
          if(temp==Response)//呼叫從機(jī)得到回應(yīng)
          {
          state=5;//轉(zhuǎn)換狀態(tài)
          SendByte(S_M);//發(fā)送從機(jī)到主機(jī)命令
          break;
          }
          /*else//無(wú)回應(yīng),停止此次傳輸
          {
          state=0;
          SendByte(STOP);
          break;
          } */
          else
          break;
          }
          case 5:
          {
          if(temp==OK)//發(fā)送S_M得到回應(yīng)
          {
          state=6;//轉(zhuǎn)換狀態(tài)
          SendByte(S_MOK);//準(zhǔn)備完成
          break;
          }
          /*else //無(wú)回應(yīng),停止通信
          {
          state=0;
          SendByte(STOP); //發(fā)送停止命令
          break;
          }*/
          else
          break;
          }
          case 6:
          {
          if(Position-CMD<20) //數(shù)組溢出判斷
          {
          *Position=temp;//接收數(shù)據(jù)
          Position++;
          SendByte(CONTINUE); //要求從機(jī)繼續(xù)發(fā)送數(shù)據(jù)
          break;
          }
          else//超出數(shù)組,停止通信
          {
          state=0;
          SendByte(STOP);
          break;
          }
          }
          default:
          break;
          }
          }
          }


          //-----------------------------------------------
          //從機(jī)程序,從機(jī)接收信息,所以用中斷法會(huì)更便于反饋和執(zhí)行命令
          //-------------------------------
          #include "basic.h"

          //---------------------------------------------------
          //宏定義

          #define EN_ADDSEND TB8=1;//發(fā)送尋址,搜尋從機(jī)
          #define EN_DATASEND TB8=0;//發(fā)送數(shù)據(jù)

          #define M_S 0Xf0//握手后的命令字,主機(jī)到從機(jī)
          #define S_M 0Xf1//握手后的命令字,從機(jī)到主機(jī)
          #define M_SOK 0Xf2//主到從準(zhǔn)備完成,從機(jī)發(fā)送的反饋信息
          #define S_MOK 0xf3//從到主準(zhǔn)備完成,主機(jī)發(fā)送的反饋信息
          #define STOP 0xf4//主機(jī)到從機(jī)發(fā)送結(jié)束

          #define ERROR 0xf5//錯(cuò)誤
          #define Response 0xf6//應(yīng)答信號(hào)
          #define CONTINUE 0xf7//接受數(shù)據(jù)之后給對(duì)方發(fā)送的反饋,請(qǐng)求繼續(xù)
          #define OK 0xf8

          sbit key=P3^7;
          //--------------------------------------------------
          //數(shù)據(jù)定義
          uchar DATA[20]={0x12,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0x00,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,};//從機(jī)返回的狀態(tài)值
          uchar CMD[20]={0};//主機(jī)給從機(jī)發(fā)送的命令
          uchar state=0;//狀態(tài)值,進(jìn)行中斷判斷
          uchar ADDR;//呼叫從機(jī)地址
          uchar temp=0;//SBUF緩存
          uchar *Position=0;//數(shù)據(jù)指針,指定數(shù)據(jù)更新的位置

          //------------------------------------------
          //STC12具有7字節(jié)全球唯一ID,將7位的ID加和作為從機(jī)地址.(有可能從機(jī)地址會(huì)重復(fù))
          uchar Set_Add()
          {
          uchar *p;
          uchar i;
          uchar addr=0;
          p=0xf1;//上電后唯一ID起始地址
          for(i=0;i<7;i++)
          {
          addr+=*p;
          }
          return (addr);
          }

          //---------------------------------------------
          //串口1初始化,用于和從機(jī)通訊
          void Uart1_Init(void) //9600bps@11.0592MHz
          {
          PCON &= 0x7F; //波特率不倍速
          SCON = 0xD0; //9位數(shù)據(jù),可變波特率
          AUXR |= 0x40; //定時(shí)器1時(shí)鐘為Fosc,即1T
          AUXR &= 0xFE; //串口1選擇定時(shí)器1為波特率發(fā)生器
          TMOD &= 0x0F; //清除定時(shí)器1模式位
          TMOD |= 0x20; //設(shè)定定時(shí)器1為8位自動(dòng)重裝方式
          TL1 = 0xDC; //設(shè)定定時(shí)初值
          TH1 = 0xDC; //設(shè)定定時(shí)器重裝值
          ET1 = 0; //禁止定時(shí)器1中斷
          TR1 = 1; //啟動(dòng)定時(shí)器1
          }
          void All_Init()
          {
          Uart1_Init();
          ADDR=Set_Add();
          EA=1;//打開(kāi)總中斷
          ES=1;//打開(kāi)串口中斷
          }
          //------------------------------------------
          //查詢(xún)法發(fā)送一個(gè)字
          void SendByte (uchar date)
          {
          ES=0;//關(guān)斷串口中斷
          EN_DATASEND;
          SBUF=date;
          while(!TI);
          TI=0;
          ES=1; //打開(kāi)串口中斷
          }

          //主函數(shù),可以用大循環(huán)只執(zhí)行全局?jǐn)?shù)組命令,而中斷接收并修改全局命令命令
          void main()
          {
          All_Init();
          Position=DATA;
          //SendCmd(DATA);
          while(1);
          {
          }
          }

          //串口1中斷服務(wù)程序,用state進(jìn)行狀態(tài)判斷處理
          void UART1() interrupt 4
          {
          RI=0;
          temp=SBUF;//讀取數(shù)據(jù)
          if (state)
          {
          switch (state)
          {
          case 1:
          if(temp==M_S)//主機(jī)發(fā)送到從機(jī),從機(jī)準(zhǔn)備好接收數(shù)據(jù)
          {
          SendByte(M_SOK);//發(fā)送應(yīng)答
          state=2;//更換狀態(tài)
          break;
          }
          else if(temp==S_M)//主機(jī)要求從機(jī)發(fā)數(shù)據(jù)
          {
          SendByte(OK);//回應(yīng)主機(jī)
          state=3;//轉(zhuǎn)換狀態(tài)
          Position=DATA;
          break;
          }
          else if(temp==STOP)
          {
          SM2=1;
          state=0;
          break;
          }
          break;
          case 2:
          {
          if(temp==STOP)//停止符判定,回到待機(jī)狀態(tài)
          {
          state=0;
          SM2=1;
          break;
          }
          DATA[1]=temp;//接收數(shù)據(jù)
          SendByte(CONTINUE);//接收數(shù)據(jù)后回應(yīng)
          //SendByte(DATA[1]);//串口測(cè)試用的
          break;
          }
          case 3:
          {
          switch(temp)
          {
          case S_MOK://主機(jī)準(zhǔn)備完成
          {
          SendByte(*Position);//發(fā)送數(shù)據(jù)
          break;
          }
          case CONTINUE:
          {
          Position++;
          SendByte(*Position);//發(fā)送數(shù)據(jù)
          break;
          }
          case STOP:// 停止命令,返回待機(jī)狀態(tài)
          {
          state=0;
          SM2=1;
          break;
          }
          }
          }
          }
          }
          if(RB8==1)//判斷尋址
          {
          if(temp==ADDR)//進(jìn)行地址判斷
          {
          SM2=0;//從機(jī)響應(yīng),清除SM2
          SendByte(Response);//發(fā)送應(yīng)答
          state=1;//更換狀態(tài)
          }
          else//用于主機(jī)呼叫從機(jī)之后,錯(cuò)誤的呼叫其他從機(jī),則使該機(jī)處于待機(jī)狀態(tài)
          {
          SM2=1;
          state=0;
          }
          }
          }

          上一頁(yè) 1 2 下一頁(yè)

          評(píng)論


          技術(shù)專(zhuān)區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();