無線溫度傳輸_第1頁
無線溫度傳輸_第2頁
無線溫度傳輸_第3頁
無線溫度傳輸_第4頁
無線溫度傳輸_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、基于52單片機的無線測溫設(shè)計 摘 要:溫度檢測在日常生活、工作和工程實踐中有重要的應(yīng)用,我們選擇STC89C52RC作為主控芯片,工作場所的溫度采集采用了溫度采集芯片DS18B20來達(dá)到一定的準(zhǔn)確度和精確度,最后采用nRF24L01模塊對采集到的溫度數(shù)據(jù)進(jìn)行無線傳輸,在經(jīng)過軟硬件測試后,我們基本實現(xiàn)了用nRF24L01進(jìn)行一定距離溫度數(shù)據(jù)傳輸后在接受端的1602液晶上顯示出來的模型,傳輸距離>30m,溫度范圍達(dá)到0至125攝氏度。關(guān)鍵詞: STC89C52RC;nRF24L01;DS18B20;無線傳輸隨著社會的進(jìn)步,利用無線通信進(jìn)行溫度數(shù)據(jù)采集的方式已經(jīng)滲透到生活各個方面。例如在礦工業(yè)

2、現(xiàn)場,由于工作環(huán)境復(fù)雜、嚴(yán)酷,工作人員不能長時間停留在現(xiàn)場觀察設(shè)備等是否運行正常,就需要采集數(shù)據(jù)并傳輸?shù)揭粋€環(huán)境相對好的操控室內(nèi),這樣就會產(chǎn)生數(shù)據(jù)傳輸問題。但由于廠房大、需要傳輸?shù)臄?shù)據(jù)多,使用傳統(tǒng)的有線數(shù)據(jù)傳輸方式就需要鋪設(shè)很多很長的通訊線,這不但浪費資源,占用空間,可操作性差,出現(xiàn)錯誤檢修困難,而且當(dāng)數(shù)據(jù)采集點處于運動狀態(tài),所處的環(huán)境不允許或無法鋪設(shè)電纜時數(shù)據(jù)就無法傳輸,此時便需要利用無線傳輸?shù)姆绞竭M(jìn)行數(shù)據(jù)采集。事實上在生活中,無線溫度采集系統(tǒng)已經(jīng)被成功應(yīng)用于礦工業(yè)業(yè)、安防監(jiān)控、環(huán)境監(jiān)測、軍事國防等許多智能控制領(lǐng)域,有的是單獨做為一個系統(tǒng),有的是與其它系統(tǒng)結(jié)合使用??偟膩碚f凡是布線繁雜或不允

3、許布線的場合都希望能通過無線方案來解決。為此,需要設(shè)計相應(yīng)的接口系統(tǒng),控制這些射頻芯片工作,完成可靠穩(wěn)定的無線數(shù)據(jù)通信,這樣使得研究也變得更加有意義了。1 對設(shè)計任務(wù)的分析1.1系統(tǒng)的功能模塊整個系統(tǒng)由溫度采集模塊、無線收發(fā)模塊、溫度顯示模塊構(gòu)成。發(fā)送部分以單片機STC89C52RC為核心,使用溫度采集轉(zhuǎn)換芯片DS18B20實時采集溫度,將采集的溫度數(shù)據(jù)通過一塊無線收發(fā)模塊傳送給接收部分,然后接收部分再通過另一塊無線收發(fā)模塊接收溫度數(shù)據(jù),然后傳給單片機,單片機對接收到的溫度數(shù)據(jù)處理之后傳給液晶,最終將會在液晶上顯示。對于DS18B20的溫度檢測模塊,由于是單線傳輸,硬件部分較簡單,但軟件在時序

