基于單片機(jī)鐵道口報(bào)警系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)_第1頁
基于單片機(jī)鐵道口報(bào)警系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)_第2頁
基于單片機(jī)鐵道口報(bào)警系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)_第3頁
基于單片機(jī)鐵道口報(bào)警系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)_第4頁
基于單片機(jī)鐵道口報(bào)警系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、沈陽工學(xué)院沈陽工學(xué)院 畢業(yè)設(shè)計(jì)報(bào)告畢業(yè)設(shè)計(jì)報(bào)告 題 目:基于單片機(jī)鐵道口報(bào)警系統(tǒng) 的設(shè)計(jì)與實(shí)現(xiàn) 院 系: 信息與控制學(xué)院 專 業(yè): 通信工程 班級學(xué)號: 01 學(xué)生姓名: 李 艷 指導(dǎo)教師: 張可菊 成 績: 2014 年 06 月 25 日 摘摘 要要 本課題通過對單片機(jī) STC89C52 和無線通信模塊 nRF24L01 分析與研究,設(shè)計(jì)了 一個(gè)基于單片機(jī)鐵道口報(bào)警系統(tǒng)的模擬過程。此系統(tǒng)主要研究如何通過無線通信模塊 與單片機(jī)來實(shí)現(xiàn)鐵道口的報(bào)警過程;詳細(xì)的闡述了無線通信收發(fā)模塊 nRF24L01 的通 信特性,單片機(jī)通過接受到 nRF24L01 的信號來控制蜂鳴器和發(fā)光二極管的工作狀態(tài), 從

2、而達(dá)到鐵道口報(bào)警目的。 通過使用 2.4G 無線射頻收發(fā)芯片 nRF24L01 通信的信號,單片機(jī)將無線接收模塊 的信號進(jìn)行處理,再進(jìn)行報(bào)警。nRF24L01 的整體性能很好而且使用較方便;其中跳頻 功能的應(yīng)用很好的解決了無線傳輸存在的干擾問題,適合工業(yè)控制場合;無線射頻模 塊可軟件設(shè)地址,只有收到本機(jī)地址是才會輸出數(shù)據(jù)提供中斷提示,可直接連接各種 系列的單片機(jī)使用,軟件編程方便。由于采用無線傳輸手段,系統(tǒng)隱蔽性好,生存能 力強(qiáng),避免了有線報(bào)警系統(tǒng)安裝時(shí)需要穿墻架線,因而造成破壞已有合理結(jié)構(gòu)的弊端, 故具有極好的應(yīng)用前景。 關(guān)鍵詞:單片機(jī);nRF42L01;報(bào)警;無線通信 Abstract T

3、hrough analysis and research of SCM(Single Chip Micyoco)and wireless communication module railway mouth alarm system is designed, which is based on single chip microcomputer. The system mainly studies alarm process, how to use railway wireless communicati0n module and SCM. Detailed elaborated the wi

4、reless transceiver module nRF24L01 communication features. By using the 2.4 G wireless transceiver chip nRF24L01 transmission data, SCM receive signal and processing, by accepting to nRF24L01 received signal, SCM to control the working state of the buzzer and LED, so as to achieve the railway port a

5、larm purposes. NRF24L01 is very good and its convenient to use at the overall performance. In the actual application testing effect is also very good. The wireless module transmission distance can reach 10 meters. Its suitable for industrial control occasions, nRF24L01 can be connected to a variety

6、of series of SCM and is used directly, software programming is convenient. Because of use wireless transmission mode, so concealment of the system is good and the survival ability is also well. The system of alarm have very good application prospect. Keywords: STC89C52; nRF24L01; alarm; wireless com

7、munication 目 錄 1 硬件部分設(shè)計(jì)硬件部分設(shè)計(jì) .1 1.1 硬件結(jié)構(gòu)設(shè)計(jì) .1 1.2 硬件電路設(shè)計(jì) .2 1.2.1 硬件模塊選擇 .2 1.2.2 硬件模塊設(shè)計(jì) .3 2 軟件部分設(shè)計(jì)軟件部分設(shè)計(jì) .6 2.1 開發(fā)環(huán)境 .6 2.2 主體程序設(shè)計(jì) .6 2.2.1 主程序設(shè)計(jì) .6 2.2.2 NRF24L01 發(fā)送模塊程序設(shè)計(jì) .7 2.2.3 NRF24L01 接收模塊程序設(shè)計(jì) .8 3 系統(tǒng)測試系統(tǒng)測試 .10 3.1 軟件測試 .10 3.2 硬件測試 .10 結(jié)結(jié) 論論 .12 參考文獻(xiàn)參考文獻(xiàn) .13 附錄附錄 A.14 附錄附錄 B.24 附錄附錄 C.26

