新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 基于單片機無線電子點菜系統(tǒng)硬件設計及實現(xiàn)

基于單片機無線電子點菜系統(tǒng)硬件設計及實現(xiàn)

作者: 時間:2011-06-04 來源:網(wǎng)絡 收藏

最小是整個開發(fā)板的控制中心,它由電源,復位電路和晶振組成。電源采用5V供電,晶振為12MHZ。為了便于調(diào)試,將P0.4-P0.7和發(fā)光管相連,發(fā)光管為共陽極連接,這是因為開發(fā)板初上電或者或者復位后,所有的I/O口均為高電平。由于不使用外部存儲器,因此將EA接高電平。為了方便調(diào)試和降低成本,因此選用USB(Universial Serial Bus,通用串口總線)方式供電。USB的即插即用特性,使對開發(fā)板供電非常方便。圖3.1所示為最小。
圖3.1 最小
3.2.2 串行口電平轉(zhuǎn)換部分
大多數(shù)PC機都有一個串行通訊端口RS-232用于兩臺計算機間進行串行通訊。RS - 232通訊接口是一種標準化的串行接口,是為DTE(Data Terminal Equipment,遠程通訊連接終端設備)與DCE (Data Communication Equipment,數(shù)據(jù)通訊設備)定義的物理接口。RS-232采用非平衡連接(又稱為單端線路),在這個線路中,信號電壓加到一條導線上,所有的信號電壓都使用一個公共的接地線。為了提高抗干擾能力和增加傳送距離,RS一232的每個腳線的信號和電平規(guī)定采用負邏輯電平,DC(-15一5V)規(guī)定為邏輯”1″,DC(+ 5-+15V)規(guī)定邏輯”0″, DC(-5一+5V規(guī)定為過渡區(qū))。由于單片機的輸入、輸出電平為TTL電平,與 PC機RS-232標準串行接口的電氣規(guī)范不一致,因此要單片機與PC機之間的數(shù)據(jù)通讀,必須進行電平轉(zhuǎn)換。選用的電平轉(zhuǎn)換芯片為MAX232,它的工作電壓為+5V,和單片機的工作電源相同。
由于STC89C58RD+單片機支持ISP下載,因此通過這個串行口既可以用來和PC機通信,又能將程序下載到單片機,不用購買昂貴的編程器。圖3.2所示為串口電平轉(zhuǎn)換部分。
圖3.2 串口電平轉(zhuǎn)換部分
3.2.3 LED部分
由于單片機復位后,各個引腳輸出都為高電平,因此選用共陰極的LED數(shù)碼管。每個數(shù)碼管的使能端com1,com2,com3,com4分別接到P1.0,P1.1,P1.2,P1.3,當向使能端輸出低電平,即可選通相對應的數(shù)碼管。74LS244為三態(tài)輸出的八組緩沖器和總線驅(qū)動器,選用的四位八段數(shù)碼管本身已經(jīng)集成了譯碼器,這樣既簡化了線路的連接,又降低了錯誤發(fā)生的概率。圖3.3為LED部分。
圖3.3 LED部分

本文引用地址:http://butianyuan.cn/article/172695.htm

3.2.4 開發(fā)板和數(shù)據(jù)傳輸模塊接口部分
這一部分有兩部分組成:由于nRF2401的工作電壓為1.9V-3.6V,工作電壓超過3.6V就會燒壞芯片。而開發(fā)板的電源為5V,因此為了使系統(tǒng)工作,必需要有5V電平轉(zhuǎn)換為3.3V電平的部分。為了這一過程,選用LM1117-MAX3.3作為核心芯片。LM1117是一個低壓差電壓調(diào)節(jié)器系列,其壓差在1.2V輸出,負載電流為800mA時為1.2V。LM1117提供電流限制和熱保護,電路包含1個齊納調(diào)節(jié)的帶隙參考電壓以確保輸出電壓的精度在±1%以內(nèi)。LM1117系列具有LLP、TO-263、SOT-223、TO-220和TO-252 D-PAK封裝;此外為了使兩個模塊直接相連,將P2口的部分引腳用排針引到一起,排針間距為 100mil,標準 DIP 插針。圖3.4為開發(fā)板和數(shù)據(jù)傳輸模塊接口部分,圖3.5為5V電平轉(zhuǎn)3.3V電平部分。
圖3.4 開發(fā)板和數(shù)據(jù)傳輸模塊接口部分
圖3.5 5V電平轉(zhuǎn)3.3V電平部分

3.2.5 鍵盤部分
圖3.6 鍵盤部分

