版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
北京化工大學(xué)第六屆萌芽杯作品含自編語(yǔ)音鬧鐘的電子時(shí)鐘作品類(lèi)別:B類(lèi)指導(dǎo)老師:吳亞瓊參賽團(tuán)隊(duì):OTW成員:王言*通信0803班200843066陳琳通信0803班200843079荀秀娟通信0803班200843086賈曉璐通信0803班200843090張小楠通信0802班200843038
設(shè)計(jì)名稱(chēng):含自編鬧鐘的電子時(shí)鐘摘要含自編語(yǔ)音鬧鐘的電子時(shí)鐘是一個(gè)具有創(chuàng)新性的時(shí)鐘。它可以顯示年、月、日、時(shí)、分、秒、溫度,實(shí)現(xiàn)日期(含星期)跟時(shí)間的多重顯示,并且可以實(shí)現(xiàn)鬧鐘定時(shí)(可以調(diào)節(jié)),時(shí)間到,鬧鐘響,按一次鍵,鬧鐘停,否則鬧鐘會(huì)在一分鐘后左右停止。鬧鐘具有錄音報(bào)時(shí)功能,錄音是通過(guò)語(yǔ)音錄放芯片ISD1760實(shí)現(xiàn)的。我們可以把需要提醒自己的話錄到鬧鐘中,時(shí)間到鬧鐘中自己的聲音就會(huì)響起。與同類(lèi)產(chǎn)品相比,它的創(chuàng)新性在于,鬧鐘播放的不是單調(diào)的一種聲音,而是可以根據(jù)自己改變的,我們可以通過(guò)錄音鍵進(jìn)行多次錄音。時(shí)鐘的設(shè)計(jì)過(guò)程在硬件與軟件方面進(jìn)行同步設(shè)計(jì)。硬件部分主要由AT89S52單片機(jī),LCD1602液晶顯示器,ISD1760語(yǔ)音錄放芯片、DS18B20數(shù)字溫度傳感器與DS1302精確時(shí)鐘控制芯片構(gòu)成。軟件方面主要包括電子時(shí)鐘程序、顯示程序、驅(qū)動(dòng)程序、中斷服務(wù)程序等。關(guān)鍵詞:創(chuàng)新、電子時(shí)鐘、單片機(jī)AbstractWithanelectronicallyself-progammingvoicealarmclock,itisacreativeclock.Theclockcanachieveamultipledisplayofthedatewiththetimeandthefunctionofsettingthetimebydemonstratingyear,month,day,hour,minute,secondandthetemperature.Thealarmclockspeaksassoonastimeisup,anditstopsifsomeonepresstherelatedkey.Otherwisetheclockwillstopinaboutaminute.IthasthefunctionoftimekeepingandrecordingthevoicewhichisachievedbyvoicerecorderchipISD1760.Ifweneedtoremindourselves,wecanthenrecordwhatwewanttosaytothealarmclock,andwhenthetimeisup,thealarminhervoicewillsound.Comparedwithsimilarproducts,itisinnovative.Alarmplaybackisnotamonotonousvoice,butcanchangeaccordingtotheirown,andwecanrecordaudiobuttonseveraltimes.Clockdesignprocesstosynchronizehardwareandsoftwaredesign.Intheeyeofhardware,ItismainlyconsistoftheAT89S52microcontroller,LCD1602,ISD1760voicerecorderscircuit,digitaltemperaturesensorDS18B20andprecisionclockcontrolchipDS1302.Andintermofsoftware,itismadeupofelectronicclock,display,driver,interruptserviceprogram.KeyWord:Innovation,ElectronicaAlarmClock,Microcontroller.
目錄TOC\o"1-4"\h\z\u1.系統(tǒng)的硬件設(shè)計(jì)與實(shí)現(xiàn) 61.1電路設(shè)計(jì)圖 61.2主要單元電路的設(shè)計(jì) 61.2.1單片機(jī)主控制模塊的設(shè)計(jì) 61.2.2時(shí)鐘電路模塊的設(shè)計(jì) 71.2.3溫度電路模塊的設(shè)計(jì) 81.2.4顯示模塊的設(shè)計(jì) 91.2.5語(yǔ)音錄放電路模塊的設(shè)計(jì) 102.系統(tǒng)的軟件設(shè)計(jì) 112.1程序流程框圖 112.1.1時(shí)鐘實(shí)現(xiàn)部分 12定時(shí)計(jì)時(shí)模塊 12溫度控制模塊 13調(diào)時(shí) 14鬧鐘 152.1.2語(yǔ)音錄放控制模塊 162.2軟件代碼的設(shè)計(jì) 162.2.1定義引腳連接 162.2.2延時(shí)函數(shù) 172.2.3驅(qū)動(dòng)與初始化函數(shù) 172.2.4寫(xiě)函數(shù)與讀函數(shù) 192.2.5數(shù)據(jù)智能處理函數(shù) 23溫度數(shù)據(jù)處理 23時(shí)間數(shù)據(jù)讀取函數(shù) 24星期自動(dòng)調(diào)整函數(shù) 252.2.6鬧鐘關(guān)聯(lián)函數(shù) 27鬧鐘顯示函數(shù) 27鬧鐘設(shè)置函數(shù) 282.2.7調(diào)整時(shí)間函數(shù) 312.2.8其它子函數(shù) 362.2.9主函數(shù) 363.仿真 384.實(shí)驗(yàn)結(jié)果與分析 415.設(shè)計(jì)的實(shí)用性分析及市場(chǎng)預(yù)測(cè) 426.作品總結(jié)與收獲心得 437.致謝 438.參考文獻(xiàn) 431.系統(tǒng)的硬件設(shè)計(jì)與實(shí)現(xiàn)1.1電路設(shè)計(jì)圖1.2主要單元電路的設(shè)計(jì)1.2.1單片機(jī)主控制模塊的設(shè)計(jì)AT89S52是低功耗,8位CMOS工藝處理器,具有8K在線可編程Flash存儲(chǔ)器。使用Atmel公司高密度非易失性存儲(chǔ)器技術(shù)制造,與工業(yè)80C51產(chǎn)品指令和引腳完全兼容。片上Flash允許程序存儲(chǔ)器在系統(tǒng)可編程,亦適于常規(guī)編程器。在單芯片上,擁有靈巧的8位CPU和在系統(tǒng)可編程Flash,使得AT89S52為眾多嵌入式控制應(yīng)用系統(tǒng)提供高靈活,超有效地解決方案。AT89S52單片機(jī)為40引腳雙列直插芯片有四個(gè)I/O口P0,P1,P2,P3,MCS-51單片機(jī)共有4個(gè)8位的I/O口(P0、P1、P2、P3),每一條I/O線都能獨(dú)立地作輸出或輸入。AT89S52具有以下標(biāo)準(zhǔn)功能:8k字節(jié)Flash,256字節(jié)RAM,32位I/O口線,看門(mén)狗定時(shí)器,2個(gè)數(shù)據(jù)指針,三個(gè)16位定時(shí)器/計(jì)數(shù)器,一個(gè)6向量二級(jí)中斷結(jié)構(gòu),全雙工串行口,片內(nèi)晶振及時(shí)鐘電路。另外,AT89S52可降至0HZ靜態(tài)邏輯操作,支持2種軟件可選擇節(jié)電模式。空閑模式下,CPU停止工作,允許RAM,定時(shí)器/計(jì)數(shù)器,串口,中斷繼續(xù)工作。掉電保護(hù)方式下,RAM內(nèi)容被保存,振蕩器被凍結(jié),單片機(jī)一切工作停止,直到下一個(gè)中斷或硬件復(fù)位為止。同時(shí)該芯片還具有PDIP、TQFP和PLCC等三種封裝形式,以適應(yīng)不同產(chǎn)品的需求。在我們的作品中,AT89S52對(duì)整個(gè)電路起到控制作用,語(yǔ)音芯片,時(shí)鐘芯片接收來(lái)自單片機(jī)中程序的指令。從而實(shí)現(xiàn)在所選時(shí)間點(diǎn)上播放所錄語(yǔ)音的功能。其中13,14,15腳接時(shí)鐘芯片DS1302。23腳接語(yǔ)音芯片ISD1760。5腳接溫度傳感器,32腳到39腳接LCD1602液晶顯示屏。XTAL1接外部晶振和微調(diào)電容的一端,在片內(nèi)它是振蕩器倒相放大器的輸入,XTAL2接外部晶振和微調(diào)電容的另一端,在片內(nèi)它是振蕩器倒相放大器的輸出.第9引腳為復(fù)位輸入端,接上電容,電阻及開(kāi)關(guān)后夠上電復(fù)位電路。1.2.2時(shí)鐘電路模塊的設(shè)計(jì)DS1302是美國(guó)DALLAS公司推出的一種高性能、低功耗、帶RAM的實(shí)時(shí)時(shí)鐘電路,它可以對(duì)年、月、日、周日、時(shí)、分、秒進(jìn)行計(jì)時(shí),具有閏年補(bǔ)償功能,工作電壓為2.5V~5.5V。采用三線接口與CPU進(jìn)行同步通信,并可采用突發(fā)方式一次傳送多個(gè)字節(jié)的時(shí)鐘信號(hào)或RAM數(shù)據(jù)。DS1302內(nèi)部有一個(gè)31×8的用于臨時(shí)性存放數(shù)據(jù)的RAM寄存器。DS1302是DS1202的升級(jí)產(chǎn)品,與DS1202兼容,但增加了主電源/后背電源雙電源引腳,同時(shí)提供了對(duì)后背電源進(jìn)行涓細(xì)電流充電的能力。試驗(yàn)中我們采用SPI三線接口與CPU進(jìn)行同步通信,并可采用突發(fā)方式一次傳送多個(gè)字節(jié)的時(shí)鐘信號(hào)和RAM數(shù)據(jù)。DS1302與單片機(jī)的連接僅需要3條線:CE引腳、SCLK串行時(shí)鐘引腳、I/O串行數(shù)據(jù)引腳,Vcc2為備用電源,外接32.768kHz晶振,為芯片提供計(jì)時(shí)脈沖。如下圖所示。實(shí)時(shí)時(shí)鐘可提供秒、分、時(shí)、日、星期、月和年,一個(gè)月小與31天時(shí)可以自動(dòng)調(diào)整,且具有閏年補(bǔ)償功能。工作電壓5V。ds1302芯片的外部連線(注)注:該圖中所示連接的管腳標(biāo)號(hào)僅供說(shuō)明注:該圖中所示連接的管腳標(biāo)號(hào)僅供說(shuō)明基本的連接方式,與本例設(shè)計(jì)的管腳可能有所不同。1.2.3溫度電路模塊的設(shè)計(jì)DS18B20數(shù)字溫度計(jì)提供九位溫度讀數(shù),指示器件的溫度,信息經(jīng)過(guò)單線接口送入DS18B20或從DS18B20送出,因此從中央處理器到DS18B20僅需連接一條線(和地)。讀、寫(xiě)完成溫度變換所需的電源可以有數(shù)據(jù)線本身提供,而不需要外部電源。DS18B20有三個(gè)主要的數(shù)據(jù)部件:1).64激光ROM;2)溫度靈敏元件;3)非易失性溫度告警觸發(fā)器TH和TL。器件。器件從單線的通信線取得其電源,在信號(hào)線為高電平的時(shí)間周期內(nèi),把能量?jī)?chǔ)存在內(nèi)部的電器中,在單信號(hào)線為低電平的時(shí)間期內(nèi)斷開(kāi)此電源,直到信號(hào)線變?yōu)楦唠娖街匦陆由霞纳娫礊橹埂W鳛榱硪环N可供選擇的方法,DS18B20也可用外部5V電源供電。每一DS18B20包括一個(gè)唯一的64位長(zhǎng)的ROM編碼。開(kāi)始的8位是單線產(chǎn)品系列編碼,接著48位是唯一的序列號(hào),最后的八位是開(kāi)始56位CRC。DS18B20通過(guò)門(mén)開(kāi)通期間內(nèi)低溫度系數(shù)振蕩器經(jīng)歷的周期個(gè)數(shù)計(jì)數(shù)來(lái)測(cè)量溫度,而門(mén)開(kāi)通期由高溫度系數(shù)振蕩器決定。在DS18B20完成溫度交換之后,溫度值與儲(chǔ)存在TH和TL內(nèi)的觸發(fā)值相比較。如果溫度測(cè)量的結(jié)果高于TH或低于TL,那么器件內(nèi)告警標(biāo)志將置位。每次溫度測(cè)量更新此標(biāo)志。只要告警標(biāo)志置位,DS18B20將對(duì)告警搜索作出相應(yīng)的反應(yīng)。設(shè)計(jì)中我們將Vdd管腳接高電平,用于給DS18B20供電,GND管腳接地,DQ管腳接單片機(jī)的5腳,利用單片機(jī)控制和實(shí)現(xiàn)DS18B20顯示9位溫度讀數(shù),指示器件溫度的功能。1.2.4顯示模塊的設(shè)計(jì)液晶顯示器(LCD)具有功耗低、體積小、質(zhì)量輕、功耗小的特點(diǎn)。點(diǎn)陣字符型液晶顯示器把LCD控制器、點(diǎn)陣驅(qū)動(dòng)器、字符存儲(chǔ)器集成在一塊印刷電路板上,構(gòu)成便于應(yīng)用的液晶模塊。這類(lèi)液晶模塊不僅可以顯示數(shù)字、字符,還可以顯示各種圖形符號(hào)以及少量自定義符號(hào),并且可以實(shí)現(xiàn)屏幕的上下左右滾動(dòng)、文字的閃爍等功能;人機(jī)界面友好,使用操作也更加靈活、方便,使其日益成為各種儀器儀表等設(shè)備的首選。LCD1602液晶顯示屏采用標(biāo)準(zhǔn)的16腳(帶背光)接口,主要功能有40通道點(diǎn)陣LCD驅(qū)動(dòng);可選擇當(dāng)作行驅(qū)動(dòng)或列驅(qū)動(dòng);輸入/輸出信號(hào):輸出,能產(chǎn)生20×2個(gè)LCD驅(qū)動(dòng)波形;輸入,接受控制器送出的串行數(shù)據(jù)和控制信號(hào);通過(guò)單片機(jī)控制將所測(cè)的頻率信號(hào)讀數(shù)顯示出來(lái)。(LCD1602的外觀圖)我們之所以采用LCD1602是因?yàn)樗@示質(zhì)量高,數(shù)字式接口,體積小,重量輕,功耗低。設(shè)計(jì)中,我們將其VSS與VDD分別接地和接VCC,將VEE接在可變電阻器上,用于調(diào)節(jié)對(duì)比度,避免顯示器“鬼影”出現(xiàn),RS端、R/W端與E端分別接單片機(jī)6、7、8口,DB0~7端與單片機(jī)P0口順序相連,由于P0口為雙向漏極開(kāi)路門(mén),所以在這里需要接上10k歐姆的上拉電阻。最后將BLKA與BLKB分別接高電平和地。此后,作品中LCD1602液晶顯示屏可用于顯示時(shí)間,日期,及當(dāng)前的環(huán)境溫度。1.2.5語(yǔ)音錄放電路模塊的設(shè)計(jì)如圖所示ISD1760語(yǔ)音錄放芯片的管腳圖。其工作電壓:2.4-5.5V,最高不能超過(guò)6V。靜態(tài)電流:0.5-1uA,工作電流:20mA。VCCD是數(shù)字電路電源端。它的主要功能有:錄音功能、播放功能、擦除功能、音量控制功能、快進(jìn)功能、復(fù)位功能及直通功能。/LED是指示信號(hào)輸出端。/RESED是芯片復(fù)位端,其與地之間連接一個(gè)0.1uF電容,當(dāng)其被觸發(fā),芯片將播放指針和錄音指針都放置在最后一段語(yǔ)音信號(hào)的位置。MISO和MOSI分別為SPI接口的串行輸出輸入端口。SCLK是接口的時(shí)鐘端,由主控制芯片產(chǎn)生,并且被用來(lái)同步控制芯片MOSI和MISO端各自數(shù)據(jù)輸入和輸出,此管腳空閑時(shí)必須拉高。/SS在為低時(shí),選擇該芯片成為當(dāng)前被控制設(shè)備并且開(kāi)啟SPI接口,空閑時(shí)需要拉高。VSSA為模擬地端口。Anain為輔助的模擬輸入,需要一個(gè)交流耦合電容(典型值為0.1uF),并且輸入信號(hào)的幅值不能超過(guò)1.0Vpp。MIC+與MIC-分別麥克風(fēng)輸入+和輸入-端。VSSP2為負(fù)極喇叭驅(qū)動(dòng)地端。SP-為喇叭輸出端。VCCP為PWM喇叭驅(qū)動(dòng)地端。SP+是喇叭輸出+端。VSSP1是正極PWM。喇叭驅(qū)動(dòng)器地端。AUD/AUX是輔助輸出端,決定APC寄存器的D7,用來(lái)輸出一個(gè)AUD或AUX輸出。AGC為自動(dòng)增益控制端,/VOL為音量控制端。ROSC是振蕩電阻,ROSC用一個(gè)電阻連接到地,決定芯片的采樣頻率端。VCCA是模擬電路電源端。/FT在獨(dú)立芯片模式下,當(dāng)FT一直為低時(shí),Anain直通線路被激活。/PLAY、/REC和/ERASE分別為播放控制端、錄音控制端和擦除控制端。/FWD為快進(jìn)控制端。RDY/INT分別為獨(dú)立模式和SPI模式端。VSSD為數(shù)字地端。(ISD1760管腳圖)試驗(yàn)中我們利用19端口接開(kāi)關(guān)實(shí)現(xiàn)對(duì)音量的的控制,23管腳和單片機(jī)的12管腳相連實(shí)現(xiàn)可控制的放音功能,24管腳和10、11管腳共同作用實(shí)現(xiàn)錄音功能,25管腳接開(kāi)關(guān)實(shí)現(xiàn)擦出功能,26管腳接開(kāi)關(guān)實(shí)現(xiàn)快進(jìn)功能,3管腳通過(guò)接開(kāi)關(guān)和電容實(shí)現(xiàn)復(fù)位功能。13和15管腳接Speaker,2管腳接電阻和電容輸出指示信號(hào)。1和28端口通過(guò)接普通電容和電解電容輸入數(shù)字信號(hào),8和21端口通過(guò)接普通電容和電解電容輸入模擬信號(hào)。14和16端口的連接使得喇叭驅(qū)動(dòng)器電源可用。2.系統(tǒng)的軟件設(shè)計(jì)2.1程序流程框圖定時(shí)器的模塊:定時(shí)器的模塊:時(shí)鐘芯片溫度采集模塊:數(shù)字溫度傳感器語(yǔ)音實(shí)現(xiàn)模塊:語(yǔ)音芯片顯示模塊:液晶顯示屏控制模塊:單片機(jī)對(duì)于語(yǔ)音芯片的接入,考慮到除語(yǔ)音芯片外的其他電路部分是純數(shù)字網(wǎng)絡(luò),而語(yǔ)音芯片除數(shù)字電路外還包含模擬電路。另外語(yǔ)音芯片工作時(shí)采集的信號(hào)均為模擬信號(hào),如時(shí)對(duì)語(yǔ)音信號(hào)的收集,整理與控制完全賦予單片機(jī)來(lái)完成,不但要增加模數(shù)與數(shù)模轉(zhuǎn)換電路,還要增加考慮包括數(shù)據(jù)暫存,尋址與提取等等一系列問(wèn)題,這樣復(fù)雜化了程序,不僅是單片機(jī)工作負(fù)擔(dān)加重,增大出錯(cuò)概率,還未能充分發(fā)揮新型語(yǔ)音芯片的卓越的控制能力,因此,在設(shè)計(jì)之初,我們確定了如下的設(shè)計(jì)思路:對(duì)于一切語(yǔ)音信號(hào)的控制完全由語(yǔ)音芯片實(shí)現(xiàn),單片機(jī)僅對(duì)語(yǔ)音芯片提供命令控制,不參與信號(hào)的控制。根據(jù)這樣的設(shè)計(jì)思路,電路可分成兩大部分:時(shí)鐘實(shí)現(xiàn)部分;鬧鐘的語(yǔ)音控制部分。2.1.1時(shí)鐘實(shí)現(xiàn)部分本部分包含4個(gè)模塊:定時(shí)模塊、溫度模塊、顯示模塊和主模塊。定時(shí)計(jì)時(shí)模塊采用軟件秒脈沖發(fā)生器利用定時(shí)器0的定時(shí)溢出中斷,將之設(shè)定為100ms溢出中斷,則10個(gè)中斷時(shí)間正好為1s。設(shè)計(jì)流程框圖:YYY是否到24h時(shí)變量回0鬧鐘判別中斷返回中斷次數(shù)+1到10次是否中斷秒+1s是否到60s秒變量回0,分變量+1是否到60s分變量回0,時(shí)變量+1中斷返回中斷返回中斷返回鬧鐘判別鬧鐘判別時(shí)間常數(shù)初始化NNNNYY溫度控制模塊YY開(kāi)始初始化對(duì)環(huán)境采集溫度信息寫(xiě)溫度信息是否收集到溫度采集指令N調(diào)時(shí)時(shí)間調(diào)整作為對(duì)電子時(shí)鐘的校正方法,在時(shí)鐘控制上非常重要。用戶可通過(guò)調(diào)時(shí)功能隨時(shí)隨地地校正時(shí)間,確保時(shí)鐘的準(zhǔn)確性。本例時(shí)鐘調(diào)節(jié)由四個(gè)按鍵共同完成。一二三四鍵分別實(shí)現(xiàn)進(jìn)入調(diào)時(shí)模式與切換位,當(dāng)前位+1,保存退出和不保存退出的功能。開(kāi)始一鍵有效,進(jìn)入時(shí)調(diào)整程序開(kāi)始一鍵有效,進(jìn)入時(shí)調(diào)整程序等待按鍵二鍵有效,時(shí)+1三鍵有效,保存修改并退出四鍵有效,不保存修改并退出一鍵有效,進(jìn)入秒調(diào)整程序等待按鍵二鍵有效,秒+1三鍵有效,保存修改并退出四鍵有效,不保存修改并退出一鍵有效,進(jìn)入月調(diào)整程序等待按鍵二鍵有效,月+1三鍵有效,保存修改并退出四鍵有效,不保存修改并退出一鍵有效,進(jìn)入分調(diào)整程序等待按鍵二鍵有效,分+1三鍵有效,保存修改并退出四鍵有效,不保存修改并退出一鍵有效,進(jìn)入年調(diào)整程序等待按鍵二鍵有效,年+1三鍵有效,保存修改并退出四鍵有效,不保存修改并退出一鍵有效,進(jìn)入日調(diào)整程序等待按鍵二鍵有效,日+1三鍵有效,保存修改并退出四鍵有效,不保存修改并退出鬧鐘鬧鐘是本電子鐘的特色鬧鐘音實(shí)現(xiàn)的載體。鬧鐘判別與處理的關(guān)鍵在于判別何時(shí)要進(jìn)行鬧鈴。當(dāng)時(shí)十位,十個(gè)位,分十位,分個(gè)位中的一位發(fā)生改變(進(jìn)位)時(shí),就需進(jìn)判別,鬧鈴判別與處理的代碼包含在定時(shí)器的中斷子程序內(nèi)。YYYNN鬧鐘判別處理時(shí)分位,個(gè)位,分分位,個(gè)位,改變了是否設(shè)定鬧鐘設(shè)置鬧鐘標(biāo)志,啟動(dòng)鬧鐘中斷返回清除鬧鐘標(biāo)志判斷是否為當(dāng)前設(shè)定時(shí)間中斷返回2.1.2語(yǔ)音錄放控制模塊語(yǔ)音錄放模塊采用ISD1760語(yǔ)音芯片,其內(nèi)部集成完整的數(shù)字電路與模擬電路,可以完美地實(shí)現(xiàn)語(yǔ)音錄放與存儲(chǔ),提取等等工作。我們只需為其搭配適當(dāng)?shù)膿P(yáng)聲器與麥克,及可靠的外圍電路即能讓他正常地工作。2.2軟件代碼的設(shè)計(jì)2.2.1定義引腳連接DS1302RESET口–P.3.5DS1302CLK口—P3.4DS1302DATE口—P3.3DS18B20溫度輸入口DQ—P1.4LCD1602使能口ELCD1602R/S引腳—P1.5LCD1602RW引腳—P1.6Speaker信號(hào)輸出—P3.2LCD1602數(shù)據(jù)端PDB—P0.0-P0.7實(shí)現(xiàn)程序Sbitrst=p3^5;Sbitclk=p3^4;Sbitdat=p3^3;Sbitrs=p1^5;Sbitrw=p1^6;Sbite=p1^7;SbitDQ=p1^4;Sbitp3_2=p3^2;SbitACC_7=ACC_7;2.2.2延時(shí)函數(shù)供需兩個(gè)延時(shí)函數(shù),以為是11微秒延時(shí)函數(shù),另一為1毫秒延時(shí)函數(shù)。前者主要用于DS18B20的延時(shí),后面主要用于LCD數(shù)據(jù)交換的延時(shí)。函數(shù)以空循環(huán)實(shí)現(xiàn)。實(shí)現(xiàn)程序:delay(uintt)//11us延時(shí){For(;t>0;t--);}Delay1ms(uchartime)//1ms延時(shí){Uchari,j;For(i=0;i<time;i++){For(j=0;j<250;j++)}}2.2.3驅(qū)動(dòng)與初始化函數(shù)本例中需對(duì)數(shù)字溫度傳感器LCD與LCD中部分顯示數(shù)據(jù)編寫(xiě)驅(qū)動(dòng)與初始化函數(shù)。對(duì)前兩者的初始化函數(shù)需保證數(shù)據(jù)輸出端或使能端始終有效,最后一個(gè)則是為確保部分全局變量的初始值正確。實(shí)現(xiàn)程序Ow_reset(void){uchari;DQ=1;_nop_();_nop_();DQ=0;delay(50);DQ=1;delay(6);for(i=0;i<0x30;i++){if(!DQ)gotod1; } flag=0; //清標(biāo)志位,表示ds1820不存在 DQ=1; return;d1: delay(45);//延時(shí)500us flag=1; DQ=1; //置標(biāo)志位,表示ds1820存在}Enable(){rs=0;rw=0;e=0;delay1ms(3);e=1;}Timestart(){ time1[1]=time1[13]=time2[8]=time2[9]=time2[10]=0x20,time2[14]=0; time1[6]=1,time1[9]=2,time1[12]=3,time1[2]='2',time1[3]='0'; time1[14]='W',time2[2]=time2[5]=':'; write(0xc1);alarm[0]=read(); rst=0; write(0xc3);alarm[1]=read(); rst=0; write(0xc5); time1[0]=read(); rst=0;}2.2.4寫(xiě)函數(shù)與讀函數(shù)寫(xiě)函數(shù)與讀函數(shù)是通信中至關(guān)重要的組成部分,承載著數(shù)據(jù)流的交換工作,本例中的數(shù)字溫度傳感器LCD與時(shí)鐘芯片分別擁有各自獨(dú)立的讀函數(shù)或?qū)懞瘮?shù)的能力或二者皆有。實(shí)現(xiàn)函數(shù)Read_temp(){ow_reset(); //總線復(fù)位if(!flag) //判斷ds1820是否存在?若ds18b20不存在則返回return; write_byte(0xCC); //SkipROMwrite_byte(0x44); //發(fā)轉(zhuǎn)換命令delay(70);write_byte(0xCC); //發(fā)SkipROM命令write_byte(0xBE); //發(fā)讀命令temp_data[0]=read_byte();//溫度低8位temp_data[1]=read_byte();//溫度高8位 ow_reset();write_byte(0xCC); //SkipROMwrite_byte(0x44); //發(fā)轉(zhuǎn)換命令}Ucharread_byte(void){uchari; ucharvalue=0; for(i=8;i>0;i--) { DQ=1;_nop_();_nop_(); value>>=1; DQ=0;// _nop_();_nop_();_nop_();_nop_();//4us DQ=1;_nop_();_nop_();_nop_();_nop_();//4us if(DQ) value|=0x80; delay(6); } DQ=1; return(value);}Voidwrite_byte(ucharval){ uchari; for(i=8;i>0;i--)// { DQ=1;_nop_();_nop_(); DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_();//5us DQ=val&0x01;//最低位移出 delay(6);//66us val=val/2;//右移一位 } DQ=1; delay(1);}Write2(uchari){ P0=i; rs=1; rw=0; e=0; delay1ms(2); e=1;}Write1(uchardata*address,m){ uchari,j; for(i=0;i<m;i++,address++) { j=*address; write2(j); }}Lcdshow(){ P0=0XC; //顯示器開(kāi)、光標(biāo)關(guān) enable(); P0=0x80; //寫(xiě)入顯示起始地址 enable(); write1(time1,16); P0=0xc1; //寫(xiě)入顯示起始地址 enable(); write1(time2,15);}Write(ucharaddress){ uchari;clk=0;_nop_();rst=1;_nop_();for(i=0;i<8;i++){ dat=address&1; _nop_(); clk=1; address>>=1; clk=0;}}Ucharread(){ uchari,j=0; for(i=0;i<8;i++) { j>>=1; _nop_(); clk=0; _nop_(); if(dat) j|=0x80; _nop_(); clk=1; } return(j);}2.2.5數(shù)據(jù)智能處理函數(shù)溫度數(shù)據(jù)處理由DS18B20讀取的數(shù)據(jù)信息,需經(jīng)過(guò)一個(gè)處理過(guò)程。著其中包括時(shí)溫度正負(fù)判斷與負(fù)溫度的處理及顯示最高位的負(fù)號(hào)問(wèn)題。由此我們引入溫度數(shù)據(jù)處理函數(shù)來(lái)解決這一數(shù)據(jù)信息中的轉(zhuǎn)換問(wèn)題。實(shí)現(xiàn)函數(shù)Work_temp(){ ucharn=0,m; if(temp_data[1]>127)//負(fù)溫度求補(bǔ)碼 { temp_data[1]=(256-temp_data[1]); temp_data[0]=(256-temp_data[0]); n=1; } time2[13]=ditab[temp_data[0]&0x0f]+'0'; time2[12]='.'; m=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);// if(n) { m-=16; } time2[9]=m/100+'0'; time2[11]=m%100; time2[10]=time2[11]/10+'0'; time2[11]=time2[11]%10+'0'; if(time2[9]=='0')//最高位為0時(shí)都不顯示 { time2[9]=0x20; if(n)//負(fù)溫度時(shí)最高位顯示"-" { time2[9]='-'; } if(time2[10]=='0') { if(n) { time2[10]='-'; time2[9]=0x20; } else time2[10]=0x20; if(time2[11]=='0'&&time2[13]=='0') time2[11]=time2[12]=0x20; } }}時(shí)間數(shù)據(jù)讀取函數(shù)本函數(shù)用于讀取當(dāng)前的年份,月份,日期,時(shí),分,秒,為L(zhǎng)CD正確顯示時(shí)間做準(zhǔn)備。實(shí)現(xiàn)函數(shù)Readtime(){uchari,m,n;write(0x8d); //讀取年份m=read();rst=0;time1[4]=m/16+0x30;time1[5]=m%16+0x30;write(0x8b); //讀取星期m=read();rst=0;time1[15]=m+0x30; for(i=7,n=0x89;i<11;i+=3,n-=2) //讀取月份和日期 { write(n); m=read(); rst=0; time1[i]=m/16+0x30; time1[i+1]=m%16+0x30; } for(m=0,i=0,n=0x85;i<7;i+=3,n-=2,m++) //讀取時(shí),分,秒 { write(n); time[m]=read(); rst=0; time2[i]=time[m]/16+0x30; time2[i+1]=time[m]%16+0x30; }}星期自動(dòng)調(diào)整函數(shù)實(shí)現(xiàn)函數(shù):Ucharsetweek(){ uchari=5,j,n; j=(time1[4]&0xf)*10+(time1[5]&0xf); n=j/4; i=i+5*n; n=j%4; if(n==1) i+=2; elseif(n==2) i+=3; elseif(n==3) i+=4; j=(time1[7]&0xf)*10+(time1[8]&0xf); if(j==2) i+=3; elseif(j==3) i+=3; elseif(j==4) i+=6; elseif(j==5) i+=1; elseif(j==6) i+=4; elseif(j==7) i+=6; elseif(j==8) i+=2; elseif(j==9) i+=5; elseif(j==11) i+=3; elseif(j==12) i+=5; if(n==0) if(j>2) i++; j=(time1[10]&0xf)*10+(time1[11]&0xf); i+=j; i%=7; if(i==0) i=7; return(i); }2.2.6鬧鐘關(guān)聯(lián)函數(shù)鬧鐘顯示函數(shù)本例中在普通情況下按一下2鍵進(jìn)入鬧鐘設(shè)置狀態(tài),當(dāng)其顯示的時(shí)刻即為當(dāng)前所設(shè)鬧鐘點(diǎn)數(shù)。對(duì)于鬧鐘顯示引入相應(yīng)函數(shù)來(lái)完成。實(shí)現(xiàn)函數(shù):Showalarm(){ uchari,j,a,b,n; ET1=1; for(j=0;j<6;j++) {i=0;while(1) { a=table2[i]; if(a==0) break; b=a&0xf; a>>=4; if(a==0) { TR1=0; gotoD1; } a=((--a)<<1)/2; TH1=th1=table1[a]/256,TL1=tl1=table1[a]%256; TR1=1;D1: do { b--; for(n=0;n<3;n++) { readtime(); lcdshow();P2=0xf7;if(P2==0xe7) { delay1ms(100); if(P2==0xe7) { TR1=0; ET1=0; return; }}} }while(b!=0); i++; } TR1=0; } ET1=0;}鬧鐘設(shè)置函數(shù)本函數(shù)針對(duì)不同按鍵指令作出相應(yīng)的設(shè)置命令,達(dá)到可選擇保存的修改鬧鐘的目的。實(shí)現(xiàn)函數(shù)Setalarm(){ uchari,n; for(i=1;i<16;i++) { time1[i]=0x20; } time2[0]=alarm[0]/16+0x30; time2[1]=(alarm[0]&0xf)+0x30; time2[3]=alarm[1]/16+0x30; time2[4]=(alarm[1]&0xf)+0x30; time2[6]=time2[7]=0x30; lcdshow(); i=0xc2; while(1) {P0=0xe; //顯示器開(kāi)、光標(biāo)開(kāi)enable();P0=i; //定光標(biāo)enable();P2=0xf7;if(P2!=0XF7){ delay1ms(100); //延時(shí)0.1s去抖動(dòng) if(P2!=0XF7){j=7;if(P2==0X77){i+=3;if(i>0xc5)i=0xc2;} elseif(P2==0xb7) { if(i==0xc2) { n=(time2[0]&0xf)*10+(time2[1]&0xf); n++; if(n>23) n=0; time2[0]=n/10+0x30; time2[1]=n%10+0x30;} else { n=(time2[3]&0xf)*10+(time2[4]&0xf); n++; if(n>59) n=0; time2[3]=n/10+0x30; time2[4]=n%10+0x30; } lcdshow(); } elseif(P2==0xd7) {write(0xc0);write((time2[0]&0xf)*16+(time2[1]&0xf));rst=0;write(0xc2);write((time2[3]&0xf)*16+(time2[4]&0xf));rst=0;time1[0]=FLAG;write(0xc4);write(time1[0]);rst=0;TR0=0;timestart();return;} else { TR0=0; timestart(); return; } } } if(j==0) { TR0=0; timestart(); return; }}}2.2.7調(diào)整時(shí)間函數(shù)與調(diào)整鬧鐘函數(shù)setalarm相同,在處于調(diào)時(shí)界面而對(duì)不同按鍵指令作出可選擇保存返回的調(diào)整。實(shí)現(xiàn)函數(shù)Settime(){ uchari=0x85,year,month,day,n; time2[6]=time2[7]=0x30,time1[14]=time1[15]=0x20; lcdshow(); while(1) {P0=0xe; //顯示器開(kāi)、光標(biāo)開(kāi)enable();P0=i; //定光標(biāo)enable();P2=0xf7;if(P2!=0XF7) { delay1ms(100); //延時(shí)0.1s去抖動(dòng) if(P2!=0XF7) { j=7; if(P2==0X77) { i+=3; if(i==0x8e) i=0xc2; elseif(i>0xc5) i=0x85; } elseif(P2==0xb7) {year=(time1[4]&0xf)*10+(time1[5]&0xf);month=(time1[7]&0xf)*10+(time1[8]&0xf);day=(time1[10]&0xf)*10+(time1[11]&0xf); if(i==0x85) { year++; if(year>99) year=0; if((year%4)!=0) if(month==2&&day==29) day=28; } elseif(i==0x88) { month++; if(month>12) month=1; if(day>Day[month-1]) { day=Day[month-1]; if(month==2&&(year%4)==0) day=29; } } elseif(i==0x8b) { day++; if(day>Day[month-1]) { if(month==2&&(year%4)==0) { if(day>29) day=1; } if(month!=2) day=1; } } elseif(i==0xc2) { n=(time2[0]&0xf)*10+(time2[1]&0xf); n++; if(n>23) n=0; time2[0]=n/10+0x30; time2[1]=n%10+0x30; } else { n=(time2[3]&0xf)*10+(time2[4]&0xf); n++; if(n>59) n=0; time2[3]=n/10+0x30; time2[4]=n%10+0x30; } time1[4]=year/10+0x30; time1[5]=year%10+0x30; time1[7]=month/10+0x30; time1[8]=month%10+0x30; time1[10]=day/10+0x30; time1[11]=day%10+0x30; lcdshow(); } elseif(P2==0xd7) { write(0x8c); write((time1[4]&0xf)*16+(time1[5]&0xf)); rst=0; write(0x8a); write(setweek()); rst=0; for(i=7,n=0x88;i<11;i+=3,n-=2) { write(n); write((time1[i]&0xf)*16+(time1[i+1]&0xf)); rst=0; } for(i=0;i<7;i+=3,n-=2) { write(n); write((time2[i]&0xf)*16+(time2[i+1]&0xf)); rst=0; } TR0=0; time1[14]='W'; return; } else { TR0=0; time1[14]='W'; return; } } } if(j==0) { TR0=0; time1[14]='W'; return; }}}2.2.8其它子函數(shù)自建字顯示函數(shù)Zijianzi(){ uchari; P0=0x40; enable(); for(i=0;i<32;i++) { write2(tab[i]);delay1ms(2); }}2.2.9主函數(shù)主函數(shù)通過(guò)調(diào)用各子函數(shù),完成時(shí)系統(tǒng)初始化,清屏,定義顯示模型字大小,控制光標(biāo)位置等等一系列工作,最終完成動(dòng)態(tài)時(shí)鐘的實(shí)現(xiàn)。實(shí)現(xiàn)函數(shù)Main(){ IE=0X82; TMOD=0x11; write(0x8E); //禁止寫(xiě)保護(hù) write(0); rst=0; P0=1; //清屏并光標(biāo)復(fù)位 enable(); P0=0X38; //設(shè)置顯示模式:8位2行5x7點(diǎn)陣 enable(); P0=6; //文字不動(dòng),光標(biāo)自動(dòng)右移 enable(); zijianzi(); //自建字 timestart(); while(1) { readtime(); //讀取時(shí)間read_temp(); //讀出18B20溫度數(shù)據(jù) work_temp(); //處理溫度數(shù)據(jù) lcdshow(); //顯示時(shí)間 if(time1[0]!=0x20) if(time[0]==alarm[0]) if(time[1]==alarm[1]) if(time[2]==0) showalarm(); P2=0xf7; if((P2&0XF0)!=0XF0) { delay1ms(100); //延時(shí)0.1s去抖動(dòng) if((P2&0XF0)!=0XF0) { j=7; TH0=TIME/256,TL0=TIME%256; TR0=1; if(P2==0x77) { settime(); } elseif(P2==0XB7) { setalarm(); } elseif(P2==0XD7) { TR0=0; if(time1[0]==FLAG) time1[0]=0x20; else time1[0]=FLAG; write(0xc4); write(time1[0]); rst=0; } } } delay1ms(100); }}3.仿真KeilC51是美國(guó)KeilSoftware公司出品的51系列兼容單片機(jī)C語(yǔ)言軟件開(kāi)發(fā)系統(tǒng)。KeilC51軟件提供豐富的庫(kù)函數(shù)和功能強(qiáng)大的集成開(kāi)發(fā)調(diào)試工具,全Wind
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024美金結(jié)算支付合同范本6篇
- 2025年度拆除工程合同糾紛調(diào)解協(xié)議范本4篇
- 二零二五年度生物科技產(chǎn)業(yè)園廠址租賃及研發(fā)合作框架協(xié)議2篇
- 與消防隊(duì)合作協(xié)議 2篇
- 2024跨境商業(yè)交易商議與協(xié)議制作詳解版
- 2025年度老舊廠房拆遷安置房購(gòu)置合同4篇
- 2025年度礦產(chǎn)資源測(cè)繪勞務(wù)分包合同(新版)4篇
- 2024年獨(dú)家品牌代理協(xié)議
- 2025年度產(chǎn)業(yè)園租賃與運(yùn)營(yíng)一體化合同4篇
- 2024年03月浙江杭銀理財(cái)崗位招考筆試歷年參考題庫(kù)附帶答案詳解
- 巖土工程勘察課件0巖土工程勘察
- 《腎上腺腫瘤》課件
- 2024-2030年中國(guó)典當(dāng)行業(yè)發(fā)展前景預(yù)測(cè)及融資策略分析報(bào)告
- 《乘用車(chē)越野性能主觀評(píng)價(jià)方法》
- 幼師個(gè)人成長(zhǎng)發(fā)展規(guī)劃
- 2024-2025學(xué)年北師大版高二上學(xué)期期末英語(yǔ)試題及解答參考
- 動(dòng)物醫(yī)學(xué)類(lèi)專(zhuān)業(yè)生涯發(fā)展展示
- 批發(fā)面包采購(gòu)合同范本
- 乘風(fēng)化麟 蛇我其誰(shuí) 2025XX集團(tuán)年終總結(jié)暨頒獎(jiǎng)盛典
- 2024年大數(shù)據(jù)分析公司與中國(guó)政府合作協(xié)議
- 一年級(jí)數(shù)學(xué)(上)計(jì)算題專(zhuān)項(xiàng)練習(xí)匯編
評(píng)論
0/150
提交評(píng)論