8、1 硬件部分設(shè)計(jì) 本鐵道口報(bào)警系統(tǒng)的硬件部分主要分為以下幾個(gè)模塊:供電模塊,單片機(jī)最小系 統(tǒng) STC89C52,nRF24L01 無線發(fā)送模塊和 nRF24L01 無線接受模塊,報(bào)警模塊,開關(guān) 和指示燈等模塊組成。系統(tǒng)主機(jī)硬件結(jié)構(gòu)框圖和從機(jī)結(jié)構(gòu)框圖,如圖 1.1 所示。 圖 1.1 系統(tǒng)硬件結(jié)構(gòu)框圖 1.1 硬件結(jié)構(gòu)設(shè)計(jì) 硬件系統(tǒng)工作過程為,閉合開關(guān)使供電模塊對整個(gè)系統(tǒng)電路供電,無線射頻發(fā)送 模塊 nRF24L01 和無線射頻接收模塊 nRF24L01 進(jìn)行數(shù)據(jù)的接收;將接收到的信號傳送 給單片機(jī),單片機(jī)對接收到的數(shù)據(jù)進(jìn)行處理,檢測是否為主機(jī)發(fā)射的信號;確認(rèn)完畢 單片機(jī)對從機(jī)接收報(bào)警模塊做出回

9、應(yīng)是否進(jìn)行報(bào)警,若接收的確是主機(jī)的數(shù)據(jù)則蜂鳴 器和紅色二極管都進(jìn)行報(bào)警,否則單片機(jī)繼續(xù)檢測是否有報(bào)警信號的到來;報(bào)警 30S 結(jié)束后蜂鳴器和紅色二極管停止報(bào)警,綠色二極管亮。 1.2 硬件電路設(shè)計(jì) 當(dāng)主從無線射頻模塊 nRF24L01 供電后,這兩個(gè)模塊會時(shí)時(shí)進(jìn)行數(shù)據(jù)的傳送,主 機(jī)會一直向從機(jī)進(jìn)行發(fā)送信號,直到從機(jī)接收到信號為止,然后在進(jìn)行下次通信。用 nRF24L01 芯片的原因是此 nRF24L01 能夠接受到信號距離小于 10m,所以當(dāng)兩個(gè)模塊 距離在 10m 內(nèi)時(shí)從機(jī) nRF24L01 就會接收到主機(jī)傳送信號;單片機(jī)對接收到的信號進(jìn) 行檢測,滿足主從接收機(jī)的配對時(shí)就會進(jìn)行報(bào)警響應(yīng)。本課

10、題使用 STC89C52 單片機(jī) 的最小系統(tǒng)電路圖,主要控制電路如圖 1.2 所示。 圖 1.2 STC89C52 單片機(jī)最小系統(tǒng) 1.2.1 硬件模塊選擇 電源模塊:的作用就是將輸入的 5V 電壓轉(zhuǎn)換為可供 STC89C52 單片機(jī)和 nRF24L01 模塊使用的 3.3V 電壓,此模塊使用了一個(gè) ASM1117 3.3V 芯片,此芯片既 是將輸出的電壓穩(wěn)定在 3.3V。為 STC89C52 和 nRF24L01 提供穩(wěn)定的工作電壓,是系 統(tǒng)能穩(wěn)定的工作,而不會燒壞單片機(jī)和無線收發(fā)模塊電路。 nRF24L01 無線射頻收發(fā)模塊: (1)發(fā)射數(shù)據(jù)時(shí),首先將 nRF24L01 配置為發(fā)射模式:接

11、著把接收節(jié)點(diǎn)地址 TX_ADDR 和有效數(shù)據(jù) TX_PLD 按照時(shí)序由 SPI 口寫入 nRF24L01 緩存區(qū),TX_PLD 必須在 CSN 為低時(shí)連續(xù)寫入,而 TX_ADDR 在發(fā)射時(shí)寫入一次即可,然后 CE 置為高 電平并保持至少 10s,延遲 130s 后發(fā)射數(shù)據(jù);若自動應(yīng)答開啟,那么 nRF24L01 在發(fā) 射數(shù)據(jù)后立即進(jìn)入接收模式,接收應(yīng)答信號(自動應(yīng)答接收地址應(yīng)該與接收節(jié)點(diǎn)地址 TX_ADDR 一致)。如果收到應(yīng)答,則認(rèn)為此次通信成功,TX_DS 置高,同時(shí) TX_PLD 從 TX FIFO 中清除;若未收到應(yīng)答,則自動重新發(fā)射該數(shù)據(jù)(自動重發(fā)已開啟), 若重發(fā)次數(shù)(ARC)達(dá)到

12、上限,MAX_RT 置高,TX_ FIFO 中數(shù)據(jù)保留以便再次重發(fā); MAX_RT 或 TX_DS 置高時(shí),使 IRQ 變低,產(chǎn)生中斷,通知 MCU。最后發(fā)射成功時(shí), 若 CE 為低則 nRF24L01 進(jìn)入空閑模式 1;若發(fā)送堆棧中有數(shù)據(jù)且 CE 為高,則進(jìn)入下 一次發(fā)射;若發(fā)送堆棧中無數(shù)據(jù)且 CE 為高,則進(jìn)入空閑模式 2 由文獻(xiàn)2可知。 (2)接收數(shù)據(jù)時(shí),首先將 nRF24L01 配置為接收模式,接著延遲 130s 進(jìn)入接收 狀態(tài)等待數(shù)據(jù)的到來。當(dāng)接收方檢測到有效的地址和 CRC 時(shí),就將數(shù)據(jù)包存儲在 RX FIFO 中,同時(shí)中斷標(biāo)志位 RX_DR 置高,IRQ 變低,產(chǎn)生中斷,通知 M