鍵盤部分用來人機通信。有四個按鍵開關構(gòu)成,分別為S5(P3.3/INT1), S6(P3.4/T0), S7(P3.5/T0), S5(P3.2/INT0),正常情況下均為高電平。當鍵按下后,輸出為低電平。由于四個鍵盤的組成一樣,這里只畫出了S5的電路圖。圖3.6為鍵盤部分。

3.3 無線數(shù)據(jù)傳輸模塊

通過仔細的比較和反復的論證后,決定選用nRF2401芯片作為無線模塊的核心芯片,它的特點在上一章已經(jīng)詳細論述,這里不在重復。nRF2401芯片的典型應用電路如圖3.7所示。

圖3.7 nRF2401芯片的典型應用電路
從圖11可以看出,只需要很少外圍電路就可以組成無線數(shù)據(jù)傳輸模塊。
它與開發(fā)板的接口電路為圖3.8
各個接口的要求如下:
(1) VCC腳接電壓范圍為 1.9V~3.6V之間,不能在這個區(qū)間之外,超過3.6V將會燒毀模塊。推薦電壓3.3V左右。
(2) 除電源 VCC 和接地端,其余腳都可以直接和普通的 5V 單片機IO 口直接相連,無需電平轉(zhuǎn)換。當然對 3V 左右的單片機更加適用了。
(3) 上面沒有SPI的單片機也可以控制本模塊,用普通單片機IO口模擬SPI不需要單片機真正的串口介入,只需要普通的單片機IO口就可以了,當然用串口也可以了。
(4)6腳,12腳為接地腳,需要和開發(fā)板的邏輯地連接起來。
圖3.8 無線數(shù)據(jù)傳輸模塊與開發(fā)板的接口電路

3.4 無線數(shù)據(jù)傳輸模塊和開發(fā)板的PCB圖

PCB板是一塊絕緣材料,在表面合理安放各種元件,并安排連接元件引腳間的銅膜導線,在不同的表面間有連接不同表面的銅導孔。
隨著技術的不斷發(fā)展進步,PCB在復雜程度和應用范圍方面都有了長足的進步,按復雜程度來分,可以將PCB板分為3類:1.單面印刷電路板;2.雙面印刷電路板;3.多層印刷電路板。為了方便布線,本系統(tǒng)所用的開發(fā)板和無線數(shù)據(jù)傳輸模塊均為雙層印刷電路板。
PCB的生成主要由四個過程組成:其一是原理圖的生成;其二是根據(jù)已經(jīng)生成的原理圖產(chǎn)生對應的網(wǎng)絡表,網(wǎng)絡表是PCB圖和原理圖的紐帶;第三步是新建一個PCB文件,并導入網(wǎng)絡表;第四步是將合理布局元件,并用導線將元件的引腳連起來。
3.4.1 開發(fā)板的PCB圖
將開發(fā)板的原理圖按照以上的步驟生成相應的PCB圖。如圖3.9所示:
在PCB圖的所有過程中,原理圖在上一節(jié)已經(jīng)生成。網(wǎng)絡表的生成也比較簡單。由于PCB圖上使用元件的封裝來代表元件,因此原理圖中各個元件都要明確有自己的封裝方式,而且在繪制PCB圖前必須將用到的封裝所在的封裝庫調(diào)入。否則,在調(diào)入網(wǎng)絡表的過程中將會出現(xiàn)元件丟失的錯誤。

圖3.9 開發(fā)板的PCB圖

開發(fā)板上主要用到兩個封裝庫:Advpcb.ddb和Miscellaneous.ddb.另外由于USB電源接口,電源開關,鍵盤和四位八段數(shù)碼管沒有對應的封裝,因此需要使用元件庫編輯器建立新元件封裝。圖3.10為鍵盤封裝,圖3.11為USB封裝,圖3.12為開關封裝,圖3.13為四位八段數(shù)碼管封裝。

圖3.10 鍵盤封裝 圖3.11 USB封裝

圖3.12 開關封裝 圖3.13 四位八段數(shù)碼管封裝

