新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于單片機無線電子點菜系統硬件設計及實現

        基于單片機無線電子點菜系統硬件設計及實現

        作者: 時間:2011-06-04 來源:網絡 收藏

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

        本文引用地址:http://www.104case.com/article/172695.htm

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

        3.2.5 鍵盤部分
        圖3.6 鍵盤部分

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

        3.3 無線數據傳輸模塊

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

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

        3.4 無線數據傳輸模塊和開發板的PCB圖

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

        圖3.9 開發板的PCB圖

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

        圖3.10 鍵盤封裝 圖3.11 USB封裝

        圖3.12 開關封裝 圖3.13 四位八段數碼管封裝

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

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

        4.1 硬件驅動程序

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

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

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

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

        圖4.2開發板通過IO口和無線數據傳輸模塊進行數據交換的流程圖

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

        4.2 串行口調試工具

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

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

        表4.4 程序中用到的所有控件,以及它們的ID
        控件 ID 標題
        按鈕 ID_SEND 發送
        按鈕 ID_CLEAR 清空
        編輯框 IDC_EDIT_SEND
        編輯框 IDC_EDIT_RCV
        靜態文本 IDC_STATIC 接收緩沖區
        靜態文本 IDC_STATIC 發送緩沖區
        組框 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程序設計原理
        第一步:初始化串行口。調用SetCommPort()函數,選擇使用的端口好,然后設置波特率發送接收的處理方式,以及數據的傳輸方式,最后將串口打開。
        第二步:發送數據。將要發送的字符串變成特定的類型后,調用函數SetOutput(),將數據發送到發送緩沖區
        第三步:接受數據。將接收緩沖區中的數據通過GetInput()函數讀出,并將它轉換為Cstring類型,顯示在界面上。
        程序的各個主要部分和一些流程圖:
        (1)登陸界面后,程序首先將接收緩沖區和發送緩沖區清空
        程序如下:
        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、無奇偶校驗位、數據位數為8、1位停止位。
        3) InBufferSize:設置接收緩沖區為1024字節。
        4) RThreshold:設置當接收緩沖區內字節個數為1時,觸發MSCOMM的OnComm事件,然后由計算機將接收緩沖的數據讀出,并將接收緩沖區清空。
        5) InputLen:值為0,設置INPUT讀取整個緩沖區的內容。
        6) OutBufferSize:設置發送緩沖區為512字節。
        (3)發送數據的源程序代碼
        void CMyDlg::OnSend()
        {
        if(!m_mscomm.GetPortOpen())
        m_mscomm.SetPortOpen(TRUE);
        UpdateData(TRUE);
        m_mscomm.SetOutput(COleVariant(m_str_send)); //發送數據
        }
        將文本框內的字符串送到變量m_str_send中,然后將字符轉化為ColeVariant類型的數據,再通過SetOutput函數將數據發送到發送緩沖區中。
        (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時候,數據到來,觸發OnComm事件,調用該函數。首先通過m_mscomm.GetInput()將接收緩沖區內的數據讀到變量variant_tmp中,再將variant_tmp賦予safearray_tmp來實現數據類型轉化為ColeSafeArray。通過safearray_tmp.GetOneDimSize()求出接收到的字符的總長度,再將每個ColeSafeArray變量轉化為Byte類型的變量,最后轉化為字符類型,并將它顯示在文本框內。
        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機通過端口1向單片機發送數據時候的圖型界面。進入界面后,首先要進行根據連接的串行口選擇要初始化的端口,然后使用鍵盤在發送緩沖區內輸入一系列的字符。等單片機開發板上電后,單擊發送按鍵將數據發送出去。
        圖4.6是PC機通過串口接收單片機發送過來的數據時候的圖形界面。在緩沖區接收的數據為二進制形式,程序內已經將這些二進制轉化為字符串在界面上顯示。
        圖4.7是串行口調試工具初始運行時候的圖形界面。
        事件驅動方式時,由計算機直接管理,字節之間不可控,而且單片機串行口和PC機串行口速率差別較大,接收程序一定要精心合理的設計,才能使傳輸穩定可靠,否則很容易出現意想不到的問題。在調試過程中,如果不小心將串行口調試工具的波特率和開發板串行口的波特率設置為不同,就會出現錯誤。程序中已經將串行口的波特率設置為9600bps,這樣可以避免錯誤。
        圖4.5通過端口1進行發送時候的圖型界面

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

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

        5.2 研究展望

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

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


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


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

        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 类乌齐县| 香河县| 东至县| 吉安县| 托克逊县| 白山市| 赣州市| 南昌县| 乌兰察布市| 阳信县| 通榆县| 蒙自县| 益阳市| 固安县| 十堰市| 淮阳县| 南皮县| 沙洋县| 西畴县| 密山市| 金阳县| 南郑县| 金山区| 邹城市| 达孜县| 科技| 故城县| 昆山市| 临海市| 舒城县| 正镶白旗| 资溪县| 绍兴县| 廊坊市| 迁西县| 荥经县| 将乐县| 苗栗市| 湘潭市| 呼和浩特市| 德安县|