新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > C51單片機和電腦串口通信電路圖與源碼

        C51單片機和電腦串口通信電路圖與源碼

        作者: 時間:2011-02-27 來源:網絡 收藏

        C51和電腦串口通信電路圖與源碼
        51有一個全雙工的串行通訊口,所以和電腦之間可以方便地進行串口通訊。進行串行通訊時要滿足一定的條件,比如電腦的串口是RS232電平的,而單片機的串口是TTL電平的,兩者之間必須有一個電平轉換電路,我們采用了專用芯片MAX232進行轉換,雖然也可以用幾個三極管進行模擬轉換,但是還是用專用芯片更簡單可靠。我們采用了三線制連接串口,也就是說和電腦的9針串口只連接其中的3根線:第5腳的GND、第2腳的RXD、第3腳的TXD。這是最簡單的連接方法,但是對我們來說已經足夠使用了,電路如下圖所示,MAX232的第10腳和單片機的11腳連接,第9腳和單片機的10腳連接,第15腳和單片機的20腳連接。


        串口通訊的硬件電路如上圖所示
        在制作電路前我們先來看看要用的MAX232,這里我們不去具體討論它,只要知道它是TTL和RS232電平相互轉換的芯片和基本的引腳接線功能就行了。通常我會用兩個小功率晶體管加少量的電路去替換MAX232,可以省一點,效果也不錯,下圖就是MAX232的基本接線圖。



        按圖7-3加上MAX232就可以了。這大熱天的拿烙鐵焊焊,還真的是熱氣迫人來呀:P串口座用DB9的母頭,這樣就可以用買來的PC串口延長線進行和電腦相連接,也可以直接接到電腦com口上。



        為了能夠在電腦端看到單片機發出的數據,我們必須借助一個WINDOWS軟件進行觀察,這里我們利用一個免費的電腦串口調試軟件。本串口軟件在本網站www.mcujl.com可以找到
        軟件界面如上圖,我們先要設置一下串口通訊的參數,將波特率調整為4800,勾選十六進制顯示。串口選擇為COM1,當然將網站提供的實驗板的串口也要和電腦的COM1連接,將燒寫有以下程序的單片機插入單片機實驗板的萬能插座中,并接通實驗板的電源。

        串口實驗的源程序如下所示:


        ;這是一個S實驗開發板向PC機的串口單向發送數據AF的演示程序
        ;采用MAX232專用芯片作RS232/TTL電平轉換.
        ;通訊波特率為4800KBPS,只要按下一次K1(就是P3.6引腳變成低電平)
        ;就發送一個16進制的AF字符
        ORG 0000H
        MOV SCON,#50H;設置成串口1方式
        MOV TMOD,#20H;波特率發生器T1工作在模式2上
        MOV PCON,#80H;波特率翻倍為2400x2=4800BPS
        MOV TH1,#0F3H;預置初值(按照波特率2400BPS預置初值)
        MOV TL1,#0F3H;預置初值(按照波特率2400BPS預置初值)
        SETB TR1;啟動定時器T1
        ;以上完成通訊初始化設置
        WRIT:JB P3.6,$;判斷K1是否按下,如果沒有按下就等待
        ACALL DELAY10;延時10毫秒消觸點抖動
        JB P3.6,WRIT;去除干擾信號
        JNB P3.6,$;等待按鍵松開
        MOV A,#0AFH;將16進制的字符AF發送到串口去
        MOV SBUF,A;將AF通過串口發送出去
        AJMP WRIT
        ;10毫秒延時子程序
        DELAY10:MOV R4,#20
        D2:MOV R5,#248
        DJNZ R5,$
        DJNZ R4,D2
        RET
        END

        ;=============兩機串口通訊程序(主機)=====================
        ; 功 能: 使用串行中斷,接收數據并顯示
        ; 硬件環境: 自制單片機實驗板
        ; 軟件環境: 偉福 V3.20
        ; Create date: 2004_07_26
        ; First Modify: 2004_07_26
        ; second Modify:
        ; Last Modify: 2004_07_26
        ; Author: Sujiande
        ;
        ;===========預定義===================
        LED0 EQU 40H ;預定義數碼管
        LED1 EQU 41H ;預定義數碼管
        LED2 EQU 42H ;預定義數碼管
        LED3 EQU 43H ;預定義數碼管
        LED4 EQU 44H ;預定義數碼管
        LED5 EQU 45H ;預定義數碼管
        LED6 EQU 46H ;預定義數碼管
        LED7 EQU 47H ;預定義數碼管
        SDA BIT P0.1 ; 定義數據線引腳定義
        SCL BIT P0.0 ; 定義時鐘線引腳定義
        ;---------------------------
        ORG 0000H ;主程序入口
        AJMP MAIN ;跳轉到主程序
        ORG 0100H ;主程序在ROM中存放位置
        ;===============主程序=====================
        MAIN:
        MOV LED0,#00H ;賦初值
        MOV LED1,#00H
        MOV LED2,#16 ;賦初值為16, 數碼管顯示代碼為: 滅
        MOV LED3,#16
        MOV LED4,#16
        MOV LED5,#16
        MOV LED6,#16
        MOV LED7,#16
        ;--------------------
        ;MOV DPTR,#TABLE ; 賦顯示代碼首地址
        MOV R1,#00H ; 給R1賦初值00H
        ACALL DISPLAY ; 調顯示子程序
        MOV SP, #30H ; 給堆棧指針賦初值
        ;--------------------------
        ; 使用定時器1,作為波特率發生器,設定波特率=9600,
        ; 定時器初值為:FAH
        ; 串行控制器設置:SM0=0,SM1=1,SM2=0,REN=1,TB8=0,
        ; RB8=0,TI=0,RI=0 即0101 0000B
        ; 波特率加倍
        ;-----------------------------
        MOV TMOD,#20H ;設置定時器1,工作方式2
        MOV TH1,#0FAh ;賦初值: FA
        MOV TL1,#0FAh ;賦初值: FA
        MOV SCON, #50h ;設置串行口控制寄存器
        MOV PCON, #80h ;設置電源控制寄存器, 讓波特率加倍(2X)
        SETB TR1 ;啟動定時
        ;*****************主程序結束************************
        LP8: MOV A,R1 ;將1的數據裝到A中
        ;-----------------------
        MOV SBUF,A ;將A的數據送到緩沖區
        JNB TI,$ ;等待數據發送完畢
        CLR TI ;清發送中斷標志
        ;-----------------------
        INC R1
        CJNE R1,#99,LP3
        MOV R1,#00H
        LP3: ACALL SEPERATE ;調拆分程序
        ACALL DISPLAY ;調顯示子程序
        ACALL DELAY_1S ;調延時子程序
        AJMP LP8
        ;=================拆分程序=====================
        SEPERATE: ANL A,#0Fh ;與操作得到個位數據
        MOV LED0,A ;個位送LED0
        MOV A,R1
        ANL A,#0F0H ;與操作得到十位數據
        SWAP A
        MOV LED1,A ;十位送LED1
        RET
        ;===============顯示子程序=====================
        DISPLAY:
        MOV DPTR,#TABLE ; 賦顯示代碼首地址
        MOV A,LED0 ;查表數據送A
        MOVC A,@A+DPTR ;查表,得到顯示代碼
        ACALL SHIFT ;調移位子程序
        MOV A,LED1
        MOVC A,@A+DPTR
        ACALL SHIFT
        MOV A,LED2
        MOVC A,@A+DPTR
        ACALL SHIFT
        MOV A,LED3
        MOVC A,@A+DPTR
        ACALL SHIFT
        MOV A,LED4
        MOVC A,@A+DPTR
        ACALL SHIFT
        MOV A,LED5
        MOVC A,@A+DPTR
        ACALL SHIFT
        MOV A,LED6
        MOVC A,@A+DPTR
        ACALL SHIFT
        MOV A,LED7
        MOVC A,@A+DPTR
        ACALL SHIFT
        RET
        ;---------顯示代碼表---------
        TABLE: DB 11H,0D7H,32H,92H,0D4H,98H,18H,0D3H,10H,90H ;0,1,2,3,4,5,6,7,8,9,
        DB 50H,1CH,39H,16H,38H,78H, 0FFH,0FEH,0EFH ;10,11,12,13,14,15,滅,-
        ;================移位子程序============================
        SHIFT: PUSH A ; 進棧暫存A值
        MOV R0,#8 ; 循環8次
        CLR C ;清進位標志
        CLR SCL ;時鐘線,先鉗位為0
        LP2: RLC A
        MOV SDA,C
        NOP
        NOP
        SETB SCL
        NOP
        NOP
        CLR SCL
        NOP
        NOP
        DJNZ R0,LP2
        POP A ; 出棧恢復A值
        RET
        ;=============延時子程序===============
        DELAY_1S:
        MOV R7,#0ffH
        LOOP7: MOV R6,#0ffH
        LOOP6: NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        DJNZ R6,LOOP6
        DJNZ R7,LOOP7
        RET
        ;------------------------------
        END

        ;=============兩機串口通訊程序(從機)=====================
        ; 功 能: 使用串行中斷,接收數據并顯示
        ; 硬件環境: 自制單片機實驗板
        ; 軟件環境: 偉福 V3.20
        ; Create date: 2004_07_26
        ; First Modify: 2004_07_26
        ; second Modify:
        ; Last Modify: 2004_07_26
        ; Author: Sujiande
        ;===========預定義===================
        LED0 EQU 40H ;預定義數碼管
        LED1 EQU 41H ;預定義數碼管
        LED2 EQU 42H ;預定義數碼管
        LED3 EQU 43H ;預定義數碼管
        LED4 EQU 44H ;預定義數碼管
        LED5 EQU 45H ;預定義數碼管
        LED6 EQU 46H ;預定義數碼管
        LED7 EQU 47H ;預定義數碼管
        SDA BIT P0.1 ; 定義數據線引腳定義
        SCL BIT P0.0 ; 定義時鐘線引腳定義
        ;---------------------------
        ORG 0000H ;主程序入口
        AJMP MAIN ;跳轉到主程序
        ORG 0023H ;中斷入口地址
        AJMP S_INT ;跳轉到中斷程序
        ORG 0100H ;主程序在ROM中存放位置
        ;==============主程序========================
        MAIN:
        MOV LED0,#00H ;賦初值
        MOV LED1,#00H
        MOV LED2,#16 ;賦初值為16, 數碼管顯示代碼為: 滅
        MOV LED3,#16
        MOV LED4,#16
        MOV LED5,#16
        MOV LED6,#16
        MOV LED7,#16
        ;------------------------------
        MOV DPTR,#TABLE ; 賦顯示代碼首地址
        ACALL DISPLAY ; 調顯示子程序
        MOV SP, #30H ; 給堆棧指針賦初值
        ;--------------------------------------------
        ; 使用定時器1,作為波特率發生器,設定波特率=9600,
        ; 定時器初值為:FAH
        ; 串行控制器設置:SM0=0,SM1=1,SM2=0,REN=1,TB8=0,
        ; RB8=0,TI=0,RI=0 即0101 0000B
        ; 波特率加倍
        ;---------------------------------------------
        MOV TMOD,#20H ;設置定時器1,工作方式2
        MOV TH1,#0FAh ;賦初值: FA
        MOV TL1,#0FAh ;賦初值: FA
        MOV SCON, #50h ;設置串行口控制寄存器
        MOV PCON, #80h ;設置電源控制寄存器, 讓波特率加倍(2X)
        ;---------------------------------------
        SETB EA ; 啟動總中斷
        SETB ES ; 啟動串行中斷
        SETB TR1 ;啟動定時
        AJMP $ ; 等待中斷
        ;*****************主程序結束************************
        ;===============中斷服務程序=============================
        S_INT:
        MOV R1, SBUF ;將緩沖區的數據送到R1
        ACALL SEPERATE ;調拆分程序
        ACALL DISPLAY ;調顯示子程序
        CLR RI ;清接收中斷標志
        RETI ;中斷返回
        ;=================拆分程序=====================
        SEPERATE: MOV A,R1
        ANL A,#0Fh ;與操作得到個位數據
        MOV LED0,A ;個位送LED0
        MOV A,R1
        ANL A,#0F0H ;與操作得到十位數據
        SWAP A ;
        MOV LED1,A ;十位送LED1
        RET
        ;===============顯示子程序======================
        DISPLAY:
        MOV A,LED0 ;查表數據送A
        MOVC A,@A+DPTR ;查表,得到顯示代碼
        ACALL SHIFT ;調移位子程序
        MOV A,LED1
        MOVC A,@A+DPTR
        ACALL SHIFT
        MOV A,LED2
        MOVC A,@A+DPTR
        ACALL SHIFT
        MOV A,LED3
        MOVC A,@A+DPTR
        ACALL SHIFT
        MOV A,LED4
        MOVC A,@A+DPTR
        ACALL SHIFT
        MOV A,LED5
        MOVC A,@A+DPTR
        ACALL SHIFT
        MOV A,LED6
        MOVC A,@A+DPTR
        ACALL SHIFT
        MOV A,LED7
        MOVC A,@A+DPTR
        ACALL SHIFT
        RET
        ;---------顯示代碼表---------
        TABLE: DB 11H,0D7H,32H,92H,0D4H,98H,18H,0D3H,10H,90H ;0,1,2,3,4,5,6,7,8,9,
        DB 50H,1CH,39H,16H,38H,78H, 0FFH,0FEH,0EFH ;10,11,12,13,14,15,滅,-
        ;================移位子程序============================
        SHIFT: PUSH A ; 進棧暫存A值
        MOV R0,#8 ; 循環8次
        CLR C ;清進位標志
        CLR SCL ;時鐘線,先鉗位為0
        LP2: RLC A
        MOV SDA,C
        NOP
        NOP
        SETB SCL
        NOP
        NOP
        CLR SCL
        NOP
        NOP
        DJNZ R0,LP2
        POP A ; 出棧恢復A值
        RET
        ;=============延時子程序===============
        DELAY_1S:
        MOV R7,#0ffH
        LOOP7: MOV R6,#0ffH
        LOOP6: NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        DJNZ R6,LOOP6
        DJNZ R7,LOOP7
        RET
        ;------------------------------
        END

        電路圖符號相關文章:電路圖符號大全




        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 玉林市| 墨江| 鄂尔多斯市| 磴口县| 布尔津县| 禄丰县| 洪洞县| 娄底市| 台江县| 兴隆县| 普格县| 略阳县| 秦安县| 琼中| 额敏县| 万年县| 铜陵市| 中牟县| 无为县| 泰州市| 柏乡县| 浮山县| 锦屏县| 临沂市| 三河市| 张家界市| 滦南县| 垫江县| 凌源市| 呈贡县| 方正县| 巴青县| 伊春市| 泸水县| 垣曲县| 龙江县| 郧西县| 旺苍县| 黄平县| 镇巴县| 连山|