各個元件的封裝的引腳的序號必須和原理圖中引腳的序號保持一致,不然將會在調(diào)如網(wǎng)絡表過程中出現(xiàn)管腳丟失的錯誤。
下面再重點分析一下布線的過程。
布線是完成產(chǎn)品的重要步驟,可以說前面的準備工作都是為它而做的,在整個PCB中,以布線的設計過程限定最高,技巧最細、工作量最大。本系統(tǒng)的PCB布線為雙面布線,布線的方式有兩種:自動布線及交互式布線。但由于自動布線效果不好,往往實際的效果和預計效果有很大的出入,因此全部使用交互式布線。布線過程中充分考慮到如何降低元件字之間互相的干擾。
首先根據(jù)印制線路板電流的大小,盡量加租電源線寬度,減少環(huán)路電阻,它們的關系是:地線>電源線>信號線。同時使電源線、地線的走向和數(shù)據(jù)傳遞的方向一致,這樣有助于增強抗噪聲能力。線條有講究:有條件做寬的線決不做細;高壓及高頻線應園滑,不得有尖銳的倒角,拐彎也不得采用直角。
由于采用雙層設計,因此不可避免地將會使用到過孔。過孔太多,沉銅工藝稍有不慎就會埋下隱患。所以,設計中應盡量減少過線孔。此外,應該合理布置電源濾波/退耦電容:一般在原理圖中僅畫出若干電源濾波/退耦電容,但未指出它們各自應接于何處。其實這些電容是為開關器件(門電路)或其它需要濾波/退耦的部件而設置的,布置這些電容就應盡量靠近這些元部件,離得太遠就沒有作用了。
3.4.2 無線數(shù)據(jù)傳輸模塊的PCB圖
由于無線數(shù)據(jù)傳輸模塊的核心芯片工作在2.4GHZ,因此在設計PCB圖時對干擾的控制要格外重視。在PCB設計時,必須考慮到各種電磁干擾,注意調(diào)整電阻、電容和電感的位置,特別要注意電容的位置。
nRF2401的PCB為雙層板,底層一般不放置元件,頂層的空余地方敷上銅,這些敷銅通過過孔與底層的地相連。nRF2401的供電電源應通過電容隔開,這樣有利于給nRF2401提供穩(wěn)定的電源。在PCB中,盡量多打一些通孔,使頂層和底層的地能夠充分接觸。nRF2401模塊的PCB如圖3.14所示。
圖3.14 無線數(shù)據(jù)傳輸模塊的PCB圖

第四章 驅(qū)動程序和串行口調(diào)試工具
驅(qū)動程序是電路的靈魂,沒有驅(qū)動的硬件電路是沒有用的。STC89C58RD+是51類單片機,可以像開發(fā)其他51單片機驅(qū)動一樣開發(fā)它的驅(qū)動程序。單片機軟件開發(fā)平臺選擇比較流行的Keil uVision2,因為現(xiàn)在關于Keil uVision2軟件的資料很多,這樣上手就會很快。
串行口調(diào)試工具是用來將PC機上的數(shù)據(jù)通過串行口發(fā)送到單片機,和PC機接收從單片機發(fā)送過來的數(shù)據(jù)。選用Visual C++ 6.0來開發(fā)串行口調(diào)試工具,Visual C++ 6.0是微軟公司推出的一款優(yōu)秀開發(fā)工具,代碼緊湊,運行速度快,而且比較適合低層開發(fā)。

4.1 硬件驅(qū)動程序

整個數(shù)據(jù)傳輸系統(tǒng)有兩部分組成:與PC機相連的開發(fā)板為主機端,它不能移動,接收從機端發(fā)送過來的數(shù)據(jù),并向從機端發(fā)送指令;可以移動的為從機端,它由開發(fā)板和無線數(shù)據(jù)傳輸模塊組成。由于兩端的地位和功能不同,因此對應的驅(qū)動程序也不同。
使用Keil uVision2開發(fā)硬件驅(qū)動程序,它支持眾多不同公司的MCS51架構(gòu)的芯片,它集編輯,編譯,仿真等于一體,同時還支持,PLM,匯編和C語言的程序設計,它的界面和常用的微軟VC++的界面相似,界面友好,易學易用,在調(diào)試程序,軟件仿真方面也有很強大的功能。因此很多開發(fā)51應用的工程師或普通的單片機愛好者,都對它十分喜歡。51 的編程語言常用的有二種,一種是匯編語言,一種是 C 語言。匯編語言的機器代碼生成效率很高但可讀性卻并不強,復雜一點的程序就更是難讀懂,而 C 語言在大多數(shù)情況下其機器代碼生成效率和匯編語言相當,但可讀性和可移植性卻遠遠超過匯編語言,而且 C 語言還可以嵌入?yún)R編來解決高時效性的代碼編寫問題。對于開發(fā)周期來說,中大型的軟件編寫用 C 語言的開發(fā)周期通常要小于匯編語言很多。綜合以上C語言的優(yōu)點,在開發(fā)時選擇了C51語言.
4.1.1 主機端硬件驅(qū)動程序
主機端的硬件驅(qū)動程序主要有兩種功能:實現(xiàn)開發(fā)板通過串行口和PC機通信;實現(xiàn)開發(fā)板通過某些I/O口和無線數(shù)據(jù)傳輸模塊進行通信。
STC89C58RD+單片機的串行口是一個全雙工通信接口,即能同時進行發(fā)送和接收,它可以作UART用,也可以作為同步移位寄存器用,其禎格式和波特率可以通過軟件編程來設置,在使用上非常方便。
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

