單片機(jī)與PC機(jī)串口通訊設(shè)計_第1頁
單片機(jī)與PC機(jī)串口通訊設(shè)計_第2頁
單片機(jī)與PC機(jī)串口通訊設(shè)計_第3頁
單片機(jī)與PC機(jī)串口通訊設(shè)計_第4頁
單片機(jī)與PC機(jī)串口通訊設(shè)計_第5頁
已閱讀5頁,還剩23頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、第一章 串口通訊的系統(tǒng)組成與原理1.1 系統(tǒng)組成及通訊原理 系統(tǒng)構(gòu)成一、 MSP430F149功能簡介: 本設(shè)計選用的主要芯片為MSP430F149,該單片機(jī)屬于德州儀器公司MSP430F14X/16X FLASH 系列。該系列是一組工業(yè)級超低功耗的微控制器,運行環(huán)境溫度為 -40+85 攝氏度工作電壓范圍1.83.6V, MSP430 單片機(jī)之所以有超低的功耗,是因為其在降低芯片的電源電壓及靈活而可控的運行時鐘方面都有其獨到之處。由于具有16位RISC(精簡指令集)結(jié)構(gòu),16位寄存器和常數(shù)寄存器,MSP430 達(dá)到了最大的代碼效率。數(shù)字控制的振蕩器提供快速從所有低功耗模式蘇醒到活動模式的能力

2、時間少于6ms。MSP430F149有較高的處理速度,在 8MHz 晶體驅(qū)動下指令周期為 125 ns。 另外它帶有兩個16 位定時器(帶看門狗功能)、速度極快的8 通道12 位A/D 轉(zhuǎn)換器(ADC)(帶內(nèi)部參考電壓、采樣保持和自動掃描功能)、一個內(nèi)部比較器和兩個通用同步/異步發(fā)射接收器、48個I/O口(均可獨立控制)的微處理器結(jié)構(gòu)。硬件乘法器提高了單片機(jī)的性能并使單片機(jī)在編碼和硬件上可兼容3。這些特點保證了可編制出高效率的源程序。二、系統(tǒng)構(gòu)成1、系統(tǒng)框圖系統(tǒng)構(gòu)成如圖1-1所示,由上位機(jī)(即工業(yè)控制計算機(jī))、通訊接口和下位機(jī)3部分組成。上位機(jī)選用的是工控機(jī) ,智能終端由單片機(jī)MSP430F1

3、49和外圍傳感器放大電路等構(gòu)成(本設(shè)計部涉及該部分的設(shè)計)。單片機(jī)與PC機(jī)之間通信方式為串行異步方式(UART),下位機(jī)采用中斷方式進(jìn)行與上位機(jī)的數(shù)據(jù)交換,上位機(jī)采用按時查詢方式對各串口進(jìn)行讀寫操作。單片機(jī)MSP430要想與PC 串口連接或者其它帶有串口的終端設(shè)備連接,接口電路部分必須要進(jìn)行EIA-RS-232-C 與MSP430 電平和邏輯關(guān)系的轉(zhuǎn)換4。本設(shè)計將采用MAX3221芯片, 完成3V5V 電平與串口電平的雙向轉(zhuǎn)換。圖1-1 系統(tǒng)框圖 通信原理及協(xié)議一、MSP430的串口通訊模塊(USART)由于本設(shè)計解決的是串口通訊問題,所以通信的基本原理是利用MSP430的串口通訊模塊(USA

4、RT)來實現(xiàn)單片機(jī)和PC機(jī)之間的串口通信。1、USART的硬件構(gòu)成:SP430F169的串行通訊模塊(USART)的作用主要是實現(xiàn)對外通信,它可以實現(xiàn)異步通信(UART)和同步通信(SPI)兩中通訊功能5。圖1-2是USART的通訊模塊。由圖1-2可以看出USART模塊分別由波特率部分,接收部分,發(fā)送部分,端口IO部分組成。USART接收部分包括接收寄存器,接收移位寄存器以及控制模塊組成,它在接收信息的時候產(chǎn)生一些狀態(tài)信息,并設(shè)置相應(yīng)的中斷標(biāo)志位。USART的發(fā)送部分包括發(fā)送寄存器,發(fā)送移位寄存器以及控制模塊組成,它在發(fā)送的時候產(chǎn)生一些狀態(tài)信息,并可以設(shè)置發(fā)送中斷標(biāo)志位。USART的波特率產(chǎn)生

5、部分主要包括時鐘的選擇,波特率的產(chǎn)生以及波特率的調(diào)整部分組成,它通過設(shè)置波特率寄存器和波特率調(diào)整寄存器來獲得需要的波特率。USART包含一個控制模塊,通過控制模塊可以選擇相應(yīng)的工作模式,同時設(shè)置相應(yīng)的管腳,比如對異步和同步工作方式的選擇,對奇偶校驗位和停止位個數(shù)等所有設(shè)置都是通過操作該模塊的寄存器來實現(xiàn)的。對于不同系列的MSP單片機(jī)其USART模塊可能有一個也可能有兩個,而MSP430F149有兩個,分別是USART0和USART1。圖1-2 USART模塊組成2、USART的控制寄存器和工作模式USART的控制寄存器是其八個寄存器之中的一個,表1-1是其位的格式, 表1-1 控制寄存器PEN

