基于單片機無(wú)線(xiàn)電子點(diǎn)菜系統硬件設計及實(shí)現
單片機最小系統是整個(gè)開(kāi)發(fā)板的控制中心,它由電源,復位電路和晶振組成。電源采用5V供電,晶振為12MHZ。為了便于調試,將P0.4-P0.7和發(fā)光管相連,發(fā)光管為共陽(yáng)極連接,這是因為開(kāi)發(fā)板初上電或者或者復位后,所有的I/O口均為高電平。由于不使用外部存儲器,因此將EA接高電平。為了方便調試和降低成本,因此選用USB(Universial Serial Bus,通用串口總線(xiàn))方式供電。USB的即插即用特性,使對開(kāi)發(fā)板供電非常方便。圖3.1所示為單片機最小系統。
圖3.1 單片機最小系統
3.2.2 串行口電平轉換部分
大多數PC機都有一個(gè)串行通訊端口RS-232用于兩臺計算機間進(jìn)行串行通訊。RS - 232通訊接口是一種標準化的串行接口,是為DTE(Data Terminal Equipment,遠程通訊連接終端設備)與DCE (Data Communication Equipment,數據通訊設備)定義的物理接口。RS-232采用非平衡連接(又稱(chēng)為單端線(xiàn)路),在這個(gè)線(xiàn)路中,信號電壓加到一條導線(xiàn)上,所有的信號電壓都使用一個(gè)公共的接地線(xiàn)。為了提高抗干擾能力和增加傳送距離,RS一232的每個(gè)腳線(xiàn)的信號和電平規定采用負邏輯電平,DC(-15一5V)規定為邏輯”1″,DC(+ 5-+15V)規定邏輯”0″, DC(-5一+5V規定為過(guò)渡區)。由于單片機的輸入、輸出電平為T(mén)TL電平,與 PC機RS-232標準串行接口的電氣規范不一致,因此要實(shí)現單片機與PC機之間的數據通讀,必須進(jìn)行電平轉換。選用的電平轉換芯片為MAX232,它的工作電壓為+5V,和單片機的工作電源相同。
由于STC89C58RD+單片機支持ISP下載,因此通過(guò)這個(gè)串行口既可以用來(lái)和PC機通信,又能將程序下載到單片機,不用購買(mǎi)昂貴的編程器。圖3.2所示為串口電平轉換部分。
圖3.2 串口電平轉換部分
3.2.3 LED部分
由于單片機復位后,各個(gè)引腳輸出都為高電平,因此選用共陰極的LED數碼管。每個(gè)數碼管的使能端com1,com2,com3,com4分別接到P1.0,P1.1,P1.2,P1.3,當向使能端輸出低電平,即可選通相對應的數碼管。74LS244為三態(tài)輸出的八組緩沖器和總線(xiàn)驅動(dòng)器,選用的四位八段數碼管本身已經(jīng)集成了譯碼器,這樣既簡(jiǎn)化了線(xiàn)路的連接,又降低了錯誤發(fā)生的概率。圖3.3為L(cháng)ED部分。
圖3.3 LED部分本文引用地址:http://dyxdggzs.com/article/172695.htm
3.2.4 開(kāi)發(fā)板和無(wú)線(xiàn)數據傳輸模塊接口部分
這一部分有兩部分組成:由于nRF2401的工作電壓為1.9V-3.6V,工作電壓超過(guò)3.6V就會(huì )燒壞芯片。而開(kāi)發(fā)板的電源為5V,因此為了使系統工作,必需要有5V電平轉換為3.3V電平的部分。為了實(shí)現這一過(guò)程,選用LM1117-MAX3.3作為核心芯片。LM1117是一個(gè)低壓差電壓調節器系列,其壓差在1.2V輸出,負載電流為800mA時(shí)為1.2V。LM1117提供電流限制和熱保護,電路包含1個(gè)齊納調節的帶隙參考電壓以確保輸出電壓的精度在±1%以?xún)?。LM1117系列具有LLP、TO-263、SOT-223、TO-220和TO-252 D-PAK封裝;此外為了使兩個(gè)模塊直接相連,將P2口的部分引腳用排針引到一起,排針間距為 100mil,標準 DIP 插針。圖3.4為開(kāi)發(fā)板和無(wú)線(xiàn)數據傳輸模塊接口部分,圖3.5為5V電平轉3.3V電平部分。
圖3.4 開(kāi)發(fā)板和無(wú)線(xiàn)數據傳輸模塊接口部分
圖3.5 5V電平轉3.3V電平部分
3.2.5 鍵盤(pán)部分
圖3.6 鍵盤(pán)部分
鍵盤(pán)部分用來(lái)實(shí)現人機通信。有四個(gè)按鍵開(kāi)關(guān)構成,分別為S5(P3.3/INT1), S6(P3.4/T0), S7(P3.5/T0), S5(P3.2/INT0),正常情況下均為高電平。當鍵按下后,輸出為低電平。由于四個(gè)鍵盤(pán)的組成一樣,這里只畫(huà)出了S5的電路圖。圖3.6為鍵盤(pán)部分。
3.3 無(wú)線(xiàn)數據傳輸模塊
通過(guò)仔細的比較和反復的論證后,決定選用nRF2401芯片作為無(wú)線(xiàn)模塊的核心芯片,它的特點(diǎn)在上一章已經(jīng)詳細論述,這里不在重復。nRF2401芯片的典型應用電路如圖3.7所示。
圖3.7 nRF2401芯片的典型應用電路
從圖11可以看出,只需要很少外圍電路就可以組成無(wú)線(xiàn)數據傳輸模塊。
它與開(kāi)發(fā)板的接口電路為圖3.8
各個(gè)接口的要求如下:
(1) VCC腳接電壓范圍為 1.9V~3.6V之間,不能在這個(gè)區間之外,超過(guò)3.6V將會(huì )燒毀模塊。推薦電壓3.3V左右。
(2) 除電源 VCC 和接地端,其余腳都可以直接和普通的 5V 單片機IO 口直接相連,無(wú)需電平轉換。當然對 3V 左右的單片機更加適用了。
(3) 硬件上面沒(méi)有SPI的單片機也可以控制本模塊,用普通單片機IO口模擬SPI不需要單片機真正的串口介入,只需要普通的單片機IO口就可以了,當然用串口也可以了。
(4)6腳,12腳為接地腳,需要和開(kāi)發(fā)板的邏輯地連接起來(lái)。
圖3.8 無(wú)線(xiàn)數據傳輸模塊與開(kāi)發(fā)板的接口電路
3.4 無(wú)線(xiàn)數據傳輸模塊和開(kāi)發(fā)板的PCB圖設計
PCB板是一塊絕緣材料,在表面合理安放各種電子元件,并安排連接電子元件引腳間的銅膜導線(xiàn),在不同的表面間有連接不同表面的銅導孔。
隨著(zhù)電子技術(shù)的不斷發(fā)展進(jìn)步,PCB在復雜程度和應用范圍方面都有了長(cháng)足的進(jìn)步,按復雜程度來(lái)分,可以將PCB板分為3類(lèi):1.單面印刷電路板;2.雙面印刷電路板;3.多層印刷電路板。為了方便布線(xiàn),本系統所用的開(kāi)發(fā)板和無(wú)線(xiàn)數據傳輸模塊均為雙層印刷電路板。
PCB的生成主要由四個(gè)過(guò)程組成:其一是原理圖的生成;其二是根據已經(jīng)生成的原理圖產(chǎn)生對應的網(wǎng)絡(luò )表,網(wǎng)絡(luò )表是PCB圖和原理圖的紐帶;第三步是新建一個(gè)PCB文件,并導入網(wǎng)絡(luò )表;第四步是將合理布局元件,并用導線(xiàn)將元件的引腳連起來(lái)。
3.4.1 開(kāi)發(fā)板的PCB圖
將開(kāi)發(fā)板的原理圖按照以上的步驟生成相應的PCB圖。如圖3.9所示:
在PCB圖設計的所有過(guò)程中,原理圖在上一節已經(jīng)生成。網(wǎng)絡(luò )表的生成也比較簡(jiǎn)單。由于PCB圖上使用元件的封裝來(lái)代表元件,因此原理圖中各個(gè)元件都要明確有自己的封裝方式,而且在繪制PCB圖前必須將用到的封裝所在的封裝庫調入。否則,在調入網(wǎng)絡(luò )表的過(guò)程中將會(huì )出現元件丟失的錯誤。
圖3.9 開(kāi)發(fā)板的PCB圖
開(kāi)發(fā)板上主要用到兩個(gè)封裝庫:Advpcb.ddb和Miscellaneous.ddb.另外由于USB電源接口,電源開(kāi)關(guān),鍵盤(pán)和四位八段數碼管沒(méi)有對應的封裝,因此需要使用元件庫編輯器建立新元件封裝。圖3.10為鍵盤(pán)封裝,圖3.11為USB封裝,圖3.12為開(kāi)關(guān)封裝,圖3.13為四位八段數碼管封裝。
圖3.10 鍵盤(pán)封裝 圖3.11 USB封裝
圖3.12 開(kāi)關(guān)封裝 圖3.13 四位八段數碼管封裝
各個(gè)元件的封裝的引腳的序號必須和原理圖中引腳的序號保持一致,不然將會(huì )在調如網(wǎng)絡(luò )表過(guò)程中出現管腳丟失的錯誤。
下面再重點(diǎn)分析一下布線(xiàn)的過(guò)程。
布線(xiàn)是完成產(chǎn)品設計的重要步驟,可以說(shuō)前面的準備工作都是為它而做的,在整個(gè)PCB中,以布線(xiàn)的設計過(guò)程限定最高,技巧最細、工作量最大。本系統的PCB布線(xiàn)為雙面布線(xiàn),布線(xiàn)的方式有兩種:自動(dòng)布線(xiàn)及交互式布線(xiàn)。但由于自動(dòng)布線(xiàn)效果不好,往往實(shí)際的效果和預計效果有很大的出入,因此全部使用交互式布線(xiàn)。布線(xiàn)過(guò)程中充分考慮到如何降低元件字之間互相的干擾。
首先根據印制線(xiàn)路板電流的大小,盡量加租電源線(xiàn)寬度,減少環(huán)路電阻,它們的關(guān)系是:地線(xiàn)>電源線(xiàn)>信號線(xiàn)。同時(shí)使電源線(xiàn)、地線(xiàn)的走向和數據傳遞的方向一致,這樣有助于增強抗噪聲能力。線(xiàn)條有講究:有條件做寬的線(xiàn)決不做細;高壓及高頻線(xiàn)應園滑,不得有尖銳的倒角,拐彎也不得采用直角。
由于采用雙層設計,因此不可避免地將會(huì )使用到過(guò)孔。過(guò)孔太多,沉銅工藝稍有不慎就會(huì )埋下隱患。所以,設計中應盡量減少過(guò)線(xiàn)孔。此外,應該合理布置電源濾波/退耦電容:一般在原理圖中僅畫(huà)出若干電源濾波/退耦電容,但未指出它們各自應接于何處。其實(shí)這些電容是為開(kāi)關(guān)器件(門(mén)電路)或其它需要濾波/退耦的部件而設置的,布置這些電容就應盡量靠近這些元部件,離得太遠就沒(méi)有作用了。
3.4.2 無(wú)線(xiàn)數據傳輸模塊的PCB圖
由于無(wú)線(xiàn)數據傳輸模塊的核心芯片工作在2.4GHZ,因此在設計PCB圖時(shí)對干擾的控制要格外重視。在PCB設計時(shí),必須考慮到各種電磁干擾,注意調整電阻、電容和電感的位置,特別要注意電容的位置。
nRF2401的PCB為雙層板,底層一般不放置元件,頂層的空余地方敷上銅,這些敷銅通過(guò)過(guò)孔與底層的地相連。nRF2401的供電電源應通過(guò)電容隔開(kāi),這樣有利于給nRF2401提供穩定的電源。在PCB中,盡量多打一些通孔,使頂層和底層的地能夠充分接觸。nRF2401模塊的PCB如圖3.14所示。
圖3.14 無(wú)線(xiàn)數據傳輸模塊的PCB圖
第四章 硬件驅動(dòng)程序和串行口調試工具
驅動(dòng)程序是硬件電路的靈魂,沒(méi)有驅動(dòng)的硬件電路是沒(méi)有用的。STC89C58RD+是51類(lèi)單片機,可以像開(kāi)發(fā)其他51單片機驅動(dòng)一樣開(kāi)發(fā)它的驅動(dòng)程序。單片機軟件開(kāi)發(fā)平臺選擇比較流行的Keil uVision2,因為現在關(guān)于Keil uVision2軟件的資料很多,這樣上手就會(huì )很快。
串行口調試工具是用來(lái)將PC機上的數據通過(guò)串行口發(fā)送到單片機,和PC機接收從單片機發(fā)送過(guò)來(lái)的數據。選用Visual C++ 6.0來(lái)開(kāi)發(fā)串行口調試工具,Visual C++ 6.0是微軟公司推出的一款優(yōu)秀開(kāi)發(fā)工具,代碼緊湊,運行速度快,而且比較適合低層開(kāi)發(fā)。
4.1 硬件驅動(dòng)程序
整個(gè)數據傳輸系統有兩部分組成:與PC機相連的開(kāi)發(fā)板為主機端,它不能移動(dòng),接收從機端發(fā)送過(guò)來(lái)的數據,并向從機端發(fā)送指令;可以移動(dòng)的為從機端,它由開(kāi)發(fā)板和無(wú)線(xiàn)數據傳輸模塊組成。由于兩端的地位和功能不同,因此對應的驅動(dòng)程序也不同。
使用Keil uVision2開(kāi)發(fā)硬件驅動(dòng)程序,它支持眾多不同公司的MCS51架構的芯片,它集編輯,編譯,仿真等于一體,同時(shí)還支持,PLM,匯編和C語(yǔ)言的程序設計,它的界面和常用的微軟VC++的界面相似,界面友好,易學(xué)易用,在調試程序,軟件仿真方面也有很強大的功能。因此很多開(kāi)發(fā)51應用的工程師或普通的單片機愛(ài)好者,都對它十分喜歡。51 的編程語(yǔ)言常用的有二種,一種是匯編語(yǔ)言,一種是 C 語(yǔ)言。匯編語(yǔ)言的機器代碼生成效率很高但可讀性卻并不強,復雜一點(diǎn)的程序就更是難讀懂,而 C 語(yǔ)言在大多數情況下其機器代碼生成效率和匯編語(yǔ)言相當,但可讀性和可移植性卻遠遠超過(guò)匯編語(yǔ)言,而且 C 語(yǔ)言還可以嵌入匯編來(lái)解決高時(shí)效性的代碼編寫(xiě)問(wèn)題。對于開(kāi)發(fā)周期來(lái)說(shuō),中大型的軟件編寫(xiě)用 C 語(yǔ)言的開(kāi)發(fā)周期通常要小于匯編語(yǔ)言很多。綜合以上C語(yǔ)言的優(yōu)點(diǎn),在開(kāi)發(fā)時(shí)選擇了C51語(yǔ)言.
4.1.1 主機端硬件驅動(dòng)程序
主機端的硬件驅動(dòng)程序主要有兩種功能:實(shí)現開(kāi)發(fā)板通過(guò)串行口和PC機通信;實(shí)現開(kāi)發(fā)板通過(guò)某些I/O口和無(wú)線(xiàn)數據傳輸模塊進(jìn)行通信。
STC89C58RD+單片機的串行口是一個(gè)全雙工通信接口,即能同時(shí)進(jìn)行發(fā)送和接收,它可以作UART用,也可以作為同步移位寄存器用,其禎格式和波特率可以通過(guò)軟件編程來(lái)設置,在使用上非常方便。
STC89C58RD+單片機串行口的工作方式和波特率由控制寄存器SCON和特殊功能寄存器PCON組成。
串行口控制寄存器SCON:
D7 D6 D5 D4 D3 D2 D1 D0
SM0 SM1 SM2 REN TB8 RB8 TI RI
特殊功能寄存器PCON:
D7 D6 D5 D4 D3 D2 D1 D0
SMOD
串行口可以通過(guò)軟件設置四種工作方式,各種工作方式的數據格式和波特率均有所不同,這四種工作方式如下:
1. 方式0
當設定SM1、SM0為00時(shí),串行口工作于方式0,在方式0下,RXD為數據輸入/輸出端,TXD為同步脈沖輸出端,發(fā)送或接收的數據為8位,低位在前,高位在后,方式0的波特率固定震蕩頻率的1 /12,也就是每一機器周期傳送一位數據。方式0可以外接移位寄存器,將串行口擴展為并行口,也可以外接同步輸入/輸出設備。發(fā)送完畢后,硬件自動(dòng)將TI置1。再次發(fā)送數據前,需要軟件將TI位清0。
REN為1時(shí),單片機允許接收數據。RXD為數據接收端,接受數據保存到SBUF接收緩沖器中。發(fā)送完畢后,硬件自動(dòng)將RI置1。再次接收數據前,需要通過(guò)軟件將RI清0。
2. 方式 1
當設定SM1、SM0為01時(shí),串行口工作方式1。方式1為波特率可變的8位異步通信方式,由TXD發(fā)送RXD接收,一幀數據為10位,1位起始位(低電平),8位數據位(低位在前)和1位停止位(高電平),波特率取決于定時(shí)器 的T 溢出率(1/溢出周期)和波特率的選擇位SMOD。
3.方式2和方式3
當設定SM0、SM1為10或11時(shí),串行口工作于方式2或方式3,這兩種方式都是9位異步通信,僅波特率不同,適用于多機通信。在方式2或方式3下,數據由TXD發(fā)送RXD接收,1幀數據為11位,1位起始位(低電平),8位數據位(低位在前),1位可編程位(第9位數據,用作奇偶校驗或地址/數據選擇),1位停止位(高電平)。與方式1相比,多了一位可編程位,發(fā)送時(shí),第9位數據為T(mén)B8,接收時(shí),第9位數據送入RB8。
通過(guò)以上單片機串行口各種工作方式的比較,由于使用一個(gè)開(kāi)發(fā)板和PC機進(jìn)行單獨的通信,因此工作方式1比較適合系統的要求。通過(guò)設置合適的波特率和幀格式,來(lái)實(shí)現開(kāi)發(fā)板和PC機之間準確的數據傳遞。
由于PC機和單片機的處理速度的不同,PC機給開(kāi)發(fā)板發(fā)送數據時(shí),單片機采用中斷的方式進(jìn)行數據接收。通過(guò)軟件設置單片機的傳輸屬性參數為”9600,N,8,1″,來(lái)實(shí)現和PC機端串行口傳輸速率同步。開(kāi)發(fā)板向PC機發(fā)送數據時(shí),采用查詢(xún)方式,這樣可以節省單片機有限的資源。
開(kāi)發(fā)板還要通過(guò)專(zhuān)門(mén)的接口和無(wú)線(xiàn)數據傳輸模塊進(jìn)行數據交換,由于系統設計為點(diǎn)對點(diǎn)通信,因此只使用了nRF2401一個(gè)信道。nRF2401的數據傳輸方式為同步傳輸,因此使用普通的I/O口通過(guò)軟件方式模擬SPI方式傳輸。
nRF2401有四種工作模式:收發(fā)模式,配置模式,空閑模式和關(guān)機模式[16][17]。工作模式由PWR_UP 、CE、TX_EN和CS三個(gè)引腳決定,詳見(jiàn)表4.1。
表4.1 nRF2401的各種工作模式的設置方式
工作模式 PWR_UP CE CS
收發(fā)模式 1 1 0
配置模式 1 0 1
空閑模式 1 0 0
關(guān)機模式 0 * *
前文已經(jīng)講過(guò)有關(guān)nRF2401的收發(fā)方式,這里重點(diǎn)討論一下它的配置方式。nRF2401的所有配置工作都是通過(guò)CS、CLK1和DATA三個(gè)引腳完成,把其配置為ShockBurstTM收發(fā)模式需要15字節的配置字。
ShockBurst TM的配置字可以分為以下四個(gè)部分:
(1) 數據寬度:聲明射頻數據包中數據占用的位數。這使得nRF2401能夠區分接收數據包中的數據和CRC校驗碼;
(2) 地址寬度:聲明射頻數據包中地址占用的位數。這使得nRF2401能夠區分地址和數據;
(3) 地址:接收數據的地址,有通道1的地址和通道2的地址;
(4) CRC:使nRF2401能夠生成CRC校驗碼和解碼。
nRF2401的配置字如表4.2所示:
在配置模式下要保持PWR_UP引腳為高電平,CE引腳為低電平,配置字從最高位開(kāi)始,依次寫(xiě)入nRF2401。在CS引腳的下降沿,新送入的配置字開(kāi)始工作。
表4.2 nRF2401的配置字
位 位數 名字 功能
Shockb
Brst T
M 配置 143:120 24 TEST 保留
119:112 8 DATA2_W 接收頻道2有效數據長(cháng)度
111:104 8 DATA1_W 接收頻道1有效數據長(cháng)度
103:64 40 ADDR2 接收頻道2的地址,最高為5字節
63:24 40 ADDR1 接收頻道1的地址,最高為5字節
23:18 6 ADDR_W 接受頻道地址位數
17 1 CRC_L 8位或16位CRC校驗
16 1 CRC_EN 使能CRC校驗
常用器件配置 15 1 RX2_EN 使能第二頻道
14 1 CM 通信方式設置
13 1 RFDR_SB 發(fā)射數據速率
12:10 3 XO_F 晶震頻率
9:8 2 RF_PWR 發(fā)射輸出電源
7:1 7 RF_CH# 頻道設置
0 1 RX_EN 接收或發(fā)送操作
開(kāi)發(fā)板通過(guò)串行口和PC機交換數據的流程圖如下:
圖4.1 開(kāi)發(fā)板和PC機通過(guò)串行口交換數據的流程圖
開(kāi)發(fā)板通過(guò)IO口和無(wú)線(xiàn)數據傳輸模塊進(jìn)行數據交換的流程圖為圖4.2。
圖4.2開(kāi)發(fā)板通過(guò)IO口和無(wú)線(xiàn)數據傳輸模塊進(jìn)行數據交換的流程圖
4.1.2 移動(dòng)端驅動(dòng)程序
移動(dòng)端的開(kāi)發(fā)板的結構和PC機端的開(kāi)發(fā)板的結構完全相同,但由于它不需要和PC機通信,只需要和無(wú)線(xiàn)數據傳輸模塊進(jìn)行通信。因此相對另一端的驅動(dòng)簡(jiǎn)單一些。具體編程規則在上一節已經(jīng)詳細敘述,這里不再多說(shuō),具體的程序是PC機端程序的一部分。
4.2 串行口調試工具
串行口調試工具是用微軟公司的visual c++6.0[20][21]開(kāi)發(fā)的。幾乎所有世界級的軟件,從業(yè)界領(lǐng)先的Web瀏覽器到面向任務(wù)的企業(yè)應用,都是使用Microsoft Visual C++開(kāi)發(fā)系統來(lái)開(kāi)發(fā)的。要用C++來(lái)開(kāi)發(fā)Windows和Web上的高性能應用程序,Visual C++是效率最高的首選工具。Visual C++ 6.0在不犧牲靈活性、性能和控制力度的同時(shí),給C++帶來(lái)了更高水平的生產(chǎn)效率。它具有可視化的界面,封裝了大量的類(lèi),使界面制作變的很簡(jiǎn)單,使用它可以方便快捷地開(kāi)發(fā)Windows環(huán)境下的應用程序。visual c++6.0專(zhuān)門(mén)為串行口通信提供了Mscomm[20][21]控件,使用該控件程序員不必花時(shí)間去了解比較復雜的API函數,通過(guò)簡(jiǎn)單修改控件的屬性和使用控件提供的方法就可以實(shí)現對串口的配置,完成串口發(fā)送和接收數據。
4.2.1串行通信的基本原理
串行端口的本質(zhì)功能是作為CPU和串行設備間的編碼轉換器。當數據從CPU經(jīng)過(guò)串行端口發(fā)送出去時(shí),字節數據轉換為串行的位。在接收數據時(shí),串行的位被轉換為字節數據。 在Windows環(huán)境下,串口是系統資源的一部分。 應用程序要使用串口進(jìn)行通信,必須在使用之前向操作系統提出資源申請要求(打開(kāi)串口),通信完成后必須釋放資源(關(guān)閉串口)。32位下串口通信程序可以用兩種方法實(shí)現:利用ActiveX控件;使用API通信函數。在本次課程設計中,所用到的是MFC的MSComm控件,下面先將這個(gè)關(guān)鍵的控件做一下簡(jiǎn)單的介紹。
Microsoft Communications Control(以下簡(jiǎn)稱(chēng)MSComm)是Microsoft公司提供的簡(jiǎn)化Windows下串行通信編程的ActiveX控件,為應用程序提供串行通信功能,它為應用程序提供了通過(guò)串行接口收發(fā)數據的簡(jiǎn)便方法。MSComm控件在串口編程時(shí)非常方便,其實(shí)際上是調用了API函數,但我們不必再了解復雜的API函數就可控制串行通信。通信的過(guò)程,實(shí)際上是對屬性的操作和對控件事件的響應。
在Windows操作系統中,串行通信采用”事件通知”方式,支持數據按塊傳送。進(jìn)行通信時(shí),Windows開(kāi)辟一個(gè)用戶(hù)定義的輸入輸出緩沖區,每接收一個(gè)字符就產(chǎn)生一個(gè)低級硬件中斷,串行驅動(dòng)程序立即取得控制權,并將字符放入輸入數據緩沖區,然后將控制權返還正在運行的應用程序。如果輸入數據緩沖區滿(mǎn)了,驅動(dòng)程序用當前定義的流控制機制通知發(fā)送方停止發(fā)送數據。發(fā)送數據也采用類(lèi)似的處理方式,應用程序將需要發(fā)送的數據放入輸出數據緩沖區,串口每發(fā)送一個(gè)字符就產(chǎn)生一個(gè)低級硬件中斷。
Visual C++ 6.0通信控件Mscomm提供了功能完善的串口數據的發(fā)送和接收功能,Mscomm 控件具有兩種處理方式:一是事件驅動(dòng)(Event-driven)方法,一是查詢(xún)法。
1)事件驅動(dòng)方式。當通信事件發(fā)生時(shí),MSCOMM控件會(huì )觸發(fā)OnComm事件,調用者可以捕獲該事件,通過(guò)檢查其CommEvent屬性便可確認發(fā)生的是哪種事件或錯誤,從而進(jìn)行相應的處理。這種方法的優(yōu)點(diǎn)是響應及時(shí)、可靠性高。
2)查詢(xún)方式。在程序的每個(gè)關(guān)鍵功能之后,可以通過(guò)檢查CommEvent屬性的值來(lái)查詢(xún)事件和錯誤。如果應用程序較小,這種方法可能更可取。例如,如果寫(xiě)一個(gè)簡(jiǎn)單的電話(huà)撥號程序,則沒(méi)有必要每接收1個(gè)字符都產(chǎn)生事件,因為惟一等待接收的字符是調制解調器的”確定”響應。
在使用MSCOMM控件時(shí),1個(gè)MSCOMM控件只能同時(shí)對應1個(gè)串口。如果應用程序需要訪(fǎng)問(wèn)和控件多個(gè)串口,那么必須使用多個(gè)MSCOMM控件。
在VC++中,MSCOMM控件只對應著(zhù)1個(gè)C++類(lèi)–CMSComm。由于MSCOMM控件本身沒(méi)有提供方法,所以CMSComm類(lèi)除了Create()成員函數外,其他的函數都是Get/Set函數對,用來(lái)獲取或設置控件的屬性。MSCOMM控件也只有1個(gè)OnComm事件,用來(lái)向調用者通知有通信事件發(fā)生。
MSCOMM控件有許多很重要的屬性,限于篇幅只給出幾個(gè)較為重要和常用的屬性。
表4.3 MSCOMM控件的重要屬性
屬 性 說(shuō) 明
CommPort 通信端口號
Settings 以字符串形式表示的波特率、奇偶校驗、數據位
PortOpen 通信端口的狀態(tài),打開(kāi)或是關(guān)閉
Input 接收數據
Output 發(fā)送數據
InputMode 接收數據的類(lèi)型:0為文本;1為二進(jìn)制
表4.4 程序中用到的所有控件,以及它們的ID
控件 ID 標題
按鈕 ID_SEND 發(fā)送
按鈕 ID_CLEAR 清空
編輯框 IDC_EDIT_SEND
編輯框 IDC_EDIT_RCV
靜態(tài)文本 IDC_STATIC 接收緩沖區
靜態(tài)文本 IDC_STATIC 發(fā)送緩沖區
組框 IDC_STATIC 端口選擇
單選按鈕 IDC_1 端口1
單選按鈕 IDC_2 端口2
mscomm IDC_MSCOMM
表4.5 用到的變量和變量的類(lèi)型
Control IDS Type Member
IDC_EDIT_SEND CString m_str_send
IDC_EDIT_RCV CString m_str_recv
IDC_MSCOMM CMSComm m_mscomm
Object IDS Messages Function
ID_SEND BN_CLICKED OnSend
ID_CLEAR BN_CLICKED OnClr
IDC_1 BN_CLICKED On_Com1
IDC_2 BN_CLICKED On_Com2
IDC_MSComm OnComm OnComm
4.2.2程序設計原理
第一步:初始化串行口。調用SetCommPort()函數,選擇使用的端口好,然后設置波特率發(fā)送接收的處理方式,以及數據的傳輸方式,最后將串口打開(kāi)。
第二步:發(fā)送數據。將要發(fā)送的字符串變成特定的類(lèi)型后,調用函數SetOutput(),將數據發(fā)送到發(fā)送緩沖區
第三步:接受數據。將接收緩沖區中的數據通過(guò)GetInput()函數讀出,并將它轉換為Cstring類(lèi)型,顯示在界面上。
程序的各個(gè)主要部分和一些流程圖:
(1)登陸界面后,程序首先將接收緩沖區和發(fā)送緩沖區清空
程序如下:
m_str_send=” “;
m_str_recv=” “;
UpdateData(FALSE);
(2)然后進(jìn)行串行口的初始化,也即是設置MSComm控件的各種屬性。首先要進(jìn)行端口的選擇,由于所用到的計算機只有兩個(gè)串行口,因此本程序只給了兩個(gè)選擇,具體的程序代碼如下:
void CMyDlg::On_Com1()
{
if(m_mscomm.GetPortOpen())
m_mscomm.SetPortOpen(FALSE);
m_mscomm.SetCommPort(1);
m_mscomm.SetSettings(”9600,n,8,1″);
m_mscomm.SetRThreshold(1);
m_mscomm.SetSThreshold(0);
m_mscomm.SetInputLen(0);
m_mscomm.SetInputMode(1);
m_mscomm.SetPortOpen(TRUE);
}
void CMyDlg::On_Com2()
{
if(m_mscomm.GetPortOpen())
m_mscomm.SetPortOpen(FALSE);
m_mscomm.SetCommPort(2);
m_mscomm.SetSettings(”9600,n,8,1″);
m_mscomm.SetRThreshold(1);
m_mscomm.SetSThreshold(0);
m_mscomm.SetInputLen(0);
m_mscomm.SetInputMode(1);
m_mscomm.SetPortOpen(TRUE);
}
1)CommPort:分別選1和2。
2) Setting設置或返回串行端口的波特率:9600、無(wú)奇偶校驗位、數據位數為8、1位停止位。
3) InBufferSize:設置接收緩沖區為1024字節。
4) RThreshold:設置當接收緩沖區內字節個(gè)數為1時(shí),觸發(fā)MSCOMM的OnComm事件,然后由計算機將接收緩沖的數據讀出,并將接收緩沖區清空。
5) InputLen:值為0,設置INPUT讀取整個(gè)緩沖區的內容。
6) OutBufferSize:設置發(fā)送緩沖區為512字節。
(3)發(fā)送數據的源程序代碼
void CMyDlg::OnSend()
{
if(!m_mscomm.GetPortOpen())
m_mscomm.SetPortOpen(TRUE);
UpdateData(TRUE);
m_mscomm.SetOutput(COleVariant(m_str_send)); //發(fā)送數據
}
將文本框內的字符串送到變量m_str_send中,然后將字符轉化為ColeVariant類(lèi)型的數據,再通過(guò)SetOutput函數將數據發(fā)送到發(fā)送緩沖區中。
(4)接收數據的源程序代碼
void CMyDlg::OnComm()
{
VARIANT variant_tmp;
COleSafeArray safearray_tmp;
LONG len,i;
BYTE buf[2048];
CString str_tmp;
if(m_mscomm.GetCommEvent()==2)
{
variant_tmp=m_mscomm.GetInput();
safearray_tmp=variant_tmp;
len=safearray_tmp.GetOneDimSize();
for(i=0;ilen;i++)
safearray_tmp.GetElement(i,buf+i);
for(i=0;ilen;i++)
{
BYTE ch=*(char*)(buf+i);
str_tmp.Format(”%c”,ch);
m_str_recv+=str_tmp;
}
}
UpdateData(FALSE);
}
當m_mscomm.GetCommEvent()==2時(shí)候,數據到來(lái),觸發(fā)OnComm事件,調用該函數。首先通過(guò)m_mscomm.GetInput()將接收緩沖區內的數據讀到變量variant_tmp中,再將variant_tmp賦予safearray_tmp來(lái)實(shí)現數據類(lèi)型轉化為ColeSafeArray。通過(guò)safearray_tmp.GetOneDimSize()求出接收到的字符的總長(cháng)度,再將每個(gè)ColeSafeArray變量轉化為Byte類(lèi)型的變量,最后轉化為字符類(lèi)型,并將它顯示在文本框內。
void CMyDlg::OnComm() 的流程圖:
圖4.3 void CMyDlg::OnComm() 的流程圖
(5)清空功能函數源代碼
void CMyDlg::OnClr()
{
m_str_send=” “;
m_str_recv=” “;
UpdateData(FALSE);
}
總的程序流程圖如圖4.4所示
圖4.5是PC機通過(guò)端口1向單片機發(fā)送數據時(shí)候的圖型界面。進(jìn)入界面后,首先要進(jìn)行根據連接的串行口選擇要初始化的端口,然后使用鍵盤(pán)在發(fā)送緩沖區內輸入一系列的字符。等單片機開(kāi)發(fā)板上電后,單擊發(fā)送按鍵將數據發(fā)送出去。
圖4.6是PC機通過(guò)串口接收單片機發(fā)送過(guò)來(lái)的數據時(shí)候的圖形界面。在緩沖區接收的數據為二進(jìn)制形式,程序內已經(jīng)將這些二進(jìn)制轉化為字符串在界面上顯示。
圖4.7是串行口調試工具初始運行時(shí)候的圖形界面。
事件驅動(dòng)方式時(shí),由計算機直接管理,字節之間不可控,而且單片機串行口和PC機串行口速率差別較大,接收程序一定要精心合理的設計,才能使傳輸穩定可靠,否則很容易出現意想不到的問(wèn)題。在調試過(guò)程中,如果不小心將串行口調試工具的波特率和開(kāi)發(fā)板串行口的波特率設置為不同,就會(huì )出現錯誤。程序中已經(jīng)將串行口的波特率設置為9600bps,這樣可以避免錯誤。
圖4.5通過(guò)端口1進(jìn)行發(fā)送時(shí)候的圖型界面
圖4.6 通過(guò)串口接收時(shí)候的圖形界面
圖4.7 串行口調試工具的運行界面
第五章 總結與展望
5.1 全文總結
通過(guò)這次畢業(yè)設計,我學(xué)到了不少課本上沒(méi)有的知識,也鍛煉了自己的動(dòng)手能力,將以前學(xué)過(guò)的零散的知識串到一起。
首先在畢業(yè)設計剛開(kāi)始的調研階段,我學(xué)會(huì )了怎么通過(guò)各種方式查詢(xún)相關(guān)的資料。通過(guò)對這些資料的學(xué)習,我大致了解了無(wú)線(xiàn)通信的發(fā)展現狀以及未來(lái)的發(fā)展趨勢,認識到目前無(wú)線(xiàn)通信方面的各種各樣的協(xié)議,以及它們之間的競爭。了解了無(wú)線(xiàn)通信方面的先進(jìn)技術(shù),這些都為我未來(lái)的學(xué)習指明了方向。
我畢業(yè)設計主要涉及硬件和軟件兩個(gè)方面的內容,通過(guò)這些我的硬件和軟件開(kāi)發(fā)能力都獲得了提高。首先在硬件方面,基本了解了電子產(chǎn)品的開(kāi)發(fā)流程和所要做的工作?;菊莆樟薖rotel 99 SE設計原理圖和簡(jiǎn)單的PCB圖的方法,并設計了一個(gè)單片機最小系統。通過(guò)開(kāi)發(fā)板的設計和硬件搭建的過(guò)程,使我對51系列單片機的接口有了更深層次的理解,熟悉了一些單片機常用的外圍電路的引腳和連接方法,如LED數碼管,鍵盤(pán)等。
在軟件方面,通過(guò)串行口調試工具的開(kāi)發(fā),我基本掌握了Visual C++ 6.0的使用方法,加深了對類(lèi)封裝的理解。通過(guò)開(kāi)發(fā)板驅動(dòng)程序的開(kāi)發(fā),使我熟練掌握了Keil uVision2,熟悉了51系列單片機內部的寄存器和編程規則,以及如何控制外圍電路。
當然,由于單片機功能的局限性,當面對很復雜的系統時(shí)像無(wú)線(xiàn)點(diǎn)菜系統,單片機就不太合適。這是因為單片機的引腳過(guò)少,能夠使用操作系統過(guò)于簡(jiǎn)單,不能進(jìn)行復雜的工作調度,也不能驅動(dòng)復雜的外圍電路,因此使用單片機完全實(shí)現點(diǎn)菜系統的要求比較困難。
近幾年來(lái),處理器已經(jīng)發(fā)展到32位機,尤其是以ARM(Advanced RISC Machines)為內核的32位處理器受到越來(lái)越多嵌入式開(kāi)發(fā)人員的青睞。ARM處理器支持復雜的嵌入式操作系統,例如Win CE,UClinux等??梢赃M(jìn)行復雜的功能調度,而且能夠驅動(dòng)比較復雜的外圍電路例如觸摸屏等。這樣使用ARM處理器和嵌入式操作系統,配合嵌入式移動(dòng)數據庫技術(shù),更能完成點(diǎn)菜系統的要求。所以,畢業(yè)設計也給我將來(lái)的學(xué)習指明了一個(gè)方向。
單就本論文而言,主要完成了以下工作:
1.在ZigBee協(xié)議的基礎上,以51系列單片機為處理器,配合一定的外圍電路構建了硬件開(kāi)發(fā)平臺。
2.用C51語(yǔ)言為硬件部分編寫(xiě)驅動(dòng)程序,并用Visual C++6.0開(kāi)發(fā)了串口調試工具。
5.2 研究展望
目前,無(wú)線(xiàn)通信的各種技術(shù)呈現百花齊放的局面。但是隨著(zhù)經(jīng)濟的發(fā)展,人民需求的提高,無(wú)線(xiàn)通信技術(shù)依然有很大的發(fā)展空間。在以下方面仍然有很長(cháng)的路要走。
1隨著(zhù)IP(Internet Protocol,網(wǎng)際協(xié)議)技術(shù)的發(fā)展,無(wú)線(xiàn)通信網(wǎng)和IP網(wǎng)有融合的趨勢。尤其是多媒體信息需求的增加,多媒體信息對實(shí)時(shí)性要求不高的特點(diǎn),使得利用無(wú)線(xiàn)通信網(wǎng)傳輸多媒體信息成為一大熱門(mén)。
2隨著(zhù)人民生活水平的提高,生活方式的轉變,無(wú)線(xiàn)通信技術(shù)必然向移動(dòng)化和便攜化方向發(fā)展。
3由于無(wú)線(xiàn)頻譜資源有限和無(wú)線(xiàn)通信傳輸信道的特殊性,使得如何提高頻譜資源的利用率以及提高抗干擾能力成為未來(lái)很熱門(mén)的研究方向。
4 現代微電子技術(shù)發(fā)展迅猛,摩爾定理仍然有效,集成電路技術(shù)已經(jīng)發(fā)展到SOC,32位的ARM處理器已經(jīng)得到了廣泛的應用。因此在未來(lái)越來(lái)越復雜的嵌入式系統開(kāi)發(fā)中,32位處理器和嵌入式操作系統將得到更廣泛的應用。
c++相關(guān)文章:c++教程
波段開(kāi)關(guān)相關(guān)文章:波段開(kāi)關(guān)原理
塵埃粒子計數器相關(guān)文章:塵埃粒子計數器原理 晶振相關(guān)文章:晶振原理 藍牙技術(shù)相關(guān)文章:藍牙技術(shù)原理 上拉電阻相關(guān)文章:上拉電阻原理 矢量控制相關(guān)文章:矢量控制原理
評論