串行口可以通過軟件設置四種工作方式,各種工作方式的數(shù)據(jù)格式和波特率均有所不同,這四種工作方式如下:
1. 方式0
當設定SM1、SM0為00時,串行口工作于方式0,在方式0下,RXD為數(shù)據(jù)輸入/輸出端,TXD為同步脈沖輸出端,發(fā)送或接收的數(shù)據(jù)為8位,低位在前,高位在后,方式0的波特率固定震蕩頻率的1 /12,也就是每一機器周期傳送一位數(shù)據(jù)。方式0可以外接移位寄存器,將串行口擴展為并行口,也可以外接同步輸入/輸出設備。發(fā)送完畢后,硬件自動將TI置1。再次發(fā)送數(shù)據(jù)前,需要軟件將TI位清0。
REN為1時,單片機允許接收數(shù)據(jù)。RXD為數(shù)據(jù)接收端,接受數(shù)據(jù)保存到SBUF接收緩沖器中。發(fā)送完畢后,硬件自動將RI置1。再次接收數(shù)據(jù)前,需要通過軟件將RI清0。
2. 方式 1
當設定SM1、SM0為01時,串行口工作方式1。方式1為波特率可變的8位異步通信方式,由TXD發(fā)送RXD接收,一幀數(shù)據(jù)為10位,1位起始位(低電平),8位數(shù)據(jù)位(低位在前)和1位停止位(高電平),波特率取決于定時器 的T 溢出率(1/溢出周期)和波特率的選擇位SMOD。
3.方式2和方式3
當設定SM0、SM1為10或11時,串行口工作于方式2或方式3,這兩種方式都是9位異步通信,僅波特率不同,適用于多機通信。在方式2或方式3下,數(shù)據(jù)由TXD發(fā)送RXD接收,1幀數(shù)據(jù)為11位,1位起始位(低電平),8位數(shù)據(jù)位(低位在前),1位可編程位(第9位數(shù)據(jù),用作奇偶校驗或地址/數(shù)據(jù)選擇),1位停止位(高電平)。與方式1相比,多了一位可編程位,發(fā)送時,第9位數(shù)據(jù)為TB8,接收時,第9位數(shù)據(jù)送入RB8。
通過以上單片機串行口各種工作方式的比較,由于使用一個開發(fā)板和PC機進行單獨的通信,因此工作方式1比較適合系統(tǒng)的要求。通過設置合適的波特率和幀格式,來實現(xiàn)開發(fā)板和PC機之間準確的數(shù)據(jù)傳遞。
由于PC機和單片機的處理速度的不同,PC機給開發(fā)板發(fā)送數(shù)據(jù)時,單片機采用中斷的方式進行數(shù)據(jù)接收。通過軟件設置單片機的傳輸屬性參數(shù)為”9600,N,8,1″,來實現(xiàn)和PC機端串行口傳輸速率同步。開發(fā)板向PC機發(fā)送數(shù)據(jù)時,采用查詢方式,這樣可以節(jié)省單片機有限的資源。
開發(fā)板還要通過專門的接口和無線數(shù)據(jù)傳輸模塊進行數(shù)據(jù)交換,由于系統(tǒng)設計為點對點通信,因此只使用了nRF2401一個信道。nRF2401的數(shù)據(jù)傳輸方式為同步傳輸,因此使用普通的I/O口通過軟件方式模擬SPI方式傳輸。
nRF2401有四種工作模式:收發(fā)模式,配置模式,空閑模式和關機模式[16][17]。工作模式由PWR_UP 、CE、TX_EN和CS三個引腳決定,詳見表4.1。

表4.1 nRF2401的各種工作模式的設置方式
工作模式 PWR_UP CE CS
收發(fā)模式 1 1 0
配置模式 1 0 1
空閑模式 1 0 0
關機模式 0 * *

