找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 9656|回復(fù): 11
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)+ISD1760智能家用語音喚醒系統(tǒng)設(shè)計(jì) 附論文+源碼

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:435817 發(fā)表于 2018-11-29 16:31 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
智能家用喚醒系統(tǒng)設(shè)計(jì)

摘要:設(shè)計(jì)了一款帶有鬧鐘并具有語音喚醒功能的智能家用喚醒系統(tǒng)。采用STC89C51單片機(jī)作為主控制芯片,采用時(shí)鐘芯片DS1302記錄日期和時(shí)間信號(hào),采用DS18B20溫度傳感器作為溫度采集模塊,采用LCD12864字符液晶顯示器作為顯示模塊,采用PWM波調(diào)節(jié)喚醒燈亮度,采用ISD1760語音模塊播報(bào)當(dāng)前溫度和穿衣建議,通過按鍵可以設(shè)置具體的時(shí)間和日期及鬧鐘等。本系統(tǒng)通過單片機(jī)控制,可在設(shè)定鬧鐘的時(shí)間到達(dá)之前啟動(dòng)喚醒燈,待喚醒燈亮度最大時(shí)鬧鐘開始響起,并且語音提醒溫度和時(shí)間等信息。這款設(shè)計(jì)有一定的可行性和人性化等特點(diǎn),不僅可以用在滿足普通人的喚醒需求,又可以用于老年人以及有耳疾的殘疾人的喚醒需求等場合,在一定程度上體現(xiàn)了智能化。

引言
在節(jié)奏過快的生活中,人們承受的精神和心理壓力十分巨大,這就使得現(xiàn)代人都希望在當(dāng)代繁忙而枯燥的工作和學(xué)習(xí)中能身心愉悅的生活。隨著信息化發(fā)展水平的逐步提高,智能化系統(tǒng)越來越受到人們的重視。市場上普遍的鬧鐘只是一種到了人們設(shè)定的時(shí)間就被令人煩躁的聲音而吵醒的機(jī)械化鬧鐘,機(jī)械化的鬧鐘不僅將熟睡的人們從夢中驚醒,影響了人們起床的心情,還影響了人們的身體健康。因此,人性化的喚醒系統(tǒng)顯得尤為重要,它以多種方式聯(lián)動(dòng),可對(duì)光線亮度、語音提示和人體感應(yīng)等諸多喚醒元素進(jìn)行個(gè)性化調(diào)整或設(shè)定,盡可能將對(duì)人的刺激減低到最低限度,讓睡眠中人在設(shè)定的時(shí)間里自然醒來[1]。
目前,市場上越來越多小型普遍的電子產(chǎn)品的功能不斷地被更替,這一現(xiàn)狀由于智能化電子產(chǎn)品的出現(xiàn), 毋庸置疑鬧鐘就是一個(gè)典型代表。普通的響鈴鬧鐘設(shè)計(jì)缺乏的是人性化關(guān)懷這一理念,比如人們還在熟睡中就會(huì)被刺耳的鬧鈴叫醒,這種喚醒方式不僅會(huì)使人感到厭煩、渾身不舒服,更重要的是會(huì)影響人們的身體健康,因此,人性化的智能喚醒系統(tǒng)顯得相當(dāng)不可忽視。近年來,智能系統(tǒng)的研究已經(jīng)帶領(lǐng)社會(huì)進(jìn)入了更為人性化的領(lǐng)域,這一現(xiàn)狀引起了國內(nèi)外學(xué)者及企業(yè)的廣泛重視。國內(nèi),浙江大學(xué)提出了一種人性化控制的智能家居若干關(guān)鍵技術(shù)研究;中國信息界提出的一款智能鬧鐘,每天早上能夠溫柔的喚醒熟睡中的人們;另外,杭州電子科技大學(xué)、吉林大學(xué)、山東大學(xué)等眾多學(xué)者也進(jìn)行了智能喚醒系統(tǒng)的相關(guān)研究。其研究成果填補(bǔ)了國內(nèi)在相關(guān)領(lǐng)域的多項(xiàng)空白,為人性化的智能家居設(shè)計(jì)提供了新的思路和技術(shù)支持,在很大程度上推動(dòng)了國內(nèi)智能化系統(tǒng)的發(fā)展進(jìn)步[2]。國外有一款地毯鬧鐘Reggie,這款鬧鐘功能是在喚醒時(shí)倘若不站上去,那么它就會(huì)一直響直到將人們喚醒,如此就解決了起床困難戶的問題;Baboomi智能鬧鐘,這款智能化的設(shè)計(jì)既有為鬧鐘充電的功能,在一定程度上又有震動(dòng)的功能。臨睡前在枕頭下放置智能鬧鐘的震動(dòng)設(shè)備,早上熟睡的人就會(huì)被它人性化地震動(dòng)聲音而慢慢喚醒,這種傳達(dá)起床信息的方式更加智能化;倘若在智能手機(jī)上安裝智能鬧鐘的App,也可以實(shí)現(xiàn)智能化的語音鬧鐘,通過設(shè)置起床時(shí)間,在早上就能感受到舒適地被喚醒。
針對(duì)目前功能比較大眾化的鬧鐘設(shè)計(jì)中存在的人性化關(guān)懷不夠,以及沒有充分考慮到消費(fèi)者的使用體驗(yàn)等問題[3-5],本設(shè)計(jì)做出了進(jìn)一步的改進(jìn),主要體現(xiàn)在在喚醒系統(tǒng)的視覺、聽覺等方面。家用智能喚醒系統(tǒng),可根據(jù)人們預(yù)先設(shè)定的起床時(shí)間,慢慢調(diào)整周圍的光照鬧鐘響起喚醒熟睡中的人們,同時(shí),以溫柔的語音提示當(dāng)天的室外溫度來提醒人們穿衣厚度指數(shù)等。本系統(tǒng)不僅能滿足普通人的喚醒需求,也能滿足老年人以及有耳疾的殘疾人的喚醒需求。
2系統(tǒng)的設(shè)計(jì)方案
一款智能家用喚醒系統(tǒng)必須具備基本的電子時(shí)鐘功能,這可以根據(jù)不同的需求設(shè)定不同的操作從而實(shí)現(xiàn)不同的功能。智能鬧鐘在設(shè)定的起床時(shí)間還沒到達(dá)之前,自動(dòng)調(diào)光燈由暗變亮,鬧鐘開始響鈴,并進(jìn)入語音提醒模式,和普通鬧鐘相比較有很大的創(chuàng)新。如果人們還未從熟睡中醒來,那么鬧鐘就會(huì)持續(xù)響起直至手動(dòng)關(guān)閉鬧鐘。本智能家用喚醒系統(tǒng)核心硬件是以STC89C51單片機(jī)為主控芯片,根據(jù)主控芯片的外圍接口這一特點(diǎn),在外圍加以其他硬件電路,然后根據(jù)單片機(jī)的指令設(shè)計(jì)要求,在編譯軟件中采用C語言設(shè)計(jì)程序,并通過執(zhí)行一定的程序來實(shí)現(xiàn)此系統(tǒng)的功能。系統(tǒng)設(shè)計(jì)主要由單片機(jī)最小系統(tǒng)、溫度檢測、實(shí)時(shí)時(shí)鐘模塊、PWM波調(diào)光、具有語音提醒功能的鬧鐘模塊、顯示和按鍵模塊等幾個(gè)部分組成。STC89C51單片機(jī)最小系統(tǒng)作為主控模塊,時(shí)間、日期信息的采集由DS1302時(shí)鐘芯片來完成,溫度的獲取用DS18B20溫度傳感器來實(shí)現(xiàn),時(shí)間和溫度等的顯示主要是在LCD12864液晶顯示器中完成的;通過按鍵完成日期、時(shí)間的初始化設(shè)置和鬧鐘的設(shè)定;借助PWM波的變化實(shí)現(xiàn)喚醒燈自動(dòng)調(diào)光;采用語音模塊完成鬧鐘喚醒和溫度提醒功能。家用智能喚醒系統(tǒng)設(shè)計(jì)原理框圖如圖1所示。
圖1系統(tǒng)原理框圖
3系統(tǒng)的硬件設(shè)計(jì)
根據(jù)系統(tǒng)的設(shè)計(jì)方案,系統(tǒng)的原理圖設(shè)計(jì)如圖2所示?傮w原理圖以單片機(jī)STC89C51為核心的控制電路[6],外圍輔以時(shí)鐘電路、溫度傳感器電路、PWM喚醒燈電路、液晶顯示電路及語音播報(bào)電路等。通過按鍵設(shè)置鬧鐘,單片機(jī)將溫度傳感器和實(shí)時(shí)時(shí)鐘傳來的信息處理后送到液晶顯示器顯示,在設(shè)定的時(shí)間提前一段時(shí)間單片機(jī)控制喚醒燈打開,語音模塊與單片機(jī)進(jìn)行通信協(xié)議,從而實(shí)現(xiàn)各個(gè)功能。