4、上的精確度控制上要求比較高,要做到精確、正確傳輸,必要的可設(shè)置上、下限值來實現(xiàn)報警。顯示模塊選用1602LCD,硬件連線與軟件編程雖然較簡單,但因為是顯示整個系統(tǒng)軟、硬件連接好壞的直觀對象,不可忽視。無線收發(fā)模塊采用挪威(Nordic)公司生產(chǎn)的nRF24L01及其外圍電路組成,軟件部分必須要熟悉內(nèi)部的標(biāo)志控制寄存器、數(shù)據(jù)通道、發(fā)射頻率功率、收發(fā)模式、SPI時序以利于編程,硬件連接簡單,但須清楚每個管腳與STC89C52RC的連接點及作用以配置相應(yīng)功能。1.2 預(yù)期結(jié)果在完成硬件電路的設(shè)計,確保每個模塊使用無誤后,可焊接硬件電路。焊完檢查整個硬件系統(tǒng)無誤后,然后編寫軟件程序,運行無誤后下載至單

5、片機,可完成整個系統(tǒng)的設(shè)計。預(yù)期結(jié)果是:溫度測量范圍為0°C至125°C,無線傳輸距離>30m。2 STC89C52RC最小系統(tǒng)及編程環(huán)境的介紹2.1 STC89C52RC最小系統(tǒng)及應(yīng)用 STC89C52RC是一個低電壓,高性能8位單片機,片內(nèi)含8k bytes的可反復(fù)擦寫的Flash和256 bytes的隨機存取數(shù)據(jù)存儲器,工作電壓在3.3V5.5V,通用 I/O 口 (32 個), 復(fù)位后均為0, P1、P2、P3、P4 是準(zhǔn)雙向口,P0 口是漏極開路輸出,作為總線擴(kuò)展用時,不用加上拉電阻,但作為 I/O 口用時,需加上拉電阻1。 本設(shè)計中52單片機最小系統(tǒng)共使用

6、了VCC引腳作為芯片正極(該芯片是5V供電),VSS引腳接地,XTAL1、XTAL2引腳用來外接石英晶體與微調(diào)電容(本設(shè)計中晶振選用11.0592MHz),RST引腳用來外接復(fù)位電路。在發(fā)射系統(tǒng)中還使用了P0.0P0.5口作為nRF24L01芯片的輸入端口,P1.7口作為DS18B20的數(shù)據(jù)接收輸入端2。在接收系統(tǒng)使用了P0.0P0.7口作為1602LCD的數(shù)據(jù)輸入端,由于本設(shè)計是在已有電路板上的開發(fā),所以1602LCD的控制端RS與P1.2相連,RW與P1.1相連,EN端與P1.0相連,P2.0P2.5作為nRF24L01芯片的輸入端口,由于P0口輸出級是漏極開路電路,要使“1”信號正常輸出

7、,必須外接上拉電阻3。STC89C52RC最小系統(tǒng)圖如圖1所示。圖1 STC89C52RC最小系統(tǒng)2.2 Keil Vision4 的使用流程首先在桌面新建個存放工程的文件夾,例biyesheji.打開 Keil Vision4 ,然后點擊菜單欄中Project選項,在下拉菜單欄中選擇New Vision Project.,便可彈出Creat New Project窗口,輸入工程名稱,例biyesheji(文件名可與工程名不同)??蓮棾銎骷x擇對話框窗口,選擇(前面加號),然后選擇AT89C51(因為AT89C51單片機的基本功能與STC89C52RC完全相同,所以我們選擇AT89C51),單

8、擊OK即可創(chuàng)建。然后單擊菜單欄中的File選項,在下拉菜單中選擇New,便可創(chuàng)建一個Text文檔,點擊保存,保存在與工程同文件夾下,注意名稱更改為main.c,單擊確定,即可保存。單擊左鍵main.c文檔左邊Project欄中Target1左邊的加號,可彈出Source Group 1,單擊右鍵Source Group 1,選擇Add Files to Group”Source Group 1”,選擇main.c 文件,即添加mian.c至工程。在工具欄單擊Target 0ptions.按鍵,可彈出Option for Target”Target 1”窗口,選擇Output選項,勾選Creat