13、CU 去取數(shù)據(jù)。 若此時(shí)自動應(yīng)答開啟,接收方則同時(shí)進(jìn)入發(fā)射狀態(tài)回傳應(yīng)答信號。最后接收成功時(shí), 若 CE 變低,則 nRF24L01 進(jìn)入空閑模式 1 由文獻(xiàn)2可知。 nRF24L01 主要特性如下:GFSK 調(diào)制;硬件集成 OSI 鏈路層,具有自動應(yīng)答和自 動再發(fā)射功能;片內(nèi)自動生成報(bào)頭和 CRC 校驗(yàn)碼;數(shù)據(jù)傳輸率為 l Mb/s 或 2Mb/s;SPI 速率為 0 Mb/s10 Mb/s;125 個(gè)頻道;與其他 nRF24 系列射頻器件相兼容; QFN20 引腳 4 mm4 mm 封裝;供電電壓為 1.9 V3.6 V。 聲光報(bào)警模塊:通過單片機(jī)接收到 nRF24L01 信號對聲光報(bào)警做出

14、響應(yīng),使蜂鳴 器和發(fā)光二極管工作進(jìn)行報(bào)警,達(dá)到提醒道口通行路人正確行走的目的。 信號指示燈模塊:通過電路板上綠色發(fā)光二極管的亮滅,來說明是發(fā)送接收模塊, 系統(tǒng)是否處于工作狀態(tài),便于提示工作人員檢查收發(fā)模塊電路是否處于工作狀態(tài),能 直觀的檢查發(fā)送模塊。 1.2.2 硬件模塊設(shè)計(jì) 電源模塊設(shè)計(jì):所使用的 AMS1117 是一個(gè)低漏失電壓調(diào)整器,它的穩(wěn)壓調(diào)整管是 由一個(gè) PNP 驅(qū)動的 NPN 管組成的,AMS1117 有固定和可調(diào)兩個(gè)版本可用,輸出電壓 有多種可以是:1.2V,1.5V,1.8V,2.5V,2.85V,3.0V,3.3V 和 5.0V。本課題硬件電 源模塊輸出的電壓固定為 3.3V

15、;為了確保 AMS1117 的穩(wěn)定性,對可調(diào)電壓版本,輸 出需要連接一個(gè)至少 22F 的鉭電容。對于固定電壓版本,可采用更小的電容,具體可 以根據(jù)實(shí)際應(yīng)用確定。所以本課題電路是使用 2 個(gè) 10F 的電容來達(dá)到 3.3V 的輸出電 壓,給單片機(jī)和無線模塊供電,電路圖如圖 1.2 所示。 圖 1.2 電源模塊電路組成 nRF24L01 是一款新型單片射頻收發(fā)器件,工作于 2.4 GHz2.5 GHz ISM 頻段。 內(nèi)置頻率合成器、功率放大器、晶體振蕩器、調(diào)制器等功能模塊,并融合了增強(qiáng)型 ShockBurst 技術(shù),其中輸出功率和通信頻道可通過程序進(jìn)行配置。nRF24L01 功耗低, 在以-6d

16、Bm 的功率發(fā)射時(shí),工作電流也只有 9mA;接收時(shí),工作電流只有 12.3mA,多 種低功率工作模式(掉電模式和空閑模式)使節(jié)能設(shè)計(jì)更方便 4 。nRF24L01 模塊接 入電路的引腳圖如圖 1.3 所示;nRF24L01 內(nèi)部電路組成圖如圖 1.4 所示。 圖 1.3 nRF24L01 模塊引腳圖 圖 1.4 nRF24L01 內(nèi)部電路組成圖 聲光報(bào)警模塊設(shè)計(jì):通過從機(jī)單片機(jī)對主機(jī)發(fā)送模塊送來的信號進(jìn)行判定是否為 報(bào)警信號,來控制 P2.6 輸出的高低電平?jīng)Q定是否進(jìn)行報(bào)警。當(dāng)單片機(jī)判定為報(bào)警信號 P2.6 輸出低電平,聲光電路均導(dǎo)通工作,不是報(bào)警信號 P2.6 口輸出高電平,聲光電路 均截止

17、。報(bào)警電路如圖 1.5 所示。 圖 1.5 報(bào)警模塊電路圖 信號指示燈模塊設(shè)計(jì):有信號時(shí) P2.6 口會輸出低電平,此時(shí)二極管發(fā)光,說明此 時(shí)有信號的發(fā)射說明無線射頻發(fā)送是正常工作,圖 1.6 為信號指示燈模塊電路。 圖 1.6 信號指示燈模塊電路圖 2 軟件部分設(shè)計(jì) 本系統(tǒng)使用 STC89C52 作為控制的單片機(jī)芯片,軟件設(shè)計(jì)主要分為系統(tǒng)初始化、 設(shè)置 nRF24L01 的主從模式、檢測信號、報(bào)警等幾個(gè)部分,每個(gè)功能模塊功能的設(shè)計(jì) 對于整體都是不可或缺的,單片機(jī) STC89C52 通過軟件程序才能很好的對外部的信息 進(jìn)行采集、分析和決策。整個(gè)系統(tǒng)電路的程序流程圖在第一章節(jié)內(nèi)已經(jīng)畫出。 STC