圖2 系統(tǒng)原理圖
3.1控制模塊的設(shè)計(jì)
主控制模塊以基于STC89C51單片機(jī)為核心,這是智能家用喚醒系統(tǒng)設(shè)計(jì)的最重要的部分,一個(gè)能夠正常工作的單片機(jī)系統(tǒng)是在核心芯片上加入一些外圍電路組成的。最小系統(tǒng)和按鍵控制電路是控制模塊設(shè)計(jì)中的兩個(gè)主要部分,控制模塊負(fù)責(zé)整體電路的主要工作,通過操作按鍵和單片機(jī)控制電路的運(yùn)行。
晶振電路和復(fù)位電路是單片機(jī)最小系統(tǒng)必不可少的部分[7]。單片機(jī)正常工作時(shí)的工作速度是由晶振電路提供的,這種工作速度是由晶振電路產(chǎn)生的脈沖信號(hào)。在理論上,STC89C51單片機(jī)的最小系統(tǒng)本應(yīng)使用的是和系統(tǒng)相配的晶振,然而在本系統(tǒng)中選取的是比較接近的12MHz晶振。由于單片機(jī)內(nèi)部結(jié)構(gòu)的特殊性,因此,只需要一個(gè)晶振和兩個(gè)電容連接在單片機(jī)外面的電路中就可實(shí)現(xiàn)時(shí)鐘電路,電容一般選用的是30pF的容量就可以滿足要求,圖中C1和C2電容的作用就是為了使單片機(jī)能夠迅速的起振,并且能夠使單片機(jī)工作時(shí)的頻率達(dá)到穩(wěn)定。晶振的一端接XTAL2(19),另一端接的是XTAL2(18),兩個(gè)電容并聯(lián)接于振蕩源之間,工作時(shí)能更好的為單片機(jī)服務(wù)。智能家用喚醒系統(tǒng)的各個(gè)部件在處于初始化狀態(tài)時(shí),單片機(jī)可由此開始工作進(jìn)行操作,這一系列是復(fù)位電路提供的條件,復(fù)位電路是單片機(jī)的準(zhǔn)備工作,包括上電復(fù)位和按鍵復(fù)位兩種模式。在按鍵復(fù)位中,電容C3取值一般為10uF,電阻R取值約為10KΩ,K5是為實(shí)現(xiàn)按鍵復(fù)位而設(shè)置的。然而,在上電復(fù)位中,由單片機(jī)運(yùn)行后給定的高低電平直接實(shí)現(xiàn)復(fù)位功能。
按鍵控制電路中,設(shè)置了五個(gè)按鍵實(shí)現(xiàn)設(shè)計(jì)所需的要求,按鍵在設(shè)計(jì)中能夠起到控制外部電路的作用,不同的操作實(shí)現(xiàn)不同的功能。本設(shè)計(jì)中使用的按鍵不多,僅需五個(gè)按鍵系統(tǒng)所需要的功能即可完成。按鍵有四個(gè)接腳,兩個(gè)相連的之間導(dǎo)通,按鍵其中一端接單片機(jī)的I/O接口,另一端可以接電源,也可以接地端,此系統(tǒng)中按鍵另一端是接地的,低電平完成按鍵的操作,這樣的接法程序是比較簡單且系統(tǒng)也相對(duì)穩(wěn)定。五個(gè)獨(dú)立按鍵實(shí)現(xiàn)的功能分別有確認(rèn)返回、加一、減一、鬧鐘開關(guān)及喚醒燈開關(guān),按鍵K1、K2、K3、K4和K5分別與單片機(jī)的P1.0、P1.1、P1.2、P1.3和P1.4引腳連接,控制模塊電路圖如圖3所示。
圖3 控制模塊電路圖
3.2時(shí)鐘模塊的設(shè)計(jì)
實(shí)時(shí)時(shí)鐘電路的設(shè)計(jì)是本次設(shè)計(jì)的基本模塊,在數(shù)字時(shí)鐘所具備的功能下才能實(shí)現(xiàn)鬧鐘的設(shè)定。時(shí)鐘模塊的設(shè)計(jì)需要采用時(shí)鐘芯片DS1302,這款芯片可以精確的計(jì)數(shù),具有農(nóng)歷和陽歷轉(zhuǎn)換的功能,可以編程接口,與此同時(shí)還具有掉電保存等功能,在編寫程序時(shí)能夠?qū)ζ浔容^方便的進(jìn)行程序控制[8]。與直接使用單片機(jī)內(nèi)部定時(shí)器實(shí)現(xiàn)計(jì)數(shù)功能相比,DS1302時(shí)鐘芯片實(shí)現(xiàn)的功能很便捷,程序簡單易編寫,穩(wěn)定性好、容易控制、時(shí)間精度高等。由于單片機(jī)內(nèi)部定時(shí)器雖然沒有使用芯片,但是實(shí)現(xiàn)的時(shí)間誤差較大,不能滿足系統(tǒng)要求。所以系統(tǒng)完成時(shí)鐘電路的首選芯片就是DS1302時(shí)鐘芯片。
DS1302時(shí)鐘芯片與單片機(jī)進(jìn)行通信時(shí),僅需要SCLK、I/O和RST三條線連接的方式,可以實(shí)現(xiàn)以一對(duì)多的方式傳送多個(gè)字節(jié)的時(shí)鐘信號(hào)或數(shù)據(jù)。DS1302比同類的芯片性能好,功耗低能更好的為系統(tǒng)的運(yùn)行減少不必要的負(fù)荷。時(shí)鐘模塊有兩個(gè)電源,在Vcc2 不能正常運(yùn)行時(shí),時(shí)鐘依然能在Vcc1的作用下維持原來的狀態(tài)繼續(xù)運(yùn)行。若兩個(gè)電源大小不一,則使用其中較大的一個(gè)電源為電路供電,Vcc1采用3V的紐扣電池,Vcc2主電源使用的是整個(gè)系統(tǒng)的電源。DS1302時(shí)鐘芯片需要使用32.768KHz的晶振,晶振電路可產(chǎn)生計(jì)時(shí)脈沖。為了對(duì)所傳送的數(shù)據(jù)進(jìn)行初始化,DS1302工作時(shí)復(fù)位腳就需要被置為高電平,反之,數(shù)據(jù)的傳送就會(huì)被停止導(dǎo)致數(shù)據(jù)不能繼續(xù)傳輸。
在本系統(tǒng)的設(shè)計(jì)中,實(shí)時(shí)時(shí)鐘電路主要是為了能夠準(zhǔn)確的顯示電子時(shí)鐘等信息。通過與單片機(jī)連接,將用軟件實(shí)現(xiàn)功能,然后經(jīng)過顯示器顯示需要的時(shí)間信息。DS1302時(shí)鐘芯片與單片機(jī)的通信接口由3條線組成,VCC接在系統(tǒng)電源上,GND接在地端, RST復(fù)位管腳與單片機(jī)的P2.2端口連接,實(shí)現(xiàn)了時(shí)鐘電路在復(fù)位時(shí)由低電平跳變成高電平并啟動(dòng)一次數(shù)據(jù)傳輸?shù)倪^程,SCLK管腳與P2.1端口連接,時(shí)鐘輸入端將記錄的脈沖信號(hào)存入時(shí)鐘芯片,I/O管腳與P2.0端口連接,數(shù)據(jù)線輸入輸出記錄的時(shí)間數(shù)據(jù)。根據(jù)電路的需求,可在三線上加上拉電阻,由于P2口內(nèi)部的緣故,本系統(tǒng)連接的單片機(jī)P2接口也可不加電阻。DS1302時(shí)鐘電路在設(shè)計(jì)中的原理圖如圖4所示。
圖4 時(shí)鐘電路原理圖
3.3溫度檢測模塊的設(shè)計(jì)
為了使測得溫度值更加精確,DS18B20溫度傳感器的高精度性能就成了溫度檢測模塊選取的標(biāo)準(zhǔn)。這款傳感器屬于數(shù)字式傳感器,而且在進(jìn)行數(shù)據(jù)的傳送時(shí)僅僅一條數(shù)據(jù)線就可以實(shí)現(xiàn),最重要的一點(diǎn)是它與單片機(jī)連接的時(shí)候顯得更加簡單方便,也鑒于此類傳感器的結(jié)構(gòu)簡單易懂,不需外圍的電路輔助完成所需的功能。若采用熱敏電阻和A/D轉(zhuǎn)換器實(shí)現(xiàn)溫度采集,就需選用標(biāo)準(zhǔn)穩(wěn)定的電阻才可完成設(shè)計(jì)要求,并且檢測的數(shù)值可靠性較差。在經(jīng)過比較論證后,選用DS18B20能更好的滿足設(shè)計(jì)需求,它的分辨率比起同類型的傳感器更高更精確,所以溫度檢測模塊選用了DS18B20型號(hào)的傳感器。
DS18B20溫度檢測模塊在設(shè)計(jì)中用于采集溫度,早晨人們在經(jīng)過鬧鐘喚醒后通過語音系統(tǒng)提醒當(dāng)前的溫度。溫度模塊采集溫度值后,經(jīng)過與單片機(jī)通信將所檢測的示數(shù)傳送到顯示器顯示,最后由ISD1760語音模塊播報(bào)溫度值。DS18B20與單片機(jī)的通信只需將DS18B20的信號(hào)線I/O口與單片機(jī)的其中一個(gè)雙向端口I/O口相連即可。在焊接時(shí)必須注意將電源端VDD和地端GND焊接牢固[9],如果VDD沒有接好,那么傳感器就只會(huì)傳送一個(gè)固定不變的溫度值,就不能檢測當(dāng)前的溫度。在設(shè)計(jì)中,傳感器須與本設(shè)計(jì)選用的主機(jī)STC89C51單片機(jī)連接,其中U3為溫度檢測控制芯片DS18B20。I/O(2)管腳與單片機(jī)的P3.7端口連接可以傳輸信號(hào),溫度模塊電路圖如圖5所示。
圖5 DS18B20溫度檢測電路原理圖
3.4語音模塊的設(shè)計(jì)
本設(shè)計(jì)使用的ISD1760是一款語音錄放功能強(qiáng)大的語音芯片。與其他語音芯片相比較,ISD1760不僅實(shí)現(xiàn)了較為方便的錄放音,還具備了一些較智能的提示功能,在一定程度上音質(zhì)也有了很大的改善。ISD1760芯片的新功能比較多,能全方位的提高整個(gè)系統(tǒng)的性能。此外,該芯片在錄放音時(shí)音質(zhì)清晰明了,幾乎不存在噪音干擾。與使用蜂鳴器實(shí)現(xiàn)的鬧鐘比較,在通過語音芯片完成的語音鬧鐘播報(bào)更能體現(xiàn)出人性化的一面,也更體現(xiàn)了ISD1760芯片功能的強(qiáng)大。這款芯片有兩種實(shí)現(xiàn)模式,一類是用硬件直接錄放音,另一類是采用四線協(xié)議與單片機(jī)通信,智能家用喚醒系統(tǒng)使用了第二種情況,通過軟件編譯實(shí)現(xiàn)語音播報(bào)功能。在主控單片機(jī)與 ISD1760進(jìn)行通信時(shí),所采用的是通過四線SPI協(xié)議來完成的,而且?guī)缀跛械牟僮鞫伎梢酝ㄟ^SPI協(xié)議來完成[10],因此,錄放音模塊可以作為一種新形式完成播報(bào)。SPI協(xié)議四線接口功能描述如表2所示。
表1 協(xié)議接口功能描述
接口
功能描述
MOSI
數(shù)據(jù)輸入端口。主控制芯片在SCLK上升沿前的半個(gè)周期將數(shù)據(jù)放入MOSI端,SCLK在上升沿時(shí),數(shù)據(jù)會(huì)被鎖存在芯片內(nèi)
MISO
串行輸出。ISD1700在 SCLK前的半個(gè)周期將數(shù)據(jù)放置在MISO端,在SCLK的下降沿時(shí),數(shù)據(jù)移出
SCLK
通信接口的時(shí)鐘。由主控制芯片產(chǎn)生,并且被用來同步芯片MOSI和MISO 端各自的數(shù)據(jù)輸入和輸出
/SS
若此接口為低時(shí),該芯片就被選為被控制的設(shè)備并開啟通信協(xié)議接口
語音模塊起到響鈴功能,并能提醒人們溫度和穿衣的建議。ISD1760的工作方式分別為獨(dú)立方式和SPI協(xié)議方式。本系統(tǒng)采用了SPI工作模式,在單片機(jī)作為主控機(jī)時(shí),ISD1760作為從機(jī),若需要播報(bào)不同的語音段,就會(huì)通過單片機(jī)發(fā)送不同的指令來控制播報(bào)。ISD1760芯片是在8KHz采樣率下的錄音,錄音經(jīng)過麥克風(fēng)輸入,為了使得到的聲音效果比較好,選擇了喇叭來播報(bào),同時(shí),電路選取合適的電阻和電容來配合語音模塊完成各項(xiàng)功能 。在ISD1760語音芯片被SPI總線控制時(shí),系統(tǒng)中采用STC89C51單片機(jī)的P3口完成與之通信,STC89C51單片機(jī)與ISD1760語音芯片通信時(shí)接口不多,僅需四條線即可,語音芯片的MISO管腳接單片機(jī)的P3.2引腳,此管腳可實(shí)現(xiàn)數(shù)據(jù)的輸出,ISD1760輸出的數(shù)據(jù)信號(hào)可以從MISO引腳被單片機(jī)接收存儲(chǔ);語音芯片MOSI管腳與單片機(jī)的P3.3口通信時(shí),此管腳實(shí)現(xiàn)的就是數(shù)據(jù)的輸入,所需的讀入操作和放音地址都是從ISD1760的MOSI管腳輸入的;語音芯片的SCLK與單片機(jī)的P3.4端口通信時(shí),SCLK主要是實(shí)現(xiàn)時(shí)鐘輸入的;P3.5管腳接語音芯片的片選引腳/SS,此管腳主要是用來控制芯片是否選通。SP+和SP-端口分別接外接喇叭的正負(fù)極。語音模塊電路原理圖如圖6所示,其中U4為語音芯片。
圖6語音模塊電路圖
3.5顯示模塊的設(shè)計(jì)
系統(tǒng)采用LCD123864液晶作為顯示模塊,常用的12864液晶模塊有藍(lán)色背光和綠色背光、有無字庫的[11],本次設(shè)計(jì)中所用的是藍(lán)色有字庫的液晶顯示器,具有兩類接口方式,一種是四位或八位的并行接口,另一種是二線或三線的串行接口。 12864液晶可以顯示設(shè)計(jì)中所需的時(shí)間、日期、溫度及鬧鐘圖標(biāo)等內(nèi)容,這比1602功能明顯強(qiáng)的多。相對(duì)而言,一般的顯示器內(nèi)部結(jié)構(gòu)有一定的缺陷,會(huì)消耗大量的電量,然而LCD12864液晶顯示器耗電量卻比其它的顯示器耗電量小很多,所需的電壓也容易滿足。液晶顯示器的工作溫度范圍能夠滿足中溫度采集所需的溫度值,并且能較準(zhǔn)確的顯示。LCD12864的硬件設(shè)計(jì)相對(duì)而言比較簡單,顯示所需程序在一定程度上比較容易編譯實(shí)現(xiàn),而且價(jià)格合適,所以此系統(tǒng)采用了這款顯示器。
顯示模塊中采用12864液晶顯示器,由于設(shè)計(jì)中需要的時(shí)間、日期等內(nèi)容都能通過這款顯示器來實(shí)現(xiàn),所以12864液晶顯示器是設(shè)計(jì)中相當(dāng)重要的模塊。12864顯示器是數(shù)字式的接口,能在顯示屏上顯示智能鬧鐘的數(shù)據(jù),與單片機(jī)系統(tǒng)連接時(shí)采用了并行接口。顯示模塊主要是將單片機(jī)發(fā)送來的時(shí)間數(shù)據(jù)和溫度數(shù)據(jù)進(jìn)行一系列的處理并由顯示器顯示,還能在設(shè)置鬧鐘后鬧鐘圖標(biāo)也能顯示出來。在液晶顯示器和單片機(jī)連接時(shí),顯示器的數(shù)據(jù)線DB0(7)-7(14)與單片機(jī)的P0.0-P0.7相連接,并需要10K的上拉電阻。VO端口接一個(gè)103的電位器,改變電位器的阻值液晶顯示器的亮度有所變化。PSB引腳高電平時(shí)選擇并口,低電平時(shí)選擇串口的接法,引腳NC不需要接任何管腳。液晶顯示模塊原理圖如圖7所示。
圖7 液晶顯示模塊電路圖
3.6PWM喚醒燈模塊設(shè)計(jì)
調(diào)光模塊設(shè)計(jì)中,采用了較為簡單的三極管驅(qū)動(dòng)LED電路?紤]到設(shè)計(jì)需要,因?yàn)槿龢O管驅(qū)動(dòng)成本低,而且容易控制和實(shí)現(xiàn)等特點(diǎn),所以最終選用了大功率三極管驅(qū)動(dòng)喚醒燈模塊[12]。由于STC89C51單片機(jī)不具備PWM配置,因此通過單片機(jī)軟件產(chǎn)生PWM波并實(shí)現(xiàn)自動(dòng)調(diào)光的功能,喚醒燈的本質(zhì)是利用PWM對(duì)LED中的正向電流進(jìn)行調(diào)節(jié)來完成的。減小LED電流將起到調(diào)節(jié)LED光輸出強(qiáng)度的作用,然而,正向電流的變化也會(huì)改變LED的亮度,因?yàn)長ED的亮度會(huì)隨著電流的變化而變化[13]。模擬早晨日光的效果是通過與單片機(jī)連接產(chǎn)生PWM波,LED發(fā)光二極管亮度會(huì)由暗變亮,直到亮度達(dá)到最大。
三極管是放大電流的器件,它分為兩類,一類是NPN型,一類是PNP型,設(shè)計(jì)中采用了NPN型,這種三極管理解起來很容易。三極管的放大作用是小的基極電流變化引起大的集電極電流變化,并且基極電流與集電極電流成正比。若基極電流由零開始增大時(shí),在三極管沒有達(dá)到飽和前,那么LED的亮度就會(huì)隨著變亮。LED的亮度受到電流控制,通過控制電流改變LED的亮度[13]。
本系統(tǒng)LED光源用三極管來放大電流,LED燈串聯(lián)一個(gè)上拉電阻限流來保護(hù)二極管。電流通斷的變化用NPN型三極管實(shí)現(xiàn),PWM波由單片機(jī)的P3.6輸出,低電平有效。在單片機(jī)上電后設(shè)置鬧鐘時(shí)間,在設(shè)定的時(shí)間范圍內(nèi)調(diào)光電路開始啟動(dòng),喚醒燈模擬日光直到達(dá)到最亮,調(diào)光電路原理圖如圖8所示。
圖8 調(diào)光電路原理圖
4軟件系統(tǒng)設(shè)計(jì)
4.1編譯軟件及語言
在智能家用喚醒系統(tǒng)設(shè)計(jì)中,采用Keil C51軟件作為編譯軟件,這款編譯軟件擁有功能強(qiáng)大的開發(fā)調(diào)試工具,軟件里包括各種各樣的函數(shù)可以容易的調(diào)用。單片機(jī)軟件的開發(fā)系統(tǒng)能夠完成編輯、編譯、調(diào)試和仿真等這一系列開發(fā)流程。程序在經(jīng)過編譯后,就能體會(huì)到此軟件編譯軟件生成代碼效率是相當(dāng)高,語句簡潔易懂。
該智能家用喚醒系統(tǒng)軟件部分所用的編程語言是C語言,由于C語言結(jié)構(gòu)比較豐富,程序設(shè)計(jì)時(shí)相對(duì)而言比較容易實(shí)現(xiàn),同時(shí)C語言所能夠適用的范圍大而且靈活方便。其中,最主要的因素C語言是大學(xué)期間一直應(yīng)用的編程語言,這種語言相對(duì)匯編語言而言比較簡單易懂。因此,本次設(shè)計(jì)的軟件任務(wù)最終決定選用C語言編程來完成。
4.2系統(tǒng)主程序
為實(shí)現(xiàn)系統(tǒng)功能,系統(tǒng)軟件各部分功能必須按要求編程。智能家用喚醒系統(tǒng)的軟件部分主要包括:單片機(jī)主控部分、LCD12864液晶顯示部分、時(shí)鐘控制部分、語音播報(bào)、溫度檢測部分、調(diào)光及按鍵部分等[14]。主程序?qū)δK進(jìn)行初始化,而后調(diào)用DS1302時(shí)間處理子程序、讀溫度、處理溫度、顯示、按鍵及語音錄放子程序等模塊。系統(tǒng)的整體程序流程圖如圖9所示。
圖9 流程圖
4.3子程序設(shè)計(jì)
本系統(tǒng)功能是通過軟件和硬件相結(jié)合實(shí)現(xiàn)的。子程序設(shè)計(jì)包括顯示、時(shí)間、溫度、語音、調(diào)光及按鍵等。各個(gè)模塊所實(shí)現(xiàn)的功能大體可由模塊的流程圖表示,主要介紹顯示、時(shí)間和溫度的工作流程。由于程序較長,所以程序?qū)⒃诟戒洸糠种幸阅K的形式全部列出。
LCD顯示子程序的設(shè)計(jì),程序主要實(shí)現(xiàn)對(duì)需要的信息的顯示,顯示包括時(shí)間及溫度等信息。需要在寫程序時(shí)注意它的讀寫控制指令,對(duì)顯示進(jìn)行初始化,調(diào)用時(shí)間、溫度及農(nóng)歷轉(zhuǎn)公歷等子程序的調(diào)用,將溫度值和時(shí)間數(shù)據(jù)轉(zhuǎn)換為液晶字符顯示。通過液晶顯示程序能夠?qū)崿F(xiàn)時(shí)鐘的實(shí)時(shí)顯示以及溫度值的顯示,可以實(shí)現(xiàn)萬年歷功能。使用串口方式將液晶顯示與控制芯片通信,程序比并口方式簡單易實(shí)現(xiàn)。子程序LCD12864顯示模塊子程序的流程圖如圖10所示。