6、VPEVSPCHARLISTENSYNCMMSWRSTUSART的控制寄存器有8個有效控制位,通過對這些控制位的設(shè)置可以對工作模式,通信協(xié)議,校驗位等進(jìn)行選擇。用戶對USART的所有操作都是通過操作該寄存器的控制位來完成的6。下面是各個位的簡單功能描述,知道這些控制位的功能,有助于我們在后面進(jìn)行硬件連接和軟件設(shè)計.PENV:校驗使能位。該位為0不允許校驗;為1時,允許校驗,且在發(fā)送時產(chǎn)生校驗位,在接收時希望接收到校驗位。在地址位多機(jī)模式中地址位包括在校驗計算中。PEV:奇偶校驗位。為0時,奇校驗,為1時進(jìn)行偶校驗。SP:停止位。接收時停止位只有一個。發(fā)送時,該位為0,只有一個停止位;該位為1時

7、,有兩個停止位。CHAR:字符長度位。該位為0表示發(fā)送的數(shù)據(jù)為7位,該位為1時表示發(fā)送的數(shù)據(jù)為8位。LISTEN:監(jiān)聽使能位。該位為0沒有反饋;該位為1,有反饋,發(fā)送的數(shù)據(jù)送到接收器,可以進(jìn)行自環(huán)測試。SYNC:該位為0時,USART為異步通信(UART)模式;該位為1,USART為同步通信(SPI)模式。MM:多機(jī)模式選擇。當(dāng)該位為0時,多機(jī)模式選擇線路空閑多機(jī)協(xié)議;該位為1時,多機(jī)模式選擇地址位多機(jī)協(xié)議。SWRST:軟件復(fù)位使能位。也叫控制位。該位影響著其他控制位和狀態(tài)位的狀態(tài),在串行口的使用過程中,這一位比較重要。一次正確的USART模塊初始化應(yīng)該是這樣的順序:先在SWRST=1的情況下

8、設(shè)置串口;然后設(shè)置SWRST=0;最后如果使用中斷,則設(shè)置相應(yīng)的中斷使能。該位為0時:USART模塊被允許。該位為1時:如果該位置位,則USART狀態(tài)機(jī)和操作運行標(biāo)志位都被初使化成復(fù)位狀態(tài)(URXIFG=URXIE=UTXIE=0,UTXIFG=1);同時所受影響的邏輯位保持在復(fù)位狀態(tài),直到SWRST位復(fù)位。這意味著,當(dāng)系統(tǒng)復(fù)位后,只有對SWRST位復(fù)位,USART的功能才能被重新允許;但是接收和發(fā)送標(biāo)志URXE和UTXE不受SWRST控制位的影響。二、通訊方式1、異步模式(UART)的選擇MSP430F149單片機(jī)支持兩種不同的串行協(xié)議,異步通信(UART)協(xié)議和同步通信(SPI)協(xié)議。這兩

9、種協(xié)議的選擇是通過控制寄存器中的SYNC位來決定的7。本設(shè)計中主要是利用MSP430的異步通信(UART)模式原理實現(xiàn)單片機(jī)與PC機(jī)之間的串口通信的。MSP430控制寄存器內(nèi)的信息決定了USART的基本操作,選擇異步模式(UART)需要通過設(shè)置SYNC=0來實現(xiàn);本設(shè)計中對于其他控制位的設(shè)置還有:設(shè)置CHAR=1,選擇字符長度為8位;設(shè)置SP=0,選擇停止位1位;設(shè)置PEV=0,選擇奇校驗;設(shè)置MM=1,選擇地址位多機(jī)模式協(xié)議??刂莆坏倪x擇基本上決定了系統(tǒng)的通信方式和通信格式。2、UART模塊的特點由于MSP430單片機(jī)具有兩個片內(nèi)的UART:串口0和串口1,實現(xiàn)兩個串口通信相當(dāng)容易,只需要設(shè)

10、置適當(dāng)?shù)募拇嫫骶涂梢允勾诠ぷ髌饋?,兩個串口都采用中斷方式,當(dāng)接收有數(shù)據(jù)時,設(shè)置一個標(biāo)志通知主程序有數(shù)據(jù)到來,當(dāng)主程序有數(shù)局要發(fā)送時,設(shè)置一個中斷標(biāo)志進(jìn)入中斷發(fā)送數(shù)據(jù)。本設(shè)計選用串口1與上位機(jī)進(jìn)行通信。在異步模式下,接收部分自身實現(xiàn)幀的同步,通信雙方只要使用相同的波特率即可。異步模式的幀格式有1位起始位、7位或8位數(shù)據(jù)位,校驗位,1位地址位,1或2位停止位構(gòu)成。在異步模式下,MSP430支持兩種多機(jī)模式:線路空閑多機(jī)模式和地址位多機(jī)模式。線路空閑模式下,數(shù)據(jù)塊被一段空閑的時間分割。在字符的第一個停止位之后收到10個以上的1,表示檢測到線路空閑;如果采用兩個停止位,則第二個停止位被認(rèn)為是空閑周期

