版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
PAGE1題目:帶溫度顯示的電子鬧鐘設(shè)計摘要本文設(shè)計了一款利用單片機技術(shù)實現(xiàn)帶溫度顯示的電子鬧鐘。以應(yīng)用AT89C51芯片作為核心,利用8位LED數(shù)碼管顯示,使用DS1302實時時鐘日歷芯片完成時鐘/日歷的基本功能,同時利用DS18B20溫度傳感器測量環(huán)境溫度。這種實現(xiàn)方法的優(yōu)點是電路簡單,性能可靠,實時性好,時間和溫度精度高,操作簡單,編程容易。關(guān)鍵詞:電子鬧鐘,溫度,AT89C51,DS18B20,DS1302AbstractThedesigndeterminestousetheMCUtechnologytorealizethemulti-functionalelectronclock.ThisdesignuseAT89C51asacorechips,8LEDdigitaldisplaying.usingDS1302real-timeclockchiptocompletethebasicfunctionoftheclock/calendar.AtthesametimethedesignuseofDS18B20temperaturesensorsisforcollectingtheenvironmentaltemperature.Themethodhastheadvantageofbeingsimplecircuit,reliableperformance,goodreal-time,highprecisionofthetimeandtemperature,simplyoperation,easyprogramming.Keywords:Electronicclock,Temperature,AT89C51,DS18B20,DS13021緒論1.1引言從古代的滴漏更鼓到近代的機械鐘,從電子表到目前的數(shù)字時鐘,為了準(zhǔn)確的測量和記錄時間,人們一直在努力改進計時工具.鐘表的數(shù)字化,大力推動了計時的精確性和可靠性.20世紀(jì)末,電子技術(shù)獲得了飛速的發(fā)展,在其推動下,現(xiàn)代電子產(chǎn)品幾乎滲透了社會的各個領(lǐng)域,有力地推動了社會生產(chǎn)力的發(fā)展和社會信息化程度的提高,同時也使現(xiàn)代電子產(chǎn)品性能進一步提高,產(chǎn)品更新?lián)Q代的節(jié)奏也越來越快。單片機自1976年由Intel公司推出MCS-48開始,迄今已有二十多年了.由于單片機集成度高,功能強,可靠性高,體積小,功耗地,使用方便,價格低廉等一系列優(yōu)點,目前已經(jīng)滲入到人們工作和生活的方方面面,幾乎"無處不在,無所不為".單片機的應(yīng)用領(lǐng)域已從面向工業(yè)控制,通訊,交通,智能儀表等迅速發(fā)展到家用消費產(chǎn)品,辦公自動化,汽車電子,PC機外圍以及網(wǎng)絡(luò)通訊等廣大領(lǐng)域。
單片機應(yīng)用的重要意義還在于,它從根本上改變了傳統(tǒng)的控制系統(tǒng)設(shè)計思想和設(shè)計方法.從前必須由模擬電路或數(shù)字電路實現(xiàn)的大部分功能,現(xiàn)在已能用單片機通過軟件方法來實現(xiàn)了.這種軟件代替硬件的控制技術(shù)也稱為微控制技術(shù),是傳統(tǒng)控制技術(shù)的一次革命.電子鬧鐘在科學(xué)技術(shù)高度發(fā)展的今天,千家萬戶都少不了它,所以很多家庭個人都需要有一個電子鬧鐘,為人們提供報時方便。
本文給出了一種AT89S52電子鬧鐘設(shè)計方法,具有設(shè)定時間和鬧鐘以及顯示溫度的功能,從而給人們帶來更為方便的工作與生活。1.2電子時鐘研究的背景和意義現(xiàn)代電子產(chǎn)品幾乎滲透到了社會的各個領(lǐng)域,有力的推動和提高了社會生產(chǎn)力的發(fā)展與信息化程度,同時也使現(xiàn)代電子產(chǎn)品性能進一步提升,產(chǎn)品更新?lián)Q代的節(jié)奏也越來越快。
時間對人們來說總是那么寶貴,工作的忙碌性和繁雜容易使人忘記當(dāng)前的時間。平時我們要求上班準(zhǔn)時,約會或召開會議必然要提及時間;火車要準(zhǔn)點到達,航班要準(zhǔn)點起飛;工業(yè)生產(chǎn)中,很多環(huán)節(jié)都需要用時間來確定工序替換時刻。所以說能隨時準(zhǔn)確的知道時間并利用時間,是我們生活和工作中必不可少的。想知道時間,手表當(dāng)然是一個很好的選擇,但是,在忙碌當(dāng)中,我們還需要一個“助理”及時的給我們提醒時間。所以,計時器最好能夠擁有一個定時系統(tǒng),隨時提醒容易忘記時間的人。最早能夠定時、報時的時鐘屬于機械式鐘表,但這種時鐘受到機械結(jié)構(gòu)、動力和體積的限制,在功能、性能以及造價上都沒辦法與電子時鐘相比。
電子鐘是采用電子電路實現(xiàn)對時、分、秒進行數(shù)字顯示的計時裝置,廣泛應(yīng)用于個人家庭,車站,碼頭辦公室等公共場所,成為人們?nèi)粘I钪胁豢缮俚谋匦杵贰S捎跀?shù)字集成電路的發(fā)展和石英晶體振蕩器的廣泛應(yīng)用,使得數(shù)字鐘的精度,遠(yuǎn)遠(yuǎn)超過老式鐘表,鐘表的數(shù)字化給人們生產(chǎn)生活帶來了極大的方便,而且大大地擴展了鐘表原先的報時功能。諸如定時自動報警、0按時自動打鈴、定時廣播、自動起閉路燈、定時開關(guān)烘箱、通斷動力設(shè)備、甚至各種定時電氣的自動啟用等,所有這些,都是以鐘表數(shù)字化為基礎(chǔ)的。因此,研究數(shù)字鐘及擴大其應(yīng)用,有著非?,F(xiàn)實的意義。另外,溫度實時顯示系統(tǒng)應(yīng)用同樣越來越廣泛,比如空調(diào)遙控器上當(dāng)前室溫的顯示、熱水器溫度的顯示等等。醫(yī)藥衛(wèi)生、工農(nóng)業(yè)生產(chǎn)上也有很多場合需要測量環(huán)境溫度。如果能夠在電子時鐘上附加溫度采集功能,將使電子時鐘的應(yīng)用更加廣泛。1.3論文主要工作概述針對目前電子時鐘的發(fā)展趨勢,逐步完善及擴展其功能以達到更加便利人們的生活為基準(zhǔn)來進行論文的設(shè)計。首先,針對所設(shè)計電子時鐘的功能進行芯片的查閱及選用。其次,對所選擇的芯片進行局部硬件功能設(shè)計并調(diào)試。然后將局部硬件進行整體結(jié)合,并進行簡單的功能調(diào)試。檢查無誤后,進行程序編寫,調(diào)試。2系統(tǒng)設(shè)計方案2.1帶溫度顯示的電子鬧鐘系統(tǒng)的總體構(gòu)成本設(shè)計電子鬧鐘系統(tǒng)包括時鐘芯片、溫度采集、顯示電路、按鍵電路、供電電源、鬧鈴指示電路等幾部分。硬件電路框圖參照圖1。溫度采集集電路溫度采集集電路顯示電路AT89C51鬧鈴電路鍵盤電路鬧鈴電路鍵盤電路電源時鐘電路電源時鐘電路后備電源后備電源圖1帶溫度顯示電子鬧鐘系統(tǒng)組成框圖鍵盤是為了完成時鐘/日歷的校對和日歷/溫度的顯示功能。由于此電子時鐘要求具有鬧鈴功能,所以設(shè)計有鬧鈴電路,進行聲音響鈴。整個電路使用了兩種電源,+5V電源將為整個電路供電。而+3V電源僅作為DS1302的備用電源。當(dāng)+5V電源被切斷后,DS1302啟用+3V電源,可以保持DS1302繼續(xù)工作。當(dāng)+5V電源恢復(fù)供電,LED依舊顯示當(dāng)前時間,而不會因為斷電使系統(tǒng)復(fù)位到初始化時間,避免了重新校時的麻煩。具體電路圖請參見附錄。2.2帶溫度顯示電子鬧鐘系統(tǒng)的功能電子時鐘主要是利用電子技術(shù)將時鐘電子化、數(shù)字化,擁有時間精確、體積小、界面友好、可擴展性能強等特點,被廣泛應(yīng)用于生活和工作當(dāng)中。當(dāng)今市場上的電子時鐘品類繁多,外形小巧別致。也有體型較大的,諸如公共場所的大型電子報時器等。電子時鐘首先是數(shù)字化了的時間顯示或報時器,在此基礎(chǔ)上,人們可以根據(jù)不同場合的要求,在時鐘上擴展其他功能,比如定時鬧鈴,萬年歷,環(huán)境溫度、濕度檢測,環(huán)境空氣質(zhì)量檢測,USB擴展口等功能。本設(shè)計電子時鐘主要功能為:具有時間顯示和手動校對功能,24小時制;具有年、月、日顯示和手動校對功能;具有鬧鈴功能;具有貪睡功能;具有環(huán)境溫度采集和顯示功能;掉電后無需重新設(shè)置時間和日期;3系統(tǒng)硬件設(shè)計主要IC芯片選擇微處理器選擇AT89C51單片機是一款低功耗,低電壓,高性能CMOS8位單片機,片內(nèi)含4KB(可經(jīng)受1000次擦寫周期)的FLASH可編程可反復(fù)擦寫的只讀程序存儲器(EPROM),器件采用CMOS工藝和ATMEL公司的高密度、非易失性存儲器(NURAM)技術(shù)制造,其輸出引腳和指令系統(tǒng)都與MCS-51兼容。片內(nèi)的FLASH存儲器允許在系統(tǒng)內(nèi)可改編程序或用常規(guī)的非易失性存儲器編程器來編程。因此,AT89C51是一種功能強,靈活性高且價格合理的單片機,可方便的應(yīng)用在各個控制領(lǐng)域。AT89C51具有以下主要性能:4KB可改編程序Flash存儲器;全靜態(tài)工作:0——24Hz;128×8字節(jié)內(nèi)部RAM;32個外部雙向輸入/輸出(I/O)口;6個中斷優(yōu)先級;2個16位可編程定時計數(shù)器;可編程串行通道;片內(nèi)時鐘振蕩器此外,AT89C51是用靜態(tài)邏輯來設(shè)計的,其工作頻率可下降到0Hz,并提供兩種可用軟件來選擇的省電方式——空閑方式(IdleMode)和掉電方式(PowerDownMode)。在空閑方式中,CPU停止工作,而RAM、定時器/計數(shù)器、串行口和中斷系統(tǒng)都繼續(xù)工作。在掉電方式中,片內(nèi)振蕩器停止工作,由于時鐘被“凍結(jié)”,使一切功能都暫停,只保存片內(nèi)RAM中的內(nèi)容,直到下一次硬件復(fù)位為止。圖2AT89C51芯片PDIP封裝引腳圖在電子時鐘設(shè)計中,常用的實時時鐘芯片有DS12887、DS1216、DS1643、DS1302。每種芯片的主要時鐘功能基本相同,只是在引腳數(shù)量、備用電池的安裝方式、計時精度和擴展功能等方面略有不同。DS12887與DS1216芯片都有內(nèi)嵌式鋰電池作為備用電池;X1203引腳少,沒有嵌入式鋰電池,跟DS1302芯片功能相似,只是相比較之下,X1203與AT89S51搭配使用時占用I/O口較多。DS1643為帶有全功能實時時鐘的8K×8非易失性SRAM,集成了非易失性SRAM、實時時鐘、晶振、電源掉電控制電路和鋰電池電源,BCD碼表示的年、月、日、星期、時、分、秒,帶閏年補償。同樣,DS1643擁有28只管腳,硬件連接起來占用微處理器I/O口較多,不方便系統(tǒng)功能拓展和維護。故而從性價比和貨源上考慮,本設(shè)計采用實時時鐘日歷芯片DS1302。芯片DS1302簡介DS1302是美國DALLAS公司推出的一種高性能、低功耗的實時時鐘日歷芯片,附加31字節(jié)靜態(tài)RAM,采用SPI三線接口與CPU進行同步通信,并可采用突發(fā)方式一次傳送多個字節(jié)的時鐘信號和RAM數(shù)據(jù)。實時時鐘可提供秒、分、時、日、星期、月和年,一個月小于31天時可以自動調(diào)整,且具有閏年補償功能。工作電壓寬達2.5~5.5V。采用雙電源供電(主電源和備用電源),可設(shè)置備用電源充電方式,提供了對后備電源進行涓細(xì)電流充電的能力。有主電源和備份電源雙引腳,而且備份電源可由大容量電容(>1F)來替代。需要強調(diào)的是,DS1302需要使用32.768KHz的晶振,其引腳圖如3所示。圖3DS1302芯片引腳圖在編程過程中要注意DS1302的讀寫時序。DS1302是SPI總線驅(qū)動方式。它不僅要向寄存器寫入控制字,還需要讀取相應(yīng)寄存器的數(shù)據(jù)。要想與DS1302通信,首先要先了解DS1302的控制字。DS1302的控制字如表1。表1DS1302控制字(即地址及命令字節(jié))BIT7BIT6BIT5BIT4BIT3BIT2BIT1BIT01RAMA4A3A2A1A0RD其引腳功能參照表2表2DS1302引腳功能說明引腳號名稱功能1VCC1備份電源輸入2X132.768KHz晶振輸入3X232.768KHz晶振輸出4GND地5RST復(fù)位6I/O數(shù)據(jù)輸入/輸出7SCLK串行時鐘8VCC2主電源輸入3.1.3環(huán)境溫度傳感器DS18B20是美國Dallas公司生產(chǎn)的基于單線(1-wire)技術(shù)的數(shù)字溫度傳感器芯片。其管腳分布如圖4。圖4DS18B20引腳分布圖每片DS18B20在出廠時都設(shè)有唯一的產(chǎn)品序列號,此序列號存放在它的內(nèi)部ROM中,微處理器通過簡單協(xié)議,就能識別這些序列號,因此多個DS18B20可以掛接于同一條單總線上,這允許在許多不同的地方放置溫度傳感器,特別適合于構(gòu)成多點溫度測控系統(tǒng)。管腳功能描述參見表3表3DS18B20詳細(xì)引腳功能描述序號名稱引腳功能描述1GND地信號2DQ數(shù)據(jù)輸入/輸出引腳;開漏單總線接口引腳;當(dāng)被用在寄生電源下,也可以向器件提供電源。3VDD可選擇的VDD引腳;當(dāng)工作于寄生電源時,此引腳必須接地。DS18B20的內(nèi)部結(jié)構(gòu)如圖5所示。主要由4部分組成:64位ROM、溫度傳感器、非揮發(fā)的溫度報警觸發(fā)器TH和TL、配置寄存器。IO存儲器和控制邏輯電源檢測IO存儲器和控制邏輯電源檢測溫度靈敏允許64bitROM溫度靈敏允許64bitROM和單線接口高速暫存存儲器高速暫存存儲器低溫觸發(fā)器低溫觸發(fā)器高溫觸發(fā)器高溫觸發(fā)器VDDVDD配置寄存器8位CRC生成器配置寄存器8位CRC生成器GNDGND圖5DS18B20內(nèi)部結(jié)構(gòu)圖配置寄存器為高速暫存存儲器中的第5個字節(jié)。DS18B20在工作時按此寄存器中的分辨率將溫度轉(zhuǎn)換成相應(yīng)精度的數(shù)值,其各位定義如表4所示。其中,TM為測試模式標(biāo)志位,出廠時被寫入“0”,不能改變;R0、R1是溫度計分辨率設(shè)置位。表4DS18B20配置寄存器結(jié)構(gòu)表BIT7BIT6BIT5BIT4BIT3BIT2BIT1BIT0TMR1R011111MSBLSB其對應(yīng)四種分辨率如表5所示,出廠時R0、R1被置為“1”,默認(rèn)設(shè)置是12位分辨率,用戶可根據(jù)需要給寫配置寄存器以獲得合適的分辨率。表5配置寄存器與分辨率關(guān)系表R0R1溫度計分辨率/bit最大轉(zhuǎn)換時間/ms00993.750110187.5010113751112750溫度信息的低位、高位字節(jié)內(nèi)容還包括了符號位S(是正溫度還是負(fù)溫度)和二進制小數(shù)部分,其具體形式如圖6。232221202-12-22-32-4低位字節(jié):MSBLSBSSSSS262524高位字節(jié):MSBLSB圖6DS18B20溫度值格式表圖6所示是12位分辨率的情況,如果配置為低分辨率,則其中無意義位為“0”。在DS18B20完成溫度變換之后,溫度值與存儲在TH和TL內(nèi)的告警觸發(fā)值相比較。由于這些是8位寄存器,所以9~12位在比較時忽略。TH或TL的高位直接對應(yīng)于16位溫度寄存器的符號位。如果溫度測量的結(jié)果高于TH或低于TL,那么器件內(nèi)告警標(biāo)志將置位,每次溫度測量都會更新此標(biāo)志位。只要告警標(biāo)志置位,DS18B20就將響應(yīng)告警搜索命令,這也就允許單線上多個DS18B20同時進行溫度測量,即使某處溫度越限,也可以識別出正在告警的器件。特別需要注意的是,與DS18B20配套使用的是頻率為11.0592MHz單片機晶振,這決定了指令的運行時間,在軟件設(shè)計中將根據(jù)此指令運行時間編寫各種延時程序。電子時鐘硬件電路設(shè)計3.2.1時鐘電路設(shè)計系統(tǒng)時鐘應(yīng)用了實時時鐘日歷芯片DS1302,其連接如圖7。該硬件電路設(shè)計簡單,抗干擾能力強。如圖,AT89C51單片機P1.7直接接DS1302的RST端,上電后,AT89C51的P1.7腳自動輸出高電平。P1.5作為串行時鐘接口,P1.6作為時鐘數(shù)據(jù)的I/O。DS1302采用雙電源供電,平時由+5V電源供電,當(dāng)+5V掉電之后,由圖中BT1(+3V備用電池)供電。特別需要注意X1和X2兩端連接的晶振Y1,該晶振頻率為32.768KHz。圖7系統(tǒng)時鐘電路3.2.2環(huán)境溫度采集電路設(shè)計本設(shè)計中使用DS18B20溫度傳感器進行環(huán)境溫度采集和轉(zhuǎn)化。如圖8所示,AT89C51單片機的P3.4腳接DS18B20的I/O腳,作為數(shù)據(jù)的讀入和寫出口。電阻R1作為DS18B20的I/O口的上拉電阻,在讀時隙結(jié)束時,I/O引腳將通過此上拉電阻拉回至高電平。圖8系統(tǒng)環(huán)境溫度采集電路3.2.3顯示電路設(shè)計就時鐘而言,通??刹捎肔CD顯示或LED顯示。對于一般的段式LCD,需要專門的驅(qū)動電路,而且LCD顯示的可視性較差;對于具有驅(qū)動電路和微處理器接口的液晶顯示模塊(字符或點陣),一般采用并行接口,對微處理器的接口要求較高,占用資源多。另外,AT89C51本身沒有專門的液晶驅(qū)動接口。LED結(jié)構(gòu)簡單,體積小,功耗低,響應(yīng)速度快,易于匹配,壽命長,可靠性高,而且顯示亮度高,價格便宜,市場上也有專門的時鐘顯示組合LED。故本設(shè)計中應(yīng)用8位8段共陰LED實現(xiàn)顯示部分,顯示面板分布如圖9。LED顯示分動態(tài)顯示和靜態(tài)顯示:動態(tài)顯示方式的硬件電路簡單。但設(shè)計上如果處理不當(dāng),易造成亮度低,閃爍問題。因此合理的設(shè)計既應(yīng)保證驅(qū)動電路易實現(xiàn),又要保證圖像穩(wěn)定,無閃爍。動態(tài)顯示采用多路復(fù)用技術(shù)的動態(tài)掃描顯示方式,復(fù)用的程度不是無限增加的,因為利用動態(tài)掃描顯示使我們看到一幅穩(wěn)定畫面的實質(zhì)是利用了人眼的暫留效應(yīng)和發(fā)光二極管發(fā)光時間的長短,發(fā)光的亮度等因素。靜態(tài)顯示,是由微型計算機一次輸出顯示模型后,就能保持該顯示結(jié)果,直到下次發(fā)送新的顯示模型為止。靜態(tài)顯示驅(qū)動程序簡單,且CPU占用率低,但每個LED數(shù)碼管需要一個鎖存器來鎖存每一個顯示位的筆段代碼,硬件開銷大,僅適合顯示位數(shù)較少的場合。為了在顯示部分節(jié)省單片機I/O口,故采用靜態(tài)顯示方式。電路圖參見圖9。74LS164是8位移位寄存器,應(yīng)用該芯片驅(qū)動LED做顯示部分,其優(yōu)點在于連線簡單,節(jié)省單片機I/O口,軟件編程容易。圖9顯示面板LED分布圖3.2.4按鍵電路設(shè)計根據(jù)功能需要,本時鐘需要設(shè)置以下功能鍵:校對選擇鍵,加1操作鍵,減1操作鍵,顯示日期鍵,顯示溫度鍵,鬧鈴開關(guān)鍵。按照鍵盤與CPU的連接方式可分為獨立式鍵盤和矩陣式鍵盤。獨立式鍵盤是各個按鍵相互獨立,每個按鍵占用一個I/O口線,每根I/O口線上的按鍵不會影響其他I/O口上按鍵工作狀態(tài)。獨立式鍵盤電路配置靈活,軟件結(jié)構(gòu)簡單,但每個按鍵必須占用一根I/O口,在按鍵數(shù)量較多時,I/O口線浪費較大,且電路結(jié)構(gòu)復(fù)雜。矩陣式鍵盤適合按鍵較多時使用。由于本設(shè)計的電子鐘最多需要7個按鍵,若采用矩陣式鍵盤時會有按鍵浪費,故采用的是獨立式鍵盤。鍵盤電路如圖11。對于內(nèi)置了上拉電阻的I/O引腳來說,外接上拉電阻沒有意義。圖11鍵盤電路按鍵操作說明如下:K1鍵:該鍵為帶自鎖按鍵,在正常顯示時間狀態(tài)下,每次將按鍵按下,LED數(shù)碼管將顯示日期;再次按下,按鍵彈出,重新顯示時間。K2鍵:該鍵為帶自鎖按鍵,在正常顯示時間狀態(tài)下,每次將按鍵按下,LED數(shù)碼管將顯示環(huán)境溫度;再次按下,按鍵彈出,重新顯示時間。K3鍵:該鍵為自動復(fù)位鍵,在正常顯示時間狀態(tài)下,第一次按下后,開始校對小時,以后每次按下都會分別進入對分、秒、鬧鈴時、鬧鈴分、年、月、日的校對狀態(tài)。K4鍵:該鍵為自動復(fù)位鍵,在校對狀態(tài)下,每次按動該鍵,都會使相應(yīng)校對位進行加1操作。例如:校對小時狀態(tài),每按一下,小時位加1,當(dāng)加至小時最高值23時,再按K4鍵,小時位回0。調(diào)分、秒、年、月、日與皆之相同,只是各位最高值不同。K5鍵:該鍵為自動復(fù)位鍵,與K4鍵類似,不同之處是該鍵每次按下將使相應(yīng)校對位進行減1操作。K6鍵:該鍵為自動復(fù)位鍵,在校對狀態(tài)下,按下該鍵,從校對狀態(tài)返回時間顯示狀態(tài);在響鈴狀態(tài)下,按下該鍵,鬧鈴進入貪睡狀態(tài)。K7鍵:該鍵為帶自鎖按鍵,按下后鬧鈴開啟,彈出后鬧鈴關(guān)閉。按鍵功能參見表6。表6按鍵功能表按鍵鍵名功能屬性K1Calendar顯示日歷自鎖K2T顯示溫度自鎖K3FUN功能選擇自動復(fù)位K4UP數(shù)值加一操作自動復(fù)位K5DOWN數(shù)值減一操作自動復(fù)位K6Enter/Snooze確認(rèn)鍵/貪睡自動復(fù)位K7Alarm鬧鈴開關(guān)自鎖3.2.5鬧鈴電路設(shè)計鬧鈴音樂可以直接采用蜂鳴器鬧鈴,如當(dāng)前時刻與鬧鈴時間相同,單片機向蜂鳴器送出低電平,蜂鳴器發(fā)聲。采用蜂鳴器鬧鈴結(jié)構(gòu)簡單,控制方便,但是發(fā)出的鬧鈴聲音單一。也可以在編程的時候編寫一段音樂程序,待鬧鈴時間到時,調(diào)用該音樂程序給揚聲器,便響起音樂。不過該方法只能做一些簡單音樂,并且音樂程序會占用很多單片機存儲資源。鬧鈴的音樂不是本設(shè)計中的重點,故采用最簡單的方法,占用單片機一根I/O口P2.0,中間用PNP型三極管S9012連接P2.0和蜂鳴器。當(dāng)P2.0引腳為低電平時,S9012的發(fā)射極和集電極導(dǎo)通,使蜂鳴器發(fā)聲。當(dāng)響鈴標(biāo)志位為“1”時,P2.0送一定頻率脈沖,使蜂鳴器U11發(fā)出聲音。如圖12。圖12鬧鈴電路4系統(tǒng)軟件設(shè)計4.1主程序設(shè)計第一次上電,系統(tǒng)先進行初始化,LED顯示初始時間“14:28:00”,并開始走時。初始日期為2008年05月12日,此刻若按K1鍵,LED顯示“080512”。單片機依次開始調(diào)用鍵盤掃描子程序、DS1302子程序、DS18B20子程序、鬧鈴子程序,經(jīng)過延時,返回程序開頭循環(huán)運行。主程序流程圖如圖13。開始鬧鈴子程序延時子程序DS18B20子程序DS1302子程序鍵盤掃描子程序顯示子程序初始化開始鬧鈴子程序延時子程序DS18B20子程序DS1302子程序鍵盤掃描子程序顯示子程序初始化圖13多功能電子鐘主程序流程圖4.2子程序設(shè)計4.2.1實時時鐘日歷子程序設(shè)計該程序主要實現(xiàn)對DS1302寫保護、充電,對年、月、日、時、分、秒等寄存器的讀寫操作。在讀寫操作子程序中都執(zhí)行了關(guān)中斷指令,因為在串行通信時對時序要求比較高,而且在此是用I/O口軟件模擬串行時鐘脈沖,所以在通信過程中最好保證傳輸?shù)倪B續(xù)性,不要允許中斷。返回讀出數(shù)據(jù)開始計時初始化開始返回讀出數(shù)據(jù)開始計時初始化開始寫入時鐘初值寫入時鐘初值圖14實時時鐘日歷子程序流程圖DS1302每次上電時自動處于暫停狀態(tài),必須把秒寄存器的位7置位0,時鐘才開始計時。如果DS1302一直沒有掉電,則不存在此問題。在進行寫操作時,需要先解除寫保護寄存器的“禁止”狀態(tài)。當(dāng)用多字節(jié)模式進行操作時,必須寫夠8字節(jié)。4.2.2環(huán)境溫度采集子程序設(shè)計DS18B20是1—wire單線器件,它在一根數(shù)據(jù)線上實現(xiàn)數(shù)據(jù)的雙向傳輸,這就需要一定的協(xié)議來對讀寫數(shù)據(jù)提出嚴(yán)格的時序要求,而AT89C51單片機并不支持單線傳輸。因此,必須采用軟件的方法來模擬單線的協(xié)議時序。主機操作單線器件DS18B20必須遵循下面的順序。1、初始化單線總線上的所有操作均從初始化開始。初始化過程如下:主機通過拉低單線480μs以上,產(chǎn)生復(fù)位脈沖,然后釋放該線,進入RX接收模式。主機釋放總線時,會產(chǎn)生一個上升沿。單線器件DS18B20檢測到該上升沿后,延時15~60μs,通過拉低總線60~240μs來產(chǎn)生應(yīng)答脈沖。主機接收到從機的應(yīng)答脈沖后,說明有單線器件在線。2、ROM操作命令一旦總線主機檢測到應(yīng)答脈沖,便可以發(fā)起ROM操作命令。共有5位ROM操作命令。如表7。表7DS18B20的ROM操作命令命令類型命令字節(jié)功能說明RaedRom33H此命令讀取激光ROM中的64位,只能用于總線上單個DS18B20器件的情況,多掛則會發(fā)生數(shù)據(jù)沖突MatchRom(匹配ROM)55H此命令后跟64位ROM序列號,尋址多掛接總線上的DS18B20。只有序列號完全匹配的DS18B20才能響應(yīng)后面的內(nèi)存操作命令,其他不匹配的將等待復(fù)位脈沖。此命令可用于單掛接或者多掛接總線。SkipRom(跳過ROM)CCH此命令用于單掛接總線系統(tǒng)時,可以無需提供64位ROM序列號皆可運行內(nèi)存操作命令。如果總線上接多個DS18B20,并且在此命令后執(zhí)行讀命令,將會發(fā)生數(shù)據(jù)沖突。SearchRom(搜索ROM)F0H主機調(diào)用此命令,通過一個排除法過程,可以識別出總線上所有器件的ROM序列號。AlarmSearch(告警搜索)ECH此命令流程圖和SearchRom命令相同,但是DS18B20只有在最近的一次溫度測量時滿足了告警觸發(fā)條件,才會響應(yīng)此命令。3、內(nèi)存操作命令在成功執(zhí)行了ROM操作命令之后,才可以使用內(nèi)存操作命令。主機可以提供6種內(nèi)存操作命令,如表8。表8DS18B20內(nèi)存操作命令命令類型命令字節(jié)功能說明WriteScratchpad(寫暫存器)4EH此命令寫暫存器中地址2~4的3個字節(jié)(TH、TL和配置寄存器)在發(fā)起復(fù)位脈沖之前,3個字節(jié)都必須要寫。RradScratchpad(讀暫存器)BEH此命令讀取暫存器內(nèi)容,從字節(jié)0一直讀取到字節(jié)8。主機可以隨時發(fā)起復(fù)位脈沖以停止此操作。CopyScratchpad(復(fù)制暫存器)48H此命令將暫存器中的內(nèi)容復(fù)制進E2RAM,以便將溫度告警觸發(fā)字節(jié)存入非易失內(nèi)存。如果在此命令后產(chǎn)生讀時隙,那么只要器件在進行復(fù)制就會輸出0,復(fù)制完成后,再輸出1。ConvertT(溫度轉(zhuǎn)換)44H此命令開始溫度轉(zhuǎn)換操作。如果在此命令后主機產(chǎn)生讀時隙,那么只要器件在進行溫度轉(zhuǎn)換就會輸出0,轉(zhuǎn)換完成后再輸出1。RecallE2(重調(diào)E2存儲器)B8H將存儲在E2RAM中的溫度告警觸發(fā)值和配置寄存器值重新拷貝到暫存器中。此重調(diào)操作在DS18B20加電時自動產(chǎn)生。ReadPowerSupply(讀供電方式)B4H主機發(fā)起此命令后的每個讀數(shù)據(jù)時隙內(nèi),DS18B20發(fā)信號通知它的供電方式:0為寄生電源方式,1為外部供電方式。4、數(shù)據(jù)處理DS18B20要求有嚴(yán)格的時序來保證數(shù)據(jù)的完整。在單線DQ上,存在復(fù)位脈沖、應(yīng)答脈沖、寫“0”、寫“1”、讀“0”和讀“1”幾種信號類型。其中,除了應(yīng)答脈沖之外,均由主機產(chǎn)生。而數(shù)據(jù)位的讀和寫則是通過使用讀、寫時隙實現(xiàn)的。首先了解寫時隙。當(dāng)主機將數(shù)據(jù)線從高電平拉至低電平時,產(chǎn)生寫時隙。有2種類型的寫時隙:寫“1”和寫“0”。所有寫時隙必須在60μs以上(即由高拉低后持續(xù)60μs以上),各個寫時隙之間必須保證最短1μs的恢復(fù)時間。DS18B20在DQ線變低后的15~60μs的窗口對DQ進行采樣,如果為高電平,就為寫“1”;如果為低電平,就為寫“0”。對于主機產(chǎn)生寫“1”時隙的情況,數(shù)據(jù)線必須先被拉低,然后釋放,在寫時隙開始后的15μs,允許DQ線拉至高電平。對于主機寫“0”時隙的情況,DQ線必須被拉至低電平且至少保持低電平60μs。再來了解讀時隙。當(dāng)主機從DS18B20讀數(shù)據(jù)時,把數(shù)據(jù)線從高電平拉至低電平,產(chǎn)生讀時隙。數(shù)據(jù)線DQ必須保持低電平至少1μs,來自DS18B20的輸出數(shù)據(jù)在讀時隙下降沿之后15μs內(nèi)有效。因此,在此15μs內(nèi),主機必須停止將DQ引腳置低。在讀時隙結(jié)束時,DQ引腳將通過外部上拉電阻拉回至高電平。所有的讀時隙最短必須持續(xù)60μs,各個讀時隙之間必須保證1μs的恢復(fù)時間。所有的讀寫時隙至少需要60μs,且每兩個獨立的時隙之間至少需要1μs的恢復(fù)時間。在寫時序中,主機將在拉低總線15μs內(nèi)釋放總線,并向DS18B20寫“1”。若主機拉低總線后能保持60μs的低電平,則向單總線器件寫“0”。DS18B20僅在主機發(fā)出讀時隙時才向主機傳輸數(shù)據(jù),所以,當(dāng)主機向DS18B20發(fā)出讀數(shù)據(jù)命令后,必須馬上產(chǎn)生讀時隙,以便DS18B20能傳輸數(shù)據(jù)。程序見附錄二。DS18B20里面低溫度系數(shù)晶振的振蕩頻率受溫度的影響很小,用于產(chǎn)生固定頻率的脈沖信號送給減法計數(shù)器1,高溫度系數(shù)晶振隨溫度變化其震蕩頻率明顯改變,所產(chǎn)生的信號作為減法計數(shù)器2的脈沖輸入,DS18B20中還隱含著計數(shù)門,當(dāng)計數(shù)門打開時,DS18B20就對低溫低溫度系數(shù)振蕩器產(chǎn)生的時鐘脈沖進行計數(shù),進而完成溫度測量。計數(shù)門的開啟時間由高溫度系數(shù)振蕩器來決定,每次測量前,首先將-55℃所對應(yīng)的基數(shù)分別置入減法計數(shù)器1和溫度寄存器中,減法計數(shù)器1和溫度寄存器被預(yù)置在-55℃所對應(yīng)的一個基數(shù)值。減法計數(shù)器1對低溫度系數(shù)晶振產(chǎn)生的脈沖信號進行減法計數(shù),當(dāng)減法計數(shù)器1的預(yù)置值減到0時溫度寄存器的值將加1,減法計數(shù)器1的預(yù)置將重新被裝入,減法計數(shù)器1重新開始對低溫度系數(shù)晶振產(chǎn)生的脈沖信號進行計數(shù),如此循環(huán)直到減法計數(shù)器2計數(shù)到0時,停止溫度寄存器值的累加,此時溫度寄存器中的數(shù)值即為所測溫度。只要計數(shù)門仍未關(guān)閉就重復(fù)上述過程,直至溫度寄存器值達到被測溫度值。環(huán)境溫度采集子程序流程見圖15。YY溫度T=TH+TL讀高8位字節(jié)TH數(shù)據(jù)讀低8位字節(jié)TL數(shù)據(jù)發(fā)起讀暫存器命令應(yīng)答脈沖否?初始化DS18B20延時1S,等待溫度轉(zhuǎn)化完成發(fā)起溫度轉(zhuǎn)換命令應(yīng)答脈沖否?發(fā)起跳過ROM命令初始化DS18B20開始YY溫度T=TH+TL讀高8位字節(jié)TH數(shù)據(jù)讀低8位字節(jié)TL數(shù)據(jù)發(fā)起讀暫存器命令應(yīng)答脈沖否?初始化DS18B20延時1S,等待溫度轉(zhuǎn)化完成發(fā)起溫度轉(zhuǎn)換命令應(yīng)答脈沖否?發(fā)起跳過ROM命令初始化DS18B20開始 N N 圖15環(huán)境溫度采集子程序流程圖4.2.3顯示子程序設(shè)計用74LS164驅(qū)動LED數(shù)碼管靜態(tài)顯示電路,編程也很容易。只要將需要顯示的數(shù)字編輯成對應(yīng)的BCD碼,逐位送入74LS164的A、B串行輸入端,數(shù)碼管將正常顯示。關(guān)鍵之處是要實現(xiàn)根據(jù)鍵值顯示不同的數(shù)字。顯示子程序流程見圖16。為了方便實現(xiàn)按鍵顯示,程序中調(diào)用的都是各個標(biāo)志位,通過判斷標(biāo)志位的“真”、“假”來決定顯示的內(nèi)容。程序見附錄二。圖16顯示子程序流程圖鍵盤掃描子程序:單片機對鍵盤掃描的方法有隨機掃描方式、定時掃描方式和中斷掃描方式。由于本設(shè)計中AT89C51單片機在系統(tǒng)中的主要任務(wù)是接受DS1302和DS18B20的數(shù)據(jù)并送出顯示,完成時鐘/日歷校對和日期/溫度顯示控制。89C51單片機完全有能力完成以上工作,所以采用隨機掃描鍵盤方式,系統(tǒng)也能夠正常運行。鍵盤掃描子程序流程見圖17。圖17鍵盤掃描子程序單片機掃描完鍵盤,得到鍵值,并根據(jù)鍵值轉(zhuǎn)入執(zhí)行對應(yīng)任務(wù),以實現(xiàn)按鍵功能。如果沒有按鍵按下,則程序掃描到Key=FFH,將鍵值Key清零,返回主程序。程序見附錄二。4.2.4鬧鈴子程序設(shè)計鬧鈴子程序最主要的任務(wù)是不斷用時鐘分(min)與時(hour)同設(shè)定的鬧鈴分(clk_min)與鬧鈴時(clk_hour)比較,只要滿足min等于clk_min、hour等于clk_hour,響鈴啟動5分鐘,并根據(jù)外部按鍵執(zhí)行相應(yīng)貪睡任務(wù)。程序見附錄二。5系統(tǒng)調(diào)試調(diào)試工作分硬件調(diào)試和軟件調(diào)試兩部分,調(diào)試方法介紹如下:首先,硬件調(diào)試主要是先搭建硬件平臺,然后利用萬用表等工具對電路檢查,最后應(yīng)用程序進行功能調(diào)試。硬件調(diào)試比較費時,需要細(xì)心和耐心,也需要熟練掌握電路原理。然后,可以直接應(yīng)用一些編輯或仿真軟件進行軟件調(diào)試,比如單片機C51編輯軟件Keil。該軟件提供了一個集成開發(fā)環(huán)境uVision,它包括C編輯器、宏編輯器、連接器、庫管理和一個功能強大的仿真調(diào)試器。通過編譯、運行,可以檢查程序錯誤。但應(yīng)用此方法,仍需要十分了解所使用元器件的工作方式和管腳連接方式。在軟件調(diào)試過程中要仔細(xì)耐心,即便是多寫或少些一兩個字符,都無法編譯成功。而有時往往在Keil中編譯、運行無錯,但燒錄到單片機中運行起來就會出錯,很可能是編程時管腳或時序編輯得不對。調(diào)試過程是一個軟硬件相結(jié)合調(diào)試的過程,硬件電路是基礎(chǔ),軟件是檢測硬件電路和實現(xiàn)其功能的關(guān)鍵。在調(diào)試過程中,首先必須明確調(diào)試順序。例如:本設(shè)計是在單片機系統(tǒng)基礎(chǔ)上建立起來的,所以必須先確定單片機基礎(chǔ)電路能否正常工作。為了正確顯示時間,接下來還要確定顯示電路能否正常工作。硬件調(diào)試的過程,也是軟件調(diào)試的過程。然后,要準(zhǔn)備好調(diào)試的工具。硬件調(diào)試需要萬用表、示波器等,軟件調(diào)試一般需要諸如Keil等仿真編輯器。本人根據(jù)自己實際制作該電子時鐘的經(jīng)驗,將調(diào)試過程介紹如下:5.1硬件調(diào)試5.1.1單片機基礎(chǔ)電路調(diào)試單片機基礎(chǔ)電路包括電源、單片機、外部時鐘震蕩電路、復(fù)位電路和外部接口電路。調(diào)試過程需要注意以下幾點:1.檢查電源是否完好。2.單片機電源要連接正確,并且保證AT89C51的31號引腳接高電平。AT89C51的31號引腳是外部程序存儲器選擇信號端,當(dāng)該引腳為高電平時,單片機會一直從片內(nèi)程序存儲器內(nèi)取指令。3.如果使用P0口做I/O口,要接上拉電阻。4.使用萬用表排查電路中是否存在斷路或者短路情況。焊接時容易出現(xiàn)管腳之間短路,所以在上電以前必須先排查電路。5.編輯一個使一組發(fā)光二極管循環(huán)點亮的程序并燒錄到單片機內(nèi),上電運行,檢查單片機是否正常工作,復(fù)位電路是否正確。5.1.2顯示電路調(diào)試本設(shè)計的顯示電路使用了共陰LED和74LS164。在連接顯示電路之前要明確共陰型8段LED的10個管腳與各段發(fā)光二極管的對應(yīng)關(guān)系,熟悉74LS164管腳位置,然后才能開始進行連接。在連接過程中,需要注意以下幾點:1.LED數(shù)碼管各管腳與74LS164各管腳的對應(yīng)關(guān)系要十分清楚,所有LED數(shù)碼管與74LS164的連接方式要統(tǒng)一。2.因為是移位顯示,所以需要注意前一位74LS164的QH腳要與下一位74LS164的A、B腳連接。3.明確單片機管腳功能。本設(shè)計定義了P1.0連接74LS164的A、B腳,P1.1連接74LS164的CLK腳。4.74LS164的CLR腳接高電平。5.檢查好電源正負(fù)端和P1.0、P1.1連接是否正確。檢查無誤后上電,檢查顯示電路是否正確。5.1.3DS1302電路調(diào)試該電路包含DS1302芯片、主電源、備用電源、晶振等部分。在與單片機連接的過程中需要注意以下幾點:1、清楚DS1302與單片機連接的管腳。本設(shè)計定義為:DS1302的SCLK連接P1.5,I/O連接P1.6,RST連接P1.7。2、注意電源正負(fù)極連接。3、DS1302接32.768KHz的晶振。該晶振體型比較小,在焊接時要小心,注意不要將晶振引腳弄斷。同時也要盡量使晶振離DS1302的X1、X2引腳近距離焊接。4、編寫DS1302的時鐘/日歷程序,只要求能夠正確顯示時間。燒錄進單片機,檢查電路電源正負(fù)極連接是否正確,檢查P1.0和P1.1引腳接線是否正確。檢查無誤后可以上電檢查。本人編寫了一段汶川特大地震發(fā)生的時間顯示程序,設(shè)置初始時間為14:28:00,初始日期為2008年5月12日。上電后LED數(shù)碼管顯示“142800”,之后開始走時。觀察32分鐘之后,數(shù)碼管顯示“150000”,證明DS1302電路正確。源程序見附錄二5.1.4按鍵電路調(diào)試按鍵電路比較簡單,故調(diào)試起來也很容易。如果確保按鍵焊接正確,只需在DS1302的調(diào)試程序上加上一段日歷顯示子程序,并在主程序中寫入:If(P_7==0){dis_calendar;}日歷顯示子程序原理與時鐘顯示子程序原理相同,源程序見附錄C。該程序的功能是:當(dāng)按下K7時,第1~6位LED數(shù)碼管馬上由時間顯示日期。當(dāng)K7彈出后,數(shù)碼管1~6位有顯示日期轉(zhuǎn)為顯示實時時間。5.2軟件調(diào)試在硬件調(diào)試完畢的基礎(chǔ)上,需要進一步完善程序,也就是進入軟件調(diào)試階段。在本設(shè)計中,軟件調(diào)試主要分三大部分:實時時鐘日歷子程序調(diào)試、環(huán)境溫度采集子程序調(diào)試、按鍵子程序調(diào)試。將這三部分調(diào)試成功,那么整個設(shè)計的軟件部分也就基本完成了。在硬件調(diào)試部分,已經(jīng)將實時時鐘日歷子程序調(diào)試完畢了,只需在主程序中調(diào)用按鍵子程序即可,源程序見附錄二,這里不再贅述。5.2.1環(huán)境溫度采集子程序調(diào)試DS18B20溫度傳感器使用起來非常方便,不但接線少,而且編程容易。該溫度傳感器在讀寫數(shù)據(jù)時需要嚴(yán)格的時序,為了方便編寫對應(yīng)的延時程序,此時單片機一般都選用11.0592MHz的晶振。溫度顯示子程序與時間顯示子程序原理相同,源程序見附錄二5.2.2鍵盤子程序調(diào)試依據(jù)設(shè)計要求,鍵盤子程序需要完成對時間/日歷的校對、日期/溫度的顯示和鬧鈴的開關(guān)。為了便于顯示子程序和鬧鈴子程序的調(diào)用,除了K1、K2鍵以外,其余按鍵都定義功能標(biāo)志位。在調(diào)用鬧鈴子程序時,鬧鈴標(biāo)志位為“1”,則開啟鬧鈴,否則關(guān)閉鬧鈴。源程序見附錄二。6結(jié)論隨著社會的發(fā)展和進步,生產(chǎn)生活對時鐘的需求越來越大,對時鐘的體型、功能的要求也各有不同。例如,本設(shè)計中的溫度功能就能夠給我們帶來很多的方便。所以多功能的電子時鐘在今后的應(yīng)用也會越來越廣泛?;趩纹瑱C實現(xiàn)帶溫度顯示的電子時鐘,僅僅是眾多方法之一。并且市場上的實時時鐘日歷芯片品類繁多,IC化的傳感器各種各樣,顯示方式也愈趨于人性化。所以這類時鐘有多種實現(xiàn)方案,能夠?qū)崿F(xiàn)的功能也很多。本文采用51單片機C語言進行編程,當(dāng)然也可以應(yīng)用匯編語言編程。由于自己能力有限,匯編語言學(xué)的不是很好,故未采用匯編語言編寫程序。其實我們還可以根據(jù)需求為電子時鐘增設(shè)新功能,在增設(shè)新功能的同時,我們可以進一步學(xué)習(xí)單片機的使用,各種外圍器件,特別是芯片的應(yīng)用,為自己以后從事工程技術(shù)工作打下良好的基礎(chǔ)。致謝在論文完成之際,我首先要感謝指導(dǎo)老師的熱情關(guān)懷和悉心指導(dǎo)。在我撰寫論文的過程中,指導(dǎo)老師給與了很大的幫助與支持,無論是在論文的選題、構(gòu)思和資料的收集方面,還是在論文的研究方法以及成文定稿方面,我都得到了他悉心細(xì)致的教誨和無私的幫助,特別是他廣博的學(xué)識、深厚的專業(yè)技術(shù)、嚴(yán)謹(jǐn)?shù)闹螌W(xué)精神和一絲不茍的工作作風(fēng)使我終生受益,在此表示真誠地感謝和深深的謝意。
在論文的寫作過程中,也得到了許多同學(xué)的支持和幫助,在此一并致以誠摯的謝意。感謝所有關(guān)心、支持、幫助過我的良師益友。
最后,向在百忙中抽出時間對本文進行評審并提出寶貴意見的各位老師表示衷心地感謝!參考文獻[1]盧超.基于單片機的數(shù)字電子鐘的設(shè)計與制作[J].大慶師范學(xué)院學(xué)報,2006,(05).[2]董軍堂,馮曉艷,賈培軍.基于AT89C2051單片機的電子鐘設(shè)計[J].電子制作,2007,(12).[3]劉盛雄,周奇,韋云隆.基于單片機的數(shù)字式電子鐘的設(shè)計與制作[J].重慶工學(xué)院學(xué)報,2006,(08)[4]何宏森.多功能智能電子鐘的設(shè)計[J].兵工自動化,2005,(04).[5]王韌,俞斌.簡易電子鐘的設(shè)計[J].電子世界,2005,(07).[6]向繼文,廖立新.基于AT89S51的電子鐘系統(tǒng)設(shè)計[J].機電產(chǎn)品開發(fā)與創(chuàng)新,2007,(02).[7]曾日波.多功能數(shù)字電子鐘系統(tǒng)的設(shè)計與實現(xiàn)[J].樂山師范學(xué)院學(xué)報,2004,(12).[8]趙淑范.數(shù)字電子鐘的設(shè)計[J].長春大學(xué)學(xué)報,2004,(04).[9]陳正軍,鄔華,王謝瑋.基于單片機的電子鬧鐘研究與設(shè)計[J].科技信息,2010,(14).[10]張友德.單片微型機原理應(yīng)用與實驗[M].上海:復(fù)旦大學(xué)出版社,1996,(57)[11]姜立東.嵌入式系統(tǒng)原理及應(yīng)用[M].北京:機械工業(yè)出版社,2006,(89)[12]楊欣.電路設(shè)計與仿真[M].北京:清華大學(xué)出版社,2006,(92)[13]樓然苗.51系列單片機設(shè)計實例[M].北京:航空航天大學(xué)出版社,2004,(72)[14]李朝青.單片機原理及接口技術(shù)[M].北京:航空航天大學(xué)出版社,2010,(53)附錄一系統(tǒng)設(shè)計總電路圖附錄二帶溫度顯示的電子鬧鐘程序程序C.1主程序//主程序的功能是對子程序進行調(diào)用,并設(shè)定顯示延時時間#include"reg51.h"http://頭文件;#include"typedef.h"#include"lcd.h"#include"key.h"#include"alarm_clock.h"#include"ds1302.h"sbitDAT=P1^0;//74LS164的A、B腳接單片機P1.0;sbitCLK=P1^1;//74LS164的CLOCK腳接單片機P1.1;sbitCalendar=P2^7;//定義日歷顯示按鍵K1接單片機P2.7;sbitWDZ=P2^6;//定義溫度顯示按鍵K2接單片機P2.6;sbitFUN=P2^5;//定義功能選擇鍵K3接單片機P2.5;sbitUP=P2^4;//定義加1鍵K4接單片機P2.4;sbitDOWN=P2^3;//定義減1鍵K5接單片機P2.3;sbitEnte_Snooze=P2^2;//定義確認(rèn)/貪睡鍵K6接單片機P2.2;sbitAlarm=P2^1;//定義鬧鈴開關(guān)鍵K7接單片機P2.1;sbitbeeper= P2^0;//定義鬧鈴接口P2.0;#defineuintunsignedint#defineucharunsignedchar#definetrue1//定義true=1;#definefalse0//定義false=0;#defineFUNCTION0xDF//定義FUN鍵值為DFH;#defineUP0xEF//定義UP鍵值為EFH;#defineDOWN0xF7 //定義DOWN鍵值為F7H;#defineALARM0xFB//定義ALARM鍵值為FBH;#defineEnte_Snooze0xFB//定義E/S鍵值為BFH;voidkey_task(void);voidprocess(ucharcurrent_key);externbitflash_flag;//定義全局變量(標(biāo)志位);externucharfunction_count;externbitalarm_flag;externbitkey_enable;voiddis();voidsendbyte();void reset_3w();void wbyte_3w(uchar);uchar rbyte_3w();void write_byte(ucharClock_Add,ucharClock_Data);ucharread_byte(uchar);voidwrite_clock_burst();voidds1302_init();voidds1302_task();voidlcd_disp_time1();voiddis_WD();voidds18b20();voidalarm_clock(void);voiddelay(unsignedinttime)//10ms延時{unsignedchara,b,c;for(a=0;a<time;a++)for(b=0;b<10;b++)for(c=0;c<120;c++);}voidmain()//主程序;{ds1302_init();//初始化DS1302; beeper=1;//初始化鬧鈴管腳;while(1)//循環(huán); {key_task();//掃描鍵盤子程序; ds1302_task();//DS1302子程序;ds18b20();//DS18B20子程序;alarm_clock();//鬧鈴子程序; disp_time();//時間顯示子程序;delay(55);//延時; beeper=1;//鬧鈴管腳置1;}}/*電子時鐘程序*/#include"reg51.h"http://主要是對時鐘芯片DS1302初始化;#include"typedef.h"#include"lcd.h"#include"ds1302.h"#include"key.h"void reset_3w();void wbyte_3w(uchar);uchar rbyte_3w();void write_byte(ucharClock_Add,ucharClock_Data);ucharread_byte(uchar);voidwrite_clock_burst();void ds1302_init();voidds1302_task();#defineuintunsignedint#defineucharunsignedchar/*定義初始化時間*/ucharsec=00;ucharmin=25;ucharhour=14;uchardate=12;ucharmonth=5;ucharyear=8;ucharday_of_week;ucharclk_hour=14;ucharclk_min=28;//-14:28-/*定義寄存器地址*/#defineREAD_SEC_ADD0x81//讀秒寄存器#defineREAD_MIN_ADD0x83//讀分寄存器#defineREAD_HOUR_ADD0x85//讀時寄存器#defineREAD_DATE_ADD0x87//讀日寄存器#defineREAD_MONTH_ADD0x89//讀月寄存器#defineREAD_DOW_ADD0x8B//讀周寄存器#defineREAD_YEAR_ADD0x8D//年寄存器#defineWRITE_SEC_ADD0x80//寫秒寄存器#defineWRITE_MIN_ADD0x82//寫分寄存器#defineWRITE_HOUR_ADD0x84//寫時寄存器#defineWRITE_DATE_ADD0x86//寫日寄存器#defineWRITE_MONTH_ADD0x88//寫月寄存器#defineWRITE_DOW_ADD0x8A//寫周寄存器#defineWRITE_YEAR_ADD0x8C//寫年寄存器#defineCLOCK_BURST_ADD0xBE//時鐘多字節(jié)傳送模式externvoidwrite_clock_burst();externvoid write_byte(ucharClock_Add,ucharClock_Data);voidsendbyte();void reset_3w();void wbyte_3w(uchar);uchar rbyte_3w();void write_byte(ucharClock_Add,ucharClock_Data);ucharread_byte(uchar);voidwrite_clock_burst();void ds1302_init();voidds1302_task();sbitSCLK=P3^5;//定義管腳SCLKsbitIO=P3^6;//定義管腳I/OsbitRST=P3^7;//定義管腳RSTucharsec,min,hour,date,month,year;ucharcodehex2bcd[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09, /*00-09*/0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19, /*10-19*/0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29, /*20-29*/0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39, /*30-39*/0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49, /*40-49*/0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59, /*50-59*/0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69, /*60-69*/0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79, /*70-79*/0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89, /*80-89*/0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99, /*90-99*/};ucharcodebcd2hex[]={0,1,2,3,4,5,6,7,8,9,0,0,0,0,0,0, /*00-09*/10,11,12,13,14,15,16,17,18,19,0,0,0,0,0,0, /*10-19*/20,21,22,23,24,25,26,27,28,29,0,0,0,0,0,0, /*20-29*/30,31,32,33,34,35,36,37,38,39,0,0,0,0,0,0, /*30-39*/40,41,42,43,44,45,46,47,48,49,0,0,0,0,0,0, /*40-49*/50,51,52,53,54,55,56,57,58,59,0,0,0,0,0,0, /*50-59*/60,61,62,63,64,65,66,67,68,69,0,0,0,0,0,0, /*60-69*/70,71,72,73,74,75,76,77,78,79,0,0,0,0,0,0, /*70-79*/80,81,82,83,84,85,86,87,88,89,0,0,0,0,0,0, /*80-89*/90,91,92,93,94,95,96,97,98,99,0,0,0,0,0,0, /*90-99*/};voidreset_3w() //復(fù)位子程序{SCLK=0;RST=0;//復(fù)位DS1302,中止數(shù)據(jù)傳送RST=1;//啟動數(shù)據(jù)傳送}voidwbyte_3w(ucharW_Byte) //寫字節(jié)子程序{uchari; for(i=0;i<8;++i) {IO=0; if(W_Byte&0x01) {IO=1;} SCLK=0; SCLK=1; W_Byte>>=1;}}uchar rbyte_3w() //讀字節(jié)子程序{uchari; ucharR_Byte; ucharTmpByte; R_Byte=0x00; IO=1; for(i=0;i<8;i++) {SCLK=1; SCLK=0; TmpByte=(uchar)IO; TmpByte<<=7; R_Byte>>=1; R_Byte|=TmpByte;} returnR_Byte;}void write_byte(ucharClock_Add,ucharClock_Data) {reset_3w(); wbyte_3w(Clock_Add); wbyte_3w(Clock_Data); reset_3w();}voidwrite_clock_burst(){reset_3w();//復(fù)位 wbyte_3w(CLOCK_BURST_ADD); //寫多字節(jié)傳送模式寄存器 wbyte_3w(hex2bcd[sec]);//寫入初始化時間 wbyte_3w(hex2bcd[min]); wbyte_3w(hex2bcd[hour]); wbyte_3w(hex2bcd[date]); wbyte_3w(hex2bcd[month]); wbyte_3w(hex2bcd[day_of_week]); wbyte_3w(hex2bcd[year]); wbyte_3w(0); /*mustwritecontrolregisterinburstmode*/ reset_3w();}uchar read_byte(ucharClock_Add) //從DS1302讀一個字節(jié){ucharClock_Data; reset_3w(); wbyte_3w(Clock_Add); Clock_Data=rbyte_3w(); reset_3w(); return(Clock_Data);}void ds1302_init() {reset_3w(); wbyte_3w(0x8e); //寫保護寄存器 wbyte_3w(0); //去保護 reset_3w(); wbyte_3w(0x90); wbyte_3w(0xab); write_clock_burst();//寫入初始化時間}voidds1302_task(){if(!key_enable) {sec=bcd2hex[read_byte(READ_SEC_ADD)];//讀DS1302sec min=bcd2hex[read_byte(READ_MIN_ADD)];//讀DS1302min hour=bcd2hex[read_byte(READ_HOUR_ADD)];//讀DS1302hour date=bcd2hex[read_byte(READ_DATE_ADD)]; day_of_week=bcd2hex[read_byte(READ_DOW_ADD)]; month=bcd2hex[read_byte(READ_MONTH_ADD)];//讀DS1302month year=bcd2hex[read_byte(READ_YEAR_ADD)];//讀DS1302year}}/*鍵盤子程序*/#include"reg51.h"http://主要是用于對時間的設(shè)定與調(diào)整#include"typedef.h"#include"key.h"#include"ds1302.h"uintwait_time;bitkey_enable;bit flash_flag;bit alarm_flag;ucharflash_count;ucharfunction_count=0;ucharkey;ucharkey_push;ucharkey_l;voidkey_scan()//掃描鍵盤;{ ucharl,a,PUSH; PUSH=P2&0xFF; if(PUSH!=0xFF){for(l=500;l>0;l--)//延時; for(a=50;a>0;a--); if(PUSH!=0xFF) {key_push=P2&0xFF; key=key_push;//key等于鍵值; }}}voidprocess(ucharcurrent_key)//按鍵功能子程序;{ switch(current_key) {caseFUNCTION://功能選擇鍵; {key_enable=true; function_count=function_count+1;if(function_count>=9) function_count=1;}break; caseUP://加1操作鍵; {if(function_count==1)//function_count=1,則秒加1操作;{sec++; if(sec>=60)//秒加到60,則被置0; sec=0; write_byte(WRITE_SEC_ADD,hex2bcd[sec]);//寫入秒寄存器; } if(function_count==2)//function_count=2,則分加1操作;{min++; if(min>=60)//分加到60,則被置0; min=0; write_byte(WRITE_MIN_ADD,hex2bcd[min]);//寫入分寄存器; } elseif(function_count==3)//function_count=3,則小時加1操作; {hour++; if(hour>=24)//小時加到24,則被置0; hour=0; write_byte(WRITE_HOUR_ADD,hex2bcd[hour]); } //寫入小時寄存器; elseif(function_count==4)//function_count=4,則鬧鈴分鐘加1操作; {clk_min++; if(clk_min>=60)//分鐘加滿60自動置0; clk_min=0;} elseif(function_count==5)//function_count=5,則鬧鈴小時加1操作; {clk_hour++; if(clk_hour>=24)//小時加滿24自動置0; clk_hour=0;} elseif(function_count==6)//function_count=6,則年加1操作; {year++; if(year>99) year=0; write_byte(WRITE_YEAR_ADD,hex2bcd[year]); }} elseif(function_count==7)//function_count=7,則月加1操作; { month++; if(month>=13) month=1; write_byte(WRITE_MONTH_ADD,hex2bcd[month]);} elseif(function_count==8)//function_count=8,則日加1操作; {date++; if(date>=31) date=0; write_byte(WRITE_DATE_ADD,hex2bcd[date]);} break; caseDOWN://鍵盤減1操作功能{ if(function_count==1) {if(sec==0) sec=60; --sec; write_byte(WRITE_SEC_ADD,hex2bcd[sec]);} if(function_count==2) {if(min==0) min=60; --min; write_byte(WRITE_MIN_ADD,hex2bcd[min]);} elseif(function_count==3) {if(hour==0) hour=24; --hour; write_byte(WRITE_HOUR_ADD,hex2bcd[hour]);} elseif(function_count==4) {if(clk_min==0) clk_min=60; --clk_min;} elseif(function_count==5) {if(clk_hour==0) clk_hour=24; --clk_hour; } elseif(function_count==6){if(year==0) year=100; --year; write_byte(WRITE_YEAR_ADD,hex2bcd[year]);} elseif(function_count==7) {if(month==1) month=13; --month; write_byte(WRITE_MONTH_ADD,hex2bcd[month]);} elseif(fu
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024高效房地產(chǎn)經(jīng)紀(jì)服務(wù)協(xié)議示例
- 2024年融資中介服務(wù)協(xié)議范本
- 2024年二手車交易協(xié)議樣本
- 2024年商用司機短期租賃協(xié)議
- DB11∕T 1692-2019 城市樹木健康診斷技術(shù)規(guī)程
- DB11∕T 1699-2019 在用氨制冷壓力管道X射線數(shù)字成像檢測技術(shù)要求
- 2024年工程裝修全包服務(wù)協(xié)議細(xì)則
- 2024年離婚財產(chǎn)分割協(xié)議格式
- 2024年法律顧問聘請協(xié)議樣本
- 2024指定區(qū)域建筑工程修復(fù)施工協(xié)議
- 零部件英文縮寫及零部件中英文對照
- 血源性病原體職業(yè)接觸防護導(dǎo)則
- 煉鋼廠6機6流小方坯連鑄機技術(shù)操作規(guī)程
- 跌倒的護理 (養(yǎng)老護理員培訓(xùn)課件)
- 船舶租賃盡職調(diào)查
- 統(tǒng)編教學(xué)小學(xué)語文課外閱讀《細(xì)菌世界歷險記》導(dǎo)讀課課件
- 植物生理學(xué)-植物的逆境生理
- 【課件】比的基本性質(zhì)
- 小學(xué)英語人教新起點五年級上冊Unit3Animalsunit3storytime
- 2023年江蘇省淮安市中考化學(xué)試卷
- 小學(xué)英語名師工作室工作計劃2篇
評論
0/150
提交評論