圖10 LCD子程序流程圖
DS1302子程序的設(shè)計(jì),在將時(shí)鐘初始化后寫入時(shí)鐘的初值,時(shí)鐘模塊開始計(jì)時(shí)并讀出數(shù)據(jù)送至顯示器顯示,其流程圖如圖11。
     圖11 DS1302子程序流程圖
DS18B20溫度子程序,主要包括初始化,檢測溫度的存在與否,進(jìn)行讀寫操作并轉(zhuǎn)換讀取溫度,其程序流程圖如圖12所示。
圖12 溫度子程序流程圖
5系統(tǒng)安裝與調(diào)試
5.1硬件系統(tǒng)調(diào)試
智能家用喚醒系統(tǒng)設(shè)計(jì)的電路系統(tǒng)較大,因而這對(duì)焊接方面而言更是不容輕視。在龐大的電路系統(tǒng)中,在焊接時(shí)出現(xiàn)一點(diǎn)的失誤,后續(xù)的檢測及調(diào)試就不會(huì)順利地進(jìn)行,而且電路在焊接時(shí)線比較多,要盡量避免線與線之間的干擾,若影響較大則會(huì)對(duì)電路造成短路現(xiàn)象[15]。
硬件模塊電路調(diào)試是為了檢測電路中是否會(huì)出現(xiàn)電路不通等情況,同時(shí)也是在檢測各個(gè)元器件之間的連接是否正確。先檢測電源部分的電路,然后依次檢測實(shí)時(shí)時(shí)鐘模塊、溫度檢測模塊、顯示模塊及語音模塊等,主要檢測各引腳的連接。經(jīng)過模塊測試后再進(jìn)行整體測試,在該設(shè)計(jì)硬件調(diào)試的過程中,遇到以下問題:
第一,當(dāng)確保硬件電路連接無誤后,系統(tǒng)上電啟動(dòng)后LCD12864不顯示,這樣的情況可能是硬件電路中存在錯(cuò)焊或虛焊,也可能芯片插反導(dǎo)致短路。解決的方法:首先,檢查芯片的供電電壓是否5V,檢查電路有沒有問題;然后,調(diào)節(jié)控制背光的電位器,電位器阻值不合適也會(huì)使所顯示出來的光亮有一定的差異;最后,顯示不是很穩(wěn)定,應(yīng)將單片機(jī)的31引腳接高電平。
第二,電路工作一段時(shí)間后芯片會(huì)發(fā)熱,經(jīng)過仔細(xì)地用萬用表檢查電路,發(fā)現(xiàn)有短路現(xiàn)象。由于在液晶顯示器所接的排阻短路導(dǎo)致此種情況出現(xiàn),解決的辦法:斷掉短路部分重新連接。
5.2軟件系統(tǒng)測試
智能家用喚醒系統(tǒng)是多功能的設(shè)計(jì),當(dāng)前的日期、時(shí)間和溫度都能被液晶顯示器顯示。由于喚醒系統(tǒng)所需的功能較多,因此它的程序編寫也較為復(fù)雜,所以在編寫程序時(shí)各個(gè)模塊的程序相當(dāng)重要,子程序和主程序之間在連接和調(diào)試時(shí)就需要注意邏輯問題。在保證硬件電路無誤時(shí),對(duì)軟件開始調(diào)試。首先,將系統(tǒng)的整體主程序框架寫出,主流程分為幾個(gè)子程序,分別是溫度、時(shí)鐘、語音、顯示等系列;然后,每個(gè)子程序開始調(diào)試,完成各部分的軟件功能;最后,系統(tǒng)進(jìn)行整體調(diào)試完成設(shè)計(jì)功能。在經(jīng)過多次的修改程序并調(diào)試完所有的程序后,在實(shí)物上進(jìn)行驗(yàn)證。在調(diào)試過程中遇到了一些問題,在修改時(shí)間時(shí),農(nóng)歷的顯示沒有自動(dòng)調(diào)整對(duì)應(yīng)上。針對(duì)這一問題,在調(diào)試時(shí)把其他的程序設(shè)置斷點(diǎn)并暫時(shí)屏蔽,將農(nóng)歷轉(zhuǎn)換的子程序進(jìn)行獨(dú)立調(diào)試。這時(shí)就會(huì)發(fā)現(xiàn)調(diào)用時(shí)間自動(dòng)調(diào)整不能完成更新,十進(jìn)制和十六進(jìn)制的處理不太合理導(dǎo)致時(shí)間出現(xiàn)混亂。最后經(jīng)過進(jìn)制之間的修改調(diào)整使得時(shí)間能正常顯示。
5.3系統(tǒng)誤差分析
本系統(tǒng)的誤差來源:第一,DS1302時(shí)鐘芯片本身的問題,這個(gè)可以通過測試,確定在一定時(shí)間內(nèi)誤差是多少,可用程序調(diào)節(jié)彌補(bǔ)誤差;第二,系統(tǒng)的外圍器件等帶來的誤差,因此在焊接時(shí)元器件布局要合理,保證線路質(zhì)量,最大程度的減小誤差。第三,在軟件設(shè)計(jì)時(shí),溫度值的轉(zhuǎn)換沒有經(jīng)過精確的計(jì)算導(dǎo)致溫度的讀取出現(xiàn)了問題,精度不準(zhǔn),測量的數(shù)值有所偏差,因此需精確計(jì)算溫度,采用軟件實(shí)現(xiàn)。

