新型DS18B20溫度傳感器擺脫了傳統(tǒng)的以熱敏電阻為傳感器的溫度測量方法,而改為一種全新的,以數(shù)字溫度傳感器作感溫元件的數(shù)字式溫度計,解決了傳統(tǒng)的溫度檢測可靠性差,測量溫度準(zhǔn)確率低的缺點,它以單總線的連接方式,使電路大大的簡化。DS18B20傳感器利用單片機進(jìn)行控制,簡單而且易于智能化控制。設(shè)計中還加入了nRF905無線收發(fā)模塊,可以實現(xiàn)一定距離的溫度數(shù)據(jù)傳輸,使得設(shè)計模塊可以進(jìn)行遠(yuǎn)距離的檢測和控制。
此次設(shè)計根據(jù)具體實驗制作,給出了系統(tǒng)實現(xiàn)的硬件原理圖及軟件流程圖。該設(shè)計模塊測量精度高、擴展方便,具有一定的參考價值。設(shè)計布線簡單,結(jié)構(gòu)緊湊,體積小,擴展方便,可在一定距離進(jìn)行無線檢測,在大型倉庫,工廠,智能化建筑等領(lǐng)域的溫度檢測中有廣闊的應(yīng)用前景。
目錄
摘要 3
Abstract 4
緒論 5
11 設(shè)計背景與意義 5
12 設(shè)計目的及應(yīng)用 5
13 設(shè)計內(nèi)容及要求 5
第二章 系統(tǒng)方案論證與選擇 6
21 系統(tǒng)總體方案描述 6
22 系統(tǒng)總體框圖 6
23 系統(tǒng)硬件構(gòu)成 6
系統(tǒng)硬件主要單元設(shè)計 7
31 主控制模塊 7
32 數(shù)據(jù)顯示模塊 9
33 信號采集模塊 9
34 無線收發(fā)模塊 10
系統(tǒng)軟件設(shè)計 11
41 程序設(shè)計思路 11
42 程序設(shè)計框圖 12
系統(tǒng)硬件調(diào)試結(jié)果圖15
51 系統(tǒng)仿真15
52 系統(tǒng)硬件調(diào)試 15
53 調(diào)試結(jié)果16
心得體會及總結(jié) 16
參考文獻(xiàn) 17
附錄一:原理圖 17
附錄:源程序代碼18
第一章 緒論
1.1研究背景與意義隨著社會的發(fā)展、科技的進(jìn)步以及人們生活水平的逐步提高,現(xiàn)如今自動化、信息化程度越來越高,單片機和傳感器的應(yīng)用領(lǐng)域越來越廣。各種方便于生活的自動控制系統(tǒng)進(jìn)入了人們的生活。單片機和傳感器在自動控制中的應(yīng)用越來越廣泛,它實用性強,使用方便,技術(shù)先進(jìn),它們的廣泛應(yīng)用是科技進(jìn)步的標(biāo)志。 現(xiàn)實中溫度控制不適當(dāng)導(dǎo)致的發(fā)霉,腐爛問題是倉庫日常工作急需解決的問題,是衡量倉庫管理質(zhì)量的重要指標(biāo)。它直接影響到儲備物資的使用壽命和工作可靠性。為保持日常工作的順利進(jìn)行,首要任務(wù)是加強倉庫的溫度檢測。同時專門的安排人員去定期去倉庫測量溫度也非常麻煩,因此設(shè)計一種自動檢測和顯示溫度,并且能夠進(jìn)行較遠(yuǎn)距離的無限傳輸?shù)臏囟瓤刂圃O(shè)備很有必要。 1.2 研究目的及應(yīng)用溫度的檢測與控制是工業(yè)生產(chǎn)過程中應(yīng)用比較廣泛的課題,隨著傳感器在生產(chǎn)和生活中更加廣泛的應(yīng)用,利用新型單總線式數(shù)字溫度傳感器實現(xiàn)對溫度的單點和多點的測試與控制得到很快開發(fā)。但就目前情況看,很少有人對倉庫進(jìn)行自動化檢測和管理,大多數(shù)的倉庫在管理過程中依然是使用傳統(tǒng)的工作方法,利用溫度計等簡單檢測工具人工檢測倉庫溫濕度。這種方法不僅費時、費力,而且效率低下。市場需要普及一種簡單、實用、易操作并且可以進(jìn)行無線傳輸?shù)臏囟葯z測設(shè)備。 1.3 設(shè)計內(nèi)容及要求本文著重闡述以單片機控制,溫度傳感器DS18B20對溫度的數(shù)據(jù)采集和處理,NRF905無線發(fā)送和接收模塊的應(yīng)用,4位共陽極數(shù)碼管對溫度傳感器處理后的溫度進(jìn)行顯示,實現(xiàn)一定距離上的定點溫度自動檢測和發(fā)送接收。
第二章 系統(tǒng)方案論證與選擇
2.1 系統(tǒng)總體方案描述系統(tǒng)設(shè)計分為2個部分,第一個部分實現(xiàn)溫度的檢測、顯示和發(fā)送,第二個部分為數(shù)據(jù)的接收和顯示。第一個設(shè)計模塊中,利用單片機STC89C52控制溫度傳感器DS18B20定點檢測和處理溫度數(shù)據(jù),單片機將采集的溫度數(shù)據(jù)發(fā)送給單片機,再通過單片機控制,對接收到的溫度數(shù)據(jù)進(jìn)行一定的轉(zhuǎn)換和處理,然后存放在寄存器中,等待下一步處理,再經(jīng)過無線發(fā)送模塊nRF905將顯示的數(shù)據(jù)打包發(fā)送給第二個模塊。第二個設(shè)計模塊中,同樣利用STC89C52單片機作為控制主體,先控制nRF905無線接收模塊接收第一個模塊發(fā)送的數(shù)據(jù),然后控制4位共陽極數(shù)碼管顯示接收到的數(shù)據(jù)。則完成整個設(shè)計流程。 2.2 系統(tǒng)總體框圖系統(tǒng)的設(shè)計框圖如圖1所示:
2.3 系統(tǒng)硬件構(gòu)成系統(tǒng)硬件方面主要由單片機最小系統(tǒng),溫度傳感器DS18B20,4位共陽極數(shù)碼管,還有nRF905無線收發(fā)模塊組成,目的在于實現(xiàn)溫度的準(zhǔn)確檢測和無線收發(fā)所檢測的溫度數(shù)據(jù)。 第三章 系統(tǒng)硬件電路設(shè)計3.1 單片機最小系統(tǒng)設(shè)計單片機最小系統(tǒng)的設(shè)計主要有五個部分組成,電源電路,復(fù)位電路,晶振電路,串口電路和控制主體的STC89C52單片機。 電源電路由一個六腳的按鍵開關(guān),一個1K的電阻,一個10uF的極性電容和一個顯示電路供電狀態(tài)的發(fā)光二極管組成。開關(guān)為了適應(yīng)各種情況下能夠方便供電,開關(guān)外接有一個USB接口和一個DC-5V的標(biāo)準(zhǔn)電源接口作為供電設(shè)備使用。除此之外還設(shè)計了一個外接電源接口。電源電路如圖2所示。 圖2 電源電路 復(fù)位電路組成很簡單,僅僅有4個小器件構(gòu)成,一個是作為復(fù)位控制的四腳按鍵,一個10uF的極性電容,還有兩個電阻,阻值分別為1K和10K。電路與單片機的RST端口連接,電路上電后,按下按鍵控制系統(tǒng)復(fù)位。具體電路如圖3所示: 圖3 復(fù)位電路 晶振電路更為簡單,只有3個器件,一個11.0592Hz的晶振外加二個30PF的普通電容組成,晶振兩端分別與單片機的XTAL1和XTAL2口相接。電路如圖4所示: 圖4 晶振電路 串口電路主要利用MAX232來實現(xiàn),MAX232是美信公司設(shè)計的一款單電源電平轉(zhuǎn)換芯片,在本次設(shè)計中的使用的方法是在MAX232的1和3管腳之間,4和5管腳之間,2和16管腳之間,6和15管腳之間,還有16和16管腳之間全部加上一個0.1uF的電容,7和8管腳作為串口輸入端,外接一個標(biāo)準(zhǔn)9孔串口母頭,9和10管腳作為輸出,分別與單片機的P3.0和P3.1連接。這樣就構(gòu)成了與單片機連接,可以進(jìn)行串口通信的串口電路。具體電路圖5所示: 圖5 串口電路 單片機最小系統(tǒng)的主體部分使用的是STC89C52單片機,它是美國ATMEL公司生產(chǎn)的低電壓,高性能的CMOS 8位單片機,片內(nèi)寄存器可反復(fù)擦洗,含有32個可編程雙向I/O口,3個16位定時/計數(shù)器,共8個中斷源。需要指出且注意的是,單片機在系統(tǒng)設(shè)計時,管腳EA要始終接高電平。因為EA接高電平時,單片機讀取內(nèi)部程序存儲器。當(dāng)擴展有外部ROM時,讀取完內(nèi)部ROM后自動讀取外部ROM,EA接低電平時,單片機直接讀取外部ROM。 而設(shè)計中使用的STC89C52是有內(nèi)部ROM的,所以此引腳始終接高電平。一般在設(shè)計單片機最小系統(tǒng)時,大多會加上流水燈和獨立鍵盤的設(shè)計,但是在我的畢業(yè)設(shè)計中把這些部分作了改進(jìn)?紤]到流水燈和獨立鍵盤這些設(shè)計如果完整的加入就會造成一定的浪費,而且由于學(xué)校實驗室的條件有限,PCB板的刻錄存在很多問題,因此這些設(shè)備會大大增加硬件調(diào)試過程的難度,費時費力。同時,在設(shè)計單片機最小系統(tǒng)時,考慮到不加入這些設(shè)備的話,以后又有可能需要用到。所以中和上面各種因素,在最小系統(tǒng)的設(shè)計部分最后只是增加了二個獨立鍵盤和二個LED發(fā)光二極管作為調(diào)試或需要時使用,同時,考慮到以后可能還會外接其它設(shè)備的介入,為了方便,特意留有兩排20腳的單排插針外接端口,這樣,設(shè)計的最小系統(tǒng)模塊在需要時也可以控制其它外接裝置。使得設(shè)計模塊更加靈活多用,不僅僅局限在本次畢業(yè)設(shè)計中使用,還可以留作以后的開發(fā)板學(xué)習(xí)。 最小系統(tǒng)的主體STC89C52如圖6所示: 圖6 STC89C52管腳接線圖 3.2 數(shù)據(jù)顯示模塊設(shè)計數(shù)據(jù)顯示電路使用的是SMA410364型號的4位共陽極數(shù)碼管,其內(nèi)部結(jié)構(gòu)圖如下面圖7所示:
圖7 數(shù)碼管內(nèi)部結(jié)構(gòu)圖 該數(shù)碼管共有12個管腳,其中11,7,4,2,1,10,5,3管腳分別對應(yīng)數(shù)碼管的A,B,C,D,E,F,G,DP段選位,與單片機的P0口連接,對應(yīng)單片機的P0.0-P0.7口,用來控制數(shù)碼管顯示數(shù)值大小,6,8,9,12管腳控制數(shù)碼管的位選,分別與單片機的P2.0-P2.4口連接,通過單片機指令選擇需要顯示數(shù)據(jù)的數(shù)碼管位。 我們知道,在單片機的端口上電后會一直存在高電平,而數(shù)碼管的位選正好是高電平有效,所以會導(dǎo)致在不需要使用數(shù)碼管的時候,數(shù)碼管依然會保持打開狀態(tài)。通常情況下會在單片機最小系統(tǒng)中使用鎖存器與數(shù)碼管連接,但是在這次設(shè)計中沒有使用鎖存器,而是改用在數(shù)碼管與單片機端口連接之間加一個PNP三極管的方法,讓三極管發(fā)射極接電源,基集與單片機端口連接,集電極與數(shù)碼管連接,這樣的設(shè)計就會導(dǎo)致單片機端口給低電平時才會選通數(shù)碼管,不僅方便控制,而且電路設(shè)計簡單。 設(shè)計原理圖如圖8所示: 圖8 數(shù)碼管電路 3.3 信號采集模塊設(shè)計信號采集部分主要由溫度傳感器DS18B20進(jìn)行 1.DS1820溫度傳感器外觀圖和引腳圖如圖9所示,三個管腳定義如下:[10]  ① 引腳1接地; ② 引腳2數(shù)字信號輸入/輸出; ③ 引腳3接高電平5V高電平。 2.DS18B20溫度采集模塊設(shè)計[10] 此模塊的設(shè)計中STC89C52單片機作為控制主體,溫度傳感器DS18B20采集溫度, 溫度傳感器DS18B20是一種單線接口傳感器,所以連接電路很簡單,只要將其管腳DQ接單片機的一個端口進(jìn)行溫度采集,VDD接高電平,GND接地即可。設(shè)計中的DQ端被設(shè)計成連接單片機的P1.3端口。 根據(jù)DS18B20的工作原理、內(nèi)部結(jié)構(gòu)圖、時序圖,還有DS18B20的ROM指令操作碼,編寫DS18B20的操作代碼,采集溫度樣本,將采集的樣本數(shù)據(jù)存放在寄存器中等待下一步處理。
3.4無線收發(fā)模塊設(shè)計無線收發(fā)模塊的功能實現(xiàn)主要是用nRF905無線收發(fā)模塊實現(xiàn)的  1.nRF905接口電路和管腳說明[9]
圖11 nRF905管腳圖
(1)VCC為電源接入端,一般接入的電壓在3.3V-3.6V之間,不能超過3.6V,不然很容易將模塊燒壞,建議使用3.3V (2)TX_EN為數(shù)字輸入端口,當(dāng)TX-_EN置1時為TX輸入模式,當(dāng)TX-_EN置0時為RX輸入模式 (3)TRX_CE也是數(shù)字輸入端,它控制使能芯片的發(fā)射和接收 (4)PWR_UP是給芯片上電的數(shù)字輸入端口 (5)uCLK為時鐘輸出端口,此管腳在使用過程中一般廢棄不用 (6)CD數(shù)字輸出端進(jìn)行載波檢測 (7)AM數(shù)字輸出端進(jìn)行地址匹配 (8)DR數(shù)字輸出端,接收和發(fā)送數(shù)據(jù)完成 (9)MISO和MOSI分別為SPI輸出輸入端口 (10)SCK和CSN分別為SPI的時鐘和使能端口 (11)13和14管腳為相同的二個接地端口. 2.nRF905無線收發(fā)模塊設(shè)計 該模塊的設(shè)計中使用到了AMS1117芯片,目的是將上電端口輸入的5V電壓轉(zhuǎn)換成適合nRF905模塊使用的3.3V工作電壓,轉(zhuǎn)換電路中由于使用的是AMS1117芯片,所以設(shè)計簡單許多,只需要在芯片的輸入端和接地端之間,輸出端和接地端之間分別并聯(lián)上一個普通電容和一個極性電容即可,電路設(shè)計如圖12所示: 圖12 AMS1117變壓電路 芯片AMS1117輸出的電壓與無線收發(fā)模塊的VCC口連接,PWR_UP,TX-_EN,TRX_CE,MISO,MOSI,SCK,CSN分別對應(yīng)單片機的P1.0,P1.1,P1.2,P1.4,P1.5,P1.6,P1.7端口,AM,DR,CD分別對應(yīng)單片機的P3.2,P3.3,P3.4端口,uCLK端口廢棄不用,最后的兩個GND端口全部接地,這樣就組成了nRF905的無線控制模塊?梢赃M(jìn)行程序的調(diào)控使用了。 nRF905模塊的無線發(fā)射接收電路主要利用nRF905與外圍器件構(gòu)成的電路組成,設(shè)計中使用的是購買的成品模塊,其內(nèi)部電路結(jié)構(gòu)沒有詳細(xì)研究,其主要部分是天線。他利用特定的形狀可以將電流轉(zhuǎn)化為射頻能量并以電波形式發(fā)射出去.或?qū)o線電波接收進(jìn)來。 第四章 系統(tǒng)軟件設(shè)計4.1 程序設(shè)計思路程序設(shè)計使用的軟件是是美國Keil Software公司出品的51系列兼容單片機C語言軟件開發(fā)系統(tǒng)Keil C51。與匯編相比,C語言在功能上、結(jié)構(gòu)性、可讀性、可維護(hù)性上有明顯的優(yōu)勢,因而易學(xué)易用。 程序設(shè)計過程中,首要的是會熟練使用各種數(shù)碼管,即要了解數(shù)碼管的構(gòu)造,也要了解其工作原理,并且能夠編寫各種數(shù)碼管的顯示程序,當(dāng)能夠做到這一步,然后還要了解溫度傳感器的內(nèi)部結(jié)構(gòu)和工作原理,還有寄存器的工作方式和讀寫時序圖,然后根據(jù)它的ROM和RAM指令編寫工作代碼,通過單片機讀取后控制數(shù)碼管顯示。 編寫DS18B20的操作代碼時,先初始化傳感器,然后分別讀它的位和比特,然后是寫比特,然后開始主要的轉(zhuǎn)換過程程序設(shè)計,轉(zhuǎn)換時要判斷正負(fù),如果為負(fù)值,則取其值的反碼后加1,得到正值,然后在前面顯示“-”號,最后設(shè)計單片機控制讀取DS18B20的寄存器數(shù)據(jù),通過數(shù)碼管顯示。 設(shè)計了溫度顯示程序后開始設(shè)計無線發(fā)送程序,同樣的需要了解nRF905的結(jié)構(gòu),工作原理寄存器和時序圖,還有SPI口的設(shè)置。設(shè)計程序時,一般先給寄存器配置參數(shù),通過SPI口想配置寄存器讀寫配置信息。然后編寫它的寫操作和讀操作代碼,主機通過SPI接口向配置寄存器寫入信息,最后是它的發(fā)送指令代碼。 在編寫接收代碼程序時,和發(fā)送的代碼過程相似,參考后面的程序附錄。 4.2 程序流程圖溫度采集模塊的程序設(shè)計要特別注意溫度傳感器DS18B20的代碼編寫,在充分了解很清楚DS18B20的基礎(chǔ)上根據(jù)其指令碼,寄存器等編寫其讀寫指令,以及溫度處理轉(zhuǎn)換代碼,然后編寫數(shù)碼管的顯示程序,然后合并,構(gòu)成總的程序流程。Keil C51軟件提供豐富的庫函數(shù)和功能強大的集成開發(fā)調(diào)試工具,全Windows界面。其中uVision與Ishell分別是C51為Windows和Dos的集成開發(fā)環(huán)境(IDE),可以完成編輯、編譯、連接、調(diào)試、仿真等整個開發(fā)流程。使用簡單方便。 設(shè)計的數(shù)據(jù)采集模塊具體流程圖15所示:
圖15 數(shù)據(jù)采集流程圖
溫度采集時是,首先將DS18B20進(jìn)行初始化設(shè)置,然后才能進(jìn)行后面的操作。這也是使用各種傳感器設(shè)備的最基本步驟,然后是根據(jù)先前編寫的溫度傳感器代碼讀取傳感器采集的溫度數(shù)據(jù),存儲在其寄存器中,然后進(jìn)行控制轉(zhuǎn)換程序。如果采集的溫度是正值,那么就控制單片機直接讀取經(jīng)NRF905發(fā)送。如果溫度數(shù)據(jù)是負(fù)值,那么要進(jìn)行取反加一后變成正值數(shù)據(jù)再通過無線設(shè)備發(fā)送出去。 無線發(fā)送流程圖如圖16所示:
圖16 無線發(fā)送流程圖
初始化nRF905,將接收點的地址和要發(fā)送的有效數(shù)據(jù)將通過SPI接口傳送給nRF905。將TRX-CE和TX-EN全部置為高電平來激活nRF905的ShockBurst的發(fā)送模式。通過nRF905的ShockBurst可使射頻寄存器自動開啟,并完成數(shù)據(jù)包的發(fā)送,DR置高。 然后判斷TRX-CE電平,如果置低將返回初始不進(jìn)行后面的操作,如果置高,那么將AUTO-RETRAN也設(shè)置為高電平,從而使nRF905將連續(xù)不斷地重復(fù)發(fā)送數(shù)據(jù)包,直到TRX-CE被設(shè)置為低電平為止;而當(dāng)TRX-CE被設(shè)置為低電平時,DR=0,nRF905則結(jié)束數(shù)據(jù)傳輸,并將自己設(shè)置為空閑模式。 在ShockBurst模式下,只要開始發(fā)送數(shù)據(jù),TRX-CE和TX-EN的引腳無論是高電平還是低電平,發(fā)送過程都會被保證處理完畢。
無線接收流程圖如圖17所示:
圖17 無線接收流程圖 首先,將TRX-CE置為高,TX-EN置為低,nRF905進(jìn)入接收模式,然后不斷監(jiān)測有無信號,等待接收;當(dāng)nRF905檢測到有和接收頻率相同的載波時,其載波檢測引腳CD置為高電平;此后,當(dāng)nRF905接收到相匹配的地址時,地址匹配引腳AM置為高電平;在這之后,當(dāng)nRF905接收完畢一個有效的數(shù)據(jù)包(CRC校驗正確)時,nRF905將去掉前導(dǎo)碼、地址和CRC位,同時將數(shù)據(jù)準(zhǔn)備就緒引腳DR置為高電平,并用單片機將TRX-CN引腳設(shè)置為低電平,以進(jìn)入空閑模式,從而使單片機能夠通過SPI接口讀出有效的數(shù)據(jù);當(dāng)所有的數(shù)據(jù)讀出后,nRF905將AM和DR設(shè)置為低電平,以便使nRF905準(zhǔn)備進(jìn)入其它工作模式。 第五章 系統(tǒng)仿真與硬件調(diào)試5.1系統(tǒng)仿真系統(tǒng)的仿真過程是使用proteus仿真軟件進(jìn)行,由于在proteus軟件中找不到NRF905的仿真模塊,所以仿真過程中沒有實現(xiàn)無線收發(fā)的仿真電路,只是進(jìn)行了溫度檢測和顯示過程的仿真操作。仿真圖如圖18所示: 

