基于單片機(jī)的無線電子點(diǎn)菜系統(tǒng)硬件方案設(shè)計(jì)
3.2 開發(fā)板的各個(gè)組成部分原理圖以及功能
整個(gè)開發(fā)板是由單片機(jī)最小系統(tǒng)和它的一些外圍電路組成,單片機(jī)最小系統(tǒng)做為整個(gè)開發(fā)板的控制中心,控制各個(gè)外圍電路協(xié)調(diào)工作,完成系統(tǒng)設(shè)計(jì)的功能。整個(gè)系統(tǒng)原理圖見附錄2,下面詳細(xì)敘述各個(gè)組成部分的原理及各自實(shí)現(xiàn)的功能。原理圖由Protel 99SE[18][19]繪制。
3.2.1 單片機(jī)最小系統(tǒng)組成電路
單片機(jī)最小系統(tǒng)是整個(gè)開發(fā)板的控制中心,它由電源,復(fù)位電路和晶振組成。電源采用5V供電,晶振為12MHZ。為了便于調(diào)試,將P0.4-P0.7和發(fā)光管相連,發(fā)光管為共陽(yáng)極連接,這是因?yàn)殚_發(fā)板初上電或者或者復(fù)位后,所有的I/O口均為高電平。由于不使用外部存儲(chǔ)器,因此將EA接高電平。為了方便調(diào)試和降低成本,因此選用USB(Universial Serial Bus,通用串口總線)方式供電。USB的即插即用特性,使對(duì)開發(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ī)定為過渡區(qū))。由于單片機(jī)的輸入、輸出電平為TTL電平,與 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下載,因此通過這個(gè)串行口既可以用來和PC機(jī)通信,又能將程序下載到單片機(jī),不用購(gòu)買昂貴的編程器。圖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部分
3.2.4 開發(fā)板和無線數(shù)據(jù)傳輸模塊接口部分
這一部分有兩部分組成:由于nRF2401的工作電壓為1.9V-3.6V,工作電壓超過3.6V就會(huì)燒壞芯片。而開發(fā)板的電源為5V,因此為了使系統(tǒng)工作,必需要有5V電平轉(zhuǎn)換為3.3V電平的部分。為了實(shí)現(xiàn)這一過程,選用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為開發(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 鍵盤部分
鍵盤部分用來實(shí)現(xiàn)人機(jī)通信。有四個(gè)按鍵開關(guān)構(gòu)成,分別為S5(P3.3/INT1), S6(P3.4/T0), S7(P3.5/T0), S5(P3.2/INT0),正常情況下均為高電平。當(dāng)鍵按下后,輸出為低電平。由于四個(gè)鍵盤的組成一樣,這里只畫出了S5的電路圖。圖3.6為鍵盤部分。
3.3 無線數(shù)據(jù)傳輸模塊
通過仔細(xì)的比較和反復(fù)的論證后,決定選用nRF2401芯片作為無線模塊的核心芯片,它的特點(diǎn)在上一章已經(jīng)詳細(xì)論述,這里不在重復(fù)。nRF2401芯片的典型應(yīng)用電路如圖3.7所示。
圖3.7 nRF2401芯片的典型應(yīng)用電路
從圖11可以看出,只需要很少外圍電路就可以組成無線數(shù)據(jù)傳輸模塊。
它與開發(fā)板的接口電路為圖3.8
各個(gè)接口的要求如下:
(1) VCC腳接電壓范圍為 1.9V~3.6V之間,不能在這個(gè)區(qū)間之外,超過3.6V將會(huì)燒毀模塊。推薦電壓3.3V左右。
(2) 除電源 VCC 和接地端,其余腳都可以直接和普通的 5V 單片機(jī)IO 口直接相連,無需電平轉(zhuǎn)換。當(dāng)然對(duì) 3V 左右的單片機(jī)更加適用了。
(3) 硬件上面沒有SPI的單片機(jī)也可以控制本模塊,用普通單片機(jī)IO口模擬SPI不需要單片機(jī)真正的串口介入,只需要普通的單片機(jī)IO口就可以了,當(dāng)然用串口也可以了。
(4)6腳,12腳為接地腳,需要和開發(fā)板的邏輯地連接起來。
圖3.8 無線數(shù)據(jù)傳輸模塊與開發(fā)板的接口電路
3.4 無線數(shù)據(jù)傳輸模塊和開發(fā)板的PCB圖設(shè)計(jì)
PCB板是一塊絕緣材料,在表面合理安放各種電子元件,并安排連接電子元件引腳間的銅膜導(dǎo)線,在不同的表面間有連接不同表面的銅導(dǎo)孔。
隨著電子技術(shù)的不斷發(fā)展進(jìn)步,PCB在復(fù)雜程度和應(yīng)用范圍方面都有了長(zhǎng)足的進(jìn)步,按復(fù)雜程度來分,可以將PCB板分為3類:1.單面印刷電路板;2.雙面印刷電路板;3.多層印刷電路板。為了方便布線,本系統(tǒng)所用的開發(fā)板和無線數(shù)據(jù)傳輸模塊均為雙層印刷電路板。
PCB的生成主要由四個(gè)過程組成:其一是原理圖的生成;其二是根據(jù)已經(jīng)生成的原理圖產(chǎn)生對(duì)應(yīng)的網(wǎng)絡(luò)表,網(wǎng)絡(luò)表是PCB圖和原理圖的紐帶;第三步是新建一個(gè)PCB文件,并導(dǎo)入網(wǎng)絡(luò)表;第四步是將合理布局元件,并用導(dǎo)線將元件的引腳連起來。
3.4.1 開發(fā)板的PCB圖
將開發(fā)板的原理圖按照以上的步驟生成相應(yīng)的PCB圖。如圖3.9所示:
在PCB圖設(shè)計(jì)的所有過程中,原理圖在上一節(jié)已經(jīng)生成。網(wǎng)絡(luò)表的生成也比較簡(jiǎn)單。由于PCB圖上使用元件的封裝來代表元件,因此原理圖中各個(gè)元件都要明確有自己的封裝方式,而且在繪制PCB圖前必須將用到的封裝所在的封裝庫(kù)調(diào)入。否則,在調(diào)入網(wǎng)絡(luò)表的過程中將會(huì)出現(xiàn)元件丟失的錯(cuò)誤。
圖3.9 開發(fā)板的PCB圖
開發(fā)板上主要用到兩個(gè)封裝庫(kù):Advpcb.ddb和Miscellaneous.ddb.另外由于USB電源接口,電源開關(guān),鍵盤和四位八段數(shù)碼管沒有對(duì)應(yīng)的封裝,因此需要使用元件庫(kù)編輯器建立新元件封裝。圖3.10為鍵盤封裝,圖3.11為USB封裝,圖3.12為開關(guān)封裝,圖3.13為四位八段數(shù)碼管封裝。
圖3.10 鍵盤封裝 圖3.11 USB封裝
圖3.12 開關(guān)封裝 圖3.13 四位八段數(shù)碼管封裝
各個(gè)元件的封裝的引腳的序號(hào)必須和原理圖中引腳的序號(hào)保持一致,不然將會(huì)在調(diào)如網(wǎng)絡(luò)表過程中出現(xiàn)管腳丟失的錯(cuò)誤。
下面再重點(diǎn)分析一下布線的過程。
布線是完成產(chǎn)品設(shè)計(jì)的重要步驟,可以說前面的準(zhǔn)備工作都是為它而做的,在整個(gè)PCB中,以布線的設(shè)計(jì)過程限定最高,技巧最細(xì)、工作量最大。本系統(tǒng)的PCB布線為雙面布線,布線的方式有兩種:自動(dòng)布線及交互式布線。但由于自動(dòng)布線效果不好,往往實(shí)際的效果和預(yù)計(jì)效果有很大的出入,因此全部使用交互式布線。布線過程中充分考慮到如何降低元件字之間互相的干擾。
首先根據(jù)印制線路板電流的大小,盡量加租電源線寬度,減少環(huán)路電阻,它們的關(guān)系是:地線>電源線>信號(hào)線。同時(shí)使電源線、地線的走向和數(shù)據(jù)傳遞的方向一致,這樣有助于增強(qiáng)抗噪聲能力。線條有講究:有條件做寬的線決不做細(xì);高壓及高頻線應(yīng)園滑,不得有尖銳的倒角,拐彎也不得采用直角。
由于采用雙層設(shè)計(jì),因此不可避免地將會(huì)使用到過孔。過孔太多,沉銅工藝稍有不慎就會(huì)埋下隱患。所以,設(shè)計(jì)中應(yīng)盡量減少過線孔。此外,應(yīng)該合理布置電源濾波/退耦電容:一般在原理圖中僅畫出若干電源濾波/退耦電容,但未指出它們各自應(yīng)接于何處。其實(shí)這些電容是為開關(guān)器件(門電路)或其它需要濾波/退耦的部件而設(shè)置的,布置這些電容就應(yīng)盡量靠近這些元部件,離得太遠(yuǎn)就沒有作用了。
3.4.2 無線數(shù)據(jù)傳輸模塊的PCB圖
由于無線數(shù)據(jù)傳輸模塊的核心芯片工作在2.4GHZ,因此在設(shè)計(jì)PCB圖時(shí)對(duì)干擾的控制要格外重視。在PCB設(shè)計(jì)時(shí),必須考慮到各種電磁干擾,注意調(diào)整電阻、電容和電感的位置,特別要注意電容的位置。
nRF2401的PCB為雙層板,底層一般不放置元件,頂層的空余地方敷上銅,這些敷銅通過過孔與底層的地相連。nRF2401的供電電源應(yīng)通過電容隔開,這樣有利于給nRF2401提供穩(wěn)定的電源。在PCB中,盡量多打一些通孔,使頂層和底層的地能夠充分接觸。nRF2401模塊的PCB如圖3.14所示。
圖3.14 無線數(shù)據(jù)傳輸模塊的PCB圖
第四章 硬件驅(qū)動(dòng)程序和串行口調(diào)試工具
驅(qū)動(dòng)程序是硬件電路的靈魂,沒有驅(qū)動(dòng)的硬件電路是沒有用的。STC89C58RD+是51類單片機(jī),可以像開發(fā)其他51單片機(jī)驅(qū)動(dòng)一樣開發(fā)它的驅(qū)動(dòng)程序。單片機(jī)軟件開發(fā)平臺(tái)選擇比較流行的Keil uVision2,因?yàn)楝F(xiàn)在關(guān)于Keil uVision2軟件的資料很多,這樣上手就會(huì)很快。
串行口調(diào)試工具是用來將PC機(jī)上的數(shù)據(jù)通過串行口發(fā)送到單片機(jī),和PC機(jī)接收從單片機(jī)發(fā)送過來的數(shù)據(jù)。選用Visual C++ 6.0來開發(fā)串行口調(diào)試工具,Visual C++ 6.0是微軟公司推出的一款優(yōu)秀開發(fā)工具,代碼緊湊,運(yùn)行速度快,而且比較適合低層開發(fā)。
4.1 硬件驅(qū)動(dòng)程序
整個(gè)數(shù)據(jù)傳輸系統(tǒng)有兩部分組成:與PC機(jī)相連的開發(fā)板為主機(jī)端,它不能移動(dòng),接收從機(jī)端發(fā)送過來的數(shù)據(jù),并向從機(jī)端發(fā)送指令;可以移動(dòng)的為從機(jī)端,它由開發(fā)板和無線數(shù)據(jù)傳輸模塊組成。由于兩端的地位和功能不同,因此對(duì)應(yīng)的驅(qū)動(dòng)程序也不同。
使用Keil uVision2開發(fā)硬件驅(qū)動(dòng)程序,它支持眾多不同公司的MCS51架構(gòu)的芯片,它集編輯,編譯,仿真等于一體,同時(shí)還支持,PLM,匯編和C語言的程序設(shè)計(jì),它的界面和常用的微軟VC++的界面相似,界面友好,易學(xué)易用,在調(diào)試程序,軟件仿真方面也有很強(qiáng)大的功能。因此很多開發(fā)51應(yīng)用的工程師或普通的單片機(jī)愛好者,都對(duì)它十分喜歡。51 的編程語言常用的有二種,一種是匯編語言,一種是 C 語言。匯編語言的機(jī)器代碼生成效率很高但可讀性卻并不強(qiáng),復(fù)雜一點(diǎn)的程序就更是難讀懂,而 C 語言在大多數(shù)情況下其機(jī)器代碼生成效率和匯編語言相當(dāng),但可讀性和可移植性卻遠(yuǎn)遠(yuǎn)超過匯編語言,而且 C 語言還可以嵌入?yún)R編來解決高時(shí)效性的代碼編寫問題。對(duì)于開發(fā)周期來說,中大型的軟件編寫用 C 語言的開發(fā)周期通常要小于匯編語言很多。綜合以上C語言的優(yōu)點(diǎn),在開發(fā)時(shí)選擇了C51語言.
4.1.1 主機(jī)端硬件驅(qū)動(dòng)程序
主機(jī)端的硬件驅(qū)動(dòng)程序主要有兩種功能:實(shí)現(xiàn)開發(fā)板通過串行口和PC機(jī)通信;實(shí)現(xiàn)開發(fā)板通過某些I/O口和無線數(shù)據(jù)傳輸模塊進(jìn)行通信。
STC89C58RD+單片機(jī)的串行口是一個(gè)全雙工通信接口,即能同時(shí)進(jìn)行發(fā)送和接收,它可以作UART用,也可以作為同步移位寄存器用,其禎格式和波特率可以通過軟件編程來設(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
串行口可以通過軟件設(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ù)前,需要通過軟件將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ù)為TB8,接收時(shí),第9位數(shù)據(jù)送入RB8。
通過以上單片機(jī)串行口各種工作方式的比較,由于使用一個(gè)開發(fā)板和PC機(jī)進(jìn)行單獨(dú)的通信,因此工作方式1比較適合系統(tǒng)的要求。通過設(shè)置合適的波特率和幀格式,來實(shí)現(xiàn)開發(fā)板和PC機(jī)之間準(zhǔn)確的數(shù)據(jù)傳遞。
由于PC機(jī)和單片機(jī)的處理速度的不同,PC機(jī)給開發(fā)板發(fā)送數(shù)據(jù)時(shí),單片機(jī)采用中斷的方式進(jìn)行數(shù)據(jù)接收。通過軟件設(shè)置單片機(jī)的傳輸屬性參數(shù)為”9600,N,8,1″,來實(shí)現(xiàn)和PC機(jī)端串行口傳輸速率同步。開發(fā)板向PC機(jī)發(fā)送數(shù)據(jù)時(shí),采用查詢方式,這樣可以節(jié)省單片機(jī)有限的資源。
開發(fā)板還要通過專門的接口和無線數(shù)據(jù)傳輸模塊進(jìn)行數(shù)據(jù)交換,由于系統(tǒng)設(shè)計(jì)為點(diǎn)對(duì)點(diǎn)通信,因此只使用了nRF2401一個(gè)信道。nRF2401的數(shù)據(jù)傳輸方式為同步傳輸,因此使用普通的I/O口通過軟件方式模擬SPI方式傳輸。
nRF2401有四種工作模式:收發(fā)模式,配置模式,空閑模式和關(guān)機(jī)模式[16][17]。工作模式由PWR_UP 、CE、TX_EN和CS三個(gè)引腳決定,詳見表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ān)nRF2401的收發(fā)方式,這里重點(diǎn)討論一下它的配置方式。nRF2401的所有配置工作都是通過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引腳為低電平,配置字從最高位開始,依次寫入nRF2401。在CS引腳的下降沿,新送入的配置字開始工作。
表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ā)送操作
開發(fā)板通過串行口和PC機(jī)交換數(shù)據(jù)的流程圖如下:
圖4.1 開發(fā)板和PC機(jī)通過串行口交換數(shù)據(jù)的流程圖
開發(fā)板通過IO口和無線數(shù)據(jù)傳輸模塊進(jìn)行數(shù)據(jù)交換的流程圖為圖4.2。
圖4.2開發(fā)板通過IO口和無線數(shù)據(jù)傳輸模塊進(jìn)行數(shù)據(jù)交換的流程圖
4.1.2 移動(dòng)端驅(qū)動(dòng)程序
移動(dòng)端的開發(fā)板的結(jié)構(gòu)和PC機(jī)端的開發(fā)板的結(jié)構(gòu)完全相同,但由于它不需要和PC機(jī)通信,只需要和無線數(shù)據(jù)傳輸模塊進(jìn)行通信。因此相對(duì)另一端的驅(qū)動(dòng)簡(jiǎn)單一些。具體編程規(guī)則在上一節(jié)已經(jīng)詳細(xì)敘述,這里不再多說,具體的程序是PC機(jī)端程序的一部分。
4.2 串行口調(diào)試工具
串行口調(diào)試工具是用微軟公司的visual c++6.0[20][21]開發(fā)的。幾乎所有世界級(jí)的軟件,從業(yè)界領(lǐng)先的Web瀏覽器到面向任務(wù)的企業(yè)應(yīng)用,都是使用Microsoft Visual C++開發(fā)系統(tǒng)來開發(fā)的。要用C++來開發(fā)Windows和Web上的高性能應(yīng)用程序,Visual C++是效率最高的首選工具。Visual C++ 6.0在不犧牲靈活性、性能和控制力度的同時(shí),給C++帶來了更高水平的生產(chǎn)效率。它具有可視化的界面,封裝了大量的類,使界面制作變的很簡(jiǎn)單,使用它可以方便快捷地開發(fā)Windows環(huán)境下的應(yīng)用程序。visual c++6.0專門為串行口通信提供了Mscomm[20][21]控件,使用該控件程序員不必花時(shí)間去了解比較復(fù)雜的API函數(shù),通過簡(jiǎn)單修改控件的屬性和使用控件提供的方法就可以實(shí)現(xiàn)對(duì)串口的配置,完成串口發(fā)送和接收數(shù)據(jù)。
4.2.1串行通信的基本原理
串行端口的本質(zhì)功能是作為CPU和串行設(shè)備間的編碼轉(zhuǎn)換器。當(dāng)數(shù)據(jù)從CPU經(jīng)過串行端口發(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)要求(打開串口),通信完成后必須釋放資源(關(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)用程序提供了通過串行接口收發(fā)數(shù)據(jù)的簡(jiǎn)便方法。MSComm控件在串口編程時(shí)非常方便,其實(shí)際上是調(diào)用了API函數(shù),但我們不必再了解復(fù)雜的API函數(shù)就可控制串行通信。通信的過程,實(shí)際上是對(duì)屬性的操作和對(duì)控件事件的響應(yīng)。
在Windows操作系統(tǒng)中,串行通信采用”事件通知”方式,支持?jǐn)?shù)據(jù)按塊傳送。進(jìn)行通信時(shí),Windows開辟一個(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)用者可以捕獲該事件,通過檢查其CommEvent屬性便可確認(rèn)發(fā)生的是哪種事件或錯(cuò)誤,從而進(jìn)行相應(yīng)的處理。這種方法的優(yōu)點(diǎn)是響應(yīng)及時(shí)、可靠性高。
2)查詢方式。在程序的每個(gè)關(guān)鍵功能之后,可以通過檢查CommEvent屬性的值來查詢事件和錯(cuò)誤。如果應(yīng)用程序較小,這種方法可能更可取。例如,如果寫一個(gè)簡(jiǎn)單的電話撥號(hào)程序,則沒有必要每接收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)用程序需要訪問和控件多個(gè)串口,那么必須使用多個(gè)MSCOMM控件。
在VC++中,MSCOMM控件只對(duì)應(yīng)著1個(gè)C++類–CMSComm。由于MSCOMM控件本身沒有提供方法,所以CMSComm類除了Create()成員函數(shù)外,其他的函數(shù)都是Get/Set函數(shù)對(duì),用來獲取或設(shè)置控件的屬性。MSCOMM控件也只有1個(gè)OnComm事件,用來向調(diào)用者通知有通信事件發(fā)生。
MSCOMM控件有許多很重要的屬性,限于篇幅只給出幾個(gè)較為重要和常用的屬性。
表4.3 MSCOMM控件的重要屬性
屬 性 說 明
CommPort 通信端口號(hào)
Settings 以字符串形式表示的波特率、奇偶校驗(yàn)、數(shù)據(jù)位
PortOpen 通信端口的狀態(tà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
51單片機(jī)相關(guān)文章:51單片機(jī)教程
單片機(jī)相關(guān)文章:單片機(jī)教程
c++相關(guān)文章:c++教程
單片機(jī)相關(guān)文章:單片機(jī)視頻教程
單片機(jī)相關(guān)文章:單片機(jī)工作原理
波段開關(guān)相關(guān)文章:波段開關(guān)原理
藍(lán)牙技術(shù)相關(guān)文章:藍(lán)牙技術(shù)原理 矢量控制相關(guān)文章:矢量控制原理
評(píng)論