11、的第一個信號。在使用地址位多機(jī)模式時,字符包含一個附加的位作為地址標(biāo)識,數(shù)據(jù)快的第一個字符帶有一個置位的地址位,用以表明該字符是一個地址。由于已經(jīng)設(shè)置了控制寄存器中的MM=1,故在本設(shè)計中選擇了地址位多機(jī)模式。下面是UART通信的一些特點:(1)、異步通訊模式,包括線路空閑/地址位通信協(xié)議。(2)、有兩個單獨的移位寄存器,輸入/輸出移位寄存器。(3)、傳輸7位或8位數(shù)據(jù),可采用奇偶或無校驗。(4)、可編程實現(xiàn)波特率調(diào)整。(5)、分別發(fā),收單獨中斷。(6)、有效地檢測到起始位實現(xiàn)從低功耗喚醒。(7)、狀態(tài)標(biāo)志檢測錯誤或者地址位。三、基本通信協(xié)議:在PC機(jī)和多臺單片機(jī)的通訊中,確定一個明確而合理的

12、通訊協(xié)議是關(guān)鍵,包括對數(shù)據(jù)格式、通訊方式、傳送速度、傳送步驟、檢糾錯方式以及控制字符定義等問題做出統(tǒng)一規(guī)定6。由于已經(jīng)選擇了UART的多機(jī)通信模式.為了區(qū)別不同的分機(jī),必須為每個分機(jī)分配一個唯一的地址,此地址唯一區(qū)別各單片機(jī)。數(shù)據(jù)格式采用數(shù)據(jù)包的形式,一次傳輸一組數(shù)據(jù)。數(shù)據(jù)包格式如表1-2所示:表 1-2 數(shù)據(jù)包格式起使標(biāo)志位下位機(jī)地址操作命令數(shù)據(jù)長度數(shù)據(jù)內(nèi)容和校驗結(jié)束標(biāo)志起始標(biāo)志位:1 個字節(jié) 分機(jī)地址: 1 個字節(jié)命令/ 數(shù)據(jù): 1 個字節(jié) 數(shù)據(jù)長度: 1 個字節(jié) 數(shù)據(jù)內(nèi)容: n 個字節(jié) 和檢驗: 2 個字節(jié) 結(jié)束標(biāo)志位: 1 個字節(jié) 數(shù)據(jù)格式中的地址位表示與PC 機(jī)通訊的單片機(jī)地址。操作

13、命令則表示此次通訊要完成的操作。在單片機(jī)發(fā)送上位機(jī)接收的時候,協(xié)議規(guī)定命令FFH 為上報數(shù)據(jù), 此時數(shù)據(jù)包中的數(shù)據(jù)長度、數(shù)據(jù)內(nèi)容、和檢驗三個域便填充實際發(fā)送數(shù)據(jù)的個數(shù)、數(shù)據(jù)及和校驗;命令F0H - F3H 則表示單片機(jī)給PC機(jī)的反饋信息,此時數(shù)據(jù)包中的數(shù)據(jù)長度、數(shù)據(jù)內(nèi)容和檢驗三個域為空,其中當(dāng)命令為F0H 表示接收成功,F(xiàn)1H 表示接收失敗并要求重發(fā),F(xiàn)2H 表示單片機(jī)有數(shù)據(jù)上報要求,F(xiàn)3H 表示單片機(jī)無數(shù)據(jù)上報要求。操作命令域在PC 機(jī)發(fā)送單片機(jī)接收的時候也有相似的協(xié)議規(guī)定。第二章 硬件電路設(shè)計2.1 接口電平電路設(shè)計 RS-232接口電路設(shè)計一、 RS-232電氣標(biāo)準(zhǔn)1、RS-232基本電

14、氣要求由于MSP430最大工作電壓為3.6V,所以在與PC機(jī)進(jìn)行串口通信的時候需要進(jìn)行EIA-RS-232邏輯電平轉(zhuǎn)換。EIA-RS-232 是美國電子工業(yè)協(xié)會(EIA)制定的串口通信協(xié)議,“C”表示標(biāo)準(zhǔn)修第幾次修改,其信號電平采用負(fù)邏輯,邏輯“1”的電平是-5V15V,邏輯“0”的電平為+5V+15V,因為其有2V的噪聲容限,故最終限制接收器能識別低至+3V的信號作為邏輯“0”,高到-3V的信號 作為邏輯“1”8。因此,實際工作時,應(yīng)保證電平在±(315)V之間。S-232-C最高傳輸速率為20kb/s,最大直接連接長度為15m。2、RS-232常用接口RS-232-C標(biāo)準(zhǔn)接口有2

15、5條線:4條數(shù)據(jù)線、11條控制線、3條定時線、7條備用和未定義線。其中常用的只有9根,它們是:(1)6條聯(lián)絡(luò)控制信號線: 數(shù)據(jù)裝置準(zhǔn)備好(Data set ready-DSR)有效時(ON)狀態(tài),表明MODEM處于可以使用的狀態(tài)。 數(shù)據(jù)終端準(zhǔn)備好(Data set ready-DTR)有效時(ON)狀態(tài),表明數(shù)據(jù)終端可以使用。 請求發(fā)送(Request to send-RTS)用來表示DTE請求DCE發(fā)送數(shù)據(jù),即當(dāng)終端要發(fā)送數(shù)據(jù)時,使該信號有效(ON狀態(tài))。允許發(fā)送(Clear to send-CTS)用來表示DCE準(zhǔn)備好接收DTE發(fā)來的數(shù)據(jù),是對請求發(fā)送信號RTS的響應(yīng)信號。該信號有效時,則