9、 HEX File選項。 在main.c中輸入我們的系統(tǒng)軟件程序,順序點擊左上方的三個編譯按鍵,在main.c輸入框下面可查看出錯與警告數(shù)量,單擊錯誤原因可自動轉(zhuǎn)換到出錯地方,修改之后再編譯,直至沒有錯誤,一般情況下警告內(nèi)容可忽略。3 系統(tǒng)各模塊使用方法本設(shè)計采用溫度傳感器,配合低功耗單片機就可以快速、高效、準(zhǔn)確的采集到目標(biāo)點的溫度,然后采用無線模塊對采集到的溫度數(shù)據(jù)進(jìn)行無線傳輸,最終設(shè)計好的系統(tǒng)能夠測量距離較遠(yuǎn)的溫度,并將溫度人性化的顯示在液晶上。本設(shè)計采用STC89C52RC作為主控CPU,外加DS18B20溫度采集模塊、nRF24L0l無線收發(fā)模塊和1602液晶顯示模塊組成整個系統(tǒng)4,如

10、圖2所示。圖2 系統(tǒng)總體架構(gòu)圖3.1 溫度采集模塊該模塊采用數(shù)字測溫芯片DS18B20,測量范圍從-55攝氏度到+125攝氏度,擁有可以選擇的9到12位溫度數(shù)據(jù)分辨率,可以工作在寄生電源模式,也可采用外部電源供電,本設(shè)計采用外部電源供電。本系統(tǒng)中溫度傳感器輸出腳I/O直接與單片機的P1.7相連。具體連接如圖 圖3 DS18B20與STC89C52RC接口電路。 圖3 DS18B20與STC89C52RC接口電路DS18B20 可做主機也可作從機,但在本設(shè)計中充當(dāng)從機的角色,而單片機就是主機。單片機通過單總線總線訪問DS18B20需要經(jīng)過以下幾個步驟: (1)DS18B20初始化(復(fù)位)。 (2

11、)執(zhí)行ROM 指令。ROM 指令也就是訪問、搜索、匹配DS18B20 的64 位序列號的動作。在單個DS18B20情況下,可以直接跳過ROM 指令。而跳過ROM 指令的字節(jié)是0xCC。由于本設(shè)計中我們使用單個DS18B20,所以我們無需刻意讀取ROM 里邊的序列號來,然后匹配那個DS18B205。 (3)執(zhí)行DS18B20 功能指令(RAM 指令),功能命令跟隨著需要交換的數(shù)據(jù)。在初始化過程中,主機通過拉低單總線至少480µs,以產(chǎn)生復(fù)位脈沖(TX)。然后主機釋放總線并進(jìn)入接收(RX)模式。當(dāng)總線被釋放后,4.7K的上拉電阻將單總線拉高。DS18B20檢測到這個上升沿后,延時15&#

12、181;s60µs,通過拉低總線60µs240µs產(chǎn)生應(yīng)答脈沖,主CPU檢測到這個低脈沖則表示復(fù)位成功。本設(shè)計中DS18B20采用分辨率為12位,因此精度為0.0625攝氏度。當(dāng)采集的溫度為零上攝氏度時,DS18B20高速暫存存儲器的第一個字節(jié)的高4位為0,當(dāng)采集的溫度為零下攝氏度時,DS18B20高速暫存存儲器的第1個字節(jié)的高4位為1。當(dāng)溫度為零上攝氏度時,只需給溫度數(shù)據(jù)乘以精度。當(dāng)溫度為零下攝氏度時,需給溫度數(shù)據(jù)取反加一再乘以精度。但當(dāng)DS18B20高速暫存存儲器的第0個字節(jié)為0XFF時,需給第0個字節(jié)清零,然后給第一個字節(jié)加1,之后再乘以精度。具體溫度轉(zhuǎn)換程

13、序如下:void convert_T(uchar temp_data_h,uchar temp_data_l) uchar temp; if(temp_data_h&0xf0)=0xf0) /*temp_data_h為DS18B20高速暫存存儲器的第1個字節(jié) temp_data_l為DS18B20高速暫存存儲器的第0個字節(jié)*/ temp_data_l=temp_data_l; if(temp_data_l=0xff) temp_data_l=temp_data_l+0x01; temp_data_h=temp_data_h; temp_data_h=temp_data_h+0x01;

