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