前文已經(jīng)講過有關nRF2401的收發(fā)方式,這里重點討論一下它的配置方式。nRF2401的所有配置工作都是通過CS、CLK1和DATA三個引腳完成,把其配置為ShockBurstTM收發(fā)模式需要15字節(jié)的配置字。
ShockBurst TM的配置字可以分為以下四個部分:
(1) 數(shù)據(jù)寬度:聲明射頻數(shù)據(jù)包中數(shù)據(jù)占用的位數(shù)。這使得nRF2401能夠區(qū)分接收數(shù)據(jù)包中的數(shù)據(jù)和CRC校驗碼;
(2) 地址寬度:聲明射頻數(shù)據(jù)包中地址占用的位數(shù)。這使得nRF2401能夠區(qū)分地址和數(shù)據(jù);
(3) 地址:接收數(shù)據(jù)的地址,有通道1的地址和通道2的地址;
(4) CRC:使nRF2401能夠生成CRC校驗碼和解碼。
nRF2401的配置字如表4.2所示:
在配置模式下要保持PWR_UP引腳為高電平,CE引腳為低電平,配置字從最高位開始,依次寫入nRF2401。在CS引腳的下降沿,新送入的配置字開始工作。
表4.2 nRF2401的配置字
位 位數(shù) 名字 功能
Shockb
Brst T
M 配置 143:120 24 TEST 保留
119:112 8 DATA2_W 接收頻道2有效數(shù)據(jù)長度
111:104 8 DATA1_W 接收頻道1有效數(shù)據(jù)長度
103:64 40 ADDR2 接收頻道2的地址,最高為5字節(jié)
63:24 40 ADDR1 接收頻道1的地址,最高為5字節(jié)
23:18 6 ADDR_W 接受頻道地址位數(shù)
17 1 CRC_L 8位或16位CRC校驗
16 1 CRC_EN 使能CRC校驗
常用器件配置 15 1 RX2_EN 使能第二頻道
14 1 CM 通信方式設置
13 1 RFDR_SB 發(fā)射數(shù)據(jù)速率
12:10 3 XO_F 晶震頻率
9:8 2 RF_PWR 發(fā)射輸出電源
7:1 7 RF_CH# 頻道設置
0 1 RX_EN 接收或發(fā)送操作
開發(fā)板通過串行口和PC機交換數(shù)據(jù)的流程圖如下:
圖4.1 開發(fā)板和PC機通過串行口交換數(shù)據(jù)的流程圖
開發(fā)板通過IO口和無線數(shù)據(jù)傳輸模塊進行數(shù)據(jù)交換的流程圖為圖4.2。

圖4.2開發(fā)板通過IO口和無線數(shù)據(jù)傳輸模塊進行數(shù)據(jù)交換的流程圖

4.1.2 移動端驅(qū)動程序
移動端的開發(fā)板的結(jié)構(gòu)和PC機端的開發(fā)板的結(jié)構(gòu)完全相同,但由于它不需要和PC機通信,只需要和無線數(shù)據(jù)傳輸模塊進行通信。因此相對另一端的驅(qū)動簡單一些。具體編程規(guī)則在上一節(jié)已經(jīng)詳細敘述,這里不再多說,具體的程序是PC機端程序的一部分。

4.2 串行口調(diào)試工具