14、else temp_data_l=temp_data_l+0x01; temp_data_h=temp_data_h; temp=(temp_data_l&0xf0)>>4)|(temp_data_h&0x0f)<<4); else temp=(temp_data_l&0xf0)>>4)|(temp_data_h&0x0f)<<4); 3.2 nRF24L01模塊使用方法流程 nRF24L01是新型單片射頻收發(fā)器件,工作于2.4 GHz2.5 GHz ISM頻段,供電電壓為1.9 V3.6 V,功耗低,在以-6dB

15、m的功率發(fā)射時,工作電流也只有9mA;接收時,工作時電流只有12.3mA,多種低功率工作模式(掉電模式和空閑模式)使節(jié)能設(shè)計更方便.實物圖如圖4所示,圖5為 nRF24L01模塊電路圖。圖4 nRF24L01實物圖圖5 nRF24L01模塊電路圖SCK口同步串行通信接口,最大傳輸速率可達(dá)10 Mb/s,傳輸時先傳送低位字節(jié),再傳送高位字節(jié)。對云單個字節(jié)而言,先送高位再送低位。用軟件模擬SPI總線,與SPI相關(guān)的指令共有8個,使用時這些控制指令由nRF24L01的MOSI輸入6。相應(yīng)的狀態(tài)和數(shù)據(jù)信息是從MISO輸出給MCU。 發(fā)射數(shù)據(jù)時,首先將nRF24L01配置為發(fā)射模式,接著把接收節(jié)點地址T

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

17、發(fā);MAX_RT或TX_DS置高時,使IRQ變低,產(chǎn)生中斷,通知MCU。最后發(fā)射成功時,若CE為低則nRF24L01進(jìn)入空閑模式1;若發(fā)送堆棧中有數(shù)據(jù)且CE為高,則進(jìn)入下一次發(fā)射;若發(fā)送堆棧中無數(shù)據(jù)且CE為高,則進(jìn)入空閑模式。 接收數(shù)據(jù)時,首先將nRF24L01配置為接收模式,接著延遲130s進(jìn)入接收狀態(tài)等待數(shù)據(jù)的到來。當(dāng)接收方檢測到有效的地址和CRC時,就將數(shù)據(jù)包存儲在RX FIFO中,同時中斷標(biāo)志位RX_DR置高,IRQ變低,產(chǎn)生中斷,通知MCU去取數(shù)據(jù)。若此時自動應(yīng)答開啟,接收方則同時進(jìn)入發(fā)射狀態(tài)回傳應(yīng)答信號。最后接收成功時,若CE變低,則nRF24L01進(jìn)入空閑模式1。在寫寄

18、存器之前一定要進(jìn)入待機模式或掉電模式。nRF24L0l所有的配置字都由配置寄存器定義,這些配置寄存器可通過SPI口訪問。nRF24L01 的配置寄存器共有25個,詳細(xì)配置參照附錄中系統(tǒng)程序。3.3 1602LCD的使用流程LCD使用前必須先對他初始化,可通過復(fù)位完成前,也可在復(fù)位完成后。初始化過程如清屏;功能設(shè)置;開關(guān)顯示設(shè)置;輸入方式設(shè)置。對1602LED操作分為讀、寫操作,讀、寫操作又分為數(shù)據(jù)與命令操作。LCD控制器HD44780內(nèi)有多個寄存器,通過RS和R/W引腳共同決定選擇哪一個寄存器。當(dāng)RS為高電平時選擇數(shù)據(jù)寄存器,低電平時選擇指令寄存器7。R/W為低電平時進(jìn)行讀操作,低電平時進(jìn)行寫