18、89C52 是 STC 公司生產(chǎn)的一種低功耗、高性能 CMOS8 位微控制器具有 8K 在系 統(tǒng)可編程 Flash 存儲器。STC89C52 使用經(jīng)典的 MCS-51 內(nèi)核,具有傳統(tǒng) 51 單片機(jī)不 具備的功能。在單芯片上,擁有靈巧的 8 位 CPU 和在系統(tǒng)可編程 Flash,使得 STC89C52 為眾多嵌入式控制應(yīng)用系統(tǒng)提供高靈活、有效的解決方案。工作電壓: 5.5V3.3V(5V 單片機(jī))和 3.8V2.0V(3V 單片機(jī)) 。本設(shè)計(jì)使用的是后者 3.8V2.0V(3V 單片機(jī)) 。 2.1 開發(fā)環(huán)境 本設(shè)計(jì)采用開發(fā)環(huán)境為 Keil Vision4 版本,Keil 是集成開發(fā)環(huán)境進(jìn)行編

19、程的軟件。 Keil 公司是一家業(yè)界領(lǐng)先的微控制器(MCU)軟件開發(fā)工具的獨(dú)立供應(yīng)商。Keil 公司 由兩家私人公司聯(lián)合運(yùn)營,分別是德國慕尼黑的 Keil Elektronik GmbH 和美國德克薩 斯的 Keil Software Inc5,2324,具有可視化操作窗口和靈活的 Windows 管理窗口。 Keil 軟件不但給使用者提供了大量的庫函數(shù),還提供強(qiáng)大功能的開發(fā)及測試工具;支 持多種語言的編程,像 C 語言、匯編語言等;而且能完成從編輯、編譯、連接、測試、 仿真等整個(gè)程序開發(fā)到仿真調(diào)試的過程,給使用者提供非常便捷的工作流程;除此之 外,程序進(jìn)行編譯之后,即可生成相應(yīng)的匯編語言文件

20、被保存起來;因此使得編程工 作更為高效。 本文采用 Keil Vision4 進(jìn)行軟件部分的程序設(shè)計(jì),采用 C 語言編程。重點(diǎn)編寫通 過無線芯片發(fā)送和接收無線信號的接口程序,編譯并通過,驗(yàn)證了程序的正確性,由 文獻(xiàn)5可知。 2.2 主體程序設(shè)計(jì) 2.2.1 主程序設(shè)計(jì) 系統(tǒng)要完成 nRF24L01 接收模塊從 nRF24L01 發(fā)射模塊端接收過來的數(shù)據(jù),在經(jīng)過 單片機(jī)的處理之后判斷是否進(jìn)行報(bào)警;如果單片機(jī)接收是主機(jī)的信號,從機(jī)電路部分 的聲光報(bào)警就會工作,蜂鳴器開始響起,紅色二極管也將亮起,直至設(shè)定的報(bào)警 30S 后才會結(jié)束;隨即綠色二極管亮起報(bào)警結(jié)束。單片機(jī)的主程序流程為:完整各部分模 塊的

21、初始化之后,接著進(jìn)行數(shù)據(jù)的發(fā)送接收和告警的判斷以及數(shù)據(jù)顯示;按照主程序 進(jìn)行逐步的調(diào)試,主程序流程圖如圖 2.1 所示。 開始 初始化程序 設(shè)置nRF24L01 的工作模式 檢查有無接收到信號 是否為來車發(fā)送的信號 Y 報(bào)警模塊報(bào)警 Y 結(jié)束 N 圖 2.1 主程序流程圖 2.2.2 nRF24L01 發(fā)送模塊程序設(shè)計(jì) 通過對 nRF24L01 的認(rèn)識和學(xué)習(xí),對各個(gè)管腳進(jìn)行研究后,結(jié)合課題要實(shí)現(xiàn)的功 能進(jìn)行程序的編寫。收發(fā)模塊都要進(jìn)行檢測是否配,每隔 1s 就會發(fā)送一次信號,單片 機(jī)進(jìn)行檢測,若是傳送數(shù)據(jù),否則繼續(xù)跳到下個(gè)頻率進(jìn)行信號的發(fā)送,直至頻點(diǎn)配對 成功,圖 2.2 為 nRF24L01

