傳統(tǒng)方式中,對大型倉庫、博物館等無人環(huán)境的數(shù)據(jù)采集費時費力、效率低下,且實時性差,隨機性大?茖W技術(shù)的進步促進了自動檢測系統(tǒng)的發(fā)展,而利用無線通信技術(shù)實現(xiàn)對無人環(huán)境的監(jiān)測更是未來電子技術(shù)應用的發(fā)展趨勢。造價低廉、使用方便的單片機在小型控制系統(tǒng)中獲得了廣泛的應用。凌陽公司推出的16位單片機SPCE061A處理速度快,獨具語音識別的特色功能,是用作系統(tǒng)控制核心的理想選擇;而傳輸速率高、成本低、功耗小的nRF24L01無線模塊也是實現(xiàn)系統(tǒng)無線通信的最佳選擇。 1 系統(tǒng)設計方案 系統(tǒng)分為主控端與監(jiān)測端,通過無線模塊進行數(shù)據(jù)通信,核心部分是需要對數(shù)據(jù)進行處理的主控端。主控端以SPCE061A單片機為控制核心,通過nRF24L01模塊進行數(shù)據(jù)的收集,以12864液晶模塊作為數(shù)據(jù)顯示的平臺。監(jiān)測端采用8位的AT89S52單片機作為控制核心。使用DHT11數(shù)字溫濕度傳感器采集溫濕度數(shù)據(jù)。監(jiān)測端還設計有繼電器電路,可以模擬在溫度超過警戒值時自動打開 房間空調(diào)制冷。圖1為系統(tǒng)整體框架圖。 圖1 系統(tǒng)整體框架圖 2 硬件電路設計 2.1 微處理模塊設計 主控端微處理器選用凌陽公司推出的SPCE061A單片機。SPCE061A是一款16位的微處理器,運算速度快,非常適合處理復雜的數(shù)字信號。CPU工作電壓VDD 為 2.4~3.6V,CPU 時鐘頻率范圍為0.32~49.152MHz,內(nèi)置2K字SRAM以及32K字FLASH;具有2 個 16 位可編程定時器/計數(shù)器(可自動預置初始計數(shù)值);2個10位DAC(數(shù)/模轉(zhuǎn)換)輸出通道;32 位通用可編程輸入/輸出端口;具備觸鍵喚醒的功能;7通道10位電壓模/數(shù)轉(zhuǎn)換器(ADC)和單通道聲音模/數(shù)轉(zhuǎn)換器;聲音模/數(shù)轉(zhuǎn)換器輸入通道內(nèi)置麥克風放大器和自動增益控制(AGC)功能;具備串行設備接口;具有低電壓復位(LVR)功能和低電壓監(jiān)測(LVD)功能;內(nèi)置在線仿真電路ICE(In-Circuit Emulator)接口;具有保密功能;具有看門狗功能。圖2為SPCE061A內(nèi)部結(jié)構(gòu)圖;圖3為SPCE061A引腳圖。 圖2 SPCE061A內(nèi)部結(jié)構(gòu)圖 圖3 SPCE061A引腳圖 監(jiān)測端微處理器選用ATMEL公司的AT89S52單片機。AT89S52是一種低功耗、高性能的8位CMOS微控制器,具有8K 在系統(tǒng)可編程Flash 存儲器,256字節(jié)RAM, 32 位I/O 口線,片內(nèi)晶振及時鐘電路,最高工作頻率可達33MHZ;內(nèi)部集成看門狗定時器,全雙工UART串行口,6個中斷源,3個16位定時器/計數(shù)器。圖4為AT89S52單片機引腳及其最小系統(tǒng)圖。 圖4 AT89S52單片機引腳及其最小系統(tǒng) 2.2 溫濕度模塊 DHT11數(shù)字溫濕度傳感器,是一款含有已校準數(shù)字信號輸出的溫濕度復合傳感器。它應用專用的數(shù)字模塊采集技術(shù)和溫濕度傳感技術(shù),具有很高的可靠性與穩(wěn)定性。圖5為DHT11應用電路。 圖5 DHT11應用電路 DHT11采用單總線傳輸方式,供電電壓為3V~5.5V。傳感器上電后,要等待 1s 以越過不穩(wěn)定狀態(tài)。電源引腳(VDD,GND)之間可增加一個100nF 的電容,用以去耦濾波。 DATA引腳用于微處理器與 DHT11之間的通訊和同步,采用單總線數(shù)據(jù)格式,一次通訊時間4ms左右,數(shù)據(jù)分小數(shù)部分和整數(shù)部分,當前小數(shù)部分用于以后擴展,現(xiàn)在讀出均為零。本設計中將DHT11的DATA引腳連接AT89S52的P1.0腳。一次完整的數(shù)據(jù)傳輸為40bit,高位先出。數(shù)據(jù)格式:8bit濕度整數(shù)數(shù)據(jù)+8bit濕度小數(shù)數(shù)據(jù)+8bi溫度整數(shù)數(shù)據(jù)+8bit溫度小數(shù)數(shù)據(jù)+8bit校驗和。數(shù)據(jù)傳送正確時校驗和數(shù)據(jù)等于8bit濕度整數(shù)數(shù)據(jù)+8bit濕度小數(shù)數(shù)據(jù)+8bi溫度整數(shù)數(shù)據(jù)+8bit溫度小數(shù)數(shù)據(jù)所得結(jié)果的末8位。 2.3 無線模塊 nRF24L01是一款工作在2.4~2.5 GHz世界通用ISM頻段的單片無線收發(fā)器芯片,采用FSK調(diào)制,內(nèi)部集成自己的協(xié)議,有自動應答、自動重發(fā)、地址及CRC檢驗功能,可實現(xiàn)點對點或1對6的無線通信,無線通信速度可達2 Mbps;電流消耗極低,當工作在發(fā)射模式下發(fā)射功率為-6 dBm時電流消耗為9 mA,接收模式下為12.3 mA。 nRF24L01有四種工作模式:收發(fā)模式、配置模式、空閑模式、關機模式。工作模式由PWR_UP register 、PRIM_RX register和CE決定。本設計中讓NRF24L01工作于收發(fā)模式中的Enhanced ShockBurstTM收發(fā)模式下,這種工作模式下,系統(tǒng)的程序編制會更加簡單,并且穩(wěn)定性也會更高。 nRF24L01的所有配置工作都是通過SPI完成,共有30字節(jié)的配置字。 雖然nRF24L01模塊工作于1.9~3.6V的低電壓,但考慮到SPCE061A單片機及51單片機的IO口輸出電流均較小,nRF24L01無線模塊可以直接與其連接。圖6為nRF24L01芯片及其外圍電路。圖7為nRF24L01與AT89S52引腳連接圖。圖8為nRF24L01與SPCE061A引腳連接圖。 圖6 nRF24L01芯片及其外圍電路 圖7 nRF24L01與AT89S52引腳連接圖 圖8 nRF24L01與SPCE061A引腳連接圖 2.4 顯示模塊 系統(tǒng)顯示模塊采用帶中文字庫的12864液晶顯示屏。12864主要由行驅(qū)動器/列驅(qū)動器及128x64全點陣液晶顯示器組成。其顯示分辨率為128×64, 內(nèi)置8192個16*16點漢字,和128個16*8點ASCII字符集。該模塊接口方式靈活,操作指令簡單、方便,可以顯示8×4行16×16點陣的漢字,也可完成圖形顯示,可構(gòu)成全中文人機交互圖形界面。低電壓低功耗也是其又一顯著特點。12864具有簡單而功能較強的指令集,可實現(xiàn)字符移動、閃爍等顯示功能,共有7條指令,單片機只需通過D/I、R/W、DB0~DB7送入數(shù)據(jù)或者指令便可顯示其指定內(nèi)容或顯示方式。 本設計中,12864液晶屏采用并行通信方式與SPCE061A單片機進行數(shù)據(jù)通信。為了方便的操作12864液晶屏,我們將12864的4、5、6引腳與SPCE061A的IOB9、IOB8、IOB10引腳連接,并編寫了能夠直接操作SPCE061A單個IO口狀態(tài)的函數(shù),以方便操作12864顯示屏而不影響其它IO口的數(shù)據(jù)通信。圖9為12864液晶屏與SPCE061A的引腳連接圖。 圖9 12864液晶屏與SPCE061A的引腳連接圖 2.5 鍵盤模塊 SPCE061A開發(fā)板自身集成了三個按鍵K1、K2、K3,按鍵一端連接單片機的高電平,另一端分別連接了SPCE061A單片機的IOA0、IOA1、IOA2口。圖10為SPCE061A開發(fā)板集成的三個按鍵電路圖。其中按K1鍵進入調(diào)整報警溫度模式,按K2鍵與K3鍵調(diào)整報警溫度的上下限值。 圖10 SPCE061A開發(fā)板按鍵電路圖 2.6 繼電器模塊 當檢測端檢測到溫度高于警戒值時,AT89S52單片機P1.1引腳輸出高電平,通過繼電器實現(xiàn)弱電控制強電,打開制冷空調(diào),當溫度低于警戒值時,AT89S52單片機P1.1引腳輸出低電平,控制制冷空調(diào)停止運行。實現(xiàn)自動控制時要先把開關S1閉合,本系統(tǒng)將警戒值設置為35℃。圖11為繼電器自動控制電路圖。 圖11 繼電器自動控制電路圖 2.7 語音模塊 凌陽的 SPCE061A 是 16 位單片機,具有很強的信息處理能力,最高時鐘頻率可達到 49MHz,具備運算速度高的優(yōu)勢,這些無疑為語音的播放、錄放、合成及辨識提供了條件。 凌陽壓縮算法中 SACM_A2000、SACM_S480 、SACM_S240 主要是用來放音,可用于語音提示,而 DVR 則用來錄放音。SPCE061A單片機提供了相關API函數(shù)及程序代碼范例,方便用C語言進行開發(fā)。本系統(tǒng)在編寫軟件時定義了SPCE061A相關寄存器的地址,通過調(diào)用相關定義即可方便進行操作。 軟件設計時采用S480壓縮算法將報警語音“有危險”進行壓縮,用S480自動方式播放報警語音。該壓縮算法壓縮比為80:3,存儲容量大,音質(zhì)介于 A2000 和 S240 之間,適用于語音播放。圖12為S480自動播放方式流程圖 圖12 S480自動播放方式流程圖 3 系統(tǒng)軟件設計流程 系統(tǒng)上電后,主控端軟件初始化相關IO口,并初始化NRF24L01無線收發(fā)模塊為接收模式,調(diào)用LCD字庫初始化程序。希捷軟件進入循環(huán)狀態(tài),讀取RF24L01無線收發(fā)模塊狀態(tài)寄存器,判斷是否接收到數(shù)據(jù)。如果接收到數(shù)據(jù),將數(shù)據(jù)存儲到預先定義的數(shù)組中,調(diào)用語音報警子函數(shù),判斷接收到的數(shù)據(jù)是否達到報警上下限,達到后液晶屏顯示危險狀態(tài),并啟用語音報警。沒有危險時則只通過液晶屏顯示當前溫濕度數(shù)據(jù)及狀態(tài)安全。 主控端軟件執(zhí)行完語音報警子函數(shù)后清除NRF24L01無線收發(fā)模塊狀態(tài)寄存器中斷標志,清看門狗。判斷報警溫度調(diào)整鍵是否被按下,如果按下則調(diào)用報警溫度調(diào)整子函數(shù),調(diào)整完畢后進入循環(huán)模式,重復執(zhí)行以上步驟。 監(jiān)測端軟件開始初始化相關IO口,并設置NRF24L01無線收發(fā)模塊為發(fā)射模式,然后進入循環(huán)狀態(tài),開始調(diào)用溫濕度采集子函數(shù)。采集完數(shù)據(jù)后,程序?qū)?shù)據(jù)放入NRF24L01無線收發(fā)模塊的發(fā)射數(shù)據(jù)緩存器中。此時要檢測溫度數(shù)據(jù)是否超過設定的警戒值,如果超過警戒值則開啟繼電器,否則關閉繼電器。下一步軟件啟動數(shù)據(jù)發(fā)射。發(fā)射完成后,讀NRF24L01無線收發(fā)模塊的狀態(tài)寄存器并清除相關中斷標志位,延時一段時間后再次進入循環(huán)采集發(fā)射狀態(tài),重復執(zhí)行以上步驟。圖13為主控端軟件流程圖,圖14為監(jiān)測端軟件流程圖。 3.1 主控端軟件設計 3.1.1 主程序設計 void main() { Initial_IO(); //初始化IO口 flag=0; //調(diào)溫子程序標志位清0 nRF24L01_Initial(); // NRF24L01初始化 RX_Mode(); //設置NRF24L01為接收模式并開始接收數(shù)據(jù) initinal(); //調(diào)用LCD字庫初始化程序 while(1) { sta=SPI_Read(STATUS); // 讀取狀態(tài)寄存器的值 if(RX_DR) // 如果接收到數(shù)據(jù)開啟接收數(shù)據(jù)中斷 { SPI_RW_Reg(WRITE_REG+STATUS,sta); //清除中斷標志位 SPI_Read_Buf(RD_RX_PLOAD,Rx_Buffer,TX_PLOAD_WIDTH); //從接收數(shù)據(jù)緩存器讀取接收到的數(shù)據(jù) baojing(); //調(diào)用顯示及報警子程序 *P_Watchdog_Clear=0x0001; //清除看門狗 } SPI_RW_Reg(WRITE_REG+STATUS,sta); //清除中斷標志位 *P_Watchdog_Clear=0x0001; //清除看門狗 if((*P_IOA_Data&0x0007)==0x0001) //如果調(diào)溫按鍵被按下 { flag=1; //標志位置1 tiaowendu(); //調(diào)用調(diào)溫子程序 } delayms(10); //延時一段時間 } } 3.1.2 nRF24L01收發(fā)數(shù)據(jù)子程序 以下程序設置NRF24L01無線收發(fā)模塊的工作方式,并開啟數(shù)據(jù)接收 void RX_Mode(void) { CE_Low; //CE=0; delay1us(1); SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); SPI_Write_Buf(WRITE_REG + RX_ADDR_P1, TX_ADDRESS, TX_ADR_WIDTH); SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); //開啟自動應答 SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); SPI_RW_Reg(WRITE_REG + RF_CH, 40); // 選擇無線頻道40 SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH); SPI_RW_Reg(WRITE_REG + RX_PW_P1, TX_PLOAD_WIDTH); SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // 設置為數(shù)據(jù)接收模式,開啟CRC檢測等 CE_High; //CE = 1 設置CE引腳為高來開啟模塊的數(shù)據(jù)接收模式 delay1us(1); } 3.1.3 12864液晶屏顯示子程序 void lcd_mesg(unsigned char *adder1) //寫滿整屏! { unsigned char i; TransferData(0x80,0); //設置圖形顯示存儲器的地址 delay(100); for(i=0;i<32;i++) { TransferData(*adder1,1); adder1++; } TransferData(0x90,0); //設置圖形顯示存儲器的地址 delay(100); for(i=32;i<64;i++) { TransferData(*adder1,1); adder1++; } } void lcd_mesg1(unsigned char w_dizhi,unsigned char changdu,unsigned char *adder1) //在任意位置寫入要顯示的任意長度的數(shù)據(jù) { unsigned char i; TransferData(w_dizhi,0); //設置圖形顯示存儲器的地址 delay(100); for(i=0;i { TransferData(*adder1,1); adder1++; } } 3.1.4 報警溫度調(diào)整子程序 通過設置標志位,判斷K1鍵被按下的次數(shù)。如果是第一次被按下,則可以通過K2、K3鍵調(diào)整報警溫度上限;如果是第二次被按下,則可以通過K2、K3鍵調(diào)整報警溫度下限;如果是第三次被按下,則調(diào)出報警溫度調(diào)整子程序。 3.1.5 報警子程序 如果溫度報警界限,主控端會在12864液晶屏上顯示危險的字樣,并進行“有危險”的語音提示。 SPCE061A以S480自動方式播放語音的程序如下: void PlaySnd_Auto(unsigned int uiSndIndex,unsigned int uiDAC_Channel) { SACM_S480_Initial(1); //初始化為自動播放方式 SACM_S480_Play(uiSndIndex,uiDAC_Channel,3); //播放 while((SACM_S480_Status() & 0x0001) != 0) { //判斷播放狀態(tài),如還在播放則繼續(xù)循環(huán) SACM_S480_ServiceLoop(); //播放系統(tǒng)服務程序 *P_Watchdog_Clear=0x0001; } SACM_S480_Stop(); //停止播放 } 3.2 監(jiān)測端軟件設計 3.2.1 監(jiān)測端主程序 void main(void) { init_io(); // 初始化IO口 TX_Mode(); // 設置NRF24L01無線收發(fā)模塊為發(fā)射方式 while(1) { RH(); //采集溫濕度數(shù)據(jù) delay2(100); relay(); //控制繼電器的狀態(tài) tx_buf[0]=str[0]; // 將檢測到的數(shù)據(jù)保存到tx_buf[0] tx_buf[1]=str[1]; // 將檢測到的數(shù)據(jù)保存到tx_buf[1] tx_buf[2]=str[2]; // 將檢測到的數(shù)據(jù)保存到tx_buf[2] tx_buf[3]=str[3]; // 將檢測到的數(shù)據(jù)保存到tx_buf[3] TX_Mode(); //設置NRF24L01無線收發(fā)模塊為發(fā)射方式并開始發(fā)射 sta=SPI_Read(STATUS); // 調(diào)取狀態(tài)寄存器的數(shù)值 SPI_RW_Reg(WRITE_REG+STATUS,sta); // 清除狀態(tài)寄存器的中斷標志位 delay_ms(1000); } } 3.2.2 Nrf24L01收發(fā)數(shù)據(jù)子程序 void TX_Mode(void) { CE=0; SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); SPI_Write_Buf(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, 0x1a); SPI_RW_Reg(WRITE_REG + RF_CH, 40); SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); CE=1; } 3.2.3 溫濕度檢測子程序 void RH(void) { dht_data=0; delay1(20); //主機拉低18ms dht_data=1; delay2(2); //總線由上拉電阻拉高 主機延時20us dht_data=1; //主機設為輸入 判斷從機響應信號 if(!dht_data) //判斷從機是否有低電平響應信號 如不響應則跳出,響應則向下運行 { U8FLAG=2; while((!dht_data)&&U8FLAG++); //判斷從機是否發(fā)出 80us 的低電平響應信號是否結(jié)束 U8FLAG=2; while((dht_data)&&U8FLAG++); COM(); //開始進入數(shù)據(jù)接收狀態(tài) U8RH_data_H_temp=U8comdata; COM(); U8RH_data_L_temp=U8comdata; COM(); U8T_data_H_temp=U8comdata; COM(); U8T_data_L_temp=U8comdata; COM(); U8checkdata_temp=U8comdata; dht_data=1; //拉高為下一輪做好準備 U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp); //進行數(shù)據(jù)校驗 if(U8temp==U8checkdata_temp) { U8RH_data_H=U8RH_data_H_temp; U8RH_data_L=U8RH_data_L_temp; U8T_data_H=U8T_data_H_temp; U8T_data_L=U8T_data_L_temp; U8checkdata=U8checkdata_temp; str[0]=(U8T_data_H_temp/10)+0x30; str[1]=(U8T_data_H_temp%10)+0x30; str[2]=(U8RH_data_H_temp/10)+0x30; str[3]=(U8RH_data_H_temp%10)+0x30; } } } 3.2.4 繼電器控制子程序 void relay() { if(str[0]>0x03) relay_sta=0x01; //打開繼電器 else if(str[0]==0x03) { if(str[1]>0x05) relay_sta=0x01; //打開繼電器 else relay_sta=0x00; //關閉繼電器 } else relay_sta=0x00; //關閉繼電器 } 4 系統(tǒng)運行測試 按照以上方案設計出整個系統(tǒng)后上電運行,系統(tǒng)工作狀態(tài)良好,能夠滿足生產(chǎn)生活中的要求,圖15為系統(tǒng)整體運行情況,圖16與圖17為調(diào)整報警溫度界面與系統(tǒng)報警界面。 5 結(jié)語 本系統(tǒng)使用處理速度快的16位單片機SPCE061A作為主控端核心,利用nRF24L01無線模塊,設計完成了能夠監(jiān)控小型無人環(huán)境溫濕度的人性化系統(tǒng)。經(jīng)過測試,系統(tǒng)溫濕度數(shù)據(jù)采集準確,nRF24L01模塊傳送數(shù)據(jù)穩(wěn)定;當環(huán)境溫度達到警戒值時,繼電器閉合,可以模擬開啟制冷空調(diào)的動作。本系統(tǒng)達到了預期設計目的,具有很高的實用價值。 |