找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6004|回復(fù): 1
收起左側(cè)

基于51單片機系統(tǒng)的溫度檢測與無線收發(fā)設(shè)計

[復(fù)制鏈接]
ID:442604 發(fā)表于 2018-12-9 13:36 | 顯示全部樓層 |閱讀模式
新型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程序

  1. //*************此程序為nRF905的發(fā)送程序***********
  2. #include <reg52.h>
  3. #include <intrins.h>
  4. #define uchar unsigned char
  5. #define uint  unsigned int

  6. //*******************定義命令字**********************
  7. #define WC 0x00  // Write configuration register command
  8. #define RC 0x10   // Read configuration register command
  9. #define WTP 0x20   // Write TX Payload  command
  10. #define RTP 0x21  // Read TXPayload  command
  11. #define WTA 0x22  // Write TX Address  command
  12. #define RTA 0x23

  13. //*******************管腳配置*********
  14. sbit              TXEN=P1^0;
  15. sbit              TRX_CE=P1^1;
  16. sbit              PWR=P1^2;
  17. sbit              MISO=P1^4;
  18. sbit              MOSI=P1^5;
  19. sbit              SCK=P1^6;
  20. sbit              CSN=P1^7;
  21. /////////////////////////////////////////////////////
  22. sbit              AM=P3^3;
  23. sbit              DR=P3^4;
  24. sbit              CD=P3^2;
  25. sbit DQ=P1^3;
  26. //uchar Txbuf[4];
  27. uchar display[5]={0x00,0x00,0x00,0x00,0x00};              //前面4字節(jié)是要發(fā)送的內(nèi)容
  28. //從前往后是溫度數(shù)據(jù)低位到高位
  29. // 溫度小數(shù)部分查表
  30. uchar code ditab[16]=
  31. {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
  32. uint     h;
  33. uchar flag;
  34. //rf905控制信息
  35. uchar Rfconfig[10]={0x4c,0x0c,0x44,0x04,0x04,0xe7,0xe7,0xe7,0xe7,0x58};
  36. uchar data temp_data[2]={0x00,0x00};  

  37. void delay(uint x)
  38. {
  39. uint i;
  40. for(i=0;i<x;i++)
  41. {
  42.   _nop_();
  43. }
  44. }

  45. //18b20相關(guān)函數(shù)
  46. /***********18B20復(fù)位函數(shù)**********/
  47. void ow_reset(void)
  48. {
  49. char presence=1;
  50. while(presence)
  51. {
  52. while(presence)
  53. {
  54. DQ=1;_nop_();_nop_();
  55. DQ=0;    //
  56. delay(50); // 550us
  57. DQ=1;    //
  58. delay(6); // 66us
  59. presence=DQ; // presence=0繼續(xù)下一步
  60.    }
  61. delay(45);    //延時500us
  62. presence = ~DQ;
  63. }
  64. DQ=1;
  65. }

  66. /**********18B20寫命令函數(shù)*********/
  67. //向 1-WIRE 總線上寫一個字節(jié)
  68. void write_byte(uchar val)
  69. {
  70. uchar i;
  71. for (i=8; i>0; i--) //
  72. {
  73. DQ=1;_nop_();_nop_();
  74. DQ = 0;_nop_();_nop_();_nop_();_nop_();_nop_();//5us
  75. DQ = val&0x01;      //最低位移出
  76. delay(6);           //66us
  77. val=val/2;          //右移一位
  78. }
  79. DQ = 1;
  80. delay(1);
  81. }

  82. /*********18B20讀1個字節(jié)函數(shù)********/
  83. //從總線上讀取一個字節(jié)
  84. uchar read_byte(void)
  85. {
  86. uchar i;
  87. uchar value = 0;
  88. for (i=8;i>0;i--)
  89. {
  90. DQ=1;_nop_();_nop_();
  91. value>>=1;
  92. DQ = 0;             //
  93. _nop_();_nop_();_nop_();_nop_();   //4us
  94. DQ = 1;_nop_();_nop_();_nop_();_nop_();   //4us
  95. if(DQ)value|=0x80;
  96. delay(6);           //66us
  97. }
  98. DQ=1;
  99. return(value);
  100. }

  101. /***********讀出溫度函數(shù)**********/
  102. void read_temp()
  103. {
  104. ow_reset();       //總線復(fù)位
  105. write_byte(0xCC); // 發(fā)Skip ROM命令
  106. write_byte(0xBE); // 發(fā)讀命令
  107. temp_data[0]=read_byte(); //溫度低8位
  108. temp_data[1]=read_byte(); //溫度高8位
  109. ow_reset();
  110. write_byte(0xCC); // Skip ROM
  111. write_byte(0x44); // 發(fā)轉(zhuǎn)換命令
  112. }

  113. /***********溫度數(shù)據(jù)處理函數(shù)**********/
  114. void work_temp()
  115. {
  116. uchar n=0;
  117. uchar doth,dotl;
  118. uchar flag3=1,flag2=1;       //數(shù)字顯示修正標(biāo)記
  119. if((temp_data[1]&0xf8)!=0x00)
  120. {
  121.    temp_data[1]=~(temp_data[1]);
  122.    temp_data[0]=~(temp_data[0])+1;
  123.    n=1;
  124.    flag=1;
  125. }//負(fù)溫度求補碼
  126. if(temp_data[0]>255)
  127. {
  128. temp_data[1]++;
  129. }
  130. display[4]=temp_data[0]&0x0f;
  131. display[0]=ditab[display[4]];
  132. doth=display[0]/10;
  133. dotl=display[0]%10;
  134. display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x07)<<4);
  135. display[3]=display[4]/100;
  136. display[2]=display[4]/10%10;
  137. display[1]=display[4]%10;
  138. if(!display[3])
  139.    {
  140.     display[3]=0x0a;
  141.     flag3=0;
  142.     if(!display[2])
  143.     {
  144.      display[2]=0x0a;
  145.      flag2=0;
  146.     }
  147.    }//最高位為0時都不顯示
  148. if(n)
  149. {
  150.    display[3]=0x0b;//負(fù)溫度時最高位顯示"-"
  151.    flag3=0;
  152. }
  153. }
  154. //905相關(guān)函數(shù)
  155. void Spiwrite(uchar dat)
  156. {
  157. uchar i=8;
  158. while(i--)
  159. {
  160. delay(10);
  161. SCK=0;
  162. MOSI=(bit)(dat&0x80);
  163. dat<<=1;
  164. delay(10);
  165. SCK=1;
  166. delay(10);
  167. SCK=0;
  168. }
  169. SCK=0;
  170. }

  171. void Txpacket(void)
  172. {
  173. TXEN=1;
  174. CSN=0;
  175. Spiwrite(0x22);
  176. Spiwrite(0xe7);
  177. Spiwrite(0xe7);
  178. Spiwrite(0xe7);
  179. Spiwrite(0xe7);
  180. CSN=1;
  181. _nop_();_nop_();
  182. CSN=0;
  183. Spiwrite(0x20);
  184. Spiwrite(display[0]);
  185. Spiwrite(display[1]);
  186. Spiwrite(display[2]);
  187. Spiwrite(display[3]);
  188. CSN=1;
  189. _nop_();_nop_();
  190. TRX_CE=1;
  191. delay(50);
  192. while(!DR);
  193. TRX_CE=0;
  194. }

  195. void ini_system(void)
  196. {
  197. uchar i;
  198. CSN=1;
  199. SCK=0;
  200. PWR=1;   //   PWR_UP  | TRX_CE |TXEN | M O D E
  201. TRX_CE=0;  // 1    |   0    |  0 | SPI Programming
  202. TXEN=0;
  203. _nop_();
  204. CSN=0;
  205. Spiwrite(0x00);
  206. for(i=0;i<10;i++)
  207. {
  208. Spiwrite(Rfconfig[i]);
  209. }
  210. CSN=1;
  211. }
  212. void setmode()
  213. {
  214. PWR=1;  //   PWR_UP  TRX_CE   TXEN      MODE
  215. TRX_CE=1; //      1        1     1 SHOCKBURST TX
  216. TXEN=1;
  217. delay(1000); //time must be >=650us
  218. }

  219. void nRF905Init(void)
  220. {
  221.     CSN=1;                                                                                    // Spi               disable
  222.               SCK=0;                                                                                    // Spi clock line init low
  223.               DR=1;                                                                                    // Init DR for input
  224.               AM=1;                                                                                    // Init AM for input
  225.               CD=1;                                                                                    // Init CD for input
  226.               PWR=1;                                                                      // nRF905 power on
  227.               TRX_CE=0;                                                                      // Set nRF905 in standby mode
  228.               TXEN=0;                                                                      // set radio in Rx mode
  229. }
  230. void main()
  231. {
  232. ow_reset();       // 開機先轉(zhuǎn)換一次
  233. write_byte(0xCC); // Skip ROM
  234. write_byte(0x44); // 發(fā)轉(zhuǎn)換命令
  235.               nRF905Init();
  236. ini_system();
  237. while(1)
  238. {
  239. read_temp();         //讀出18B20溫度數(shù)據(jù)
  240. work_temp();         //處理溫度數(shù)據(jù)
  241. setmode();
  242. delay(100);
  243. Txpacket();
  244. delay(1000);
  245. }
  246. }

  247. 接收部分程序:
  248. /*****接收時用數(shù)碼管顯示接收到的數(shù)據(jù)**********/
  249. #include <reg52.h>
  250. #include <intrins.h>
  251. #define uchar unsigned char
  252. #define uint  unsigned int
  253. #define disdate P0                //段碼輸出口
  254. #define discan P2                //掃描口

  255. //############################################
  256. //數(shù)碼管顯示部分
  257. uchar dis_7[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};
  258. //共陽LED段碼表        "0"  "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9" "不亮" "-"  
  259. uchar dis_can[4]={0xfe,0xfd,0xfb,0xf7};//列選代碼
  260. #define WC 0x00  
  261. #define RC 0x10   
  262. #define WTP 0x20   
  263. #define RTP 0x21  
  264. #define WTA 0x22  
  265. #define RTA 0x23  
  266. #define RRP 0x24
  267. sbit              TXEN=P1^0;
  268. sbit              TRX_CE=P1^1;
  269. sbit              PWR=P1^2;
  270. sbit              MISO=P1^4;
  271. sbit              MOSI=P1^5;
  272. sbit              SCK=P1^6;
  273. sbit              CSN=P1^7;
  274. /////////////////////////////////////////////////////
  275. sbit              AM=P3^3;
  276. sbit              DR=P3^4;
  277. sbit              CD=P3^2;

  278. sbit DP=P0^7;
  279. unsigned char Rxbuf[4]={0x00,0x00,0x00,0x00};
  280. unsigned char Rfconfig[10]=
  281. {0x4c,0x0c,0x44,0x04,0x04,0xe7,0xe7,0xe7,0xe7,0x58};
  282. void delay110(uint z)
  283. {              uchar x;
  284.               uint y;
  285.               for(x=0;x<=110;x++)
  286.                             for(y=0;y<=z;y++);
  287. }
  288. void delay(uint x)
  289. { uint i;
  290. for(i=0;i<x;i++)
  291. {
  292.   _nop_();
  293. }
  294. }

  295. void Spiwrite(uchar dat)
  296. {uchar i=8;
  297. for(i=0;i<8;i++)
  298. {
  299. delay(10);
  300. SCK=0;
  301. MOSI=(bit)(dat&0x80);
  302. dat<<=1;
  303. delay(10);
  304. SCK=1;
  305. delay(10);
  306. SCK=0;
  307. }
  308. SCK=0;
  309. }

  310. unsigned char Spiread(void)
  311. {
  312. uchar i=8;
  313. uchar ddat;
  314. for(i=0;i<8;i++)
  315. {
  316. ddat<<=1;
  317. SCK=0;
  318. _nop_();
  319. _nop_();
  320. ddat|=MISO;
  321. SCK=1;
  322. _nop_();_nop_();
  323. }
  324. SCK=0;
  325. return ddat;
  326. }
  327. void Rxpacket(void)
  328. {
  329. unsigned char j=0;
  330. delay110(50);
  331. TRX_CE=0;
  332. PWR=1;
  333. CSN=0;
  334. delay(1);
  335. Spiwrite(RRP);
  336. for(j=0;j<4;j++)
  337. {
  338. Rxbuf[j]=Spiread();
  339. }
  340. CSN=1;
  341. delay110(5);
  342. //              TRX_CE=1;                                                                      // Set TRX_CE high,start Tx data transmission
  343. }

  344. void ini_system(void)
  345. {
  346. uchar i;
  347. CSN=1;
  348. SCK=0;
  349. PWR=1;   //   PWR_UP  | TRX_CE |TXEN | M O D E
  350. TRX_CE=0;  // 1    |   0    |  0 | SPI Programming
  351. TXEN=0;
  352. _nop_();
  353. CSN=0;
  354. Spiwrite(WC);
  355. for(i=0;i<10;i++)
  356. {
  357. Spiwrite(Rfconfig[i]);
  358. }
  359.   CSN=1;
  360. }
  361. void setmode()
  362. {
  363. PWR=1;  //   PWR_UP  TRX_CE   TXEN      MODE
  364. TRX_CE=1; //      1        1     0 SHOCKBURST RX
  365. TXEN=0;
  366. delay(500); //time must be >=650us
  367. }

  368. /***********顯示掃描函數(shù)**********/
  369. void scan()
  370. {
  371. char k;
  372.     for(k=0;k<4;k++)         //四位LED掃描控制
  373.      {
  374.               disdate=0xff;
  375.       disdate=dis_7[Rxbuf[k]];
  376.       if(k==1){DP=0;}
  377.       discan=dis_can[3-k];delay(90);
  378.                 discan=0xff;
  379.      }
  380. }

  381. void nRF905Init(void)
  382. {
  383.     CSN=1;                                                                                    // Spi               disable
  384.               SCK=0;                                                                                    // Spi clock line init low
  385.               DR=1;                                                                                    // Init DR for input
  386.               AM=1;                                                                                    // Init AM for input
  387.               CD=1;                                                                                    // Init CD for input
  388.               PWR=1;                                                                      // nRF905 power on
  389.               TRX_CE=0;                                                                      // Set nRF905 in standby mode
  390.               TXEN=0;                                                                      // set radio in Rx mode
  391. }

  392. unsigned char CheckDR(void)                            //檢查是否有新數(shù)據(jù)傳入 Data Ready
  393. {
  394.               if (DR==1&&TRX_CE==1&&TXEN==0)
  395.               {
  396.        // Delay(50)  ;
  397.                             return 1;
  398.               }
  399.               else
  400.               {
  401.                             return 0;
  402.               }
  403. }
  404. uchar m;
  405. uint n;

  406. void main()
  407. {
  408. nRF905Init();
  409.   ini_system();
  410. while(1)
  411. {                           
  412.    setmode();
  413. while (CheckDR()==0);
  414. //                delay(10);
  415.   Rxpacket();
  416. //              delay(1);
  417.   while(DR==1)
  418.   {
  419.   for(m=0;m<=1;m++)
  420. {
  421.               scan();
  422. }
  423.   }
  424. //delay110(2);
  425. for(m=0;m<=100;m++)
  426. {
  427.               scan();
  428. }
  429. }
  430. }
復(fù)制代碼

完整的Word格式文檔51黑下載地址:
基于51單片機系統(tǒng)的溫度檢測與無線收發(fā)設(shè)計.doc (1.23 MB, 下載次數(shù): 26)


回復(fù)

使用道具 舉報

ID:585189 發(fā)表于 2019-7-16 17:18 | 顯示全部樓層
無線用的這個沒學(xué)過 nRF905
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表