16、通知終端開始沿發(fā)送數(shù)據(jù)線TxD發(fā)送數(shù)據(jù)。 接收線信號檢出(Received Line detection-RLSD)用來表示DCE已接通通信鏈路,告知DTE準(zhǔn)備接收數(shù)據(jù)。此線也叫做數(shù)據(jù)載波檢出(Data Carrier dectection-DCD)線。 振鈴指示(Ringing-RI)該信號有效(ON狀態(tài))表示通知終端,已被呼叫。 上述控制信號線何時有效,何時無效的順序表示了接口信號的傳送過程。例如,只有當(dāng)DSR和DTR都處于有效(ON)狀態(tài)時,才能在DTE和DCE之間進(jìn)行傳送操作。若DTE要發(fā)送數(shù)據(jù),則預(yù)先將DTR線置成有效(ON)狀態(tài),等CTS線上收到有效(ON)狀態(tài)的回答后,才能在Tx

17、D線上發(fā)送串行數(shù)據(jù)。這種順序的規(guī)定對半雙工的通信線路特別有用,因為半雙工的通信才能確定DCE已由接收方向改為發(fā)送方向,這時線路才能開始發(fā)送(2)2條數(shù)據(jù)發(fā)送與接收線: 發(fā)送數(shù)據(jù)(Transmitted data-TxD)通過TxD終端將串行數(shù)據(jù)發(fā)送已經(jīng)發(fā)送。接收數(shù)據(jù)(Received data-RxD)通過RxD線終端接收從PC發(fā)來的串行數(shù)據(jù),(DCEDTE)。 (3)一條地線 信號地SG,無方向。 二、接口電路設(shè)計RS-232接口電路連接方式根據(jù)需要有三線、六線、八線、兩線多種。當(dāng)通訊速率較低時可以采用三線對接法,按圖2-2所示。 圖2-1 RS-232電纜連接圖在本設(shè)計中采用一塊MAX32

18、21芯片把從MSP430中USART過來的信號進(jìn)行電平轉(zhuǎn)換后輸出到PC,把從PC發(fā)過來的信號發(fā)送給USART,設(shè)計中的RS-232接口電路如圖2-2所示:圖2-2 RS-232接口電路圖圖2-2中DB9為即為我們選用的RS-232連接器9針串行口,其插針分別對應(yīng)RS-232-C標(biāo)準(zhǔn)接口9根常用線。其對應(yīng)關(guān)系如表2-1所示9。表2-1 9針串行口插針對應(yīng)關(guān)系表DB9管腳號插針功能說明標(biāo)記1接收線信號檢出DCD2接收數(shù)據(jù)RD3發(fā)送數(shù)據(jù)TD4數(shù)據(jù)終端就緒DTR5信號地SG6數(shù)據(jù)傳輸設(shè)備就緒DSR7請求發(fā)送RTS8允許發(fā)送CTS9振鈴指示RI由圖2-2以及表2-1可以知道,接收使能EN接地,時鐘有效;

19、掉電模式控制腳FORCEOFF始終拉高,即MAX3221始終處在工作狀態(tài)。USART(本設(shè)計中選擇UART1)的TXD腳與MAX3221的11腳(DIN)相連,USART的RXD腳與MAX3221的9腳(ROUT)相連;輸入DIN的信號轉(zhuǎn)換為RS-232電平后,經(jīng)MAX3221的13 腳(DOUT)輸出到J5(DB9)的2腳(DB9的2腳為串口的RXD腳),接口J5(DB9)的3腳(串口的TXD腳)與MAX3221的8腳(RIN)相連,這樣的連接方式已將USART的輸出腳TXD(本設(shè)計中UART1的P3.6管腳)和輸入腳RXD(本設(shè)計中UART1的P3.7管腳)連接對調(diào),可以直接通過延長線與P

20、C機(jī)相連。2.2 單片機(jī)電路設(shè)計 單片機(jī)電路設(shè)計圖單片機(jī)電路比較簡單,在與接口電路連接的的基礎(chǔ)上,分別采用單片機(jī)的一般I/O接口實現(xiàn)與其他電路的連接。由于是多路通信,所以每一路的硬件設(shè)計基本相同,下面為單片機(jī)部分電路圖。圖2-3 單片機(jī)部分電路圖由圖2-3可以看出,在單片機(jī)的時鐘設(shè)計上與其他的單片機(jī)有一定區(qū)別,MSP430F149單片機(jī)采用兩個時鐘輸入,一個32KHZ的時鐘信號,一個8MHZ的時鐘信號,該系統(tǒng)的時鐘信號都是采用晶體振蕩器實現(xiàn)的.考慮到電源的輸入波紋對單片機(jī)的影響,在電源的管腳增加一個0.1µF的電容來實現(xiàn)濾波,以減小輸入端受到的干擾。另外單片機(jī)還有模擬電源的輸入端,所

21、以這里需要考慮干擾問題,在該系統(tǒng)中的干擾比較小,因此模擬地和數(shù)字地共地,模擬電源輸入端增加一個濾波電容以減小干擾10。第三章 軟件設(shè)計 3.1 功能描述 上位機(jī)和下位機(jī)實現(xiàn)的功能一、功能描述:1、上位機(jī)功能(1)向下位機(jī)進(jìn)行呼叫,接著發(fā)送字符串,最后發(fā)送結(jié)束標(biāo)志(2)按照一定的時間間隔對串口進(jìn)行讀操作,如果有數(shù)據(jù)需要接收,則進(jìn)行數(shù)據(jù)接收.2、下位機(jī)功能(1)接收功能:識別上位機(jī)發(fā)送的地址,如果地址匹配則接收數(shù)據(jù),直到結(jié)束標(biāo)志到來,則停止接收。(2)發(fā)送功能:下位機(jī)有數(shù)據(jù)需要發(fā)送時,首先向上位機(jī)發(fā)送本機(jī)地址,然后發(fā)送數(shù)據(jù),最后發(fā)送結(jié)束標(biāo)志。3.2 程序設(shè)計 下位機(jī)程序設(shè)計一、下位機(jī)通訊協(xié)議分布式