22、 發(fā)送模塊程序流程圖。 配置24L01為 發(fā)射模式 寫數(shù)據(jù)并開始 發(fā)送 是否收到應(yīng)答信號 N 返回進(jìn)行下 一次檢測 N 發(fā)射子程序 單片機(jī)初始化 跳到下個(gè) 頻率發(fā)送 是否為應(yīng)答信號Y 向接口傳送數(shù) 據(jù)進(jìn)行報(bào)警 接收端已關(guān) 機(jī)或信號干 擾嚴(yán)重 在2s內(nèi)都未收 到應(yīng)答信號 上電 圖 2.2 nRF24L01 發(fā)送模塊工作流程圖 2.2.3 nRF24L01 接收模塊程序設(shè)計(jì) nRF24L01 接收模塊程序是發(fā)送的相對過程,在現(xiàn)實(shí)生活中由于有許多信號的干擾, 在信號識別時(shí)要尤其注意,因此對收發(fā)模塊都要進(jìn)行檢測是否配對成功;否則道口會 出現(xiàn)較混亂的情況。程序中若 ucStatus 的返回的值不為 0

23、則為已接收到數(shù)據(jù), Rx_Buf1=14 的話,說明接收到的是主機(jī)發(fā)來的數(shù)據(jù)防止與其它無線模塊造成數(shù)據(jù)混 亂,圖 2.3 為 nRF24L01 接收模塊程序流程圖。 配置24L01為接 收模式 檢測載波信號 存在當(dāng)前頻點(diǎn) 的載波信號 正確的數(shù)據(jù)包 返回 N N 接收子程序 單片機(jī)初始化 跳到下個(gè)頻率 上電 圖 2.3 nRF24L01 接收模塊工作流程圖 3 系統(tǒng)測試 將硬件部分組裝好,在單片機(jī)中燒入程序,進(jìn)行調(diào)試檢測電路實(shí)現(xiàn)的功能,經(jīng)過 檢測。經(jīng)過檢測實(shí)物實(shí)現(xiàn)的功能已經(jīng)可以達(dá)到預(yù)期設(shè)計(jì)的效果。 3.1 軟件測試 設(shè)計(jì)的主要兩個(gè)模塊的編程都已經(jīng)形成 C 語言文件如附錄 C。在軟件測試時(shí)將編 好

24、的程序在 Keil 軟件內(nèi)進(jìn)行編譯,檢查是否有錯(cuò)誤,對錯(cuò)誤部分進(jìn)行修改再次編譯, 直到無錯(cuò)誤為止。 3.2 硬件測試 檢查電路的連接是否正確,無誤后將 6 塊 1.5V 的干電池分別裝到兩個(gè)模塊的電池 盒內(nèi);先將設(shè)定為主機(jī)部分的模塊電路上電,再給接收報(bào)警模塊的電路上電。當(dāng)兩個(gè) 模塊的距離小于 10m 時(shí),從機(jī)的報(bào)警部分將進(jìn)行報(bào)警這是蜂鳴器就會響起同事紅色的 二極管也將點(diǎn)亮,此狀態(tài)會呈現(xiàn) 30S,之后蜂鳴器和紅色二極管停止工作截至此時(shí)報(bào) 警結(jié)束,說明此時(shí)會有火車通過,提醒路人現(xiàn)在是紅燈請等一等。接下來綠色的二極 管就會點(diǎn)亮,說明報(bào)警結(jié)束。以后會循環(huán)以上的工作。若將主機(jī)關(guān)閉再打開關(guān),若從 機(jī)接收到

25、信號就會報(bào)警否則將不會報(bào)警。 發(fā)送模塊在閉合開關(guān)上電后電源指示燈就會亮起說明可以正常供電,信號指示等 也會亮起但是此發(fā)光二極管會間斷的亮滅,發(fā)送模塊在間歇的進(jìn)行數(shù)據(jù)的發(fā)送,時(shí)間 間隔 1S,如圖 3.1 所示。 圖 3.1 發(fā)送模塊圖 接收模塊在供電后電源指示燈也會點(diǎn)亮,此時(shí)綠色二極管是發(fā)光的說明此時(shí)道口 的接收模塊還沒有接收到信號,還沒有車子過來如圖 3.2 的左邊部分所示;當(dāng)單片機(jī)接 收到主機(jī)發(fā)來的數(shù)據(jù)時(shí),進(jìn)行數(shù)據(jù)的處理,確定判斷時(shí),蜂鳴器就會響起同時(shí)二極管 也會亮起,報(bào)警 30S 后綠色二極管再次亮起報(bào)警結(jié)束,如圖 3.3 右邊部分。 圖 3.2 接收模塊圖 結(jié) 論 通過軟件和硬件的調(diào)試

26、結(jié)果可以看出本課題通過單片機(jī)控制的無線收發(fā)系統(tǒng)基本 實(shí)現(xiàn)自動報(bào)警功能,當(dāng)載有發(fā)送模塊的車子在距離道口十米左右是就會進(jìn)行報(bào)警,達(dá) 到提醒路人的作用。 硬件部分主要使用的芯片有 AMS1117、nRF24L01、STC89C52 單片機(jī)等芯片,電路 包括電源供電電路、單片機(jī)電路、開關(guān)電路、報(bào)警電路、信號指示電路等,這些都是 比較簡單的電路容易設(shè)計(jì)易于控制而且器件的性價(jià)比比較高。 系統(tǒng)軟件匯編語言使用的是 C 語言編程,程序包括程序初始化、延時(shí)、中斷、信 號發(fā)送接收及檢測、報(bào)警部分,容易讀,也便于對實(shí)現(xiàn)功能的修改。 但是還是存在不足之處,由于 nRF24L01 無線收發(fā)模塊只能粗略的知道車子的距離

