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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > Proteus7.5的小故事(2)單片機(jī)多機(jī)通信匯編實現(xiàn)

          Proteus7.5的小故事(2)單片機(jī)多機(jī)通信匯編實現(xiàn)

          作者: 時間:2016-11-25 來源:網(wǎng)絡(luò) 收藏
          近日學(xué)習(xí)測控網(wǎng)絡(luò)技術(shù),一時無趣想起以前學(xué)51時后面的串行通信的多機(jī)通信部分還未嘗試過,雖然技術(shù)可能已經(jīng)過時,但是對于理解網(wǎng)絡(luò)協(xié)議的基本原理還是有些裨益的。單片機(jī)的多機(jī)通信最重要的就是SM2位的使用,主從式通信方式中,主機(jī)以廣播形式發(fā)送地址幀,程序控制主機(jī)SM2為1,此時TB8位置1,從機(jī)初始時SM2=1,當(dāng)接收到RB8為1時,引起接受中斷,這時主、從機(jī)通過約定的應(yīng)答機(jī)制進(jìn)行校驗,即從機(jī)收到地址后與自身上電就得到的本機(jī)地址比較,如確定是在找自己,就發(fā)送應(yīng)答,清零SM2開始接收數(shù)據(jù),仿真原理圖如下所示:


          主要實現(xiàn)代碼如下:

          本文引用地址:http://www.ex-cimer.com/article/201611/321514.htm

          多機(jī)通信主機(jī):

          DATA_ACK EQU 2AH;本例中未使用
          ADDR_ACK EQU 1AH;地址校驗幀
          DATA_BUF EQU 40H ;按鍵中斷數(shù)據(jù)的存放區(qū)
          WORK_FLAG EQU P2.0 ;可作為單片機(jī)類程序設(shè)計的軟件調(diào)試接口
          SLAVE_ADDR EQU 30H ;單片機(jī)上電后獲得的本機(jī)地址
          ORG 0000H
          AJMP MAIN
          ORG 0003H
          AJMP INT_EX0
          ORG 000BH ;使用定時器產(chǎn)生1s
          ;AJMP INT_T0
          ORG 0013H
          AJMP INT_EX1
          ORG 001BH
          ;AJMP INT_T1
          ORG 0023H
          ; AJMP SEND_DATA
          ORG 50H

          MAIN:
          MOV SP,#60H
          MOV DATA_BUF,#0
          MOV P0,#0C0H
          MOV SLAVE_ADDR,P1
          ;定時器初始化
          MOV TMOD,#20H
          MOV TH1,#0FDH
          MOV TL1,#0FDH

          MOV SCON,#0D0H ;串口工作在方式3,多機(jī)位值1,允許接受
          MOV TB8 ,#1 ;發(fā)送地址
          SETB TR1 ;open the timer1
          SETB IT0
          SETB EX0
          SETB IT1
          SETB EX1
          ;SETB ES
          SETB EA


          HERE:

          LCALL HANDLE_DATA
          ;LCALL RECEIVE_ACK
          LCALL DISPLAY
          SJMP HERE

          HANDLE_DATA:
          MOV A,TB8
          JNZ HANDLE_ADR
          ;MOV WORK_FLAG,#0
          MOV TB8,#0


          MOV R0,#DATA_BUF
          MOV SBUF,@R0
          JNB TI,$
          MOV WORK_FLAG,#0
          CLR TI
          ;MOV TB8,#0
          RET
          HANDLE_ADR:

          MOV A,SLAVE_ADDR
          MOV SBUF,A
          JNB TI,$
          CLR TI


          RECEIVE_ACK:
          JNB RI,$
          CLR RI
          MOV A,SBUF
          XRL A,ADDR_ACK
          MOV TB8,#0
          JZ HANDLE_DATA

          MOV TB8,#1

          RET

          INT_EX0:

          CLR EX0
          PUSH ACC
          PUSH PSW
          MOV A,DATA_BUF
          INC A
          MOV DATA_BUF,A
          CJNE A,#10,EXIT
          MOV DATA_BUF,#0

          EXIT:
          POP PSW
          POP ACC
          SETB EX0
          RETI

          INT_EX1:
          CLR EX1
          PUSH ACC
          PUSH PSW
          MOV A,DATA_BUF
          DEC A
          MOV DATA_BUF,A
          CJNE A,#0FFH,QUIT
          MOV DATA_BUF,#9

          QUIT:
          POP PSW
          POP ACC
          SETB EX1
          RETI
          DISPLAY:
          MOV DPTR,#DATASEG
          MOV R0,#DATA_BUF
          MOV A,@R0
          MOVC A,@A+DPTR
          ;MOV P0,#0FFH
          MOV P0,A
          ACALL DELAY
          RET
          DELAY:
          MOV R6,#25 ;5MS
          DEL1:
          MOV R7,#98 ; ;98
          DJNZ R7,$
          DJNZ R6,DEL1
          RET

          DATASEG:
          DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H
          DB 080H,090H,0BFH
          END

          多機(jī)通信從機(jī):

          DATA_ACK EQU 2AH
          ADDR_ACK EQU 1AH
          DATA_BUF EQU 40H
          WORK_FLAG EQU P2.0
          SLAVE_ADDR EQU 30H
          TEMP_BUF EQU 31H
          ORG 0000H
          AJMP MAIN
          ORG 0003H
          AJMP INT_EX0
          ORG 000BH ;使用定時器產(chǎn)生1s
          ;AJMP INT_T0
          ORG 0013H
          AJMP INT_EX1
          ORG 001BH
          ;AJMP INT_T1
          ORG 0023H
          ; AJMP RECIVE_DATA
          ORG 50H

          MAIN:
          MOV SP,#60H
          MOV DATA_BUF,#0
          MOV P0,#0C0H
          MOV SLAVE_ADDR,P1
          MOV R5,#0
          ;定時器初始化
          MOV TMOD,#20H
          MOV TH1,#0FDH;

          MOV TL1,#0FDH

          MOV SCON,#0D0H ;串口工作在方式3,多機(jī)位值1,允許接收
          SETB SM2 ;多機(jī)通信控制位1
          SETB TR1 ;open the timer1
          SETB IT0
          SETB EX0 ;從機(jī)暫未使用
          SETB IT1
          SETB EX1 ;從機(jī)暫未使用
          SETB EA


          HERE:

          LCALL HANDLE_DATA

          LCALL DISPLAY
          SJMP HERE

          HANDLE_DATA:

          JNB RI,$
          CLR RI
          MOV A,SBUF
          MOV TEMP_BUF,A
          JNB SM2, DATA_RECEIVE
          XRL A,SLAVE_ADDR
          JNZ OVER
          MOV A,ADDR_ACK
          MOV SBUF,A
          CLR A
          JNB TI,$
          CLR TI
          CLR SM2
          RET
          OVER:
          SETB SM2
          RET

          DATA_RECEIVE:
          MOV WORK_FLAG,#0
          MOV DATA_BUF,TEMP_BUF
          RET
          INT_EX0:

          CLR EX0
          PUSH ACC
          PUSH PSW
          MOV A,DATA_BUF
          INC A
          MOV DATA_BUF,A
          CJNE A,#10,EXIT
          MOV DATA_BUF,#0

          EXIT:
          POP PSW
          POP ACC
          SETB EX0
          RETI

          INT_EX1:
          CLR EX1
          PUSH ACC
          PUSH PSW
          MOV A,DATA_BUF
          DEC A
          MOV DATA_BUF,A
          CJNE A,#0FFH,QUIT
          MOV DATA_BUF,#9

          QUIT:
          POP PSW
          POP ACC
          SETB EX1
          RETI
          DISPLAY:

          MOV DPTR,#DATASEG
          MOV R0,#DATA_BUF
          MOV A,@R0
          MOVC A,@A+DPTR
          ;MOV P0,#0FFH
          MOV P0,A
          ACALL DELAY
          RET
          DELAY:
          MOV R6,#25 ;5MS
          DEL1:
          MOV R7,#98 ; ;98
          DJNZ R7,$
          DJNZ R6,DEL1
          RET

          DATASEG:
          DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H
          DB 080H,090H,0BFH
          END

          仿真時注意波特率的設(shè)定,計算時晶振代入的是12MHZ(X約為253)而為了保證波特率的誤差小于2.5%,主機(jī)設(shè)為11.05926MHZ,從機(jī)設(shè)為12MHZ。



          評論


          技術(shù)專區(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); })();