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