19、操作。DB0DB7為8位雙向數(shù)據(jù)線,MCU通過這8位數(shù)據(jù)線將溫度數(shù)據(jù)及其他數(shù)據(jù)傳給1602LCD。最終設(shè)計顯示是在1602LCD第一行顯示:“WEN DU:XX.X”,第二行顯示“TEST BY CTD”。寫數(shù)據(jù)與寫命令的程序具體如下:void write_command(uchar tempdata) /寫命令 while(check_busy(); / 檢測忙狀態(tài)RS=0; RW=0;E=1;P0=tempdata;E=0; Delay(2);void write_data(uchar tempdata) /寫數(shù)據(jù) while(check_busy(); RS=1;RW=0;E=1;P0=

20、tempdata; E=0; Delay(2);4 電路設(shè)計4.1電源電路本設(shè)計中STC89C52RC是5V供電芯片,nRF24L01的供電電壓也是5V,所以供電電路采用5V供電??紤]到成本、操作及開發(fā)難易度,供電電路采用USB供電。USB已經(jīng)是一個業(yè)內(nèi)標(biāo)準(zhǔn)了,電壓是55.2V ,電流是300mA500mA,接口靠兩端的是正負(fù)極,中間兩條是數(shù)據(jù)的正負(fù)極,只要設(shè)備不接觸“數(shù)據(jù)線”,電腦不會識別為移動設(shè)備。(業(yè)內(nèi)的標(biāo)準(zhǔn)數(shù)據(jù)線是“紅、白、綠、黑”分別是5V+、DAT-、DAT+、5V-)如果只用提供電源,只用兩條引線,設(shè)計產(chǎn)品額定用電不超過5V,電流不超500mA,因此用USB供電可完全達(dá)到系統(tǒng)設(shè)計

21、要求。 4.2 發(fā)射電路DS18B20測試到溫度之后,通過單片機的P1.7引腳傳給單片機,而單片機接收到溫度數(shù)據(jù)并轉(zhuǎn)換之后為數(shù)據(jù)型,而nRF24L01只能傳輸字符型,因此必須通過軟件在單片機中將數(shù)據(jù)型溫度數(shù)據(jù)轉(zhuǎn)換為字符型,再通過nRF24L01傳輸給接收部分,發(fā)射部分nRF24L01選擇P0.0P0.5引腳。由于P0口是漏極開路,因此P0.0P0.5引腳需要外接上拉電阻8。具體電路圖如下圖6 發(fā)射部分電路圖。圖6 發(fā)射部分電路圖4.3 接收電路液晶雙向數(shù)據(jù)線選擇P2口,使能端選擇P0.1引腳,讀寫選擇端R/W選擇P0.2引腳,數(shù)據(jù)、命令選擇端RS選擇P0.3引腳。無線接收模塊選擇P1.0P1.

22、5引腳,接收部分管腳具體電路圖見圖7接收部分電路圖。圖7 接收部分電路圖5 軟件設(shè)計流程5.1 無線發(fā)射模塊軟件設(shè)計首先進(jìn)行初始化操作,初始化包括設(shè)置單片機IO和模擬SPI總線兩部分以使其可以和nRF24L01通信。通過SPI總線配置射頻芯片使其進(jìn)入正常的工作模式。發(fā)射數(shù)據(jù)時,首先將nRF24L01配置為發(fā)射模式。接著把發(fā)送端待發(fā)射數(shù)據(jù)的目標(biāo)地址TXADDR和數(shù)據(jù)TXPLD寫入nRF24L01緩沖區(qū),延時后發(fā)射數(shù)據(jù),其流程圖如圖8所示,發(fā)射程序見附錄A.圖8無線發(fā)射軟件流程圖5.2 無線接收模塊軟件設(shè)計首先配置好1602LCD,包括光標(biāo)移動、設(shè)計數(shù)據(jù)位數(shù)、開關(guān)命令等。然后將nRF24L01配置

23、為接收模式。接收數(shù)據(jù)時延遲進(jìn)入接收狀態(tài)等待數(shù)據(jù)的到來,當(dāng)接收方檢測到有效地址和CRC時,就將數(shù)據(jù)包儲存在接收堆棧中,同時狀態(tài)寄存器中的中斷標(biāo)志位RXDR置高,產(chǎn)生中斷使IRQ引腳變?yōu)榈碗娖?,以便通知MCU去取數(shù)據(jù)。MCU接收到nRF24L01數(shù)據(jù)并處理之后,首先判斷數(shù)據(jù)是否正確,確定正確無誤后,將數(shù)據(jù)寫入1602LCD中顯示。否則,MCU發(fā)送數(shù)據(jù)重發(fā)命令,直至數(shù)據(jù)發(fā)送正確,重發(fā)次數(shù)將在配置nRF24L01時設(shè)置。其流程圖如圖9所示,具體接收程序見附錄B.圖9無線接收軟件流程圖6 系統(tǒng)的調(diào)試及測試結(jié)果6.1 調(diào)試步驟步驟一 完成硬件電路的焊接。步驟二 首先先將其中一片STC89C52RC最小系統(tǒng)