22、控制系統(tǒng)中的下位機(jī)的每臺單片機(jī)均有唯一的地址。通信開始時,先由PC機(jī)呼叫被叫單片機(jī)的地址,單片機(jī)在接收到PC機(jī)的呼叫后,首先判斷是不是自己的地址,如果不是就不予理睬。如果是,則發(fā)送呼叫應(yīng)答信號,并根據(jù)上位機(jī)的命令進(jìn)行相應(yīng)的接收或發(fā)送。根據(jù)以上要求以及 UART通信協(xié)議基本內(nèi)容,可以將下位機(jī)通信協(xié)議設(shè)置如下表:表3-1 下位機(jī)通訊協(xié)議格式地 址數(shù) 據(jù) 結(jié)束地址:取值18,即上位機(jī)可以呼叫的8個下位機(jī)之一,發(fā)送時地址位有效。數(shù)據(jù):取值9127,為ASC 可顯示字符。結(jié)束:0。二、下位機(jī)程序流程圖下位機(jī)(單片機(jī))程序設(shè)計包括初始化設(shè)計、串口中斷服務(wù)設(shè)計和主處理程序設(shè)計。本例雖然有多個下位機(jī),但他們除

23、了本機(jī)地址的設(shè)置不同外,其他硬件電路都是相同的,所以各下位機(jī)的軟件設(shè)計也是相同的。按照通信協(xié)議的要求可以設(shè)計出如圖3-1的下位機(jī)程序流程。圖3-1 下位機(jī)(單片機(jī))主程序流程圖三、初始化設(shè)置初始化設(shè)置包括時鐘初始化,端口初始化和串口初始化。1、時鐘初始化程序及說明:#include <MSP430X14X.h> #include "UART.h" void Init_CLK(void) unsigned int i; BCSCTL1 = 0X00;/將寄存器的內(nèi)容清零 /XT2震蕩器開啟 /LFTX1工作在低頻模式 /ACLK的分頻因子為1 do IFG1&am

24、p;=OFIFG; / 清除OSCFault標(biāo)志for(i=0x20;i>0;i-); while (IFG1 & OFIFG) = OFIFG); / 如果OSCFault =1 BCSCTL2=0x00; /將寄存器的內(nèi)容清零 BCSCTL2 += SELM1;/MCLK的時鐘源為TX2CLK,分頻因子為1 BCSCTL2 += SELS;/SMCLK的時鐘源為TX2CLK,分頻因子為1 由上面的程序可以知道,只要設(shè)置BCSCTL1和BCSCTL2寄存器的相應(yīng)位就可以獲得需要的MCLK、SMCLK、和ACLK的時鐘信號。2、端口初始化 void Init_Port(void)

25、 /將所有的管腳在初始化的時候設(shè)置為輸入方式 P3DIR = 0; /將所有的管腳設(shè)置為一般I/O口 P3SEL = 0; return; 上面的初始化程序?qū)3口初始化為一般的I/O接口。3、串口初始化由于串口1(UART1)的管腳號為P3.6和P3.7,端口初始化只是將端口設(shè)置為一般的I/O接口。而本設(shè)計里需要將P3.6和P3.7作為UART的輸出和輸入管腳,所以這里需要對其另外初始化。UART1的初始化程序代碼為:、void Init_UART1(void) U1CTL = 0X00; /將寄存器的內(nèi)容清零UCTL1&=SWRST; /SWRDT復(fù)位,UART允許UCTL1=CH

26、AR+MM; /8位數(shù)據(jù)位,1位停止位,地址位模式 URCTL1 |=URXWIE;/只有地址字符使URXIFG置位 UBR0_1 = 0X03; UBR1_1 = 0X00;UMCTL_1 = 0X4A; /使用32KHz晶振時,波特率為9600bps U1TCTL=0x10;/選定ACLK(32KHz晶振)為時鐘源 ME2 |= UTXE1 + URXE1; /使能UART1的TXD和RXD IE2 |= URXIE1; /使能UART1的RX中斷 IE2 |= UTXIE1; /使能UART1的TX中斷 P3SEL |= BIT6; /設(shè)置P3.6為UART1的TXD P3SEL |=

27、BIT7; /設(shè)置P3.7為UART1的RXD P3DIR |= BIT6;/P3.6為輸出管腳 return; 根據(jù)硬件設(shè)置的要求,上面的程序設(shè)置了串口1的參數(shù),比如8位數(shù)據(jù)位,1位停止位,地址位多機(jī)模式波特率發(fā)生器選擇ACLK,波特率為9600波特/秒等,將P3.6和P3.7設(shè)置為串口1的I/O管腳。四、串口中斷服務(wù)程序串口接收和發(fā)送都采用中斷方式,設(shè)計單片機(jī)通信程序時,必須充分發(fā)揮單片機(jī)的效率,由于單片機(jī)多應(yīng)用于實時性較強(qiáng)的控制場合,因此, 應(yīng)將及時響應(yīng)和控制對象的動作放在優(yōu)先考慮的位置,以盡量減少通信等輔助性操作所占用的CPU時間11?;谏鲜隹紤],在設(shè)計單片機(jī)通信程序時,將中斷程序分