27、的范圍不能判定扯車子的方向,在道口的左右各加一個(gè)按鍵,當(dāng)車子駛過是按鍵被按 下這時(shí)無線射頻收發(fā)模塊開始工作,通過單片機(jī)設(shè)定的道口距離這樣就可以知道車子 現(xiàn)在距道口的確切距離;而通過左右按鍵按下的順序也可以知道車子的方向。 參考文獻(xiàn) 1 周航慈單片機(jī)應(yīng)用程序設(shè)計(jì)技術(shù)M北京航空航天大學(xué)出版社,1991:9-14 2 nRF24L01 無線模塊 EB/OLhttp:/ 3 李文忠,段朝玉短距離無線數(shù)據(jù)通信M北京航空航天大學(xué)出版社,2006 4 時(shí)志云,蓋建平,王代華等新型高速無線射頻器件nRF24L01 及其應(yīng)用J國外 電子元器件,2007:85-97 5 Keil Software. Gettin

28、t Started With Vision2 and the C51 Microcontroller Development tools,2009 (1) 2324. 附錄 A A.1 主機(jī)發(fā)射 main 函數(shù)程序代碼 #include /調(diào)用單片機(jī)頭文件 #define uchar unsigned char /無符號字符型 宏定義 變量范圍 0255 #define uint unsigned int /無符號整型 宏定義變量范圍 065535 #include nrf24l01.H sbit led = P26; /*1ms 延時(shí)函數(shù)*/ void delay_1ms(uint q) u

29、int i,j; for(i=0;iq;i+) for(j=0;j120;j+); /*主程序*/ void main() CE=0; /2.4G 無線模塊 IO 口初始化 SCK=0; CSN=1; TX_Mode(); delay_1ms(650); while(1) led = 0; Tx_Buf0 = 13; Tx_Buf1 = 14; Transmit(Tx_Buf); delay_1ms(100); sta=SPI_Read(READ_REG + STATUS); if(TX_DS) /當(dāng)前 STATUS 狀態(tài) 發(fā)送中斷應(yīng)使 bit5 = 1 SPI_RW_Reg(WRITE_RE

30、G + STATUS,sta); if(MAX_RT) /如果是發(fā)送超時(shí) SPI_RW_Reg(WRITE_REG + STATUS,sta); led = 1; delay_1ms(1000); /1 秒鐘發(fā)送一次信號出去 A.2 從機(jī)接收 main 函數(shù)程序代碼 #include #define uchar unsigned char #define uint unsigned int #include nrf24l01.H #define DELAY_S 30 /報(bào)警時(shí)間,這里定義了 30S sbit beep = P37; /蜂鳴器 IO 口定義 sbit led = P26; bit

31、 flag_300ms ; static uchar value = 0; /*1ms 延時(shí)函數(shù)*/ void delay_1ms(uint q) uint i,j; for(i=0;iq;i+) for(j=0;j120;j+); /*定時(shí)器 0 初始化程序*/ void time_init() EA = 1; /開總中斷 TMOD = 0X01; /定時(shí)器 0、定時(shí)器 1 工作方式 1 ET0 = 1; /開定時(shí)器 0 中斷 TR0 = 1; /允許定時(shí)器 0 定時(shí) void Check(void) /檢查有無收到數(shù)據(jù)函數(shù),有收到則報(bào)警提示 bit bPlatformFlag = 0; /