24、與液晶相連顯示,檢驗液晶顯示沒有問題。步驟三 將其中一片STC89C52RC與液晶及溫度傳感器DS18B20相連,寫入測量溫度的程序。測試DS18B20部分硬件及軟件部分好使。步驟四 將nRF24L01的收發(fā)部分分別與兩片STC89C52RC相連,寫入發(fā)射一個常數(shù)的程序,檢測收發(fā)模塊及程序好使。步驟五 將顯示、收發(fā)、溫度檢測程序整合,檢測系統(tǒng)是否能將發(fā)送端的溫度值測量出來發(fā)送到接收端在液晶上顯示出來。6.2 實驗結(jié)果經(jīng)實驗要求及實驗的目的,對系統(tǒng)進(jìn)行了一些動態(tài)值的測量,基本達(dá)到了設(shè)計的初衷。具體結(jié)果如表2所示:表2 數(shù)據(jù)測試表測試數(shù)據(jù)值發(fā)送端電流2.6mA接收端電流9mA收發(fā)端電壓3.3V收發(fā)

25、距離>30m溫度測試精度攝氏度參考文獻(xiàn)1 譚浩強. C程序設(shè)計北京M.北京:清華大學(xué)出版社 1999.20-21.2 康華光. 電子技術(shù)基礎(chǔ)數(shù)字部分(第五版)M.北京:高等教育出版社 2010.40-43.3 朱玉穎,蔡占輝. 基于nRF24L01的遠(yuǎn)程溫度檢測系統(tǒng)設(shè)計J.通信與信息處理 2010,12(10):100-102.4 周航慈. 單片機應(yīng)用程序設(shè)計技術(shù)M.北京:北京航空航天大學(xué)出版 2010.65-67.5 丁永紅、孫運強. 基于nRF240l的無線數(shù)傳系統(tǒng)設(shè)計J.國外電子測量技術(shù) 2008,27(4): 45-476 彭為. 單片機典型系統(tǒng)設(shè)計實例精講M.北京電子工業(yè)出版社

26、 2006. 69-717 潘永雄. 新編單片機原理與應(yīng)用M.西安:西安電子科技大學(xué)出版社 2003.78-80.8 曾勇、楊濤、馮月暉. 基于nRF24L01的超低功耗無線傳感器網(wǎng)絡(luò)點設(shè)計J.電子技應(yīng)用 2008,34(7):45-48.Wireless Temperature Measurement Based on 51 Single Chip MicrocomputerCHENG Tian-dong(Scienceand Technology of Electronic Information,Class 3,Grade 2010,School of Physics and Elect

27、rical Engineering, Weinan Normal University)Abstract:Temperature detection has important applications in daily life, work and engineering practice, we choose STC89C52RC as the main control chip,temperature acquisition workplace using temperature acquisition chip DS18B20 toachieve the accuracy and pr

28、ecision of the temperature data, finally the collected nRF24L01 module for wireless transmission, after the soft hardware testing, webasically are a certain distance from the temperature data transmission with nRF24L01 at the receiving end of the 1602 liquid crystal display model, the >30m transm

29、ission distance, the temperature range of 0 to 125 degrees. Key words: STC89C52RC;nRF24L01;DS18B20;Wireless附錄A 發(fā)送程序#include <reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int#define READ_REG #define WRITE_REG 0x20 #define RD_RX_PLOAD 0x61 #define WR_TX_PLOAD