28、為接收中斷服務(wù)程序和發(fā)送中斷服務(wù)程序2部分。下面為串口通信程序流程圖:圖3-2串口通信模塊程序流程圖1、接收中斷服務(wù)程序 當(dāng)有數(shù)據(jù)收到時,設(shè)置一個標(biāo)志通知主程序有數(shù)據(jù)到來,當(dāng)?shù)刂肺或炞C無誤后,則開始接收數(shù)據(jù)。下面為接收中斷處理程序代碼:interrupt UART1RX_VECTOR void UART1_RX_ISR(void)if(URCTL1&URXWIE) /接收為地址方式時等待正確的地址出現(xiàn)if(URBUF_1=ADDRESS) /地址正確,改變接收為數(shù)據(jù)方式,準(zhǔn)備接收 URCTL1&=URXWIE;nRX1_Len_temp = 0; else /接收為數(shù)據(jù)時UAR

29、T1_RX_BUFnRX1_Len_temp = RXBUF1;/數(shù)據(jù)存入UART1_RX_BUF里 nRX1_Len_temp += 1; if(UART1_RX_BUFnRX1_Len_temp += 0) /是否到達(dá)停止位 nRX1_Len = nRX1_Len_temp; nRev_UART1 = 1; /設(shè)置標(biāo)志來通知主程序nRX1_Len_temp = 0;URCTL1 |=URXWIE; /數(shù)據(jù)收完改變?yōu)榈刂贩绞?對于接收中斷,程序處于等待狀態(tài),當(dāng)外面有數(shù)據(jù)到來時則觸發(fā)接收,進(jìn)入接收中斷服務(wù)程序,當(dāng)?shù)刂夫炞C正確開始后面的數(shù)據(jù),中斷從“RxBUF1”寄存器里讀取數(shù)據(jù),將讀到的數(shù)據(jù)放

30、到“UART1_RX_BUF ”全局緩沖區(qū)里,在接收數(shù)據(jù)之后設(shè)置一個標(biāo)志“nRev_UART1”來通知主程序,完成后等待下一中斷的到來。接收中斷服務(wù)程序包含了對地址位是否匹配的驗證。2、發(fā)送中斷服務(wù)程序 當(dāng)主程序有數(shù)據(jù)要發(fā)送時,設(shè)置一個中斷標(biāo)志進(jìn)入中斷并發(fā)送數(shù)據(jù)。下面為程序代碼:interrupt UART1TX_VECTOR void UART1_TX_ISR(void) if(nTX1_Len != 0) nTX1_Flag = 0;/ 表示緩沖區(qū)里的數(shù)據(jù)沒有發(fā)送完 TXBUF1=0x01; /先寫入地址字符 TXBUF1 = UART1_TX_BUFnSend_TX1; /開始傳輸數(shù)據(jù)

31、nSend_TX1 += 1; if(nSend_TX1 >= nTX1_Len) /數(shù)據(jù)是否發(fā)送完 nSend_TX1 = 0; nTX1_Len = 0; nTX1_Flag = 1; /緩沖區(qū)里沒有數(shù)據(jù)要發(fā)送了 對于發(fā)送中斷,程序一般處于禁止等待狀態(tài)。只有當(dāng)單片機(jī)的發(fā)送緩沖區(qū)歷由數(shù)據(jù)需要發(fā)送,并將發(fā)送中斷置為允許方式后,發(fā)送中斷才開始工作。發(fā)送時從緩沖區(qū)里發(fā)送數(shù)據(jù),遵守通訊協(xié)議:首先發(fā)送地址位,然后發(fā)送需要傳輸?shù)臄?shù)據(jù),最后發(fā)送校驗以及結(jié)束標(biāo)志。在發(fā)送中斷服務(wù)程序里從“UART1_TX_BUF ”全局緩沖區(qū)里取出數(shù)據(jù)給“TXBUF1”寄存器進(jìn)行發(fā)送,發(fā)送完后發(fā)送中斷服務(wù)程序等待下一中

32、斷的到來。以上兩程序可以看出采用中斷有很好的結(jié)構(gòu),只要在中斷服務(wù)程序里理接收和發(fā)送數(shù)據(jù),然后與主程序進(jìn)行數(shù)據(jù)交換,易實現(xiàn)多任務(wù)操作,很好利用單片機(jī)資源。五、主處理程序主處理程序包含初始化、設(shè)置串口工作方式、對接收到的數(shù)據(jù)進(jìn)行處理以及封裝需要發(fā)送的數(shù)據(jù)。下面是它的程序代碼。#include <msp430x14x.h>#include "sp3220.h"/定義串口操作變量char nRev_UART1;/ 串口 1 的接收標(biāo)志char UART1_TX_BUF60;/ 串口 1 的發(fā)送緩沖區(qū)char UART1_RX_BUF60;/ 串口 1 的接收緩沖區(qū)int

