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