新聞中心

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

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

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


        主要實現代碼如下:

        本文引用地址:http://www.104case.com/article/201611/321514.htm

        多機通信主機:

        DATA_ACK EQU 2AH;本例中未使用
        ADDR_ACK EQU 1AH;地址校驗幀
        DATA_BUF EQU 40H ;按鍵中斷數據的存放區
        WORK_FLAG EQU P2.0 ;可作為單片機類程序設計的軟件調試接口
        SLAVE_ADDR EQU 30H ;單片機上電后獲得的本機地址
        ORG 0000H
        AJMP MAIN
        ORG 0003H
        AJMP INT_EX0
        ORG 000BH ;使用定時器產生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 ;發送地址
        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 ;使用定時器產生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。



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 潢川县| 松阳县| 兖州市| 乌海市| 乌审旗| 罗甸县| 翼城县| 文成县| 怀集县| 合阳县| 房产| 聂拉木县| 同德县| 垫江县| 泸州市| 麻城市| 浦东新区| 原平市| 报价| 宝兴县| 公主岭市| 灵石县| 长寿区| 东乌珠穆沁旗| 莒南县| 锡林郭勒盟| 津南区| 曲阜市| 比如县| 大石桥市| 奉节县| 南和县| 连江县| 丹棱县| 碌曲县| 科技| 黑山县| 左云县| 灵丘县| 司法| 靖州|