33、 nTX1_Len;char nRX1_Len;char nRX1_Len_temp;char nTX1_Flag;int nSend_TX1;void main(void)int nRes_UART1; int nRes = 0; char UART1_RX_Temp60; int i; int n;WDTCTL = WDTPW + WDTHOLD; / 關(guān)閉看門狗 _DINT(); / 關(guān)閉中斷 Init_CLK(); / 初始化時鐘 Init_Port(); / 初始化端口 Init_UART1(); / 初始化串口1_EINT(); / 打開中斷for(;) / 進(jìn)入處理循環(huán) if(n

34、Rev_UART1 = 1) /如果有接收中斷 nRev_UART1 = 0; for(i = 0;i < nRX1_Len;i+) UART1_RX_Tempi = UART1_RX_BUFi; / 將接收到的數(shù)據(jù)拷貝到臨時緩沖區(qū)。 nRes = ProcessCMD(UART1_RX_Temp,nRX1_Len);switch(nRes) case 1:UART1_TX_BUF0 = 'O' UART1_TX_BUF1 = 'K' UART1_TX_BUF2 = 13; nTX1_Len = 3;/ 設(shè)置中斷標(biāo)志,進(jìn)入發(fā)送中斷程序IFG2 |= UTX

35、IFG1; nRX1_Len = 0;break;case 2:for(n = 0;n < nRX1_Len;n+) UART1_TX_BUFn = UART1_RX_Tempn; UART1_TX_BUFnRX1_Len = 'O' UART1_TX_BUFnRX1_Len+1 = 'K' UART1_TX_BUFnRX1_Len+2 = 13; nTX1_Len = nRX1_Len + 3;/ 設(shè)置中斷標(biāo)志,進(jìn)入發(fā)送中斷程序IFG2 |= UTXIFG1; nRX1_Len = 0;break;case -1:UART1_TX_BUF0 = '

36、;E' UART1_TX_BUF1 = 'R'UART1_TX_BUF2 = 'R' UART1_TX_BUF3 = 'O'UART1_TX_BUF4 = 'R' UART1_TX_BUF5 = 13; nTX1_Len = 6;/ 設(shè)置中斷標(biāo)志,進(jìn)入發(fā)送中斷程序IFG2 |= UTXIFG1; nRX1_Len = 0; break;在上面的程序中主要根據(jù)“ProcessCMD(UART1_RX_Temp,nRX1_Len)”對得到的結(jié)果進(jìn)行處理,向PC發(fā)送響應(yīng)數(shù)據(jù),如果接收到的數(shù)據(jù)有錯誤,則發(fā)送“ERROR”。數(shù)據(jù)封裝

37、完成后,設(shè)置“nTx1_Len”的長度,并通過“IFG2 |= UTXIFG1;”發(fā)送中斷,從而使中斷處理程序進(jìn)行數(shù)據(jù)發(fā)送.上面程序中“ProcessCMD(UART1_RX_Temp,nRX1_Len)”主要處理接收到的數(shù)據(jù)并返回相應(yīng)的代碼以使主程序處理。該函數(shù)的具體代碼為:int ProcessCMD(char pBuf,int nLen) int nTemp = -1; int i; if(nLen <= 2) return -1; if (nLen = 5)if(pBuf0 = 'A') && (pBuf1 = 'T') &

38、& (pBuf2 = 'E') && (pBuf3 = '0') nTemp = 1;if(pBuf0 = 'A') && (pBuf1 = 'T') && (pBuf2 = 'E') && (pBuf3 = '1') nTemp = 2; return nTemp; 上位機(jī)(PC機(jī))程序設(shè)計一、上位機(jī)串口通訊編程方法的選擇隨著Windows在國內(nèi)的普及,越來越多的微機(jī)用戶轉(zhuǎn)向了Windows操作系統(tǒng),所以在DOS環(huán)境下利用匯編

39、語言和C語言對串口通信的編程方式已經(jīng)不再被看好。在Windows操作系統(tǒng)下利用VC6.0開發(fā)平臺對串口通信上位機(jī)編程,其軟件界面非常方便友好,編程工作量相對較小,只需進(jìn)行主要應(yīng)用功能的編程和少量界面控制的編程12。在Windows環(huán)境下,利用PC機(jī)串口進(jìn)行通信的常用方法有以下幾種:一是利用Windows API通信函數(shù);二是利用VC的標(biāo)準(zhǔn)通信函數(shù)_inp、_inpw、_inpd、_outp、_outpw、_outpd等直接對串口進(jìn)行操作;三是使用Microsoft Visual C+的通信控件(MSComm);四是利用第三方編寫的通信類13。本設(shè)計將介紹用PComm開發(fā)機(jī)與單片機(jī)的通信程序的解

40、決方案。二、Pcomm主要命令碼PComm( Professional Comm Tool for PC) 串口通信軟件包專門運用Windows NT/2000/XP。如今WindowsNT/2000/XP 已被廣泛應(yīng)用, 而它提供的Win32Comm API 卻復(fù)雜難用, 而且沒有提供如Zmodem 等高階應(yīng)用函數(shù), 這增加了通信軟件工程師的負(fù)擔(dān)。針對這種狀況, MOXA開發(fā)了一套簡單易用的程式函數(shù)庫及功能強(qiáng)大的輔助工具PComm。PComm Pro支持多種編程語言,如Visual Basic、VC+、Delphi 等,并且適用于任何在Windows NT/2000/XP下以Win 32 C

