單片機(jī)的串行口是非常有用的,通過(guò)他我們可以把單片機(jī)系統(tǒng)的數(shù)據(jù)傳回電腦處理或者接受電腦傳過(guò)來(lái)的數(shù)據(jù)而進(jìn)行相應(yīng)的動(dòng)作,下面我就給大家介紹上一下電腦的RS-232接口與單片機(jī)串行通信程序設(shè)計(jì)方法。
RS-232簡(jiǎn)介:
在串行通訊時(shí),要求通訊雙方都采用一個(gè)標(biāo)準(zhǔn)接口,使不同的設(shè)備可以方便地連接起來(lái)進(jìn)行通訊.RS-232-C接口(又稱EIA RS-232-C)是目前最常用的一種串行通訊接口。 (“RS-232-C”中的“-C”只不過(guò)表示RS-232的版本,所以與“RS-232”簡(jiǎn)稱是一樣的)它是在1970年由美國(guó)電子工業(yè)協(xié)會(huì)(EIA)聯(lián)合貝爾系統(tǒng),調(diào)制解調(diào)器廠家及計(jì)算機(jī)終端生產(chǎn)廠家共同制定的用于串行通訊的標(biāo)準(zhǔn)。它的全名是“數(shù)據(jù)終端設(shè)備(DTE)和數(shù)據(jù)通訊設(shè)備(DCE)之間串行二進(jìn)制數(shù)據(jù)交換接口技術(shù)標(biāo)準(zhǔn)”該標(biāo)準(zhǔn)規(guī)定采用一個(gè)25個(gè)腳的DB-25連接器,對(duì)連接器的每個(gè)引腳的信號(hào)內(nèi)容加以規(guī)定,還對(duì)各種信號(hào)的電平加以規(guī)定。后來(lái)IBM的PC機(jī)將RS232簡(jiǎn)化成了DB-9連接器,從而成為事實(shí)標(biāo)準(zhǔn)。而工業(yè)控制的RS-232口一般只使用RXD,TXD,GND三條線。
下面,讓我們使用S51增強(qiáng)型單片機(jī)實(shí)驗(yàn)板來(lái)開(kāi)發(fā)一個(gè)簡(jiǎn)單的串口通信實(shí)驗(yàn)程序,這是一個(gè)串口通信綜合實(shí)驗(yàn),需要全套餐客戶的相關(guān)配件配合才能完成。通過(guò)該實(shí)驗(yàn)程序,我們可以檢測(cè)實(shí)驗(yàn)板串口的狀態(tài),接收計(jì)算機(jī)發(fā)送來(lái)的數(shù)據(jù),然后再發(fā)送回計(jì)算機(jī),如果程序中發(fā)送和接收窗中顯示的字符相同,則說(shuō)明實(shí)驗(yàn)板的串口是良好的,能夠正常收發(fā)數(shù)據(jù),另外單片機(jī)接收計(jì)算機(jī)的控制指令,根據(jù)控制指令來(lái)控制實(shí)驗(yàn)板上的繼電器動(dòng)作。
RS-232接口與單片機(jī)串行通信程序設(shè)計(jì)的界面
圖 1
注:當(dāng)前按鍵:“K”,按鍵的ASC碼:“75”,按鍵的16進(jìn)制碼:“4BH”
S51增強(qiáng)型單片機(jī)實(shí)驗(yàn)板與電腦串口實(shí)現(xiàn)RS232通信運(yùn)行效果圖
注:按壓PC鍵盤(pán)的按鍵“K”單片機(jī)將串口接收到按鍵實(shí)時(shí)顯示在液晶模塊上(鎖定了大小鍵)。
1、液晶模塊第一行顯示“PS2-KEY: K ”, 表示接收到PS2鍵盤(pán)的按鍵:“K”
2、液晶模塊第二行顯示“HEX:4Bh ASC:75 ”,表示K的HEX碼為“4BH”,ASC碼為:“75”
注:按壓PC鍵盤(pán)的按鍵“2”單片機(jī)將串口接收到按鍵實(shí)時(shí)顯示在液晶模塊上
1、液晶模塊第二行顯示“HEX:32h ASC:50 ”,表示K的HEX碼為“32H”,ASC碼為:“50”
2、液晶模塊第一行顯示“PS2-KEY: 2 ”, 表示接收到PS2鍵盤(pán)的按鍵:“2”
從上面兩幅圖中可以看到,我們實(shí)現(xiàn)主要目標(biāo)如下:
1、在計(jì)算機(jī)上,VB6.0編寫(xiě)的通信測(cè)試程序檢測(cè)的鍵盤(pán)操作,將我們的按壓PS2鍵盤(pán)(PC鍵盤(pán))按鍵顯示在數(shù)據(jù)發(fā)送窗中,顯示按鍵當(dāng)前按鍵、按鍵的ASC碼、按鍵的16進(jìn)制碼。同時(shí)將鍵值通過(guò)電腦的RS-232串口發(fā)送到S51單片機(jī)實(shí)驗(yàn)板上,實(shí)驗(yàn)板上的AT89S51單片機(jī)接收到數(shù)據(jù)后,以二進(jìn)制方式顯示在實(shí)驗(yàn)板的8位高亮度LED上,然后把接收到的數(shù)據(jù)重新發(fā)送回電腦的RS-232串口,電腦接收到后顯示在程序的接收數(shù)據(jù)窗中。
2、單片機(jī)檢測(cè)識(shí)別計(jì)算機(jī)發(fā)送過(guò)來(lái)的鍵盤(pán)鍵值,將按鍵值以二進(jìn)制形式顯示在P1口的8位高亮度LED上,同時(shí),將當(dāng)前按鍵、按鍵的HEX碼、ASC碼實(shí)時(shí)顯示在1602液晶模塊上面。
3、單片機(jī)接收計(jì)算機(jī)對(duì)單片機(jī)的控制指令,當(dāng)計(jì)算機(jī)發(fā)送“繼電器ON指令”時(shí),則單片機(jī)驅(qū)動(dòng)實(shí)驗(yàn)板上的繼電器吸合;相反,如果計(jì)算機(jī)發(fā)送“繼電器OFF指令”時(shí),單片機(jī)驅(qū)動(dòng)繼電器釋放,我們可以學(xué)習(xí)掌握計(jì)算機(jī)智能控制的原理,只要掌握了這種方法,我們要在電腦上輕輕點(diǎn)擊鼠標(biāo)就可以控制家里的電氣開(kāi)關(guān)了就不難了(操作方法,點(diǎn)擊軟件的“繼電器”按鈕,實(shí)驗(yàn)板的繼電器吸合,再次點(diǎn)擊按鈕,繼電器釋放)。
4、單片機(jī)接收到數(shù)據(jù)后,發(fā)出一時(shí)短聲提示。同時(shí)將數(shù)據(jù)重新發(fā)送回電腦串口,供電腦程序接收顯示,電腦軟件接收到單片機(jī)發(fā)送過(guò)來(lái)的數(shù)據(jù)后,顯示在軟件的接收數(shù)據(jù)窗中。
【RS-232接口與單片機(jī)串行通信程序設(shè)計(jì)】
該系統(tǒng)程序由單片機(jī)通信程序和電腦通信程序構(gòu)成。在微機(jī)測(cè)控系統(tǒng)中,一般稱計(jì)算機(jī)為上位機(jī)、而前端采集控制的單片機(jī)系統(tǒng)稱為下位機(jī)。上位機(jī)主要負(fù)責(zé)所有測(cè)控?cái)?shù)據(jù)的綜合管理與下位機(jī)的調(diào)度控制,而下位機(jī)由單片機(jī)構(gòu)成前端的測(cè)控系統(tǒng),進(jìn)行原始數(shù)據(jù)的采集及設(shè)備的控制,下位機(jī)受上位機(jī)的管理控制。
一、單片機(jī)程序開(kāi)發(fā)
51單片機(jī)有一個(gè)全雙工的串行通信口,非常適合與電腦進(jìn)行通信,51單片機(jī)的串口開(kāi)發(fā)在各種教科書(shū)上都有詳細(xì)的介紹,我們這里不在重復(fù),大家可以參考一下書(shū)籍。單片機(jī)程序功能主要如下:初始化串口、打開(kāi)串口中斷、接收電腦發(fā)送的數(shù)據(jù)、在1602液晶模塊上顯示數(shù)據(jù)、將數(shù)據(jù)發(fā)送回電腦RS-232串口、接收繼電器控制命令、控制繼電器動(dòng)作等。
單片機(jī)通信參考程序如下:
ORG 0000H
AJMP START ;轉(zhuǎn)到初始化程序
ORG 0023H
AJMP PGUART ;轉(zhuǎn)到串行中斷服務(wù)子程序
START: MOV SP,#60H ;堆棧指針初始化
MOV P0,#0FFH ;P0端口初始化
MOV P1,#0FFH ;P1端口初始化
MOV P2,#0FFH ;P2端口初始化
MOV P3,#0FFH ;P3端口初始化
MOV TMOD,#20H ;定時(shí)器T1工作于模式2,自動(dòng)重裝載
MOV TH1,#0FDH ;TH1初值為“0FDH”,9600bps
MOV TL1,#0FDH ;TL1初值為“0FDH”,9600bps
MOV SCON,#50H ;串行口工作于方式1,允許接收
SETB TR1 ;啟動(dòng)定時(shí)器T1
SETB ES ;允許串行口中斷
SETB EA ;開(kāi)總中斷
CLR UABIT
;----------------------RS-232接口與單片機(jī)串行通信程序設(shè)計(jì)-------------------------------
MAIN: 。。.。。. ;主程序處理其他任務(wù),等待串口中斷
AJMP MAIN
PGUART: 。。.。。. ;串口中斷服務(wù)子程序,接收處理數(shù)據(jù)
RETI
END
二、RS-232串行通信測(cè)試軟件開(kāi)發(fā)
計(jì)算機(jī)RS-232串行通信測(cè)試軟件采用VB6.0開(kāi)發(fā),VisualBasic 6.0(簡(jiǎn)稱VB6.0)以其簡(jiǎn)單易學(xué),
VB6.0為可視化編程開(kāi)發(fā)軟件,開(kāi)發(fā)程序簡(jiǎn)單易學(xué),VB程序開(kāi)發(fā)主要分為兩步:第一步、使用VB控件設(shè)計(jì)出軟件界面,第二步、給各種控件編寫(xiě)相應(yīng)的執(zhí)行程序代碼,代碼編寫(xiě)完成后可以運(yùn)行查看結(jié)果了。
VB6提供了多種控件,其中MSCOMM.OCX是用于串行通信的控件,我們可將該控件添加到工具箱(Toolbox)內(nèi),這樣就可以利用該控件進(jìn)行串行通信程序的設(shè)計(jì)了。
下面介紹Mscomm控件的主要屬性和方法:
1) CommPort:設(shè)置或返回串行端口號(hào),VB6的取值范圍為1~16,表示打開(kāi)或返回通信端口號(hào)COM1~COM16
2) Setting:設(shè)置或返回串行端口的波特率、奇偶校驗(yàn)位、數(shù)據(jù)位數(shù)、停止位。如:Mscomm1.Setting=“9600,N,8,1”
3) PortOpen:打開(kāi)或關(guān)閉串行端口,格式為:Mscomm1.PortOpen=『True/False』
4) InBufferSize:設(shè)置或返回接收緩沖區(qū)的大小,缺省為1024字節(jié)
5) InBufferCount:返回接收緩沖區(qū)內(nèi)的等待讀取的字節(jié)個(gè)數(shù),可通過(guò)設(shè)置該屬性為0來(lái)清除接收緩沖區(qū)
6) RThreshold:該屬性為一閥值,當(dāng)接收緩沖區(qū)內(nèi)字節(jié)個(gè)數(shù)達(dá)到或超過(guò)該值后就產(chǎn)生OnComm事件
7) InputLen:設(shè)置或返回接收緩沖區(qū)內(nèi)用Input讀入的個(gè)數(shù)。若取0,則Input將讀取整個(gè)緩沖區(qū)的所有內(nèi)容
8) Input:該屬性表示從接收緩沖區(qū)InputLen個(gè)字符
9) OutBufferSize:設(shè)置或返回發(fā)送緩沖區(qū)大小,缺省為512字節(jié)
10) OutBufferCounter:返回發(fā)送緩沖區(qū)內(nèi)等待發(fā)送的字符數(shù),可用來(lái)清空緩沖區(qū)
11) Output:向發(fā)送緩沖區(qū)傳送一字符串,即向串口發(fā)送數(shù)據(jù)
第一步:開(kāi)發(fā)程序界面
打開(kāi)VB6.0 -》 新建“標(biāo)準(zhǔn) EXE”建立一個(gè)新的工程。在工程窗口Form1中添加我們要使用的各種按鈕和控件,其中一個(gè)圖標(biāo)如電話一樣的控件就是MSCOMM串行通信控件了,該控件在界面設(shè)計(jì)時(shí)候可見(jiàn),在程序運(yùn)行時(shí)候不可見(jiàn)。最后,放置好了各種控件后,程序的界面界面就出來(lái)了,是不是很簡(jiǎn)單呀!如下圖4所示:
RS-232串口通信測(cè)試軟件界面開(kāi)發(fā)
圖 4
第二步:VB軟件編寫(xiě)
當(dāng)軟件的界面設(shè)計(jì)完成后,我們就可以給程序添加代碼了,在程序中實(shí)現(xiàn)的主要功能如下:RS-232端口初始化、檢測(cè)PC鍵盤(pán)按壓的按鍵、發(fā)送按鍵編碼、在數(shù)據(jù)發(fā)送窗顯示當(dāng)前按鍵編碼、在接收數(shù)據(jù)窗中接收顯示單片機(jī)發(fā)送來(lái)的數(shù)據(jù),檢測(cè)繼電器控制按鈕的操作,發(fā)送繼電器控制命令。。。如下圖5所示:
RS-232串口通信測(cè)試軟件程序代碼編寫(xiě)
圖 5
【串行通信實(shí)驗(yàn)操作】
完成了單片機(jī)通信程序及PC上我VB程序開(kāi)發(fā)后,我們編譯工程,得到單片機(jī)芯片燒寫(xiě)的HEX格式目標(biāo)文件rs232test.hex和串口測(cè)試程序可以執(zhí)行文件RS232test.exe,然后我們就可以拿出實(shí)驗(yàn)板,馬上進(jìn)行串口通信實(shí)驗(yàn)了,檢測(cè)一下我們的實(shí)際通信效果。
1、使用ISP編程器將目標(biāo)文件rs232test.hex燒寫(xiě)到AT89S51單片機(jī)中
2、如前面的所示:我們將燒寫(xiě)好了通信程序的AT89S51芯片鎖緊到S51單片機(jī)實(shí)驗(yàn)板上,然后把1602字符型液晶模塊插到實(shí)驗(yàn)板的1602接口上,用RS232串口通信電纜和USB電纜將實(shí)驗(yàn)板和電腦連接好,按壓實(shí)驗(yàn)板的電源開(kāi)關(guān),開(kāi)啟電源,此時(shí)實(shí)驗(yàn)板上的電源指示燈亮起來(lái),實(shí)驗(yàn)板準(zhǔn)備就緒,隨時(shí)可以接收電腦發(fā)送的數(shù)據(jù)了。
3、雙擊我們編寫(xiě)的串口測(cè)試程序RS232test.exe,啟動(dòng)RS-232串行通信測(cè)試軟件,在軟件上設(shè)置好和實(shí)驗(yàn)板連接的通信端口,然后點(diǎn)擊“PC發(fā)送數(shù)據(jù)發(fā)送窗”,即可激活輸入窗口,然后我們按壓電腦鍵盤(pán)上的按鍵,按壓PS2鍵盤(pán)的按鍵將會(huì)被顯示在軟件中,同時(shí)發(fā)送到單片機(jī)上通過(guò)1602液晶模塊進(jìn)行顯示,當(dāng)接收到正確數(shù)據(jù)時(shí)候,實(shí)驗(yàn)板上的蜂鳴器也會(huì)發(fā)出短促的聲音,使你按壓鍵盤(pán)的感覺(jué)從聲音上體現(xiàn)出來(lái)。從單片機(jī)發(fā)送回來(lái)的數(shù)據(jù)被軟件接收后,會(huì)還原顯示在發(fā)送數(shù)據(jù)窗中,如果我們?cè)陔娔X上按壓的鍵盤(pán)上的按鍵,在軟件的發(fā)送窗、接收窗及實(shí)驗(yàn)板上1602液晶模塊上顯示的按鍵都相同,則說(shuō)明我們電腦的RS-232串口良好,單片機(jī)的串口也是良好的,通信正常。然后,我們可以點(diǎn)擊軟件中的“繼電器”按鈕,實(shí)驗(yàn)板上的單片機(jī)接收到電腦的控制指令后,就會(huì)控制繼電器產(chǎn)生相應(yīng)的開(kāi)關(guān)動(dòng)作,實(shí)現(xiàn)電腦軟件對(duì)實(shí)驗(yàn)板上繼電器的控制。
通過(guò)實(shí)驗(yàn)加深對(duì)51單片機(jī)串口的認(rèn)識(shí):
下面我們通過(guò)這套串口測(cè)試程序來(lái)做個(gè)額外實(shí)驗(yàn)。理論上,當(dāng)我們按壓鍵盤(pán)上的按鍵,所有按鍵都會(huì)發(fā)送到單片機(jī),然后再返回計(jì)算機(jī)上的,在串口測(cè)試軟件上的PC發(fā)送數(shù)據(jù)窗和接收數(shù)據(jù)窗中顯示的字符數(shù)目、字符應(yīng)該是完全相同的,如上面圖1中顯示。但是,當(dāng)我們連續(xù)快速按壓PC鍵盤(pán)(注意:連續(xù)速度要足夠快哦,才能看到實(shí)驗(yàn)現(xiàn)象)時(shí),會(huì)發(fā)現(xiàn)接收數(shù)據(jù)窗中有時(shí)候會(huì)漏掉字符,累積下來(lái),接收窗中的字符就會(huì)比發(fā)送窗中的字符少了。
發(fā)生這種現(xiàn)象的原因是什么 ?!
其實(shí)這是由于計(jì)算機(jī)發(fā)送過(guò)來(lái)的數(shù)據(jù)太快,而單片機(jī)的串口中斷一次只能接收處理一個(gè)數(shù)據(jù),前一個(gè)數(shù)據(jù)還沒(méi)有處理完,后面又有數(shù)據(jù)發(fā)送過(guò)來(lái),單片機(jī)來(lái)不及處理漏掉了。這是由51單片機(jī)的串口特性決定的,AT89S51單片機(jī)的串口只有一個(gè)字節(jié)的發(fā)送和接收緩沖區(qū)SBUF,也就是說(shuō)每次只能發(fā)送或接收一個(gè)字節(jié)數(shù)據(jù),如果在接收的數(shù)據(jù)沒(méi)有及時(shí)處理完,而又有新的數(shù)據(jù)進(jìn)來(lái),會(huì)造成數(shù)據(jù)丟失,不像計(jì)算機(jī)中VB6的MSCOMM串行通信控件,默認(rèn)的接收緩沖區(qū)為1024字節(jié),而默認(rèn)的發(fā)送緩沖區(qū)也有512字節(jié),而且還可以改變緩沖區(qū)大小,計(jì)算機(jī)有了收發(fā)數(shù)據(jù)緩沖區(qū),通信當(dāng)中就不容易出現(xiàn)緩沖區(qū)溢出而通信錯(cuò)誤的現(xiàn)象。
在測(cè)控系統(tǒng)中,如果出現(xiàn)這種錯(cuò)誤的話則有可能系統(tǒng)失控,數(shù)據(jù)出錯(cuò),誤報(bào)警等。當(dāng)然,我們?cè)谕ㄐ胖幸部梢约尤胄r?yàn)機(jī)制來(lái)檢查錯(cuò)誤,但這種現(xiàn)象也使系統(tǒng)穩(wěn)定性降低,出現(xiàn)莫名其妙的故障,而且這種屬于軟件故障,我們往往不容易想到,會(huì)走彎路。為了減少這種問(wèn)題的出現(xiàn),在這里站長(zhǎng)提醒大家,在開(kāi)發(fā)的單片機(jī)串口中斷服務(wù)子程序中,要盡量加快數(shù)據(jù)處理速度,在接收完成數(shù)據(jù)后,要及時(shí)打開(kāi)串口中斷,以便接收新的數(shù)據(jù),而其他占用時(shí)間的運(yùn)算程序盡量不要在串口中斷里面處理,這是每一個(gè)單片機(jī)開(kāi)發(fā)人員值得注意的問(wèn)題,希望大家能夠從我們這個(gè)實(shí)驗(yàn)中得到啟發(fā),開(kāi)發(fā)出更完美的程序來(lái),少走彎路。
好了,這個(gè)實(shí)驗(yàn)到此結(jié)束了,希望大家通過(guò)對(duì)這個(gè)軟件的學(xué)習(xí),掌握單片機(jī)實(shí)時(shí)溫度監(jiān)控的開(kāi)發(fā)、串口通信程序的開(kāi)發(fā)及計(jì)算機(jī)串口實(shí)時(shí)控制開(kāi)發(fā)原理及PC監(jiān)控軟件的開(kāi)發(fā),為開(kāi)發(fā)其他功能更加完善的單片機(jī)綜合應(yīng)用系統(tǒng)打好基礎(chǔ)。
-
單片機(jī)
+關(guān)注
關(guān)注
6035文章
44554瀏覽量
634634 -
RS-232
+關(guān)注
關(guān)注
0文章
388瀏覽量
49916 -
串口通信
+關(guān)注
關(guān)注
34文章
1624瀏覽量
55508
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論