串行口調(diào)試工具是用微軟公司的visual c++6.0[20][21]開發(fā)的。幾乎所有世界級的軟件,從業(yè)界領先的Web瀏覽器到面向任務的企業(yè)應用,都是使用Microsoft Visual C++開發(fā)系統(tǒng)來開發(fā)的。要用C++來開發(fā)Windows和Web上的高性能應用程序,Visual C++是效率最高的首選工具。Visual C++ 6.0在不犧牲靈活性、性能和控制力度的同時,給C++帶來了更高水平的生產(chǎn)效率。它具有可視化的界面,封裝了大量的類,使界面制作變的很簡單,使用它可以方便快捷地開發(fā)Windows環(huán)境下的應用程序。visual c++6.0專門為串行口通信提供了Mscomm[20][21]控件,使用該控件程序員不必花時間去了解比較復雜的API函數(shù),通過簡單修改控件的屬性和使用控件提供的方法就可以實現(xiàn)對串口的配置,完成串口發(fā)送和接收數(shù)據(jù)。
4.2.1串行通信的基本原理
串行端口的本質(zhì)功能是作為CPU和串行設備間的編碼轉(zhuǎn)換器。當數(shù)據(jù)從CPU經(jīng)過串行端口發(fā)送出去時,字節(jié)數(shù)據(jù)轉(zhuǎn)換為串行的位。在接收數(shù)據(jù)時,串行的位被轉(zhuǎn)換為字節(jié)數(shù)據(jù)。 在Windows環(huán)境下,串口是系統(tǒng)資源的一部分。 應用程序要使用串口進行通信,必須在使用之前向操作系統(tǒng)提出資源申請要求(打開串口),通信完成后必須釋放資源(關閉串口)。32位下串口通信程序可以用兩種方法實現(xiàn):利用ActiveX控件;使用API通信函數(shù)。在本次課程設計中,所用到的是MFC的MSComm控件,下面先將這個關鍵的控件做一下簡單的介紹。
Microsoft Communications Control(以下簡稱MSComm)是Microsoft公司提供的簡化Windows下串行通信編程的ActiveX控件,為應用程序提供串行通信功能,它為應用程序提供了通過串行接口收發(fā)數(shù)據(jù)的簡便方法。MSComm控件在串口編程時非常方便,其實際上是調(diào)用了API函數(shù),但我們不必再了解復雜的API函數(shù)就可控制串行通信。通信的過程,實際上是對屬性的操作和對控件事件的響應。
在Windows操作系統(tǒng)中,串行通信采用”事件通知”方式,支持數(shù)據(jù)按塊傳送。進行通信時,Windows開辟一個用戶定義的輸入輸出緩沖區(qū),每接收一個字符就產(chǎn)生一個低級硬件中斷,串行驅(qū)動程序立即取得控制權,并將字符放入輸入數(shù)據(jù)緩沖區(qū),然后將控制權返還正在運行的應用程序。如果輸入數(shù)據(jù)緩沖區(qū)滿了,驅(qū)動程序用當前定義的流控制機制通知發(fā)送方停止發(fā)送數(shù)據(jù)。發(fā)送數(shù)據(jù)也采用類似的處理方式,應用程序?qū)⑿枰l(fā)送的數(shù)據(jù)放入輸出數(shù)據(jù)緩沖區(qū),串口每發(fā)送一個字符就產(chǎn)生一個低級硬件中斷。
Visual C++ 6.0通信控件Mscomm提供了功能完善的串口數(shù)據(jù)的發(fā)送和接收功能,Mscomm 控件具有兩種處理方式:一是事件驅(qū)動(Event-driven)方法,一是查詢法。
1)事件驅(qū)動方式。當通信事件發(fā)生時,MSCOMM控件會觸發(fā)OnComm事件,調(diào)用者可以捕獲該事件,通過檢查其CommEvent屬性便可確認發(fā)生的是哪種事件或錯誤,從而進行相應的處理。這種方法的優(yōu)點是響應及時、可靠性高。
2)查詢方式。在程序的每個關鍵功能之后,可以通過檢查CommEvent屬性的值來查詢事件和錯誤。如果應用程序較小,這種方法可能更可取。例如,如果寫一個簡單的電話撥號程序,則沒有必要每接收1個字符都產(chǎn)生事件,因為惟一等待接收的字符是調(diào)制解調(diào)器的”確定”響應。
在使用MSCOMM控件時,1個MSCOMM控件只能同時對應1個串口。如果應用程序需要訪問和控件多個串口,那么必須使用多個MSCOMM控件。
在VC++中,MSCOMM控件只對應著1個C++類–CMSComm。由于MSCOMM控件本身沒有提供方法,所以CMSComm類除了Create()成員函數(shù)外,其他的函數(shù)都是Get/Set函數(shù)對,用來獲取或設置控件的屬性。MSCOMM控件也只有1個OnComm事件,用來向調(diào)用者通知有通信事件發(fā)生。
MSCOMM控件有許多很重要的屬性,限于篇幅只給出幾個較為重要和常用的屬性。

表4.3 MSCOMM控件的重要屬性
屬 性 說 明
CommPort 通信端口號
Settings 以字符串形式表示的波特率、奇偶校驗、數(shù)據(jù)位
PortOpen 通信端口的狀態(tài),打開或是關閉
Input 接收數(shù)據(jù)
Output 發(fā)送數(shù)據(jù)
InputMode 接收數(shù)據(jù)的類型:0為文本;1為二進制

表4.4 程序中用到的所有控件,以及它們的ID
控件 ID 標題
按鈕 ID_SEND 發(fā)送
按鈕 ID_CLEAR 清空
編輯框 IDC_EDIT_SEND
編輯框 IDC_EDIT_RCV
靜態(tài)文本 IDC_STATIC 接收緩沖區(qū)
靜態(tài)文本 IDC_STATIC 發(fā)送緩沖區(qū)
組框 IDC_STATIC 端口選擇
單選按鈕 IDC_1 端口1
單選按鈕 IDC_2 端口2
mscomm IDC_MSCOMM