6結(jié)束語

通過本次智能家用喚醒系統(tǒng)的設(shè)計(jì),人性化的智能系統(tǒng)設(shè)計(jì)顯得越來越重要。這款基于單片機(jī)的智能喚醒系統(tǒng)從硬件和軟件兩大方面解決了普通鬧鐘的不足,在加入光度調(diào)節(jié)從而使熟睡中的人們能夠在設(shè)定的時(shí)刻醒來。鬧鐘會(huì)在設(shè)定時(shí)間前將喚醒燈打開,調(diào)節(jié)人體生物鐘,在人們淺睡眠時(shí)鬧鐘響起并播報(bào)溫度等信息。該系統(tǒng)以單片機(jī)為控制芯片,外接時(shí)鐘電路、語音電路、溫度采集電路、自動(dòng)調(diào)光電路等來實(shí)現(xiàn)各項(xiàng)功能。這款智能喚醒系統(tǒng)不僅能夠更人性化的喚醒熟睡中的人們,還能提高人們的工作效率。這次設(shè)計(jì)中,智能家用喚醒系統(tǒng)在仿真時(shí)能夠很好的結(jié)合軟硬件的設(shè)計(jì),但是在實(shí)際中由于外界因素的干擾,智能喚醒系統(tǒng)無法精確的檢測出溫度示數(shù),也由于軟件設(shè)計(jì)中延遲不當(dāng)會(huì)影響時(shí)間的不準(zhǔn)確。在實(shí)際操作時(shí)會(huì)出現(xiàn)偏差,只有不斷地改進(jìn)調(diào)試,在經(jīng)過整體的優(yōu)化才能有所改善。這款較人性化的智能鬧鐘設(shè)計(jì)在一定程度上實(shí)現(xiàn)了為我們服務(wù)的功能,但難免總是會(huì)存在一定的弊端,溫度模塊檢測的溫度是室內(nèi)溫度,可以通過不斷改進(jìn)測量室外溫度,可以在本次設(shè)計(jì)的基礎(chǔ)上引入紅外遙控,從而更人性化的為人們服務(wù)。