30、 0xA0 #define FLUSH_TX 0xE1 #define FLUSH_RX 0xE2 #define REUSE_TX_PL 0xE3 #define NOP 0xFF #define CONFIG 0x00 #define EN_AA 0x01 #define EN_RXADDR 0x02 #define SETUP_AW 0x03 #define SETUP_RETR 0x04 #define RF_CH 0x05 #define RF_SETUP 0x06 #define STATUS 0x07 #define OBSERVE_TX 0x08 #define CD 0x09

31、 #define RX_ADDR_P0 0x0A #define RX_ADDR_P1 0x0B #define RX_ADDR_P2 0x0C #define RX_ADDR_P3 0x0D #define RX_ADDR_P4 0x0E #define RX_ADDR_P5 0x0F #define TX_ADDR 0x10 #define RX_PW_P0 0x11 #define RX_PW_P1 0x12 #define RX_PW_P2 0x13 #define RX_PW_P3 0x14 #define RX_PW_P4 0x15 #define RX_PW_P5 0x16 #d

32、efine FIFO_STATUS 0x17 #define RX_ADR_WIDTH 5#define TX_PLOAD_WIDTH 4#define TX_PLOAD_WIDTH 4float f_temp;uint temp;uchar TX_ADDRESS5=0x34,0x43,0x10,0x10,0x01;sbit CE=P00;sbit CSN=P01;sbit MOSI=P02;sbit MISO=P03;sbit SCK=P04;sbit IRQ=P05;sbit DQ=P17;sbit led0=P10;uchar bdata sta;sbit RX_DR= sta6;sbi

33、t TX_DS= sta5;sbit MAX_RT= sta4;uchar code dot_tab ="0112334456678899"uchar code LCDData ="0123456789" uchar LCD_3,LCD_2,LCD_1,LCD_0;void init_io(void)CE = 0; CSN = 1; SCK = 0; IRQ = 1; uchar SPI_RW(uchar byte)uchar i;for(i=0;i<8;i+)MOSI=(byte&0x80);byte=(byte<<1);SC

34、K=1;byte|=MISO;SCK=0;return(byte);uchar SPI_RW_reg(uchar reg,uchar value)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_read_pload(uchar reg,uchar *pBuf,uchar bytes)uc

35、har status,i;CSN=0;status=SPI_RW(reg);for(i=0;i<bytes;i+)pBufi=SPI_RW(0);CSN=1;return(status);uchar SPI_write_pload(uchar reg,uchar *pBuf,uchar bytes)uchar status,i;CSN=0;status=SPI_RW(reg);for(i=0;i<bytes;i+)SPI_RW(pBufi);CSN=1;return(status);void TX_mode(uchar *tx_buf)CE=0;SPI_write_pload(WR

36、ITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);SPI_write_pload(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH); SPI_write_pload(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);SPI_RW_reg(WRITE_REG+EN_AA,0X01);SPI_RW_reg(WRITE_REG+EN_RXADDR,0X01);SPI_RW_reg(WRITE_REG+SETUP_RETR,0X1F);SPI_RW_reg(WRITE_REG+RF_CH,40);SPI_RW

37、_reg(WRITE_REG+RF_SETUP,0X0F);SPI_RW_reg(WRITE_REG+CONFIG,0X0e);CE=1;uchar Check_ACK()sta=SPI_read(STATUS);if(TX_DS|MAX_RT)SPI_RW_reg(WRITE_REG + STATUS, 0xff); CSN=0;SPI_RW(FLUSH_TX);CSN=1;return (1);else return (0);IRQ = 1; void delay(unsigned int N) unsigned int i; for(i=0;i<N;i+);bit resetpul