表4.5 用到的變量和變量的類型
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程序設計原理
第一步:初始化串行口。調(diào)用SetCommPort()函數(shù),選擇使用的端口好,然后設置波特率發(fā)送接收的處理方式,以及數(shù)據(jù)的傳輸方式,最后將串口打開。
第二步:發(fā)送數(shù)據(jù)。將要發(fā)送的字符串變成特定的類型后,調(diào)用函數(shù)SetOutput(),將數(shù)據(jù)發(fā)送到發(fā)送緩沖區(qū)
第三步:接受數(shù)據(jù)。將接收緩沖區(qū)中的數(shù)據(jù)通過GetInput()函數(shù)讀出,并將它轉(zhuǎn)換為Cstring類型,顯示在界面上。
程序的各個主要部分和一些流程圖:
(1)登陸界面后,程序首先將接收緩沖區(qū)和發(fā)送緩沖區(qū)清空
程序如下:
m_str_send=” “;
m_str_recv=” “;
UpdateData(FALSE);
(2)然后進行串行口的初始化,也即是設置MSComm控件的各種屬性。首先要進行端口的選擇,由于所用到的計算機只有兩個串行口,因此本程序只給了兩個選擇,具體的程序代碼如下:
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、無奇偶校驗位、數(shù)據(jù)位數(shù)為8、1位停止位。
3) InBufferSize:設置接收緩沖區(qū)為1024字節(jié)。
4) RThreshold:設置當接收緩沖區(qū)內(nèi)字節(jié)個數(shù)為1時,觸發(fā)MSCOMM的OnComm事件,然后由計算機將接收緩沖的數(shù)據(jù)讀出,并將接收緩沖區(qū)清空。
5) InputLen:值為0,設置INPUT讀取整個緩沖區(qū)的內(nèi)容。
6) OutBufferSize:設置發(fā)送緩沖區(qū)為512字節(jié)。
(3)發(fā)送數(shù)據(jù)的源程序代碼
void CMyDlg::OnSend()
{
if(!m_mscomm.GetPortOpen())
m_mscomm.SetPortOpen(TRUE);
UpdateData(TRUE);
m_mscomm.SetOutput(COleVariant(m_str_send)); //發(fā)送數(shù)據(jù)
}
將文本框內(nèi)的字符串送到變量m_str_send中,然后將字符轉(zhuǎn)化為ColeVariant類型的數(shù)據(jù),再通過SetOutput函數(shù)將數(shù)據(jù)發(fā)送到發(fā)送緩沖區(qū)中。
(4)接收數(shù)據(jù)的源程序代碼
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ù)據(jù)到來,觸發(fā)OnComm事件,調(diào)用該函數(shù)。首先通過m_mscomm.GetInput()將接收緩沖區(qū)內(nèi)的數(shù)據(jù)讀到變量variant_tmp中,再將variant_tmp賦予safearray_tmp來實現(xiàn)數(shù)據(jù)類型轉(zhuǎn)化為ColeSafeArray。通過safearray_tmp.GetOneDimSize()求出接收到的字符的總長度,再將每個ColeSafeArray變量轉(zhuǎn)化為Byte類型的變量,最后轉(zhuǎn)化為字符類型,并將它顯示在文本框內(nèi)。
void CMyDlg::OnComm() 的流程圖:

圖4.3 void CMyDlg::OnComm() 的流程圖

(5)清空功能函數(shù)源代碼
void CMyDlg::OnClr()
{
m_str_send=” “;
m_str_recv=” “;
UpdateData(FALSE);
}
總的程序流程圖如圖4.4所示
圖4.5是PC機通過端口1向單片機發(fā)送數(shù)據(jù)時候的圖型界面。進入界面后,首先要進行根據(jù)連接的串行口選擇要初始化的端口,然后使用鍵盤在發(fā)送緩沖區(qū)內(nèi)輸入一系列的字符。等單片機開發(fā)板上電后,單擊發(fā)送按鍵將數(shù)據(jù)發(fā)送出去。
圖4.6是PC機通過串口接收單片機發(fā)送過來的數(shù)據(jù)時候的圖形界面。在緩沖區(qū)接收的數(shù)據(jù)為二進制形式,程序內(nèi)已經(jīng)將這些二進制轉(zhuǎn)化為字符串在界面上顯示。
圖4.7是串行口調(diào)試工具初始運行時候的圖形界面。
事件驅(qū)動方式時,由計算機直接管理,字節(jié)之間不可控,而且單片機串行口和PC機串行口速率差別較大,接收程序一定要精心合理的設計,才能使傳輸穩(wěn)定可靠,否則很容易出現(xiàn)意想不到的問題。在調(diào)試過程中,如果不小心將串行口調(diào)試工具的波特率和開發(fā)板串行口的波特率設置為不同,就會出現(xiàn)錯誤。程序中已經(jīng)將串行口的波特率設置為9600bps,這樣可以避免錯誤。
圖4.5通過端口1進行發(fā)送時候的圖型界面

圖4.6 通過串口接收時候的圖形界面
圖4.7 串行口調(diào)試工具的運行界面
第五章 總結(jié)與展望
5.1 全文總結(jié)

