新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 單片機雙機串口通信程序設計

        單片機雙機串口通信程序設計

        作者: 時間:2012-12-05 來源:網絡 收藏
        利用方式1實現通信,主頻為6M,波特率為2400bps,電路見圖5-10。當兩個距離較近時,甲、乙兩機的發送端與接收端分別直接相聯,兩機共地。執行程序,甲機將亮燈信號發送給乙機,若通信正常,乙機接收到信號后點亮20個發光二極管。乙機采用查詢與中斷兩種工作方式。當然20個LED乙機可單獨控制,也可接受甲機的控制,并執行甲機指令,還需要進一步完善程序.
        甲機發送程序:
        org 0000h
        sta:mov tmod,#20h;設置波特率
        mov tl1,#0FAh
        mov th1,#0FAh
        setb tr1
        mov scon,#40h;置工作方式1
        clr ti
        mov a,#00h
        mov sbuf,a ;發送亮燈信號
        wait: jbc ti,cont;發送成功清標志
        ajmp wait ;等待發送完畢
        cont: sjmp sta;重復發送
        end

        乙機查詢工作方式接收:

        org 0000h
        mov tmod,#20h ;設置通信波特率
        mov tl1,#0FAh
        mov th1,#0FAh
        setb tr1
        mov scon,#40h
        clr ri
        setb ren ;允許接收
        wait: jbc ri,read;接收成功清標志
        ajmp wait ;接收未完等待
        read: mov a ,sbuf
        mov p1,a;接收亮燈信號送P1口
        sjmp $
        end

        乙機中斷工作方式接收
        org 0000h
        ajmp main
        org 0023h
        ajmp zd ;轉串口中斷程序
        START: MOV TMOD,#20h
        mov tl1,#0FAh
        mov th1,#0FAh
        setb tr1
        mov scon,#50h
        clr ri
        mov ie,#90h;開中斷

        MAIN:sjmp $ 主程序
        zd:clr ri ;清接收標志
        ;==============中斷程序還要再完善==============
        mov a ,sbuf ;讀接收信號
        mov p1,a
        MOV R1,A ;將收到的信號送緩存
        reti;中斷返回
        end
        點擊瀏覽下一頁
        串口通訊原理圖>

        采用方式2 通信,數據幀格式是11位的,TB8為奇偶校驗位,接收過程要求判斷RB8,若出錯置F0標志為1,正確則置F0標志為0,然后返回。發送波特率375kbps,晶振為12MHz,所以SMOD=l。由于傳送數據的波特率與定時器無關,所以程序中無需對定時器編程. 以下程序出自http://www.51hei.com一位單片機大俠之手,借來用用,如果什么什么錯誤或者需要改進的地方請大家指出,不過我這里基本測試通過了。
        send:
        MOVSCON,#80H;設置串行口為方式2
        MOVPCON,#80H;SMOD=l
        MOV R0,#50H;設數據塊指針
        MOV R7,#20 ;設數據塊長度
        STA: MOVA,@R0;取數據給A
        MOV C,P
        MOV TB8,C ;奇偶位P送給TB8,
        MOV SBUF,A ;啟動發送
        ;====================================================
        WAIT: JBCTI,CONT ;若發完一幀數據,清標志后發下一幀數據
        AJMP WAIT ;未完等待
        ;=======================================================
        CONT:INCR0 ;修改數據指針
        DJNZ R7,STA;循環發送至結束
        RET
        ;================
        ;乙機接收程序如下:
        ;在進行通信時,兩機應采用相同的工作方式和波特率。
        ;=============================================
        MOVSCON,#90H;設置串行口為方式2,REN為1,允許接收
        MOVPCON,#80H;SMOD=1
        MOVR0,#50H;設置數據塊首址
        MOVR7,#20;置數據塊長度
        ;=========================================================
        WAIT:JBCRI,READ;接收完一幀數據則RI清零并讀入數據
        AJMP WAIT;未完等待
        ;==========================================
        READ:MOV A,SBUF ;讀入數據
        JNB PSW.0,PZ ;收到數為偶數則轉
        JNB RB8,ERR;收到數為奇數,發端為偶數則通信出錯
        SJMPRIGHT ;相符則正確
        PZ:JB RB8,ERR ;收到數為偶數,發端為奇數則出錯
        ;========================================
        RlGHT:MOV@R0,A ;通信正確,存放數據
        INC R0;更改地址指針
        DJNZR7,WAIT;數據塊接收完否,未完繼續
        CLR PSW.5;通信正確,置F0為0
        RET ;返回
        ERROR:SETBPSW.5;通信出錯,置F0為l
        RET ;返回


        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 郑州市| 金坛市| 罗江县| 汤原县| 长宁区| 易门县| 桂阳县| 搜索| 平阴县| 莫力| 唐河县| 泸定县| 车致| 北安市| 辽宁省| 东辽县| 花垣县| 上蔡县| 深圳市| 溧水县| 孝昌县| 岳西县| 乌拉特前旗| 兴仁县| 天全县| 商河县| 彭水| 城步| 凌云县| 平邑县| 长子县| 玉林市| 手游| 封丘县| 彝良县| 普洱| 凤城市| 嫩江县| 宁津县| 慈利县| 凤冈县|