41、OMMAPI 為基礎(chǔ)的驅(qū)動程式的其他品牌的多串口卡14。PComm的主要命令碼有以下幾種15:(1) sioopen(port);用于設(shè)置并打開串口,其中port的1、2、3、4分別代表COM、COM2、COM3、COM4。當(dāng)返回值為時,表示串口已經(jīng)打開,否則為串口打開出錯。(2) sio close(port);關(guān)閉串口,當(dāng)返回值為時,表示串口已經(jīng)關(guān)閉,否則為串口關(guān)閉出錯。(3) sio ioctl (port baud mode );用于設(shè)置串口波特率、校驗位、數(shù)據(jù)位、停止位等參數(shù)。(4) sio getch();從串口輸入緩沖區(qū)讀出一個字符,返回值為表示已收到數(shù)據(jù)。(5) sio-rea

42、d(port buf len);用于從串口輸入緩沖區(qū)讀出一串字符,buf代表字符串?dāng)?shù)組len代表數(shù)組長度,返回值為表示未收到字符,大于代表收到字符的個數(shù)。(6) sio-SetReadTimeouts port TotalTimeouts(Inter-valTimeouts); 在設(shè)定的等待時間內(nèi)連續(xù)讀串口輸入緩沖區(qū),TotalTimeouts代表設(shè)定的等待時間,Inter-valTimeouts代表每次讀出的間隔時間。(7) sio-flush(port func);用于清空緩沖區(qū)。當(dāng)func為時清空輸入緩沖區(qū),為時清空輸出緩沖區(qū),為時清空輸入輸出緩沖區(qū)。(8) sio-putch (por

43、t term);用于向串口緩沖區(qū)發(fā)送一個字符,返回值為時表示發(fā)送正確,否則表示發(fā)送錯誤。(9) sio -write(port buf len);用于從串口緩沖區(qū)發(fā)送一串字符,buf代表字符串?dāng)?shù)組,len代表數(shù)組長度。三、上位機(jī)(PC機(jī))通信協(xié)議分布式控制系統(tǒng)中的每臺下位機(jī)均有唯一的地址。機(jī)發(fā)送數(shù)據(jù)時先發(fā)送被叫單片機(jī)地址,被叫單片機(jī)對地址進(jìn)行判斷,地址錯誤就不予理睬,地址正確則向上位機(jī)發(fā)送呼叫應(yīng)答信號16。PC機(jī)在接收到呼叫應(yīng)答信號之后,將向單片機(jī)發(fā)出通信命令字符串。以下是上位機(jī)(PC機(jī))的通訊協(xié)議格式。表3-2 上位機(jī)通訊協(xié)議格式單片機(jī)號單片機(jī)號命令碼命令碼停止標(biāo)志其中,單片機(jī)號代表現(xiàn)場第幾

44、臺單片機(jī),占用個字節(jié),發(fā)送兩次的目的是為了防止干擾;命令碼則代表上位機(jī)向下位機(jī)發(fā)布的工作命令,它也占用個字節(jié),發(fā)送兩次的目的也是為了防止干擾。而停止標(biāo)志則表明上位機(jī)一次命令發(fā)送完畢,使用時可依據(jù)該標(biāo)志判斷上位機(jī)的命令是否發(fā)送完畢。四、上位機(jī)串口通訊實現(xiàn)過程在用PComm處理PC機(jī)的串口通信時,其實現(xiàn)過程如下:1、啟動VC+6.0,新建一個基于對話框的應(yīng)用程序TxRx。同時增加靜態(tài)文本、編輯框和按鈕等控件17。如圖3-3所示。圖3-3 基于對話框的接收發(fā)送數(shù)據(jù)程序根據(jù)實際需要還可以添加更多控件,諸如串口的打開和關(guān)閉按鈕,波特率選擇框以及一些實現(xiàn)更加高級功能的控件等,在這里僅添加基本的發(fā)送接收等按

45、鈕控件。2、按照表3-3為每個控件添加相應(yīng)的變量。表3-3 TxRx應(yīng)用程序各控件的屬性控 件ID變量名類 型按 鈕IDC_TRSMITT發(fā)送按鈕Edit1IDC_TXDATAM_TxDataCstringEdit2IDC_RXDATAM_RxDataCstring發(fā)送編輯控件的屬性添加過程如圖3-4所示。其他屬性以及其他控件的添加方法類似。圖3-4 發(fā)送編輯控件ID屬性設(shè)置方法3、PComm和PCommlib加入到工程中,并在TxRxDlg.cpp文件中加入include “PCommh”頭文件,此后便可調(diào)用其提供的通信命令集18。4、TxRxDlg.cpp文件中添加初始化程序代碼,也就是在

46、On InitiDialog函數(shù)中的TODO語句后加入以下代碼:/TODOAdd extra initialization hereInt ret port=1 ret=sio open port /打開串口sio DTR port 0 /置DTR為低電平sio ioctl port B9600 P NONEBIT 8 STOP 1 /設(shè)置波特率/為9600,位數(shù)據(jù)位,位停止位,無校驗位。 添加結(jié)果入圖3-5所示。圖3-5 在TxRxDlg.cpp里添加初始化程序四、上位機(jī)通信程序?qū)ι衔粰C(jī)通信程序的設(shè)計除了初始化串口外,剩下的就是對接收和發(fā)送程序的設(shè)計了,下面是一個簡單的接收發(fā)送子程序,其功能是按照一定時間間隔對串口進(jìn)行讀操作,并能夠每次向串口緩沖區(qū)發(fā)送5個字符19。void CTXRXDlg Send Recv /收發(fā)數(shù)據(jù)子函數(shù)while 1Int ret1Sio flush

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論