山西魯能晉北鋁業(yè)檢修分廠 張 乾
基于VB的PC機(jī)與單片機(jī)串口通信技術(shù)研究
山西魯能晉北鋁業(yè)檢修分廠 張 乾
在功能較復(fù)雜的控制系統(tǒng)中,通常以PC機(jī)為主機(jī),單片機(jī)為從機(jī),由單片機(jī)完成數(shù)據(jù)的采集和對(duì)裝置的控制,而由主機(jī)完成各種復(fù)雜的數(shù)據(jù)處理和對(duì)單片機(jī)進(jìn)行控制。所以計(jì)算機(jī)與單片機(jī)之間的數(shù)據(jù)通信顯得越來(lái)越重要。串行通信是指按照逐位順序傳遞數(shù)據(jù)的通信方式,由于僅需3根傳輸線傳送信息且通信距離相對(duì)較遠(yuǎn),所以在控制領(lǐng)域的現(xiàn)場(chǎng)監(jiān)測(cè)、分布控制等場(chǎng)合都有著十分重要的應(yīng)用價(jià)值。
本文,筆者設(shè)計(jì)了單片機(jī)與PC機(jī)串口通信系統(tǒng),以VB為開(kāi)發(fā)工具,設(shè)計(jì)界面簡(jiǎn)單明了,詳細(xì)介紹了程序的主要功能。
1.單片機(jī)選擇。在測(cè)控系統(tǒng)和工程應(yīng)用中,經(jīng)常遇到多項(xiàng)任務(wù)同時(shí)執(zhí)行的情況,因而主從式多機(jī)分布式系統(tǒng)已成為現(xiàn)代工業(yè)廣泛應(yīng)用的模式。它們大多由PC機(jī)和MCS-51單片機(jī)組成。AT89C52是一個(gè)低電壓、高性能的CMOS 8位單片機(jī),有40個(gè)引腳,32個(gè)外部雙向輸入/輸出端口,同時(shí)內(nèi)含2個(gè)外中斷口,3個(gè)16位可編程定時(shí)計(jì)數(shù)器,2個(gè)全雙工串行通信口,AT89C52可以按照常規(guī)方法進(jìn)行編程,也可以在線編程。
AT89C52單片機(jī)通過(guò)引腳RXD(P3.0)和引腳TXD(P3.1)與外界進(jìn)行通信。AT89C52的串行口是可編程接口,通過(guò)對(duì)2個(gè)特殊功能寄存器SCON和PCON進(jìn)行編程可控制串行口的工作方式和波特率。SCON用于控制串行口的工作方式,同時(shí)還包含要發(fā)送或接收到的第9位數(shù)據(jù)位以及串行口中斷標(biāo)志位。該寄存器的字節(jié)地址為98H,并可進(jìn)行位尋址。PCON中只有最高位SMOD與串行口工作有關(guān),該位用于控制串行口工作于方式1、2、3時(shí)的波特率。PCON的字節(jié)地址為87H,沒(méi)有位尋址功能。單片機(jī)復(fù)位時(shí),SMOD=0。
2.PC機(jī)與單片機(jī)的連接。目前的PC機(jī)都有至少一個(gè)串行通訊端口RS-232,RS-232端口可用于2臺(tái)計(jì)算機(jī)之間進(jìn)行通訊,RS-232的邏輯電平用正負(fù)電壓來(lái)表示,且信號(hào)使用負(fù)邏輯,邏輯0的電壓范圍是+5V~+15V,而邏輯1的電壓范圍是-5V~-15V,RS-232端口是計(jì)算機(jī)與其他設(shè)備溝通的最常用的接口,不但操作簡(jiǎn)單,而且價(jià)格便宜。在AT89C52單片機(jī)的內(nèi)部有一個(gè)全雙工的異步串行I/O口,它的輸入和輸出使用5V而不是RS-232電壓,由于本次設(shè)計(jì)使用的是便攜式PC機(jī)(無(wú)串行通信接口),故使用了一根USB轉(zhuǎn)串口的數(shù)據(jù)線,然后再用MAX232芯片進(jìn)行轉(zhuǎn)換。電路結(jié)構(gòu)如圖1所示。
圖1 PC機(jī)與單片機(jī)連接結(jié)構(gòu)
3.下位機(jī)(單片機(jī)端)的程序設(shè)計(jì)。本次設(shè)計(jì)采用定時(shí)1的模式1,為與上位機(jī)配合,串行口選擇工作方式1,無(wú)奇偶校驗(yàn)位,有8位數(shù)據(jù)位和1個(gè)停止位,波特率為9600。所以(TMOD)=20H,(SCON)=50H。方式1和方式3的移位時(shí)鐘脈沖由定時(shí)器T1的溢出率來(lái)決定,AT89C52串行口方式1和方式3的波特率由定時(shí)器T1的溢出率和SMOD值同時(shí)決定。單片機(jī)程序流程圖如圖2所示。
圖2 單片機(jī)程序流程
4.下位機(jī)的原理圖及仿真結(jié)果。原理圖如圖3所示。
仿真結(jié)果如圖4所示。
本系統(tǒng)的設(shè)計(jì)任務(wù)是上位機(jī)通過(guò)串行口向下位機(jī)發(fā)送字符,下位機(jī)接收到字符后返回原字符。上位機(jī)用VB編寫(xiě)程序界面。
1.上位機(jī)(及PC端)的軟件設(shè)計(jì)。
(1)建立新工程。運(yùn)行VB6.0程序,選擇“新建工程”對(duì)話框,選擇“標(biāo)準(zhǔn)EXE”,單擊“打開(kāi)”命令按鈕,進(jìn)入VB工程集成開(kāi)發(fā)環(huán)境,窗體設(shè)計(jì)器中自動(dòng)出現(xiàn)一個(gè)名為Form1的空白窗體。
圖3 單片機(jī)接線原理
圖4 仿真結(jié)果
(2)程序界面設(shè)計(jì)。添加串口通信控件MSComm。由于VB的串行通信組件不會(huì)主動(dòng)出現(xiàn)在工具箱中,當(dāng)我們需要MSComm控件時(shí),首先要把它加入到工具箱中。具體步驟如下:選擇“工程”菜單下的“部件”,在彈出的對(duì)話框選中“Microsoft Comm Control6.0”復(fù)選框,單擊“確定”后,在工具箱中就會(huì)出現(xiàn)一個(gè)類似“電話”的圖標(biāo),它就是MSComm控件。如果在控件屬性中沒(méi)有“Microsoft Comm Control6.0”選項(xiàng),可在“部件”對(duì)話框“控件”屬性中單擊“瀏覽”按鈕,在Windowssystem32目錄下選擇MSCOMM32.OCX項(xiàng)。單擊“打開(kāi)”按鈕即可在“部件”對(duì)話框中看到“Microsoft Comm Control6.0”的可選項(xiàng)目。
添加2個(gè)文本框控件:Text1和Text2,用于輸入要發(fā)送的字符和顯示要接收的字符。添加2個(gè)標(biāo)簽控件:Label1和Label2,作為發(fā)送和接收字符區(qū)的標(biāo)簽。
添加4個(gè)按鈕控件:Command1、Command2、Command3和Command4,分別執(zhí)行發(fā)送字符、關(guān)閉程序、清空發(fā)送字符區(qū)和清空接收字符區(qū)等命令。添加完所有的控件后調(diào)整控件的位置和大小,使界面美觀。
(3)屬性設(shè)置。對(duì)界面中的各控件設(shè)計(jì)屬性,設(shè)置完控件屬性的程序界面如圖5所示。
圖5 VB程序窗體界面
2.程序代碼設(shè)計(jì)。程序流程圖如圖6所示。
圖6 上位機(jī)程序流程
程序如果要實(shí)現(xiàn)自動(dòng)發(fā)送或讀取,在VB中有2種方式可以實(shí)現(xiàn):一個(gè)是使用計(jì)時(shí)器控件(Timer),該控件中的Interval可以控制計(jì)時(shí)器被啟動(dòng)的時(shí)間間隔,當(dāng)時(shí)間間隔一到,便會(huì)執(zhí)行原先發(fā)在計(jì)時(shí)器中的程序代碼;另一個(gè)則是使用循環(huán)語(yǔ)句不斷的執(zhí)行程序代碼。本次設(shè)計(jì)使用手動(dòng)發(fā)送,用VB編寫(xiě)的部分源程序如下:
Option Explicit
Dim OutputAscii As Boolean
Dim InputString As String
Dim OutputString As String
Dim i As Long
Private Sub Cmdquit_Click()
Unload Me
End Sub
Private Sub Form_Unload(Cancel As Integer)
MSComm1.PortOpen=False
End Sub
目前串行通信仍是使用最為普遍的一種外部總線方式。本文,筆者從硬件和軟件2個(gè)方面討論了單片機(jī)和PC機(jī)的串行通信方式。
本文中筆者主要完成了以下工作。
1.在點(diǎn)對(duì)點(diǎn)串行通信的硬件討論中,涉及到RS-232與TTL電平之間的轉(zhuǎn)換問(wèn)題,給出了實(shí)際的硬件電路。軟件設(shè)計(jì)以一個(gè)簡(jiǎn)單的通信協(xié)議為核心,實(shí)現(xiàn)了單片機(jī)與PC機(jī)點(diǎn)對(duì)點(diǎn)可靠的串行通信,并給出了PC機(jī)部分的源程序。
2.文章最后結(jié)合前面的討論,介紹了在一臺(tái)PC機(jī)為上位機(jī),一臺(tái)單片機(jī)作為下位機(jī)組成的字符通信。利用VB6.0的通信控件與一臺(tái)下位機(jī)進(jìn)行數(shù)據(jù)通信。本文,筆者所用的串行通信的方法只是實(shí)現(xiàn)了基本的功能,所以還可以進(jìn)一步的改進(jìn)和完善。