32、公交站臺標(biāo)志位 char i; static unsigned char ucStatus = 0; static unsigned char Num = 0; static unsigned char BeepNum = 0; if(flag_300ms = 1) / if(+Num = 7) Num = 0; ucStatus = nRF24L01_RxPacket(Rx_Buf); /返回的值不為 0 則為已接收到數(shù)據(jù) else ucStatus = 0; if( ucStatus if(+BeepNum%2 = 0) BeepNum = 0; led = 1; beep = 0; fo

33、r(i=0;iDELAY_S;i+)delay_1ms(1000); /要報(bào)警 30s Num = 0; else beep = 1; flag_300ms = 0; void main() time_init(); /初始化定時(shí)器 delay_1ms(650); CE=0; SCK=0; CSN=1; RX_Mode(); /從機(jī)設(shè)置為接收模式 led = 0; while(1) led = 0; Check(); /*定時(shí)器 0 中斷服務(wù)程序*/ void time0_int() interrupt 1 TH0 = 0 x3c; TL0 = 0 xb0; / 50ms if(+value

34、= 6) flag_300ms = 1; /300ms value = 0; A.3 nRF24L01 #ifndef _NRF24L01_H_ #define _NRF24L01_H_ /*IO 端口定義* sbit MISO = P20; sbit SCK = P21; sbit CE = P22; sbit CSN = P23; sbit MOSI = P24; sbit IRQ = P25; /* uchar bdata sta; /狀態(tài)標(biāo)志 sbit RX_DR =sta6; sbit TX_DS =sta5; sbit MAX_RT =sta4; /*NRF24L01* #defi

35、ne TX_ADR_WIDTH 5 / 5 uints TX address width #define RX_ADR_WIDTH 5 / 5 uints RX address width #define TX_PLOAD_WIDTH 32 / 32 uints TX payload #define RX_PLOAD_WIDTH 32 / 32 uints TX payload uchar code TX_ADDRESSTX_ADR_WIDTH= 0 x34,0 x43,0 x10,0 x10,0 x01; /本地地址 uchar code RX_ADDRESSRX_ADR_WIDTH= 0

36、x34,0 x43,0 x10,0 x10,0 x01; /接收地址 uchar Tx_BufTX_PLOAD_WIDTH=0 x01,0 x02,0 x03,0 x22,0 x33,0 xaa,0 xbb,0 x11,0 x22,0 x33,0 xa a,0 xbb,0 x11,0 x22, 0 x33,0 xaa,0 xbb,0 x11,0 x22,0 x33,0 xaa,0 xbb,0 x11,0 x22,0 x33,0 xaa,0 xbb,0 x11,0 x22,0 x33,0 xee,0 xff; /發(fā)送數(shù)據(jù) uchar Rx_BufRX_PLOAD_WIDTH; /接收數(shù)據(jù) /*N

37、RF24L01 寄存器指令 * #define READ_REG 0 x00 / 讀寄存器指令 #define WRITE_REG 0 x20 / 寫寄存器指令 #define RD_RX_PLOAD 0 x61 / 讀取接收數(shù)據(jù)指令 #define WR_TX_PLOAD 0 xA0 / 寫待發(fā)數(shù)據(jù)指令 #define FLUSH_TX 0 xE1 / 沖洗發(fā)送 FIFO 指令 #define FLUSH_RX 0 xE2 / 沖洗接收 FIFO 指令 #define REUSE_TX_PL 0 xE3 / 定義重復(fù)裝載數(shù)據(jù)指令 #define NOP 0 xFF / 保留 /*SPI(nR

38、F24L01)寄存器地址* #define CONFIG 0 x00 / 配置收發(fā)狀態(tài),CRC 校驗(yàn)?zāi)J揭约笆瞻l(fā)狀態(tài)響應(yīng)方 式 #define EN_AA 0 x01 / 自動應(yīng)答功能設(shè)置 #define EN_RXADDR 0 x02 / 可用信道設(shè)置 #define SETUP_AW 0 x03 / 收發(fā)地址寬度設(shè)置 #define SETUP_RETR 0 x04 / 自動重發(fā)功能設(shè)置 #define RF_CH 0 x05 / 工作頻率設(shè)置 #define RF_SETUP 0 x06 / 發(fā)射速率、功耗功能設(shè)置 #define STATUS 0 x07 / 狀態(tài)寄存器 #define

39、 OBSERVE_TX 0 x08 / 發(fā)送監(jiān)測功能 #define CD 0 x09 / 地址檢測 #define RX_ADDR_P0 0 x0A / 頻道 0 接收數(shù)據(jù)地址 #define RX_ADDR_P1 0 x0B / 頻道 1 接收數(shù)據(jù)地址 #define RX_ADDR_P2 0 x0C / 頻道 2 接收數(shù)據(jù)地址 #define RX_ADDR_P3 0 x0D / 頻道 3 接收數(shù)據(jù)地址 #define RX_ADDR_P4 0 x0E / 頻道 4 接收數(shù)據(jù)地址 #define RX_ADDR_P5 0 x0F / 頻道 5 接收數(shù)據(jù)地址 #define TX_ADDR

40、 0 x10 / 發(fā)送地址寄存器 #define RX_PW_P0 0 x11 / 接收頻道 0 接收數(shù)據(jù)長度 #define RX_PW_P1 0 x12 / 接收頻道 0 接收數(shù)據(jù)長度 #define RX_PW_P2 0 x13 / 接收頻道 0 接收數(shù)據(jù)長度 #define RX_PW_P3 0 x14 / 接收頻道 0 接收數(shù)據(jù)長度 #define RX_PW_P4 0 x15 / 接收頻道 0 接收數(shù)據(jù)長度 #define RX_PW_P5 0 x16 / 接收頻道 0 接收數(shù)據(jù)長度 #define FIFO_STATUS 0 x17 / FIFO 棧入棧出狀態(tài)寄存器設(shè)置 /*延時(shí)

41、函數(shù)*/ /短延時(shí) void delay_ms(unsigned int x) unsigned int i,j; for (i=0;ix;i+) j=108; while (j-); /*IO 口模擬 SPI 總線代碼*/ uchar SPI_RW(uchar byte) uchar i; for(i=0;i8;i+) MOSI=(byte byte=(byte1); SCK=1; byte|=MISO; /led=MISO;Delay(150); SCK=0; return(byte); uchar SPI_RW_Reg(uchar reg,uchar value) /向寄存器 REG 寫

42、一個(gè)字節(jié),同時(shí)返回狀態(tài)字 節(jié) uchar status; CSN=0; status=SPI_RW(reg); SPI_RW(value); CSN=1; return(status); uchar SPI_Read (uchar reg ) uchar reg_val; CSN=0; SPI_RW(reg); reg_val=SPI_RW(0); CSN=1; return(reg_val); uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar bytes) uchar status,byte_ctr; CSN = 0; / Set CSN l

43、ow, init SPI tranaction status = SPI_RW(reg); / 選擇寄存器寫入和讀取狀態(tài)字節(jié) for(byte_ctr=0; byte_ctrbytes; byte_ctr+) / 然后寫所有字節(jié)在緩沖區(qū)(* pBuf) SPI_RW(*pBuf+); CSN = 1; / Set CSN high again return(status); / nRF24L01 返回狀態(tài)字節(jié) /*發(fā)送模式代碼*/ void TX_Mode(void) CE=0; SPI_RW_Reg(FLUSH_TX,0 x00); SPI_Write_Buf(WRITE_REG + TX_

44、ADDR, TX_ADDRESS, TX_ADR_WIDTH); / tx 地址來 nRF24L01 寫道 SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); / RX_Addr0 tx adr 一樣為自動 ack SPI_RW_Reg(WRITE_REG + EN_AA, 0 x01); / Enable Auto.Ack:Pipe0 SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0 x01); / Enable Pipe0 SPI_RW_Reg(WRITE_REG + SETUP_RETR,

45、 0 x1a); / 500us + 86us, 10 重發(fā) 1a SPI_RW_Reg(WRITE_REG + RF_CH, 40); / 選擇 RF 信道 40 SPI_RW_Reg(WRITE_REG+RF_SETUP, 0 x07); / TX_PWR:0dBm, Datarate:1Mbps, LNA:HCURR SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); /設(shè)置接收數(shù)據(jù)長 度,本次設(shè)置為 2 字節(jié) SPI_RW_Reg(WRITE_REG + CONFIG, 0 x0e); CE=1; delay_ms(100); void