通過這次畢業(yè)設計,我學到了不少課本上沒有的知識,也鍛煉了自己的動手能力,將以前學過的零散的知識串到一起。
首先在畢業(yè)設計剛開始的調(diào)研階段,我學會了怎么通過各種方式查詢相關的資料。通過對這些資料的學習,我大致了解了無線通信的發(fā)展現(xiàn)狀以及未來的發(fā)展趨勢,認識到目前無線通信方面的各種各樣的協(xié)議,以及它們之間的競爭。了解了無線通信方面的先進技術,這些都為我未來的學習指明了方向。
我畢業(yè)設計主要涉及硬件和軟件兩個方面的內(nèi)容,通過這些我的硬件和軟件開發(fā)能力都獲得了提高。首先在硬件方面,基本了解了電子產(chǎn)品的開發(fā)流程和所要做的工作?;菊莆樟薖rotel 99 SE設計原理圖和簡單的PCB圖的方法,并設計了一個單片機最小系統(tǒng)。通過開發(fā)板的設計和硬件搭建的過程,使我對51系列單片機的接口有了更深層次的理解,熟悉了一些單片機常用的外圍電路的引腳和連接方法,如LED數(shù)碼管,鍵盤等。
在軟件方面,通過串行口調(diào)試工具的開發(fā),我基本掌握了Visual C++ 6.0的使用方法,加深了對類封裝的理解。通過開發(fā)板驅(qū)動程序的開發(fā),使我熟練掌握了Keil uVision2,熟悉了51系列單片機內(nèi)部的寄存器和編程規(guī)則,以及如何控制外圍電路。
當然,由于單片機功能的局限性,當面對很復雜的系統(tǒng)時像無線系統(tǒng),單片機就不太合適。這是因為單片機的引腳過少,能夠使用操作系統(tǒng)過于簡單,不能進行復雜的工作調(diào)度,也不能驅(qū)動復雜的外圍電路,因此使用單片機完全實現(xiàn)系統(tǒng)的要求比較困難。
近幾年來,處理器已經(jīng)發(fā)展到32位機,尤其是以ARM(Advanced RISC Machines)為內(nèi)核的32位處理器受到越來越多嵌入式開發(fā)人員的青睞。ARM處理器支持復雜的嵌入式操作系統(tǒng),例如Win CE,UClinux等??梢赃M行復雜的功能調(diào)度,而且能夠驅(qū)動比較復雜的外圍電路例如觸摸屏等。這樣使用ARM處理器和嵌入式操作系統(tǒng),配合嵌入式移動數(shù)據(jù)庫技術,更能完成系統(tǒng)的要求。所以,畢業(yè)設計也給我將來的學習指明了一個方向。
單就本論文而言,主要完成了以下工作:
1.在ZigBee協(xié)議的基礎上,以51系列單片機為處理器,配合一定的外圍電路構(gòu)建了硬件開發(fā)平臺。
2.用C51語言為硬件部分編寫驅(qū)動程序,并用Visual C++6.0開發(fā)了串口調(diào)試工具。

5.2 研究展望

目前,無線通信的各種技術呈現(xiàn)百花齊放的局面。但是隨著經(jīng)濟的發(fā)展,人民需求的提高,無線通信技術依然有很大的發(fā)展空間。在以下方面仍然有很長的路要走。
1隨著IP(Internet Protocol,網(wǎng)際協(xié)議)技術的發(fā)展,無線通信網(wǎng)和IP網(wǎng)有融合的趨勢。尤其是多媒體信息需求的增加,多媒體信息對實時性要求不高的特點,使得利用無線通信網(wǎng)傳輸多媒體信息成為一大熱門。
2隨著人民生活水平的提高,生活方式的轉(zhuǎn)變,無線通信技術必然向移動化和便攜化方向發(fā)展。
3由于無線頻譜資源有限和無線通信傳輸信道的特殊性,使得如何提高頻譜資源的利用率以及提高抗干擾能力成為未來很熱門的研究方向。
4 現(xiàn)代微電子技術發(fā)展迅猛,摩爾定理仍然有效,集成電路技術已經(jīng)發(fā)展到SOC,32位的ARM處理器已經(jīng)得到了廣泛的應用。因此在未來越來越復雜的嵌入式系統(tǒng)開發(fā)中,32位處理器和嵌入式操作系統(tǒng)將得到更廣泛的應用。

c++相關文章:c++教程


波段開關相關文章:波段開關原理


塵埃粒子計數(shù)器相關文章:塵埃粒子計數(shù)器原理
晶振相關文章:晶振原理
藍牙技術相關文章:藍牙技術原理
上拉電阻相關文章:上拉電阻原理
矢量控制相關文章:矢量控制原理

上一頁 1 2 下一頁

評論


相關推薦

技術專區(qū)

關閉