附錄2 實(shí)物圖


單片機(jī)源程序如下:
  1. #include <STC89C51.H>
  2. #include <stdio.H>
  3. #include <string.H>

  4. #include "LCD12864.h"
  5. #include "DS1302.h"
  6. #include "DS18B20.h"
  7. #include "delay.h"

  8. void display_2(void)
  9. {
  10.               unsigned char display_char[16] = {0};
  11.               int temp = 0;
  12.             
  13.               write_com(0x03);
  14.               delay(50);

  15.               write_com(0x91);
  16.               display_char[0] = (TIME[6]/16) + '0';//年
  17.               display_char[1] = (TIME[6]&0x0f) + '0';
  18.               display_char[2] = '-';
  19.               display_char[3] = (TIME[4]/16) + '0';//月
  20.               display_char[4] = (TIME[4]&0x0f) + '0';
  21.               display_char[5] = '-';
  22.               display_char[6] = (TIME[3]/16) + '0';//日
  23.               display_char[7] = (TIME[3]&0x0f) + '0';
  24.               hzkdis(display_char, 8);

  25.               write_com(0x97);
  26.               switch((TIME[5]&0x07))
  27.               {
  28.                             case 1: hzkdis("一", 2);break;
  29.                             case 2: hzkdis("二", 2);break;
  30.                             case 3: hzkdis("三", 2);break;
  31.                             case 4: hzkdis("四", 2);break;
  32.                             case 5: hzkdis("五", 2);break;
  33.                             case 6: hzkdis("六", 2);break;
  34.                             case 7: hzkdis("日", 2);break;
  35.               }
  36.             
  37.               write_com(0x8A);
  38.               display_char[0] = (TIME[2]/16) + '0';//時(shí)
  39.               display_char[1] = (TIME[2]&0x0f) + '0';
  40.               display_char[2] = ':';
  41.               display_char[3] = (TIME[1]/16) + '0';//分
  42.               display_char[4] = (TIME[1]&0x0f) + '0';
  43.               display_char[5] = ':';
  44.               display_char[6] = (TIME[0]/16) + '0';//秒
  45.               display_char[7] = (TIME[0]&0x0f) + '0';
  46.               hzkdis(display_char, 8);
  47.             
  48.               temp = Ds18b20ReadTemp();

  49.               write_com(0x9B);
  50.               if(temp < 0)//負(fù)
  51.               {
  52.                             temp =~ temp;
  53.                             temp -= 1;
  54.                             temp=(float)temp*0.625+0.5;
  55.                             display_char[0] = '-';
  56.               }
  57.               else
  58.               {
  59.                             display_char[0] = ' ';
  60.                             temp=(float)temp*0.625+0.5;
  61.               }
  62.             
  63.               display_char[1] = temp / 100 + '0';
  64.               display_char[2] = temp % 100 / 10 + '0';
  65.               display_char[3] = '.';
  66.               display_char[4] = temp % 10 + '0';
  67.               hzkdis(display_char, 5);
  68. }

  69. /********************************************************************
  70. * 名稱 : main
  71. * 功能 : 主函數(shù)
  72. * 輸入 : 無
  73. * 輸出 : 無
  74. ***********************************************************************/
  75. void main(void)
  76. {
  77.               lcdinit();
  78.               Ds1302Init();
  79.               display();
  80.             
  81.               while(1)
  82.               {
  83.                             Ds1302ReadTime();
  84.                             display_2();
  85.                             Delay1ms(200);
  86.               }
  87. }



  88. #include "DS18B20.h"

  89. /*******************************************************************************
  90. * 函 數(shù) 名         : Ds18b20Init
  91. * 函數(shù)功能                                 : 初始化
  92. * 輸    入         : 無
  93. * 輸    出         : 初始化成功返回1,失敗返回0
  94. *******************************************************************************/
  95. static uchar Ds18b20Init(void)
  96. {
  97.               uchar i;
  98.               DSPORT = 0;                                          //將總線拉低480us~960us
  99.               i = 70;            
  100.               while(i--);//延時(shí)642us
  101.               DSPORT = 1;                                          //然后拉高總線,如果DS18B20做出反應(yīng)會(huì)將在15us~60us后總線拉低
  102.               i = 0;
  103.               while(DSPORT)              //等待DS18B20拉低總線
  104.               {
  105.                             i++;
  106.                             if(i>5)//等待>5MS
  107.                             {
  108.                                           return 0;//初始化失敗
  109.                             }
  110.                             Delay1ms(1);            
  111.               }
  112.               return 1;//初始化成功
  113. }

  114. /*******************************************************************************
  115. * 函 數(shù) 名         : Ds18b20WriteByte
  116. * 函數(shù)功能                                 : 向18B20寫入一個(gè)字節(jié)
  117. * 輸    入         : com
  118. * 輸    出         : 無
  119. *******************************************************************************/
  120. static void Ds18b20WriteByte(uchar dat)
  121. {
  122.               uint i, j;

  123.               for(j=0; j<8; j++)
  124.               {
  125.                             DSPORT = 0;                                   //每寫入一位數(shù)據(jù)之前先把總線拉低1us
  126.                             i++;
  127.                             DSPORT = dat & 0x01;  //然后寫入一個(gè)數(shù)據(jù),從最低位開始
  128.                             i=6;
  129.                             while(i--); //延時(shí)68us,持續(xù)時(shí)間最少60us
  130.                             DSPORT = 1;              //然后釋放總線,至少1us給總線恢復(fù)時(shí)間才能接著寫入第二個(gè)數(shù)值
  131.                             dat >>= 1;
  132.               }
  133. }

  134. /*******************************************************************************
  135. * 函 數(shù) 名         : Ds18b20ReadByte
  136. * 函數(shù)功能                                 : 讀取一個(gè)字節(jié)
  137. * 輸    入         : com
  138. * 輸    出         : 無
  139. *******************************************************************************/
  140. static uchar Ds18b20ReadByte()
  141. {
  142.               uchar byte, bi;
  143.               uint i, j;            
  144.               for(j=8; j>0; j--)
  145.               {
  146.                             DSPORT = 0;//先將總線拉低1us
  147.                             i++;
  148.                             DSPORT = 1;//然后釋放總線
  149.                             i++;
  150.                             i++;//延時(shí)6us等待數(shù)據(jù)穩(wěn)定
  151.                             bi = DSPORT;              //讀取數(shù)據(jù),從最低位開始讀取
  152.                             /*將byte左移一位,然后與上右移7位后的bi,注意移動(dòng)之后移掉那位補(bǔ)0。*/
  153.                             byte = (byte >> 1) | (bi << 7);                                                                                    
  154.                             i = 4;                            //讀取完之后等待48us再接著讀取下一個(gè)數(shù)
  155.                             while(i--);
  156.               }                                                      
  157.               return byte;
  158. }

  159. /*******************************************************************************
  160. * 函 數(shù) 名         : Ds18b20ChangTemp
  161. * 函數(shù)功能                                 : 讓18b20開始轉(zhuǎn)換溫度
  162. * 輸    入         : com
  163. * 輸    出         : 無
  164. *******************************************************************************/
  165. static void Ds18b20ChangTemp()
  166. {
  167.               Ds18b20Init();
  168.               Delay1ms(1);
  169.               Ds18b20WriteByte(0xcc);                            //跳過ROM操作命令                           
  170.               Ds18b20WriteByte(0x44);                  //溫度轉(zhuǎn)換命令
  171. //              Delay1ms(100);              //等待轉(zhuǎn)換成功,而如果你是一直刷著的話,就不用這個(gè)延時(shí)了
  172. }

  173. /*******************************************************************************
  174. * 函 數(shù) 名         : Ds18b20ReadTempCom
  175. * 函數(shù)功能                                 : 發(fā)送讀取溫度命令
  176. * 輸    入         : com
  177. * 輸    出         : 無
  178. *******************************************************************************/
  179. static void Ds18b20ReadTempCom()
  180. {            
  181.               Ds18b20Init();
  182.               Delay1ms(1);
  183.               Ds18b20WriteByte(0xcc);              //跳過ROM操作命令
  184.               Ds18b20WriteByte(0xbe);              //發(fā)送讀取溫度命令
  185. }
  186. ……………………

  187. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