圖18 溫度采集仿真圖 5.2 系統(tǒng)硬件調(diào)試系統(tǒng)硬件的制作過程全部在學(xué)校實驗室完成,在制作條件上受到一定的限制。在制作PCB電路板的過程中,由于打孔機上的打孔針只有一種直徑的,所以導(dǎo)致過孔和焊接點的孔徑大小一樣,焊接時要特別注意分清。因為制作的過孔之間是沒有伏銅,連接過孔的兩層導(dǎo)線是不相通的,需要手工進(jìn)行焊接,千萬不可漏焊。所以在硬件的調(diào)試過程要注意過孔的問題。另外,在制作電路電路板時,使用的是腐蝕刻線,很容易出現(xiàn)斷線現(xiàn)象,所以在焊接器件之前最好將斷線全部焊接好,避免斷線導(dǎo)致調(diào)試過程的不正,F(xiàn)象,因為焊接后電路板上的斷線不容易補焊。 在電路板的設(shè)計過程中要盡量在底層布線,同樣是因為孔內(nèi)沒有加銅的原因,如果是頂層走線,就需要在頂層焊接,而頂層焊接時遇到像數(shù)碼管之類的器件的管腳很難在正面焊接,即使焊接也很容易出現(xiàn)虛焊現(xiàn)象,導(dǎo)致接觸不良。 在調(diào)試過程中,我的電路板出現(xiàn)了正面布線焊接時出現(xiàn)短路和斷路現(xiàn)象,導(dǎo)致串口無法使用,模塊供電不正常等現(xiàn)象,最后經(jīng)過使用萬用表仔細(xì)的檢測后才找出原因,過程繁瑣異常。 調(diào)試過程主要就是一個檢測過程,一定要有耐心,夠仔細(xì),不然很難找出問題的根本原因。所以在電路PCB板的設(shè)計過程中,腐蝕刻線過程中,焊接電路板時都需要認(rèn)真仔細(xì)對待,盡量減少因為硬件導(dǎo)致模塊功能不正常的問題出現(xiàn),但同時,電路板出現(xiàn)問題的調(diào)試過程也是一個很好學(xué)習(xí)和經(jīng)驗積累過程,一定要認(rèn)真對待,自己找原因,不要總是讓別人代勞。 5.3 調(diào)試結(jié)果經(jīng)過不斷認(rèn)真的調(diào)試過程,且電路的設(shè)計也沒有任何問題,最后電路板終于能夠完全實現(xiàn)預(yù)先設(shè)計的所有功能。 第六章 心得與體會經(jīng)過一個星期的現(xiàn)代檢測技術(shù)課程設(shè)計,我們小組成功地完成了無線溫度檢測系統(tǒng)的設(shè)計。雖然整個設(shè)計中我們遇到了很多問題,但通過我們自己九個人的分工,查找資料,調(diào)試、仿真,不斷地調(diào)整設(shè)計思路,最終成功地完成了設(shè)計目標(biāo)。這次課程設(shè)計讓我自己對于學(xué)習(xí)現(xiàn)代檢測技術(shù)有了更深一步地了解,通過實際地操作,發(fā)現(xiàn)書上的理論知識與在實際運用中的還是有一定的出入的。經(jīng)過自己不斷地摸索,改進(jìn),從中學(xué)到了很多實際知識。 整個設(shè)計制作中也培養(yǎng)了我的實際操作能力和團隊合作能力,不僅加強了自己獨立工作地能力,而且還充分地體會到了設(shè)計創(chuàng)作地艱辛,看到制作完成時也體會到了成功地喜悅,收獲了不少課外知識。還有要感謝李老師以及楊老師在我們遇到困難時,給予我們的建議與鼓勵。 設(shè)計過程中感受最深的就是編寫程序后的調(diào)試過程,確實是一個漫長而痛苦的過程。我們根據(jù)顯示的結(jié)果不斷尋找錯誤點,各個擊破。雖然很累(每天都熬夜),但是當(dāng)程序跳出來之后,心中的喜悅是不言而喻的,不管之前多么的痛苦都是值得的! 通過此次課程設(shè)計,我總結(jié)了幾點: ①每一個系統(tǒng)的生成,都是經(jīng)過層層周密的思考與測試而得到的,這需要團隊的合作以及個人優(yōu)秀的素質(zhì)。 ②寫程序過程中,切記戒驕戒躁,踏踏實實,一步一個腳印。學(xué)會模塊化編程,會讓你少走很多彎路。 ③當(dāng)程序很多很復(fù)雜時,應(yīng)該寫一個模塊就調(diào)試一個,這樣下來會輕松的解決各個問題,而不像你一次性全寫完,錯了之后再來調(diào)就很復(fù)雜了。 ④硬件電路的調(diào)試,也是需要極大的耐性,以及擁有良好的電子基礎(chǔ),這個需要多加練習(xí)。 再次感謝我們的李老師.,老師嚴(yán)謹(jǐn)細(xì)致、一絲不茍的作風(fēng)一直是我工作、學(xué)習(xí)中的榜樣;老師循循善誘的教導(dǎo)和不拘一格的思路給予我無盡的啟迪;這次課程設(shè)計中離不開老師您的細(xì)心指導(dǎo)。而您開朗的個性和寬容的態(tài)度,幫助我能夠很順利的完成了這次課程設(shè)計。 同時感謝對我?guī)椭^的同學(xué)們,謝謝你們對我的幫助和支持,讓我感受到同學(xué)的友誼。
附錄一:原理圖 
上位機Labview數(shù)據(jù)顯示程序 前面板 后面板labview程序
- //*************此程序為nRF905的發(fā)送程序***********
- #include <reg52.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
-
- //*******************定義命令字**********************
- #define WC 0x00 // Write configuration register command
- #define RC 0x10 // Read configuration register command
- #define WTP 0x20 // Write TX Payload command
- #define RTP 0x21 // Read TXPayload command
- #define WTA 0x22 // Write TX Address command
- #define RTA 0x23
-
- //*******************管腳配置*********
- sbit TXEN=P1^0;
- sbit TRX_CE=P1^1;
- sbit PWR=P1^2;
- sbit MISO=P1^4;
- sbit MOSI=P1^5;
- sbit SCK=P1^6;
- sbit CSN=P1^7;
- /////////////////////////////////////////////////////
- sbit AM=P3^3;
- sbit DR=P3^4;
- sbit CD=P3^2;
- sbit DQ=P1^3;
- //uchar Txbuf[4];
- uchar display[5]={0x00,0x00,0x00,0x00,0x00}; //前面4字節(jié)是要發(fā)送的內(nèi)容
- //從前往后是溫度數(shù)據(jù)低位到高位
- // 溫度小數(shù)部分查表
- uchar code ditab[16]=
- {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
- uint h;
- uchar flag;
- //rf905控制信息
- uchar Rfconfig[10]={0x4c,0x0c,0x44,0x04,0x04,0xe7,0xe7,0xe7,0xe7,0x58};
- uchar data temp_data[2]={0x00,0x00};
-
- void delay(uint x)
- {
- uint i;
- for(i=0;i<x;i++)
- {
- _nop_();
- }
- }
-
- //18b20相關(guān)函數(shù)
- /***********18B20復(fù)位函數(shù)**********/
- void ow_reset(void)
- {
- char presence=1;
- while(presence)
- {
- while(presence)
- {
- DQ=1;_nop_();_nop_();
- DQ=0; //
- delay(50); // 550us
- DQ=1; //
- delay(6); // 66us
- presence=DQ; // presence=0繼續(xù)下一步
- }
- delay(45); //延時500us
- presence = ~DQ;
- }
- DQ=1;
- }
-
- /**********18B20寫命令函數(shù)*********/
- //向 1-WIRE 總線上寫一個字節(jié)
- void write_byte(uchar val)
- {
- uchar i;
- for (i=8; i>0; i--) //
- {
- DQ=1;_nop_();_nop_();
- DQ = 0;_nop_();_nop_();_nop_();_nop_();_nop_();//5us
- DQ = val&0x01; //最低位移出
- delay(6); //66us
- val=val/2; //右移一位
- }
- DQ = 1;
- delay(1);
- }
-
- /*********18B20讀1個字節(jié)函數(shù)********/
- //從總線上讀取一個字節(jié)
- uchar read_byte(void)
- {
- uchar i;
- uchar value = 0;
- for (i=8;i>0;i--)
- {
- DQ=1;_nop_();_nop_();
- value>>=1;
- DQ = 0; //
- _nop_();_nop_();_nop_();_nop_(); //4us
- DQ = 1;_nop_();_nop_();_nop_();_nop_(); //4us
- if(DQ)value|=0x80;
- delay(6); //66us
- }
- DQ=1;
- return(value);
- }
-
- /***********讀出溫度函數(shù)**********/
- void read_temp()
- {
- ow_reset(); //總線復(fù)位
- write_byte(0xCC); // 發(fā)Skip ROM命令
- write_byte(0xBE); // 發(fā)讀命令
- temp_data[0]=read_byte(); //溫度低8位
- temp_data[1]=read_byte(); //溫度高8位
- ow_reset();
- write_byte(0xCC); // Skip ROM
- write_byte(0x44); // 發(fā)轉(zhuǎn)換命令
- }
-
- /***********溫度數(shù)據(jù)處理函數(shù)**********/
- void work_temp()
- {
- uchar n=0;
- uchar doth,dotl;
- uchar flag3=1,flag2=1; //數(shù)字顯示修正標(biāo)記
- if((temp_data[1]&0xf8)!=0x00)
- {
- temp_data[1]=~(temp_data[1]);
- temp_data[0]=~(temp_data[0])+1;
- n=1;
- flag=1;
- }//負(fù)溫度求補碼
- if(temp_data[0]>255)
- {
- temp_data[1]++;
- }
- display[4]=temp_data[0]&0x0f;
- display[0]=ditab[display[4]];
- doth=display[0]/10;
- dotl=display[0]%10;
- display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x07)<<4);
- display[3]=display[4]/100;
- display[2]=display[4]/10%10;
- display[1]=display[4]%10;
- if(!display[3])
- {
- display[3]=0x0a;
- flag3=0;
- if(!display[2])
- {
- display[2]=0x0a;
- flag2=0;
- }
- }//最高位為0時都不顯示
- if(n)
- {
- display[3]=0x0b;//負(fù)溫度時最高位顯示"-"
- flag3=0;
- }
- }
- //905相關(guān)函數(shù)
- void Spiwrite(uchar dat)
- {
- uchar i=8;
- while(i--)
- {
- delay(10);
- SCK=0;
- MOSI=(bit)(dat&0x80);
- dat<<=1;
- delay(10);
- SCK=1;
- delay(10);
- SCK=0;
- }
- SCK=0;
- }
-
- void Txpacket(void)
- {
- TXEN=1;
- CSN=0;
- Spiwrite(0x22);
- Spiwrite(0xe7);
- Spiwrite(0xe7);
- Spiwrite(0xe7);
- Spiwrite(0xe7);
- CSN=1;
- _nop_();_nop_();
- CSN=0;
- Spiwrite(0x20);
- Spiwrite(display[0]);
- Spiwrite(display[1]);
- Spiwrite(display[2]);
- Spiwrite(display[3]);
- CSN=1;
- _nop_();_nop_();
- TRX_CE=1;
- delay(50);
- while(!DR);
- TRX_CE=0;
- }
-
- void ini_system(void)
- {
- uchar i;
- CSN=1;
- SCK=0;
- PWR=1; // PWR_UP | TRX_CE |TXEN | M O D E
- TRX_CE=0; // 1 | 0 | 0 | SPI Programming
- TXEN=0;
- _nop_();
- CSN=0;
- Spiwrite(0x00);
- for(i=0;i<10;i++)
- {
- Spiwrite(Rfconfig[i]);
- }
- CSN=1;
- }
- void setmode()
- {
- PWR=1; // PWR_UP TRX_CE TXEN MODE
- TRX_CE=1; // 1 1 1 SHOCKBURST TX
- TXEN=1;
- delay(1000); //time must be >=650us
- }
-
- void nRF905Init(void)
- {
- CSN=1; // Spi disable
- SCK=0; // Spi clock line init low
- DR=1; // Init DR for input
- AM=1; // Init AM for input
- CD=1; // Init CD for input
- PWR=1; // nRF905 power on
- TRX_CE=0; // Set nRF905 in standby mode
- TXEN=0; // set radio in Rx mode
- }
- void main()
- {
- ow_reset(); // 開機先轉(zhuǎn)換一次
- write_byte(0xCC); // Skip ROM
- write_byte(0x44); // 發(fā)轉(zhuǎn)換命令
- nRF905Init();
- ini_system();
- while(1)
- {
- read_temp(); //讀出18B20溫度數(shù)據(jù)
- work_temp(); //處理溫度數(shù)據(jù)
- setmode();
- delay(100);
- Txpacket();
- delay(1000);
- }
- }
-
- 接收部分程序:
- /*****接收時用數(shù)碼管顯示接收到的數(shù)據(jù)**********/
- #include <reg52.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define disdate P0 //段碼輸出口
- #define discan P2 //掃描口
-
- //############################################
- //數(shù)碼管顯示部分
- uchar dis_7[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};
- //共陽LED段碼表 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮" "-"
- uchar dis_can[4]={0xfe,0xfd,0xfb,0xf7};//列選代碼
- #define WC 0x00
- #define RC 0x10
- #define WTP 0x20
- #define RTP 0x21
- #define WTA 0x22
- #define RTA 0x23
- #define RRP 0x24
- sbit TXEN=P1^0;
- sbit TRX_CE=P1^1;
- sbit PWR=P1^2;
- sbit MISO=P1^4;
- sbit MOSI=P1^5;
- sbit SCK=P1^6;
- sbit CSN=P1^7;
- /////////////////////////////////////////////////////
- sbit AM=P3^3;
- sbit DR=P3^4;
- sbit CD=P3^2;
-
- sbit DP=P0^7;
- unsigned char Rxbuf[4]={0x00,0x00,0x00,0x00};
- unsigned char Rfconfig[10]=
- {0x4c,0x0c,0x44,0x04,0x04,0xe7,0xe7,0xe7,0xe7,0x58};
- void delay110(uint z)
- { uchar x;
- uint y;
- for(x=0;x<=110;x++)
- for(y=0;y<=z;y++);
- }
- void delay(uint x)
- { uint i;
- for(i=0;i<x;i++)
- {
- _nop_();
- }
- }
-
- void Spiwrite(uchar dat)
- {uchar i=8;
- for(i=0;i<8;i++)
- {
- delay(10);
- SCK=0;
- MOSI=(bit)(dat&0x80);
- dat<<=1;
- delay(10);
- SCK=1;
- delay(10);
- SCK=0;
- }
- SCK=0;
- }
-
- unsigned char Spiread(void)
- {
- uchar i=8;
- uchar ddat;
- for(i=0;i<8;i++)
- {
- ddat<<=1;
- SCK=0;
- _nop_();
- _nop_();
- ddat|=MISO;
- SCK=1;
- _nop_();_nop_();
- }
- SCK=0;
- return ddat;
- }
- void Rxpacket(void)
- {
- unsigned char j=0;
- delay110(50);
- TRX_CE=0;
- PWR=1;
- CSN=0;
- delay(1);
- Spiwrite(RRP);
- for(j=0;j<4;j++)
- {
- Rxbuf[j]=Spiread();
- }
- CSN=1;
- delay110(5);
- // TRX_CE=1; // Set TRX_CE high,start Tx data transmission
- }
-
- void ini_system(void)
- {
- uchar i;
- CSN=1;
- SCK=0;
- PWR=1; // PWR_UP | TRX_CE |TXEN | M O D E
- TRX_CE=0; // 1 | 0 | 0 | SPI Programming
- TXEN=0;
- _nop_();
- CSN=0;
- Spiwrite(WC);
- for(i=0;i<10;i++)
- {
- Spiwrite(Rfconfig[i]);
- }
- CSN=1;
- }
- void setmode()
- {
- PWR=1; // PWR_UP TRX_CE TXEN MODE
- TRX_CE=1; // 1 1 0 SHOCKBURST RX
- TXEN=0;
- delay(500); //time must be >=650us
- }
-
- /***********顯示掃描函數(shù)**********/
- void scan()
- {
- char k;
- for(k=0;k<4;k++) //四位LED掃描控制
- {
- disdate=0xff;
- disdate=dis_7[Rxbuf[k]];
- if(k==1){DP=0;}
- discan=dis_can[3-k];delay(90);
- discan=0xff;
- }
- }
-
- void nRF905Init(void)
- {
- CSN=1; // Spi disable
- SCK=0; // Spi clock line init low
- DR=1; // Init DR for input
- AM=1; // Init AM for input
- CD=1; // Init CD for input
- PWR=1; // nRF905 power on
- TRX_CE=0; // Set nRF905 in standby mode
- TXEN=0; // set radio in Rx mode
- }
-
- unsigned char CheckDR(void) //檢查是否有新數(shù)據(jù)傳入 Data Ready
- {
- if (DR==1&&TRX_CE==1&&TXEN==0)
- {
- // Delay(50) ;
- return 1;
- }
- else
- {
- return 0;
- }
- }
- uchar m;
- uint n;
-
- void main()
- {
- nRF905Init();
- ini_system();
- while(1)
- {
- setmode();
- while (CheckDR()==0);
- // delay(10);
- Rxpacket();
- // delay(1);
- while(DR==1)
- {
- for(m=0;m<=1;m++)
- {
- scan();
- }
- }
- //delay110(2);
- for(m=0;m<=100;m++)
- {
- scan();
- }
- }
- }
復(fù)制代碼
完整的Word格式文檔51黑下載地址:
基于51單片機系統(tǒng)的溫度檢測與無線收發(fā)設(shè)計.doc
(1.23 MB, 下載次數(shù): 26)
2018-12-9 13:35 上傳
點擊文件名下載附件
|