色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

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

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

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


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

          本文引用地址:http://cafeforensic.com/article/201611/321514.htm

          多機通信主機:

          DATA_ACK EQU 2AH;本例中未使用
          ADDR_ACK EQU 1AH;地址校驗幀
          DATA_BUF EQU 40H ;按鍵中斷數(shù)據(jù)的存放區(qū)
          WORK_FLAG EQU P2.0 ;可作為單片機類程序設計的軟件調(diào)試接口
          SLAVE_ADDR EQU 30H ;單片機上電后獲得的本機地址
          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,多機位值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

          多機通信從機:

          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,多機位值1,允許接收
          SETB SM2 ;多機通信控制位1
          SETB TR1 ;open the timer1
          SETB IT0
          SETB EX0 ;從機暫未使用
          SETB IT1
          SETB EX1 ;從機暫未使用
          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

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



          評論


          技術專區(qū)

          關閉