38、se(void)DQ=0;delay(40);DQ=1; delay(30); return(DQ);void ds18b20_init(void)resetpulse();uchar read_bit(void)unsigned char i; DQ=0; _nop_(); _nop_(); DQ=1; for(i=0;i<4;i+); return(DQ);uchar read_byte(void) uchar i,m,receive_data; m=1; receive_data=0; for(i=0;i<8;i+) if(read_bit() receive_data=re

39、ceive_data+(m<<i); delay(7); return(receive_data);void write_bit(uchar bitval) DQ=0; if(bitval=1) DQ=1; delay(6); DQ=1;void write_byte(uchar val) uchar i,temp; for(i=0;i<8;i+) temp=val>>i; temp=temp&0x01; write_bit(temp); delay(6); void convert_T(uchar temp_data_h,uchar temp_data_

40、l) uchar temp; if(temp_data_h&0xf0)=0xf0) temp_data_l=temp_data_l; if(temp_data_l=0xff) temp_data_l=temp_data_l+0x01; temp_data_h=temp_data_h; temp_data_h=temp_data_h+0x01; else temp_data_l=temp_data_l+0x01; temp_data_h=temp_data_h; LCD_0=dot_tabtemp_data_l&0x0f; temp=(temp_data_l&0xf0)&

41、gt;>4)|(temp_data_h&0x0f)<<4); LCD_3='-' LCD_2=LCDData(temp%100)/10; LCD_1=LCDData(temp%100)%10; else LCD_0=dot_tabtemp_data_l&0x0f; temp=(temp_data_l&0xf0)>>4)|(temp_data_h&0x0f)<<4); LCD_3=LCDDatatemp/100; LCD_2=LCDData(temp%100)/10; LCD_1=LCDData(temp%

42、100)%10; void main() uchar temp_data_l,temp_data_h;uchar tx_buf4=0;init_io();while(1)ds18b20_init(); write_byte(0xcc); write_byte(0x44); delay(1000); ds18b20_init(); write_byte(0xcc); write_byte(0xbe); temp_data_l= read_byte(); temp_data_h = read_byte(); convert_T(temp_data_h,temp_data_l);tx_buf0=LC

43、D_3;tx_buf1=LCD_2tx_buf2='.'tx_buf3=LCD_1;TX_mode(tx_buf);while(Check_ACK(); 附錄B 接收程序#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int#define READ_REG 0x00 #define WRITE_REG 0x20 #define RD_RX_PLOAD 0x61 #define WR_TX_PLOAD 0xA0 #define FLUS

44、H_TX 0xE1 #define FLUSH_RX 0xE2 #define REUSE_TX_PL 0xE3 #define NOP 0xFF #define CONFIG 0x00 #define EN_AA 0x01 #define EN_RXADDR 0x02 #define SETUP_AW 0x03 #define SETUP_RETR 0x04 #define RF_CH 0x05 #define RF_SETUP 0x06 #define STATUS 0x07 #define OBSERVE_TX 0x08 #define CD 0x09 #define RX_ADDR_P

45、0 0x0A #define RX_ADDR_P1 0x0B #define RX_ADDR_P2 0x0C#define RX_ADDR_P3 0x0D #define RX_ADDR_P4 0x0E #define RX_ADDR_P5 0x0F #define TX_ADDR 0x10 #define RX_PW_P0 0x11 #define RX_PW_P1 0x12 #define RX_PW_P2 0x13 #define RX_PW_P3 0x14 #define RX_PW_P4 0x15 #define RX_PW_P5 0x16 #define FIFO_STATUS 0

46、x17 #define TX_ADR_WIDTH 5#define RX_ADR_WIDTH 5#define TX_PLOAD_WIDTH 4#define RX_PLOAD_WIDTH 4uchar idata rxbuf12=0;uchar RX_ADDRES5=0x34,0x43,0x10,0x10,0x01;uchar code table="0123456789"uchar bdata sta;sbit RX_DR= sta6;sbit TX_DS= sta5;sbit MAX_RT= sta4;sbit RS=P12;sbit RW=P11;sbit E=P1

47、6;uchar code LCDData ="0123456789" uchar code dot_tab ="0112334456678899" uchar first_line16=" WEN DU 00.0 " uchar second_line16="TEST BY CTD " sbit MOSI=P20;sbit MISO=P21;sbit CE=P22;sbit CSN=P24;sbit IRQ=P26;sbit SCK=P27;sbit beep=P23;void delayms(uint x)uint i,j;for(i=x;i>0;i-)for(j=113;j>0;j-);void init_io

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論