智能家用喚醒系統設計
摘要:設計了一款帶有鬧鐘并具有語音喚醒功能的智能家用喚醒系統。采用STC89C51單片機作為主控制芯片,采用時鐘芯片DS1302記錄日期和時間信號,采用DS18B20溫度傳感器作為溫度采集模塊,采用LCD12864字符液晶顯示器作為顯示模塊,采用PWM波調節喚醒燈亮度,采用ISD1760語音模塊播報當前溫度和穿衣建議,通過按鍵可以設置具體的時間和日期及鬧鐘等。本系統通過單片機控制,可在設定鬧鐘的時間到達之前啟動喚醒燈,待喚醒燈亮度最大時鬧鐘開始響起,并且語音提醒溫度和時間等信息。這款設計有一定的可行性和人性化等特點,不僅可以用在滿足普通人的喚醒需求,又可以用于老年人以及有耳疾的殘疾人的喚醒需求等場合,在一定程度上體現了智能化。
引言 在節奏過快的生活中,人們承受的精神和心理壓力十分巨大,這就使得現代人都希望在當代繁忙而枯燥的工作和學習中能身心愉悅的生活。隨著信息化發展水平的逐步提高,智能化系統越來越受到人們的重視。市場上普遍的鬧鐘只是一種到了人們設定的時間就被令人煩躁的聲音而吵醒的機械化鬧鐘,機械化的鬧鐘不僅將熟睡的人們從夢中驚醒,影響了人們起床的心情,還影響了人們的身體健康。因此,人性化的喚醒系統顯得尤為重要,它以多種方式聯動,可對光線亮度、語音提示和人體感應等諸多喚醒元素進行個性化調整或設定,盡可能將對人的刺激減低到最低限度,讓睡眠中人在設定的時間里自然醒來[1]。 目前,市場上越來越多小型普遍的電子產品的功能不斷地被更替,這一現狀由于智能化電子產品的出現, 毋庸置疑鬧鐘就是一個典型代表。普通的響鈴鬧鐘設計缺乏的是人性化關懷這一理念,比如人們還在熟睡中就會被刺耳的鬧鈴叫醒,這種喚醒方式不僅會使人感到厭煩、渾身不舒服,更重要的是會影響人們的身體健康,因此,人性化的智能喚醒系統顯得相當不可忽視。近年來,智能系統的研究已經帶領社會進入了更為人性化的領域,這一現狀引起了國內外學者及企業的廣泛重視。國內,浙江大學提出了一種人性化控制的智能家居若干關鍵技術研究;中國信息界提出的一款智能鬧鐘,每天早上能夠溫柔的喚醒熟睡中的人們;另外,杭州電子科技大學、吉林大學、山東大學等眾多學者也進行了智能喚醒系統的相關研究。其研究成果填補了國內在相關領域的多項空白,為人性化的智能家居設計提供了新的思路和技術支持,在很大程度上推動了國內智能化系統的發展進步[2]。國外有一款地毯鬧鐘Reggie,這款鬧鐘功能是在喚醒時倘若不站上去,那么它就會一直響直到將人們喚醒,如此就解決了起床困難戶的問題;Baboomi智能鬧鐘,這款智能化的設計既有為鬧鐘充電的功能,在一定程度上又有震動的功能。臨睡前在枕頭下放置智能鬧鐘的震動設備,早上熟睡的人就會被它人性化地震動聲音而慢慢喚醒,這種傳達起床信息的方式更加智能化;倘若在智能手機上安裝智能鬧鐘的App,也可以實現智能化的語音鬧鐘,通過設置起床時間,在早上就能感受到舒適地被喚醒。 針對目前功能比較大眾化的鬧鐘設計中存在的人性化關懷不夠,以及沒有充分考慮到消費者的使用體驗等問題[3-5],本設計做出了進一步的改進,主要體現在在喚醒系統的視覺、聽覺等方面。家用智能喚醒系統,可根據人們預先設定的起床時間,慢慢調整周圍的光照鬧鐘響起喚醒熟睡中的人們,同時,以溫柔的語音提示當天的室外溫度來提醒人們穿衣厚度指數等。本系統不僅能滿足普通人的喚醒需求,也能滿足老年人以及有耳疾的殘疾人的喚醒需求。 2系統的設計方案 一款智能家用喚醒系統必須具備基本的電子時鐘功能,這可以根據不同的需求設定不同的操作從而實現不同的功能。智能鬧鐘在設定的起床時間還沒到達之前,自動調光燈由暗變亮,鬧鐘開始響鈴,并進入語音提醒模式,和普通鬧鐘相比較有很大的創新。如果人們還未從熟睡中醒來,那么鬧鐘就會持續響起直至手動關閉鬧鐘。本智能家用喚醒系統核心硬件是以STC89C51單片機為主控芯片,根據主控芯片的外圍接口這一特點,在外圍加以其他硬件電路,然后根據單片機的指令設計要求,在編譯軟件中采用C語言設計程序,并通過執行一定的程序來實現此系統的功能。系統設計主要由單片機最小系統、溫度檢測、實時時鐘模塊、PWM波調光、具有語音提醒功能的鬧鐘模塊、顯示和按鍵模塊等幾個部分組成。STC89C51單片機最小系統作為主控模塊,時間、日期信息的采集由DS1302時鐘芯片來完成,溫度的獲取用DS18B20溫度傳感器來實現,時間和溫度等的顯示主要是在LCD12864液晶顯示器中完成的;通過按鍵完成日期、時間的初始化設置和鬧鐘的設定;借助PWM波的變化實現喚醒燈自動調光;采用語音模塊完成鬧鐘喚醒和溫度提醒功能。家用智能喚醒系統設計原理框圖如圖1所示。 圖1系統原理框圖 3系統的硬件設計 根據系統的設計方案,系統的原理圖設計如圖2所示。總體原理圖以單片機STC89C51為核心的控制電路[6],外圍輔以時鐘電路、溫度傳感器電路、PWM喚醒燈電路、液晶顯示電路及語音播報電路等。通過按鍵設置鬧鐘,單片機將溫度傳感器和實時時鐘傳來的信息處理后送到液晶顯示器顯示,在設定的時間提前一段時間單片機控制喚醒燈打開,語音模塊與單片機進行通信協議,從而實現各個功能。 
圖2 系統原理圖 3.1控制模塊的設計 主控制模塊以基于STC89C51單片機為核心,這是智能家用喚醒系統設計的最重要的部分,一個能夠正常工作的單片機系統是在核心芯片上加入一些外圍電路組成的。最小系統和按鍵控制電路是控制模塊設計中的兩個主要部分,控制模塊負責整體電路的主要工作,通過操作按鍵和單片機控制電路的運行。 晶振電路和復位電路是單片機最小系統必不可少的部分[7]。單片機正常工作時的工作速度是由晶振電路提供的,這種工作速度是由晶振電路產生的脈沖信號。在理論上,STC89C51單片機的最小系統本應使用的是和系統相配的晶振,然而在本系統中選取的是比較接近的12MHz晶振。由于單片機內部結構的特殊性,因此,只需要一個晶振和兩個電容連接在單片機外面的電路中就可實現時鐘電路,電容一般選用的是30pF的容量就可以滿足要求,圖中C1和C2電容的作用就是為了使單片機能夠迅速的起振,并且能夠使單片機工作時的頻率達到穩定。晶振的一端接XTAL2(19),另一端接的是XTAL2(18),兩個電容并聯接于振蕩源之間,工作時能更好的為單片機服務。智能家用喚醒系統的各個部件在處于初始化狀態時,單片機可由此開始工作進行操作,這一系列是復位電路提供的條件,復位電路是單片機的準備工作,包括上電復位和按鍵復位兩種模式。在按鍵復位中,電容C3取值一般為10uF,電阻R取值約為10KΩ,K5是為實現按鍵復位而設置的。然而,在上電復位中,由單片機運行后給定的高低電平直接實現復位功能。 按鍵控制電路中,設置了五個按鍵實現設計所需的要求,按鍵在設計中能夠起到控制外部電路的作用,不同的操作實現不同的功能。本設計中使用的按鍵不多,僅需五個按鍵系統所需要的功能即可完成。按鍵有四個接腳,兩個相連的之間導通,按鍵其中一端接單片機的I/O接口,另一端可以接電源,也可以接地端,此系統中按鍵另一端是接地的,低電平完成按鍵的操作,這樣的接法程序是比較簡單且系統也相對穩定。五個獨立按鍵實現的功能分別有確認返回、加一、減一、鬧鐘開關及喚醒燈開關,按鍵K1、K2、K3、K4和K5分別與單片機的P1.0、P1.1、P1.2、P1.3和P1.4引腳連接,控制模塊電路圖如圖3所示。 圖3 控制模塊電路圖 3.2時鐘模塊的設計 實時時鐘電路的設計是本次設計的基本模塊,在數字時鐘所具備的功能下才能實現鬧鐘的設定。時鐘模塊的設計需要采用時鐘芯片DS1302,這款芯片可以精確的計數,具有農歷和陽歷轉換的功能,可以編程接口,與此同時還具有掉電保存等功能,在編寫程序時能夠對其比較方便的進行程序控制[8]。與直接使用單片機內部定時器實現計數功能相比,DS1302時鐘芯片實現的功能很便捷,程序簡單易編寫,穩定性好、容易控制、時間精度高等。由于單片機內部定時器雖然沒有使用芯片,但是實現的時間誤差較大,不能滿足系統要求。所以系統完成時鐘電路的首選芯片就是DS1302時鐘芯片。 DS1302時鐘芯片與單片機進行通信時,僅需要SCLK、I/O和RST三條線連接的方式,可以實現以一對多的方式傳送多個字節的時鐘信號或數據。DS1302比同類的芯片性能好,功耗低能更好的為系統的運行減少不必要的負荷。時鐘模塊有兩個電源,在Vcc2 不能正常運行時,時鐘依然能在Vcc1的作用下維持原來的狀態繼續運行。若兩個電源大小不一,則使用其中較大的一個電源為電路供電,Vcc1采用3V的紐扣電池,Vcc2主電源使用的是整個系統的電源。DS1302時鐘芯片需要使用32.768KHz的晶振,晶振電路可產生計時脈沖。為了對所傳送的數據進行初始化,DS1302工作時復位腳就需要被置為高電平,反之,數據的傳送就會被停止導致數據不能繼續傳輸。 在本系統的設計中,實時時鐘電路主要是為了能夠準確的顯示電子時鐘等信息。通過與單片機連接,將用軟件實現功能,然后經過顯示器顯示需要的時間信息。DS1302時鐘芯片與單片機的通信接口由3條線組成,VCC接在系統電源上,GND接在地端, RST復位管腳與單片機的P2.2端口連接,實現了時鐘電路在復位時由低電平跳變成高電平并啟動一次數據傳輸的過程,SCLK管腳與P2.1端口連接,時鐘輸入端將記錄的脈沖信號存入時鐘芯片,I/O管腳與P2.0端口連接,數據線輸入輸出記錄的時間數據。根據電路的需求,可在三線上加上拉電阻,由于P2口內部的緣故,本系統連接的單片機P2接口也可不加電阻。DS1302時鐘電路在設計中的原理圖如圖4所示。 圖4 時鐘電路原理圖 3.3溫度檢測模塊的設計 為了使測得溫度值更加精確,DS18B20溫度傳感器的高精度性能就成了溫度檢測模塊選取的標準。這款傳感器屬于數字式傳感器,而且在進行數據的傳送時僅僅一條數據線就可以實現,最重要的一點是它與單片機連接的時候顯得更加簡單方便,也鑒于此類傳感器的結構簡單易懂,不需外圍的電路輔助完成所需的功能。若采用熱敏電阻和A/D轉換器實現溫度采集,就需選用標準穩定的電阻才可完成設計要求,并且檢測的數值可靠性較差。在經過比較論證后,選用DS18B20能更好的滿足設計需求,它的分辨率比起同類型的傳感器更高更精確,所以溫度檢測模塊選用了DS18B20型號的傳感器。 DS18B20溫度檢測模塊在設計中用于采集溫度,早晨人們在經過鬧鐘喚醒后通過語音系統提醒當前的溫度。溫度模塊采集溫度值后,經過與單片機通信將所檢測的示數傳送到顯示器顯示,最后由ISD1760語音模塊播報溫度值。DS18B20與單片機的通信只需將DS18B20的信號線I/O口與單片機的其中一個雙向端口I/O口相連即可。在焊接時必須注意將電源端VDD和地端GND焊接牢固[9],如果VDD沒有接好,那么傳感器就只會傳送一個固定不變的溫度值,就不能檢測當前的溫度。在設計中,傳感器須與本設計選用的主機STC89C51單片機連接,其中U3為溫度檢測控制芯片DS18B20。I/O(2)管腳與單片機的P3.7端口連接可以傳輸信號,溫度模塊電路圖如圖5所示。 圖5 DS18B20溫度檢測電路原理圖 3.4語音模塊的設計 本設計使用的ISD1760是一款語音錄放功能強大的語音芯片。與其他語音芯片相比較,ISD1760不僅實現了較為方便的錄放音,還具備了一些較智能的提示功能,在一定程度上音質也有了很大的改善。ISD1760芯片的新功能比較多,能全方位的提高整個系統的性能。此外,該芯片在錄放音時音質清晰明了,幾乎不存在噪音干擾。與使用蜂鳴器實現的鬧鐘比較,在通過語音芯片完成的語音鬧鐘播報更能體現出人性化的一面,也更體現了ISD1760芯片功能的強大。這款芯片有兩種實現模式,一類是用硬件直接錄放音,另一類是采用四線協議與單片機通信,智能家用喚醒系統使用了第二種情況,通過軟件編譯實現語音播報功能。在主控單片機與 ISD1760進行通信時,所采用的是通過四線SPI協議來完成的,而且幾乎所有的操作都可以通過SPI協議來完成[10],因此,錄放音模塊可以作為一種新形式完成播報。SPI協議四線接口功能描述如表2所示。 表1 協議接口功能描述 | | | 數據輸入端口。主控制芯片在SCLK上升沿前的半個周期將數據放入MOSI端,SCLK在上升沿時,數據會被鎖存在芯片內 | | 串行輸出。ISD1700在 SCLK前的半個周期將數據放置在MISO端,在SCLK的下降沿時,數據移出 | | 通信接口的時鐘。由主控制芯片產生,并且被用來同步芯片MOSI和MISO 端各自的數據輸入和輸出 | | 若此接口為低時,該芯片就被選為被控制的設備并開啟通信協議接口 |
語音模塊起到響鈴功能,并能提醒人們溫度和穿衣的建議。ISD1760的工作方式分別為獨立方式和SPI協議方式。本系統采用了SPI工作模式,在單片機作為主控機時,ISD1760作為從機,若需要播報不同的語音段,就會通過單片機發送不同的指令來控制播報。ISD1760芯片是在8KHz采樣率下的錄音,錄音經過麥克風輸入,為了使得到的聲音效果比較好,選擇了喇叭來播報,同時,電路選取合適的電阻和電容來配合語音模塊完成各項功能 。在ISD1760語音芯片被SPI總線控制時,系統中采用STC89C51單片機的P3口完成與之通信,STC89C51單片機與ISD1760語音芯片通信時接口不多,僅需四條線即可,語音芯片的MISO管腳接單片機的P3.2引腳,此管腳可實現數據的輸出,ISD1760輸出的數據信號可以從MISO引腳被單片機接收存儲;語音芯片MOSI管腳與單片機的P3.3口通信時,此管腳實現的就是數據的輸入,所需的讀入操作和放音地址都是從ISD1760的MOSI管腳輸入的;語音芯片的SCLK與單片機的P3.4端口通信時,SCLK主要是實現時鐘輸入的;P3.5管腳接語音芯片的片選引腳/SS,此管腳主要是用來控制芯片是否選通。SP+和SP-端口分別接外接喇叭的正負極。語音模塊電路原理圖如圖6所示,其中U4為語音芯片。 圖6語音模塊電路圖 3.5顯示模塊的設計 系統采用LCD123864液晶作為顯示模塊,常用的12864液晶模塊有藍色背光和綠色背光、有無字庫的[11],本次設計中所用的是藍色有字庫的液晶顯示器,具有兩類接口方式,一種是四位或八位的并行接口,另一種是二線或三線的串行接口。 12864液晶可以顯示設計中所需的時間、日期、溫度及鬧鐘圖標等內容,這比1602功能明顯強的多。相對而言,一般的顯示器內部結構有一定的缺陷,會消耗大量的電量,然而LCD12864液晶顯示器耗電量卻比其它的顯示器耗電量小很多,所需的電壓也容易滿足。液晶顯示器的工作溫度范圍能夠滿足中溫度采集所需的溫度值,并且能較準確的顯示。LCD12864的硬件設計相對而言比較簡單,顯示所需程序在一定程度上比較容易編譯實現,而且價格合適,所以此系統采用了這款顯示器。 顯示模塊中采用12864液晶顯示器,由于設計中需要的時間、日期等內容都能通過這款顯示器來實現,所以12864液晶顯示器是設計中相當重要的模塊。12864顯示器是數字式的接口,能在顯示屏上顯示智能鬧鐘的數據,與單片機系統連接時采用了并行接口。顯示模塊主要是將單片機發送來的時間數據和溫度數據進行一系列的處理并由顯示器顯示,還能在設置鬧鐘后鬧鐘圖標也能顯示出來。在液晶顯示器和單片機連接時,顯示器的數據線DB0(7)-7(14)與單片機的P0.0-P0.7相連接,并需要10K的上拉電阻。VO端口接一個103的電位器,改變電位器的阻值液晶顯示器的亮度有所變化。PSB引腳高電平時選擇并口,低電平時選擇串口的接法,引腳NC不需要接任何管腳。液晶顯示模塊原理圖如圖7所示。 圖7 液晶顯示模塊電路圖 3.6PWM喚醒燈模塊設計 調光模塊設計中,采用了較為簡單的三極管驅動LED電路。考慮到設計需要,因為三極管驅動成本低,而且容易控制和實現等特點,所以最終選用了大功率三極管驅動喚醒燈模塊[12]。由于STC89C51單片機不具備PWM配置,因此通過單片機軟件產生PWM波并實現自動調光的功能,喚醒燈的本質是利用PWM對LED中的正向電流進行調節來完成的。減小LED電流將起到調節LED光輸出強度的作用,然而,正向電流的變化也會改變LED的亮度,因為LED的亮度會隨著電流的變化而變化[13]。模擬早晨日光的效果是通過與單片機連接產生PWM波,LED發光二極管亮度會由暗變亮,直到亮度達到最大。 三極管是放大電流的器件,它分為兩類,一類是NPN型,一類是PNP型,設計中采用了NPN型,這種三極管理解起來很容易。三極管的放大作用是小的基極電流  變化引起大的集電極電流  變化,并且基極電流與集電極電流成正比。若基極電流由零開始增大時,在三極管沒有達到飽和前,那么LED的亮度就會隨著變亮。LED的亮度受到電流控制,通過控制電流改變LED的亮度[13]。 本系統LED光源用三極管來放大電流,LED燈串聯一個上拉電阻限流來保護二極管。電流通斷的變化用NPN型三極管實現,PWM波由單片機的P3.6輸出,低電平有效。在單片機上電后設置鬧鐘時間,在設定的時間范圍內調光電路開始啟動,喚醒燈模擬日光直到達到最亮,調光電路原理圖如圖8所示。 圖8 調光電路原理圖 4軟件系統設計 4.1編譯軟件及語言 在智能家用喚醒系統設計中,采用Keil C51軟件作為編譯軟件,這款編譯軟件擁有功能強大的開發調試工具,軟件里包括各種各樣的函數可以容易的調用。單片機軟件的開發系統能夠完成編輯、編譯、調試和仿真等這一系列開發流程。程序在經過編譯后,就能體會到此軟件編譯軟件生成代碼效率是相當高,語句簡潔易懂。 該智能家用喚醒系統軟件部分所用的編程語言是C語言,由于C語言結構比較豐富,程序設計時相對而言比較容易實現,同時C語言所能夠適用的范圍大而且靈活方便。其中,最主要的因素C語言是大學期間一直應用的編程語言,這種語言相對匯編語言而言比較簡單易懂。因此,本次設計的軟件任務最終決定選用C語言編程來完成。 4.2系統主程序 為實現系統功能,系統軟件各部分功能必須按要求編程。智能家用喚醒系統的軟件部分主要包括:單片機主控部分、LCD12864液晶顯示部分、時鐘控制部分、語音播報、溫度檢測部分、調光及按鍵部分等[14]。主程序對模塊進行初始化,而后調用DS1302時間處理子程序、讀溫度、處理溫度、顯示、按鍵及語音錄放子程序等模塊。系統的整體程序流程圖如圖9所示。 圖9 流程圖 4.3子程序設計 本系統功能是通過軟件和硬件相結合實現的。子程序設計包括顯示、時間、溫度、語音、調光及按鍵等。各個模塊所實現的功能大體可由模塊的流程圖表示,主要介紹顯示、時間和溫度的工作流程。由于程序較長,所以程序將在附錄部分中以模塊的形式全部列出。 LCD顯示子程序的設計,程序主要實現對需要的信息的顯示,顯示包括時間及溫度等信息。需要在寫程序時注意它的讀寫控制指令,對顯示進行初始化,調用時間、溫度及農歷轉公歷等子程序的調用,將溫度值和時間數據轉換為液晶字符顯示。通過液晶顯示程序能夠實現時鐘的實時顯示以及溫度值的顯示,可以實現萬年歷功能。使用串口方式將液晶顯示與控制芯片通信,程序比并口方式簡單易實現。子程序LCD12864顯示模塊子程序的流程圖如圖10所示。
圖10 LCD子程序流程圖 DS1302子程序的設計,在將時鐘初始化后寫入時鐘的初值,時鐘模塊開始計時并讀出數據送至顯示器顯示,其流程圖如圖11。 圖11 DS1302子程序流程圖 DS18B20溫度子程序,主要包括初始化,檢測溫度的存在與否,進行讀寫操作并轉換讀取溫度,其程序流程圖如圖12所示。 圖12 溫度子程序流程圖 5系統安裝與調試 5.1硬件系統調試 智能家用喚醒系統設計的電路系統較大,因而這對焊接方面而言更是不容輕視。在龐大的電路系統中,在焊接時出現一點的失誤,后續的檢測及調試就不會順利地進行,而且電路在焊接時線比較多,要盡量避免線與線之間的干擾,若影響較大則會對電路造成短路現象[15]。 硬件模塊電路調試是為了檢測電路中是否會出現電路不通等情況,同時也是在檢測各個元器件之間的連接是否正確。先檢測電源部分的電路,然后依次檢測實時時鐘模塊、溫度檢測模塊、顯示模塊及語音模塊等,主要檢測各引腳的連接。經過模塊測試后再進行整體測試,在該設計硬件調試的過程中,遇到以下問題: 第一,當確保硬件電路連接無誤后,系統上電啟動后LCD12864不顯示,這樣的情況可能是硬件電路中存在錯焊或虛焊,也可能芯片插反導致短路。解決的方法:首先,檢查芯片的供電電壓是否5V,檢查電路有沒有問題;然后,調節控制背光的電位器,電位器阻值不合適也會使所顯示出來的光亮有一定的差異;最后,顯示不是很穩定,應將單片機的31引腳接高電平。 第二,電路工作一段時間后芯片會發熱,經過仔細地用萬用表檢查電路,發現有短路現象。由于在液晶顯示器所接的排阻短路導致此種情況出現,解決的辦法:斷掉短路部分重新連接。 5.2軟件系統測試 智能家用喚醒系統是多功能的設計,當前的日期、時間和溫度都能被液晶顯示器顯示。由于喚醒系統所需的功能較多,因此它的程序編寫也較為復雜,所以在編寫程序時各個模塊的程序相當重要,子程序和主程序之間在連接和調試時就需要注意邏輯問題。在保證硬件電路無誤時,對軟件開始調試。首先,將系統的整體主程序框架寫出,主流程分為幾個子程序,分別是溫度、時鐘、語音、顯示等系列;然后,每個子程序開始調試,完成各部分的軟件功能;最后,系統進行整體調試完成設計功能。在經過多次的修改程序并調試完所有的程序后,在實物上進行驗證。在調試過程中遇到了一些問題,在修改時間時,農歷的顯示沒有自動調整對應上。針對這一問題,在調試時把其他的程序設置斷點并暫時屏蔽,將農歷轉換的子程序進行獨立調試。這時就會發現調用時間自動調整不能完成更新,十進制和十六進制的處理不太合理導致時間出現混亂。最后經過進制之間的修改調整使得時間能正常顯示。 5.3系統誤差分析 本系統的誤差來源:第一,DS1302時鐘芯片本身的問題,這個可以通過測試,確定在一定時間內誤差是多少,可用程序調節彌補誤差;第二,系統的外圍器件等帶來的誤差,因此在焊接時元器件布局要合理,保證線路質量,最大程度的減小誤差。第三,在軟件設計時,溫度值的轉換沒有經過精確的計算導致溫度的讀取出現了問題,精度不準,測量的數值有所偏差,因此需精確計算溫度,采用軟件實現。
6結束語
通過本次智能家用喚醒系統的設計,人性化的智能系統設計顯得越來越重要。這款基于單片機的智能喚醒系統從硬件和軟件兩大方面解決了普通鬧鐘的不足,在加入光度調節從而使熟睡中的人們能夠在設定的時刻醒來。鬧鐘會在設定時間前將喚醒燈打開,調節人體生物鐘,在人們淺睡眠時鬧鐘響起并播報溫度等信息。該系統以單片機為控制芯片,外接時鐘電路、語音電路、溫度采集電路、自動調光電路等來實現各項功能。這款智能喚醒系統不僅能夠更人性化的喚醒熟睡中的人們,還能提高人們的工作效率。這次設計中,智能家用喚醒系統在仿真時能夠很好的結合軟硬件的設計,但是在實際中由于外界因素的干擾,智能喚醒系統無法精確的檢測出溫度示數,也由于軟件設計中延遲不當會影響時間的不準確。在實際操作時會出現偏差,只有不斷地改進調試,在經過整體的優化才能有所改善。這款較人性化的智能鬧鐘設計在一定程度上實現了為我們服務的功能,但難免總是會存在一定的弊端,溫度模塊檢測的溫度是室內溫度,可以通過不斷改進測量室外溫度,可以在本次設計的基礎上引入紅外遙控,從而更人性化的為人們服務。
附錄2 實物圖 
單片機源程序如下:
- #include <STC89C51.H>
- #include <stdio.H>
- #include <string.H>
-
- #include "LCD12864.h"
- #include "DS1302.h"
- #include "DS18B20.h"
- #include "delay.h"
-
- void display_2(void)
- {
- unsigned char display_char[16] = {0};
- int temp = 0;
-
- write_com(0x03);
- delay(50);
-
- write_com(0x91);
- display_char[0] = (TIME[6]/16) + '0';//年
- display_char[1] = (TIME[6]&0x0f) + '0';
- display_char[2] = '-';
- display_char[3] = (TIME[4]/16) + '0';//月
- display_char[4] = (TIME[4]&0x0f) + '0';
- display_char[5] = '-';
- display_char[6] = (TIME[3]/16) + '0';//日
- display_char[7] = (TIME[3]&0x0f) + '0';
- hzkdis(display_char, 8);
-
- write_com(0x97);
- switch((TIME[5]&0x07))
- {
- case 1: hzkdis("一", 2);break;
- case 2: hzkdis("二", 2);break;
- case 3: hzkdis("三", 2);break;
- case 4: hzkdis("四", 2);break;
- case 5: hzkdis("五", 2);break;
- case 6: hzkdis("六", 2);break;
- case 7: hzkdis("日", 2);break;
- }
-
- write_com(0x8A);
- display_char[0] = (TIME[2]/16) + '0';//時
- display_char[1] = (TIME[2]&0x0f) + '0';
- display_char[2] = ':';
- display_char[3] = (TIME[1]/16) + '0';//分
- display_char[4] = (TIME[1]&0x0f) + '0';
- display_char[5] = ':';
- display_char[6] = (TIME[0]/16) + '0';//秒
- display_char[7] = (TIME[0]&0x0f) + '0';
- hzkdis(display_char, 8);
-
- temp = Ds18b20ReadTemp();
-
- write_com(0x9B);
- if(temp < 0)//負
- {
- temp =~ temp;
- temp -= 1;
- temp=(float)temp*0.625+0.5;
- display_char[0] = '-';
- }
- else
- {
- display_char[0] = ' ';
- temp=(float)temp*0.625+0.5;
- }
-
- display_char[1] = temp / 100 + '0';
- display_char[2] = temp % 100 / 10 + '0';
- display_char[3] = '.';
- display_char[4] = temp % 10 + '0';
- hzkdis(display_char, 5);
- }
-
- /********************************************************************
- * 名稱 : main
- * 功能 : 主函數
- * 輸入 : 無
- * 輸出 : 無
- ***********************************************************************/
- void main(void)
- {
- lcdinit();
- Ds1302Init();
- display();
-
- while(1)
- {
- Ds1302ReadTime();
- display_2();
- Delay1ms(200);
- }
- }
-
-
-
- #include "DS18B20.h"
-
- /*******************************************************************************
- * 函 數 名 : Ds18b20Init
- * 函數功能 : 初始化
- * 輸 入 : 無
- * 輸 出 : 初始化成功返回1,失敗返回0
- *******************************************************************************/
- static uchar Ds18b20Init(void)
- {
- uchar i;
- DSPORT = 0; //將總線拉低480us~960us
- i = 70;
- while(i--);//延時642us
- DSPORT = 1; //然后拉高總線,如果DS18B20做出反應會將在15us~60us后總線拉低
- i = 0;
- while(DSPORT) //等待DS18B20拉低總線
- {
- i++;
- if(i>5)//等待>5MS
- {
- return 0;//初始化失敗
- }
- Delay1ms(1);
- }
- return 1;//初始化成功
- }
-
- /*******************************************************************************
- * 函 數 名 : Ds18b20WriteByte
- * 函數功能 : 向18B20寫入一個字節
- * 輸 入 : com
- * 輸 出 : 無
- *******************************************************************************/
- static void Ds18b20WriteByte(uchar dat)
- {
- uint i, j;
-
- for(j=0; j<8; j++)
- {
- DSPORT = 0; //每寫入一位數據之前先把總線拉低1us
- i++;
- DSPORT = dat & 0x01; //然后寫入一個數據,從最低位開始
- i=6;
- while(i--); //延時68us,持續時間最少60us
- DSPORT = 1; //然后釋放總線,至少1us給總線恢復時間才能接著寫入第二個數值
- dat >>= 1;
- }
- }
-
- /*******************************************************************************
- * 函 數 名 : Ds18b20ReadByte
- * 函數功能 : 讀取一個字節
- * 輸 入 : com
- * 輸 出 : 無
- *******************************************************************************/
- static uchar Ds18b20ReadByte()
- {
- uchar byte, bi;
- uint i, j;
- for(j=8; j>0; j--)
- {
- DSPORT = 0;//先將總線拉低1us
- i++;
- DSPORT = 1;//然后釋放總線
- i++;
- i++;//延時6us等待數據穩定
- bi = DSPORT; //讀取數據,從最低位開始讀取
- /*將byte左移一位,然后與上右移7位后的bi,注意移動之后移掉那位補0。*/
- byte = (byte >> 1) | (bi << 7);
- i = 4; //讀取完之后等待48us再接著讀取下一個數
- while(i--);
- }
- return byte;
- }
-
- /*******************************************************************************
- * 函 數 名 : Ds18b20ChangTemp
- * 函數功能 : 讓18b20開始轉換溫度
- * 輸 入 : com
- * 輸 出 : 無
- *******************************************************************************/
- static void Ds18b20ChangTemp()
- {
- Ds18b20Init();
- Delay1ms(1);
- Ds18b20WriteByte(0xcc); //跳過ROM操作命令
- Ds18b20WriteByte(0x44); //溫度轉換命令
- // Delay1ms(100); //等待轉換成功,而如果你是一直刷著的話,就不用這個延時了
- }
-
- /*******************************************************************************
- * 函 數 名 : Ds18b20ReadTempCom
- * 函數功能 : 發送讀取溫度命令
- * 輸 入 : com
- * 輸 出 : 無
- *******************************************************************************/
- static void Ds18b20ReadTempCom()
- {
- Ds18b20Init();
- Delay1ms(1);
- Ds18b20WriteByte(0xcc); //跳過ROM操作命令
- Ds18b20WriteByte(0xbe); //發送讀取溫度命令
- }
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
智能家用喚醒系統設計.docx
(1.1 MB, 下載次數: 152)
2018-11-29 16:29 上傳
點擊文件名下載附件
設計文檔
|