46、Transmit(unsigned char * tx_buf) /傳輸 CE=0; /StandBy I 模式 SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); / 裝載接收端地址 SPI_RW_Reg(FLUSH_TX,0 x00); SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); / 裝載數(shù)據(jù) SPI_RW_Reg(WRITE_REG + CONFIG, 0 x0e); / IRQ 收發(fā)完成中斷響應(yīng),16 位 CRC,主發(fā)送 CE=1; /置高 CE,激

47、發(fā)數(shù)據(jù)發(fā)送 delay_ms(150); /*接收模式代碼*/ uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars) uchar status,i; / 交易 CSN = 0; / Set CSN low, init SPI tranaction status = SPI_RW(reg); / 選擇寄存器寫入和讀取的狀態(tài) uchar for(i=0;iuchars;i+) pBufi = SPI_RW(0); CSN = 1; return(status); / return nRF24L01 status uchar /*/ *函數(shù)

48、:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf) *功能:數(shù)據(jù)讀取后放如 rx_buf 接收緩沖區(qū)中 /*/ unsigned char nRF24L01_RxPacket(unsigned char* rx_buf) unsigned char revale=0; sta=SPI_Read(STATUS); / 讀取狀態(tài)寄存其來判斷數(shù)據(jù)接收狀況 if(RX_DR) / 判斷是否接收到數(shù)據(jù)/ CE = 0; /SPI 使能 SPI_Read_Buf(RD_RX_PLOAD,rx_buf,RX_PLOAD_WIDTH);/ read

49、receive payload from RX_FIFO buffer revale =1; /讀取數(shù)據(jù)完成標(biāo)志 Delay(100); SPI_RW_Reg(WRITE_REG+STATUS,sta); /接收到數(shù)據(jù)后 RX_DR,TX_DS,MAX_PT 都置高為 1,通過寫 1 來清楚中斷標(biāo)志 return revale; /*/ /*函數(shù):void RX_Mode(void) /*功能:數(shù)據(jù)接收配置 /*/ void RX_Mode(void) CE=0; SPI_RW_Reg(FLUSH_RX,0 x00); SPI_Write_Buf(WRITE_REG + TX_ADDR, TX

50、_ADDRESS, TX_ADR_WIDTH); Writes TX_Address to nRF24L01 SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); / RX_Addr0 same as TX_Adr for Auto.Ack SPI_RW_Reg(WRITE_REG + EN_AA, 0 x01); / Enable Auto.Ack:Pipe0 SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0 x01); / Enable Pipe0 SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0 x1a); / 500us + 86us, 10 retrans.1a SPI_RW_Reg(WRITE_REG + RF_CH, 40); / Select RF channel 40 SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); /設(shè)置接收數(shù)據(jù)長 度,本次設(shè)置為 32 字節(jié) SPI_RW_Reg(WRITE_REG + RF_SETUP, 0 x07); / TX_PWR:0dBm, Datarate:1Mbps, LNA:HCURR SPI_RW_Reg(WR

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論