智能家用喚醒系統(tǒng)設(shè)計(jì).docx (1.1 MB, 下載次數(shù): 152)


評(píng)分

參與人數(shù) 2黑幣 +15 收起 理由
小樹123 + 3 共享資料的黑幣獎(jiǎng)勵(lì)!
木不子 + 12 很給力!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏7 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:1 發(fā)表于 2018-12-1 03:41 | 只看該作者
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

板凳
ID:439508 發(fā)表于 2018-12-5 16:56 | 只看該作者
可玩性很高啊
回復(fù)

使用道具 舉報(bào)

地板
ID:441417 發(fā)表于 2018-12-7 10:02 | 只看該作者
很棒的干貨分享
回復(fù)

使用道具 舉報(bào)

5#
ID:439149 發(fā)表于 2018-12-8 17:26 來自觸屏版 | 只看該作者
admin 發(fā)表于 2018-12-1 03:41
好資料,51黑有你更精彩!!!

可以發(fā)一下壓縮包么?
回復(fù)

使用道具 舉報(bào)

6#
ID:342623 發(fā)表于 2019-2-15 22:13 | 只看該作者
請(qǐng)問ISD1760語音錄放模塊如何直接用硬件錄放音呢
回復(fù)

使用道具 舉報(bào)

7#
ID:195169 發(fā)表于 2019-4-3 18:44 | 只看該作者
表示看不懂程序,有大神能解釋一下嗎
回復(fù)

使用道具 舉報(bào)

8#
ID:195169 發(fā)表于 2019-4-3 18:45 | 只看該作者
有大神能解釋后面isd語音模塊的應(yīng)用嗎
回復(fù)

使用道具 舉報(bào)

9#
ID:504288 發(fā)表于 2019-4-8 11:43 | 只看該作者
樓主方便留個(gè)聯(lián)系方式嗎?有問題想請(qǐng)假一下你
回復(fù)

使用道具 舉報(bào)

10#
ID:649767 發(fā)表于 2019-12-9 21:46 | 只看該作者
這些程序都沒有.h文件啊
回復(fù)

使用道具 舉報(bào)

11#
ID:723933 發(fā)表于 2020-4-7 11:39 | 只看該作者
寫的真好,很有幫助
回復(fù)

使用道具 舉報(bào)

12#
ID:723933 發(fā)表于 2020-4-7 11:57 | 只看該作者
寫的真好,對(duì)我很有幫助
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

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