沈陽(yáng)航空航天大學(xué)
課程設(shè)計(jì)
(論文)
題目 單片機(jī)與PC機(jī)RS-485的串行通信設(shè)計(jì)
班 級(jí)
學(xué) 號(hào)
學(xué) 生 姓 名
指 導(dǎo) 教 師
目 錄
0 前言 1
1 總體方案設(shè)計(jì) 2
2 硬件電路設(shè)計(jì) 2
2.1 AT89C51單片機(jī) 2
2.2 時(shí)鐘電路 4
2.3 按鍵復(fù)位電路 4
2.4 MAX485轉(zhuǎn)換芯片 4
2.5 PC機(jī)RS-485 通信的接口電路 5
3 軟件設(shè)計(jì) 6
4 調(diào)試分析 8
5 結(jié)論及進(jìn)一步設(shè)想 8
參考文獻(xiàn) 8
課設(shè)體會(huì) 10
附錄1 電路原理圖 11
附錄2 程序清單 12
單片機(jī)與PC機(jī)RS-485串行通訊設(shè)計(jì)
摘要:本文提出了一種PC機(jī)與單片機(jī)進(jìn)行串行通信的方案,該方案通過(guò)PC機(jī)的RS232串口、485總線實(shí)現(xiàn)與51單片機(jī)的串口通信,PC機(jī)送出的信號(hào)進(jìn)行電平轉(zhuǎn)換后送到485總線,單片機(jī)則接受MAX485芯片轉(zhuǎn)換得到的信號(hào),從而進(jìn)行串行通信。該系統(tǒng)的特點(diǎn)是電路設(shè)計(jì)簡(jiǎn)單可行、通信穩(wěn)定、實(shí)用性強(qiáng)。
關(guān)鍵詞:PC機(jī);單片機(jī);串口通信;MAX485芯片;
0 前言
在計(jì)算機(jī)測(cè)控領(lǐng)域經(jīng)常會(huì)采用一臺(tái)PC 機(jī)與一個(gè)或多個(gè)單片機(jī)組成小型的測(cè)控網(wǎng)絡(luò), 這種測(cè)控系統(tǒng)充分發(fā)揮了單片機(jī)功能強(qiáng), 抗干擾性能好, 溫度適應(yīng)范圍寬,面向控制的優(yōu)點(diǎn), 同時(shí)又可以利用計(jì)算機(jī)彌補(bǔ)單片機(jī)在數(shù)據(jù)處理和交互性等方面的不足。在測(cè)控系統(tǒng)中一般是以PC 機(jī)作為主控機(jī),采用串行通訊定時(shí)掃描以單片機(jī)為核心的智能控制器(從機(jī)) 以便采集數(shù)據(jù)或發(fā)送信號(hào)。PC機(jī)的串口一般采用RS—232的總線標(biāo)準(zhǔn),但由于RS—232接口標(biāo)準(zhǔn)發(fā)布較早,難免有不足之處,主要體現(xiàn)在以下四點(diǎn):1、接口信號(hào)的電平值較高,已損壞接口電路芯片,又因?yàn)榕cTTL電平不兼容故需使用電平轉(zhuǎn)換電路方能與TTL電路連接;2、傳送速率較低,在異步傳送時(shí),波特率為20Kbps;3、接口使用一根信號(hào)線和一根信號(hào)返回線而構(gòu)成共地的傳輸形式,這種共地傳輸容易產(chǎn)生共模干擾,所以抗噪聲干擾性弱;4、傳輸距離有限,最大傳輸距離標(biāo)準(zhǔn)為50英尺,實(shí)際上也只能用在50m左右。
針對(duì)RS-232的不足, 于是先后又出現(xiàn)了一些新的接口標(biāo)準(zhǔn)RS-485 就是其中之一。RS—485總線標(biāo)準(zhǔn)是美國(guó)電氣工業(yè)協(xié)會(huì)(EIA)公布的平衡電壓數(shù)字接口電路的電氣性能標(biāo)準(zhǔn),是為改善RS-232標(biāo)準(zhǔn)的電氣特性,又參考RS-232兼容而制定的。RS-485標(biāo)準(zhǔn)與RS-232標(biāo)準(zhǔn)相比具有以下優(yōu)點(diǎn):1、RS-485的電氣性能:邏輯“1”以兩線間的電壓差為+(0.2-6)V表示;邏輯“0”以兩線間的電壓差為-(0.2-6)V表示。接口信號(hào)電平比RS-232降低了,就不易損壞接口電路芯片,且該電平與TTL電平兼容,可方便與TTL電路連接。2、RS-485的數(shù)據(jù)最高傳送速率為10Mbps。3、RS-485接口是采用平衡驅(qū)動(dòng)器和和差分接收器的組合,抗共模干擾能力強(qiáng),抗噪聲干擾性好。4、RS-485最大的通信距離約為1219m,傳輸速率與傳輸距離成反比,在100kb/s的傳輸速率下才可以達(dá)到最大的通信距離,如需傳輸更長(zhǎng)的距離,需加485中繼器。RS-485總線最大支持32節(jié)點(diǎn)。由于RS-485接口具有良好的抗干擾性,較長(zhǎng)的傳輸距離和多站通信能力等優(yōu)點(diǎn),使其成為首選的串行接口。RS-485接口組成的半雙工網(wǎng)絡(luò),一般只需兩根連線,所以RS-485總線接口均采用雙絞線傳輸。
1 總體方案設(shè)計(jì)
針對(duì)本課題的設(shè)計(jì)任務(wù),進(jìn)行分析得到:本次設(shè)計(jì)用RS-485標(biāo)準(zhǔn)進(jìn)行單片機(jī)與PC機(jī)的串行通信,PC機(jī)發(fā)出的數(shù)據(jù)經(jīng)過(guò)RS-232/485轉(zhuǎn)化器后發(fā)送,再經(jīng)過(guò)單片機(jī)端的MAX485芯片把信號(hào)轉(zhuǎn)換成TTL電平送給單片機(jī),單片機(jī)接收到PC機(jī)發(fā)來(lái)的數(shù)據(jù)后再回送給PC機(jī)。
該串行通信系統(tǒng)設(shè)計(jì),在總體上大致可分為以下幾個(gè)部分組成:1、RS-232/RS-485轉(zhuǎn)換電路,TTL電平轉(zhuǎn)換芯片,單片機(jī)最小系統(tǒng)。系統(tǒng)原理框圖如圖1所示。
圖1 系統(tǒng)原理框圖
2 硬件電路設(shè)計(jì)
2.1 單片機(jī)介紹
圖2 AT89C51
引腳說(shuō)明
VCC:接+5V電壓,
GND:接信號(hào)地。
I/O口部分
P0口:(P0.0~P0.7)P0口為一個(gè)8位雙向I/O口,在不接片外存儲(chǔ)器和不擴(kuò)展I/O口時(shí),可作為準(zhǔn)雙向輸入/輸出口。在接片外存儲(chǔ)器或擴(kuò)展I/O口時(shí),P0口分時(shí)復(fù)用為地8位地址總線和雙向數(shù)據(jù)總線?! ?br />
P1口:(P1.0~P1.7)P1口是一個(gè)8位雙向I/O口?! ?br />
P2口:(P2.0~P2.7)P2口為8位準(zhǔn)雙向I/O口,在接有片外存儲(chǔ)器或擴(kuò)展I/O口且尋址范圍超過(guò)256B時(shí),P2口用作高8位地址總線。
P3口:(P3.0~P3.7)P3口是一個(gè)8位雙向I/O口。它還有第二功能如表1所示。
表1 P3口第二功能表
管腳
第二功能
P3.0
RXD(串行輸入口)
P3.1
TXD(串行輸出口)
P3.2
(外部中斷0)
P3.3
(外部中斷1)
P3.4
T0(定時(shí)/計(jì)數(shù)器0計(jì)數(shù)脈沖輸入端)
P3.5
T1(定時(shí)/計(jì)數(shù)器1計(jì)數(shù)脈沖輸入端)
P3.6
(外部數(shù)據(jù)存儲(chǔ)器寫選通信號(hào)輸出端)
P3.7
(外部數(shù)據(jù)存儲(chǔ)器讀選通信號(hào)輸出端)
控制與復(fù)位部分
RST:復(fù)位信號(hào)。當(dāng)振蕩器復(fù)位器件時(shí),要保持RST腳兩個(gè)機(jī)器周期的高電平時(shí)間。
ALE/:地址鎖存允許輸出。當(dāng)訪問(wèn)外部程序存儲(chǔ)器或數(shù)據(jù)存儲(chǔ)器時(shí),ALE輸出脈沖用于鎖存地址的低8位字節(jié)。一般情況下,ALE仍以時(shí)鐘振蕩頻率的1/6輸出固定的脈沖信號(hào),因此它可對(duì)外輸出時(shí)鐘或用于定時(shí)目的。
:外部程序存儲(chǔ)器的選通信號(hào)。當(dāng)讀外部ROM時(shí),有效,實(shí)現(xiàn)從片外程序存儲(chǔ)器的讀操作。
/V:為片外程序存儲(chǔ)器選用端。當(dāng)保持低電平時(shí),只選用片外部程序存儲(chǔ)器。否則,單片機(jī)上電或復(fù)位后選用片內(nèi)程序存儲(chǔ)器。
外接晶振部分
XTAL1:反向振蕩放大器的輸入及內(nèi)部時(shí)鐘工作電路的輸入。
XTAL2:反向振蕩器的輸出。
2.2 時(shí)鐘電路
圖3 時(shí)鐘電路
外接晶振X1以及電容C1、C2構(gòu)成并聯(lián)諧振電路,內(nèi)部振蕩器產(chǎn)生自激振蕩,一般晶振可在2~12MHz之間任選,本系統(tǒng)選用的晶振頻率為12MHz。對(duì)外接電容值雖然沒(méi)有嚴(yán)格的要求,但電容的大小多少會(huì)影響振蕩頻率的高低、振蕩器的穩(wěn)定性、起振的快速性和溫度的穩(wěn)定性,根據(jù)經(jīng)驗(yàn)本系統(tǒng)所接電容C1、C2為22pF如圖3所示。
2.3 按鍵復(fù)位電路
圖4 復(fù)位電路
上電自動(dòng)復(fù)位是通過(guò)給電容充電進(jìn)而給RST引腳一個(gè)高電平信號(hào),此信號(hào)隨著VCC對(duì)電容C的充電過(guò)程而逐漸回落,即RST引腳上的高電平持續(xù)時(shí)間取決于電容C充電時(shí)間,為保證系統(tǒng)可靠復(fù)位,RST引腳上的高電平必須維持足夠長(zhǎng)的時(shí)間,按鍵復(fù)位由此產(chǎn)生,當(dāng)按下復(fù)位按鈕,電容對(duì)R1迅速放電,RST端變?yōu)楦唠娖?,按鈕松開后,電容通過(guò)電阻R2進(jìn)行充電,使RST端恢復(fù)低電平,本系統(tǒng)采用按鍵復(fù)位電路如圖4所示。
2.4 MAX485轉(zhuǎn)換芯片
圖5 MAX485芯片
MAX485接口芯片是Maxim公司的一種RS-485芯MAX485是專用于RS-485 通訊的小功率收發(fā)器, 它采用8 腳DIP/SO 封裝, 內(nèi)含一個(gè)驅(qū)動(dòng)器和一個(gè)發(fā)送器。其驅(qū)動(dòng)器采用限斜率設(shè)計(jì), 這樣可以將電磁干擾(EMI)減至最小,并減小因電纜不匹配而產(chǎn)生的影響, 因此, 能夠以高達(dá)250kb/s 的速率無(wú)誤差地傳送數(shù)據(jù)。當(dāng)RE為低電平時(shí),MAX485數(shù)據(jù)輸入有效;當(dāng)DE為高電平時(shí),MAX485數(shù)據(jù)輸出有效。在半雙工使用中,通常可以將這兩個(gè)腳直接相連,然后由PC或者單片機(jī)輸出的高低電平就使MAX485在接收和發(fā)送狀態(tài)之間轉(zhuǎn)換了。MAX485芯片采用單一電源+5 V工作,額定電流為300 μA,采用半雙工通訊方式。A端和B端分別為接收和發(fā)送的差分信號(hào)端,當(dāng)A引腳的電平高于B時(shí),代表發(fā)送的數(shù)據(jù)為1;當(dāng)A的電平低于B端時(shí),代表發(fā)送的數(shù)據(jù)為0。在與單片機(jī)連接時(shí)接線非常簡(jiǎn)單,只需要一個(gè)信號(hào)控制MAX485的接收和發(fā)送即可,同時(shí)將A和B端之間加匹配電阻,一般可選100Ω的電阻。
2.5 PC 機(jī)RS-485 通信的接口電路
圖6 PC 機(jī)RS-485通信的接口電路
在上圖中,MAX485是通過(guò)兩個(gè)引腳RE(2腳)和DE(3腳)來(lái)控制數(shù)據(jù)的輸入和輸出。當(dāng)RE為低電平時(shí),MAX485數(shù)據(jù)輸入有效;當(dāng)DE為高電平時(shí),MAX485數(shù)據(jù)輸出有效。在半雙工使用中,通??梢詫⑦@兩個(gè)引腳直接相連,然后由PC或者單片機(jī)輸出的高低電平就可以讓MAX485在接收和發(fā)送狀態(tài)之間轉(zhuǎn)換了。本電路使用TX線和MAX232的另外一個(gè)通道來(lái)控制MAX485的狀態(tài)切換。平時(shí)MAX232的9腳輸出低電平,使MAX485的RE和DE為低電平而處于數(shù)據(jù)接收狀態(tài)。當(dāng)PC機(jī)發(fā)送數(shù)據(jù)時(shí),MAX232的9腳輸出高電平,使MAX485的RE和DE為高電平而處于數(shù)據(jù)發(fā)送狀態(tài)。
3 軟件設(shè)計(jì)
89C51單片機(jī)是本次設(shè)計(jì)的核心部分,所有的程序都將寫入到單片機(jī)里。在本次的設(shè)計(jì)中,單片機(jī)的在電路中的主要目的就是對(duì)PC機(jī)發(fā)來(lái)的的數(shù)據(jù)在回送給pc機(jī),在串口調(diào)試助手中顯示,其中數(shù)據(jù)的流向是通過(guò)單片機(jī)控制MAX485芯片來(lái)實(shí)現(xiàn)的。
設(shè)計(jì)單片機(jī)通信程序時(shí),必須充分發(fā)揮單片機(jī)的效率,由于單片機(jī)多應(yīng)用于實(shí)時(shí)性較強(qiáng)的控制場(chǎng)合,因此, 應(yīng)將及時(shí)響應(yīng)和控制對(duì)象的動(dòng)作放在優(yōu)先考慮的位置,以盡量減少通信等輔助性操作所占用的CPU時(shí)間?;谏鲜隹紤],在設(shè)計(jì)單片機(jī)通信程序時(shí),將通信程序分為發(fā)送處理程序、接收中斷處理程序,從而構(gòu)成整個(gè)單片機(jī)的通信程序。當(dāng)系統(tǒng)上電后,單片機(jī)程序初始化芯片的端口及變量初始化賦值, 串口中斷發(fā)生時(shí),自動(dòng)進(jìn)入中斷服務(wù)程序,其主程序的流程圖如圖7所示。
N
Y
圖7 系統(tǒng)主程序流圖
當(dāng)程序?qū)懞煤?,通過(guò)燒寫器完成程序的調(diào)試工作,然后就是用串口線將實(shí)驗(yàn)板和PC機(jī)相連起來(lái),同時(shí)給實(shí)驗(yàn)板接上電源,然后就是通過(guò)PC機(jī)軟件來(lái)發(fā)數(shù)據(jù)了,要在PC機(jī)上向串口發(fā)送數(shù)據(jù)一定要借助相應(yīng)軟件,串口調(diào)試軟件,它設(shè)置方便、靈活,界面簡(jiǎn)潔明。串口調(diào)試助手支持常用的300bps~115200bps波特率,能設(shè)置校驗(yàn)、數(shù)據(jù)位和停止位,能以ASCII碼或十六進(jìn)制接收或發(fā)送任何數(shù)據(jù)或字符。
為了能夠在計(jì)算機(jī)端看到單片機(jī)發(fā)出的數(shù)據(jù),我們必須借助一個(gè)WINDOWS軟件進(jìn)行觀察,這里利用計(jì)算機(jī)串口調(diào)試軟件來(lái)觀察如圖8所示。
圖8 串口調(diào)試軟件
這里我們需要設(shè)置一下串口通訊的參數(shù),將波特率調(diào)整為9600,串口選擇為COM1,校驗(yàn)位:無(wú);數(shù)據(jù)位:8位;停止位:1位;當(dāng)然AT89C51單片機(jī)實(shí)驗(yàn)板的串口也要和電腦的COM1連接,將燒寫程序的單片機(jī)插入單片機(jī)實(shí)驗(yàn)板的萬(wàn)能插座中,并接通AT89C51單片機(jī)實(shí)驗(yàn)板的電源這樣就可以實(shí)現(xiàn)PC機(jī)與單片機(jī)的串口通信了。
4 調(diào)試分析
PC機(jī)的串口調(diào)試助手無(wú)任何顯示。這是因?yàn)闊龑懙某绦虺霈F(xiàn)了錯(cuò)誤,應(yīng)在發(fā)送程序中把TI清零。
PC機(jī)的串口調(diào)試助手出現(xiàn)亂碼,不能正確的收到單片機(jī)發(fā)送的字符。這是因?yàn)檫x取的波特率不匹配,或控制MAX485芯片的單片機(jī)引腳發(fā)出的控制命令時(shí)間太短,芯片來(lái)不及轉(zhuǎn)換狀態(tài),解決方法是選擇相匹配的波特率,適當(dāng)增加延時(shí)函數(shù)。
5 結(jié)論及進(jìn)一步設(shè)想
根據(jù)實(shí)驗(yàn)結(jié)果,本設(shè)計(jì)基本完成了設(shè)計(jì)要求,但由于系統(tǒng)存在內(nèi)部和外部的各種電氣干擾、焊接硬件時(shí)的不牢固、外部環(huán)境條件等影響,數(shù)據(jù)流可能會(huì)有誤碼,嚴(yán)重時(shí)可能會(huì)使控制狀態(tài)失靈。如果時(shí)間允許我會(huì)自己設(shè)計(jì)一個(gè)PCB板來(lái)承載各種元件,這樣元件連接的靠性就會(huì)大大增加,出錯(cuò)的概率也會(huì)減少。
參考文獻(xiàn)
[1] 劉復(fù)華.單片機(jī)及其應(yīng)用系統(tǒng).北京:清華大學(xué)出版社,1992
[2] 李朝青.PC機(jī)及單片機(jī)數(shù)據(jù)通信技術(shù)[M],北京航空航天大學(xué)出版社,2002
[3] 王仲文.精通串行口通訊[M] ,北京電子工業(yè)出版社,1995
[4] 李華.MCS-51系列單片機(jī)實(shí)用接口技術(shù)[J],北京航空航天大學(xué)出版社,1993
[5] 李響初.數(shù)字電路基礎(chǔ)與應(yīng)用[M],機(jī)械工業(yè)出版社,2008
課設(shè)體會(huì)
經(jīng)過(guò)一段時(shí)間的收集資料,我的課程設(shè)計(jì)終于完成,看著自己的成果,有說(shuō)不出的感觸。通過(guò)這段時(shí)間的努力,對(duì)我這學(xué)期的學(xué)習(xí)有了系統(tǒng)的總結(jié)。
本設(shè)計(jì)利用AT89C52單片機(jī)串行口,實(shí)現(xiàn)與PC機(jī)通訊。本設(shè)計(jì)中包括了單片機(jī)通訊的編制,串行通訊的硬件環(huán)境,數(shù)據(jù)格式的協(xié)議,數(shù)據(jù)交換的協(xié)議等多方面的知識(shí),在這個(gè)單片機(jī)串行口與PC機(jī)通訊設(shè)計(jì)中,用一個(gè)相對(duì)簡(jiǎn)單的實(shí)驗(yàn)來(lái)實(shí)現(xiàn)這個(gè)功能。其次,在連接各個(gè)模塊編譯程序的時(shí)候一定要注意各個(gè)變量的定義和功能,因?yàn)槊總€(gè)定義和功能不一樣的,會(huì)影響實(shí)驗(yàn)結(jié)果,再者就是程序需規(guī)范化,語(yǔ)法不能出錯(cuò),編譯才能通過(guò),試驗(yàn)才能成功。
在測(cè)試通訊時(shí),遇到了很多的困難,想要的結(jié)果總是不能正確的顯示,后來(lái),在多次的修改程序,調(diào)試電路之后,才發(fā)現(xiàn)是因?yàn)檠訒r(shí)函數(shù)的時(shí)間太長(zhǎng)了。經(jīng)過(guò)屢次調(diào)試,終于找到了比較合適的輸入數(shù)值,終于成功了。通過(guò)此實(shí)驗(yàn),讓我看到了自己的水平和差距,雖然我有還很多不足,但是在我的努力下,彌補(bǔ)了我的缺憾。此次學(xué)習(xí)使我受益匪淺。從中學(xué)到很多以前沒(méi)有接觸到的知識(shí),及其解決辦法和一些程序的設(shè)計(jì)方法。增加了自己在編程方面的功底。
通過(guò)這次課程設(shè)計(jì)使我懂得了理論與實(shí)際相結(jié)合是很重要的,只有理論知識(shí)是遠(yuǎn)遠(yuǎn)不夠的,只有把所學(xué)的理論知識(shí)與實(shí)踐相結(jié)合起來(lái),從理論中得出結(jié)論,才能真正為社會(huì)服務(wù),從而提高自己的實(shí)際動(dòng)手能力和獨(dú)立思考的能力。同時(shí)讓我學(xué)會(huì)了分析問(wèn)題、處理問(wèn)題的方法,可以說(shuō)達(dá)到了舉一反三的目的,為以后工作、學(xué)習(xí)都打下了堅(jiān)實(shí)的基礎(chǔ)。
[2013年7月 12日完成]
附錄1 電路原理圖
附錄2 程序清單
#include <REG52.H>
#include <stdio.h>
sbit RE=P2^7; //定義485的使能腳
sbit DE=P2^6;
bit SendFlag;
unsigned int ReData,SenData;
/**************************************
延時(shí)程序
**************************************/
void delay(unsigned char i)
{
unsigned char j;
for(i; i > 0; i--)
for(j = 200; j > 0; j--);
}
void main (void)
{
SCON = 0x50; //REN=1允許串行接受狀態(tài),串口工作模式1
TMOD= 0x20; //定時(shí)器1工作方式2
TH1 = 0xFD; // 波特率9600、數(shù)據(jù)位8、停止位1。效驗(yàn)位無(wú) (12M)
TL1 = 0xFD;
TR1 = 1; //開定時(shí)器
ES = 1; //開串口中斷
EA = 1; // 開總中斷
while(1)
{
if (SendFlag==1) // max485(半雙工通信) RE/DE定義 RE=0為接受狀態(tài) DE=1為發(fā)送狀態(tài)
{ RE=1; // DE=1為發(fā)送狀態(tài)
DE=1;
SBUF=SenData; //發(fā)送數(shù)據(jù)
delay(50);
}
else
{
RE=0; //接收狀態(tài)
DE=0;
}
}
}
/****************************************************
串口中斷程序
******************************************************/
void ser_int (void) interrupt 4 //4為中斷號(hào)
{
if(TI == 1)
{
TI = 0; //發(fā)送中斷標(biāo)志位置零
SendFlag = 0;
}
if(RI == 1) //RI接受中斷標(biāo)志
{
RI = 0; //清除RI接受中斷標(biāo)志
ReData = SBUF; //SUBF接受/發(fā)送緩沖器
SenData=ReData;
SendFlag = 1;
}
}