基于單片機(jī)的簡易燈光時鐘設(shè)計 畢業(yè)論文(帶程序).doc_第1頁
基于單片機(jī)的簡易燈光時鐘設(shè)計 畢業(yè)論文(帶程序).doc_第2頁
基于單片機(jī)的簡易燈光時鐘設(shè)計 畢業(yè)論文(帶程序).doc_第3頁
基于單片機(jī)的簡易燈光時鐘設(shè)計 畢業(yè)論文(帶程序).doc_第4頁
基于單片機(jī)的簡易燈光時鐘設(shè)計 畢業(yè)論文(帶程序).doc_第5頁
免費(fèi)預(yù)覽已結(jié)束,剩余54頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

本科畢業(yè)論文(設(shè)計) 題 目: 基于單片機(jī)的簡易燈光時鐘設(shè)計 專 業(yè): 電子信息工程 學(xué)生姓名: 學(xué)生學(xué)號: 100305044 院 系: 物理與電子工程學(xué)院 年級、班: 10 級 5 班 指導(dǎo)教師: 2014 年 5 月 6 日 宜賓學(xué)院 yibin university i 摘要 本文介紹了一個基于單片機(jī)的簡易燈光時鐘的設(shè)計,它具有顯示年、月、日、 時鐘、分鐘和秒、星期的顯示功能,還具有閏年補(bǔ)償?shù)裙δ?,時鐘芯片采用的 是 ds1302,ds1302 能存儲時間信息,并且可以掉電保存。單片機(jī)通過讀取 ds1302 的信息后通過 lcd1602 顯示在液晶屏幕上面。本設(shè)計包含 4 個按鍵,編 號分別為 1、2、3、4,每個按鍵的功能分別為功能選擇、光標(biāo)移動、加按鍵以 及減按鍵,可以設(shè)置鬧鐘,當(dāng) ds1302 上面的時間跟單片機(jī)所設(shè)定的鬧鐘時間一 致后,單片機(jī)可以驅(qū)動蜂鳴器進(jìn)行鬧鈴提醒。除此之外,系統(tǒng)還附帶整點(diǎn)報時, 以及任何時候通過按鍵語音報時功能。 關(guān)鍵詞:單片機(jī); lcd1602;蜂鳴器;ds1302;鬧鐘;語音報時; ii abstract this paper is aim to introduce a design which is based on simple chip microcomputer clock. it owns two main functions, namely, showing time, including year, month, day, hour, minute and second; and compensation of the leap year. the chip of this design is called ds1302, which can save time information even when the electricity was cut down accidently. the single-chip microcomputer is also capable of reading the information on ds1302 and reflects the data on the lcd screen through the lcd1602. the design includes four buttons, numbered 1,2,3,4, respectively, each button function selection, cursor movement, plus buttons and minus buttons, you can set the alarm. the microcontroller can drive the buzzer to make the clock alarming when the time on these two equipments the same are. besides, the basic functions in this microcontroller, such as: chime on every hour and the time speaking by telephone, are also included in this design. key words: chip microcomputer, lcd1602, buzzer, ds1302, alarm clock. iii 目錄 摘要 i abstract.ii 第一章 緒論 .1 1.1 目的和意義 1 1.2 本系統(tǒng)實(shí)現(xiàn)的主要功能 1 第二章 總體方案論證與設(shè)計 .2 2.1 主控模塊的選型和論證 2 2.2 顯示模塊的選型和論證 2 2.3 時鐘芯片的選型和論證 2 2.4 溫度檢測模塊的選型和論證 3 2.5 整點(diǎn)報時模塊的選型和論證 3 2.6 電源模塊 3 2.7 系統(tǒng)整體設(shè)計概述 3 第三章.系統(tǒng)硬件電路設(shè)計 .5 3.1 主控模塊 5 3.1.1 單片機(jī)的最小系統(tǒng)設(shè)計 5 3.2 lcd 液晶顯示器簡介 6 3.2.1 液晶原理介紹 6 3.2.2 液晶模塊簡介 6 3.2.3 液晶顯示部分與 stc89c52 的接口 .6 3.3 鍵盤模塊設(shè)計 7 3.4 蜂鳴器模塊設(shè)計 8 3.5 時鐘模塊的設(shè)計 8 3.6 溫度檢測模塊設(shè)計 .10 3.6.1 溫度傳感器工作原理 .10 3.6.2 ds18b20 硬件電路設(shè)計 .11 3.7 語音模塊設(shè)計 .11 第四章.系統(tǒng)軟件設(shè)計 12 4.1 系統(tǒng)軟件總體設(shè)計 .12 4.2 程序設(shè)計原理 .16 5.系統(tǒng)調(diào)試 .18 5.1 硬件調(diào)試 .18 5.2 軟件調(diào)試 .18 參考文獻(xiàn) .20 致謝 .21 附錄 .22 系統(tǒng)整體原理圖 .22 系統(tǒng) pcb 圖 .22 元件清單 .24 系統(tǒng)源程序 .25 1 第一章 緒論 1.1 目的和意義 現(xiàn)代社會已經(jīng)邁上了信息化的步伐,微電子技術(shù)的發(fā)展也越來越快,單片 機(jī)的運(yùn)用也日漸廣泛。無論是通信業(yè)的學(xué)生,老師或者是研發(fā)人員,對于單片 機(jī)的運(yùn)用均青睞有加,因此單片機(jī)已成為研發(fā)人員必須掌握的能力之一,而且 單片機(jī)也會發(fā)展成為一個高薪行業(yè)。 而時鐘作為電子類的一個小設(shè)計,不僅深受人們的喜愛,也是單片機(jī)實(shí)驗 中一個非常常見的題目。由于單片機(jī)給人有很大的發(fā)揮空間,是以會對制作人 以高要求對待,并且在掌握設(shè)計的同時程序要以簡潔為主,功能上要能滿足人 們需求,顯示界面要大膽創(chuàng)新,標(biāo)新立異。lcd 顯示的數(shù)字時鐘清晰直觀的顯 示準(zhǔn)確時間、而且精度很是高、并且有夜視功能,還擴(kuò)展出多種與人方便功能。 本設(shè)計中的簡易燈光時鐘既是一個時間控制系統(tǒng),又包含溫度檢測系統(tǒng), 既能準(zhǔn)確無誤的顯示出正確的高精度的時間又能檢測當(dāng)前的溫度 本文提出了以 stc51 系列單片機(jī)為核心,采用 ds1302 作為電子時鐘的核 心芯片的設(shè)計方案,與溫度傳感器 ds18b20、led 顯示、時鐘芯片 ds1302、 按鍵等模塊組成硬件的電子電路系統(tǒng)。顯示采用 lcd,以實(shí)現(xiàn)顯示年、月、日、 時、分鐘、秒、星期、溫度。設(shè)計過程中使用 keilc51 軟件,采用 c 語言編程; 此外,還要從多方面保障系統(tǒng)的穩(wěn)定性,提高系統(tǒng)的性能指標(biāo) 本設(shè)計可以對時間進(jìn)行實(shí)時的校準(zhǔn),讀取時間方便、能直觀顯示實(shí)時時間、 功能方面體現(xiàn)多樣話、簡單明了的電路、低廉的成本都是該設(shè)計的優(yōu)點(diǎn),滿足 未來電子設(shè)計的發(fā)展要求,市場前景好。 1.2 本系統(tǒng)實(shí)現(xiàn)的主要功能 本系統(tǒng)設(shè)計制作一個基于單片機(jī)的簡易燈光時鐘。能實(shí)現(xiàn)以下幾種功能: (1)鍵盤掃描,設(shè)計按鍵掃描程序下載到單片機(jī),每個按鍵賦予一個功能, 單片機(jī)通過掃描程序檢測用戶按鍵,確定后實(shí)現(xiàn)功能。 (2)通過單片機(jī)的 ds1302 的數(shù)據(jù)采集,并實(shí)時顯示年,月,日,時,分, 秒,和星期在液晶屏上,并且可以設(shè)置時間,系統(tǒng)不供電的情況時鐘芯片依然 可以由后備紐扣電池供電,使其掉電時間保存。 (3)用戶可以設(shè)定鬧鐘時間,當(dāng)時間到了之后,系統(tǒng)自動驅(qū)動蜂鳴器發(fā)響。 (4)系統(tǒng)附帶有整點(diǎn)報時功能,以及任何時候通過按鍵報時功能。 (5)系統(tǒng)還帶有測溫功能,單片機(jī)可以實(shí)時讀取 ds18b20 的溫度數(shù)據(jù)并在 液晶上顯示。 2 第二章 總體方案論證與設(shè)計 本系統(tǒng)可以由主控、顯示、時鐘、溫度檢測、電源等模塊組成,以下是討 論這幾個模塊的選型和論證。 2.1 主控模塊的選型和論證 方案一: 采用 msp430f149,msp430f169 系列單片機(jī),該單片機(jī)是 ti 公司 1996 年 開始推向市場的一種 16 位超低功耗的混合信號處理器。其內(nèi)部集成了很多模擬 電路、數(shù)字電路和微處理器,提供 12 位 adc,具有采樣、保持、自動掃描, 有 2 個 16 位計數(shù)器等強(qiáng)大的功能。但芯片價格昂貴,不適合一般的設(shè)計和開發(fā)。 方案二 采用 52 系列的單片機(jī),該單片機(jī)具有可靠性高,價格成本低,解密難,高 性能的特點(diǎn),32 個 io 口,且 stc 系列的單片機(jī)可以在線編程、調(diào)試。 因此選用方案二中的 52 系列單片機(jī)作為主控芯片。 2.2 顯示模塊的選型和論證 方案一: 用點(diǎn)陣式數(shù)碼管顯示,它是由發(fā)光二極管八行和八列顯示文本,更適合用 于顯示文字,如進(jìn)行數(shù)字顯示使用就太浪費(fèi)了,而且價格比較高,所以不用此 種作為顯示。 方案二: 使用 led 數(shù)碼管動態(tài)掃描, led 數(shù)碼管雖然價格適中,最適合數(shù)字顯示, 采用動態(tài)掃描的方法與單片機(jī)連接,單片機(jī)口線占用得少。但是由于數(shù)碼管動 態(tài)掃描需要借助 74ls164 移位寄存器,74ls164 在調(diào)試的時候,電路方面常出 故障,所以不采用 led 數(shù)碼管作為顯示。 方案三: 選用 lcd 液晶顯示屏,它可以清晰可見的顯示文字,圖像,功能很是強(qiáng)大, 關(guān)于本設(shè)計的要求,我們使用一個 lcd1602 即能滿足要求,成本低,雖然接口 線有點(diǎn)多,但是調(diào)試會很方便。 所以本設(shè)計中方案三中的 lcd1602 液顯示屏作為顯示模塊。 2.3 時鐘芯片的選型和論證 方案一: 用程序控制單片機(jī)實(shí)現(xiàn)時間計數(shù)。采取該方案雖然能夠縮小時鐘芯片的使 用量,節(jié)省成本開支,但是,誤差會非常大。 方案二: 采用 ds1302 時鐘芯片實(shí)現(xiàn)時鐘,ds1302 是美國 dallas 公司推出的一 種性能比較高、性價比高,功耗較低、帶 ram 的實(shí)時時鐘電路,它可以對年、 月、日、時鐘、分鐘、秒以及星期進(jìn)行計時,還能進(jìn)行閏年補(bǔ)償,工作電壓為 2.5v5.5v。 ds1302 里面含有一個 8*31 的 ram 存儲器,用于臨時存放數(shù)據(jù)。 ds1302 主要特點(diǎn)是采用串行數(shù)據(jù)傳輸,具有可編程充電和掉電保護(hù)功能,采用 普通 32.768khz 晶振作為標(biāo)準(zhǔn)時鐘。 3 因此本設(shè)計中采用方案二中的 ds1302 作為時鐘模塊 2.4 溫度檢測模塊的選型和論證 方案一: ad590 感溫電流源的輸出電流與絕對溫度成比例。電源電壓在 4 v30 v 范圍內(nèi),ad590 可充當(dāng)一個高阻抗,調(diào)節(jié)系數(shù)為 1 a/k 為恒流調(diào)節(jié)器。通過激 光調(diào)整的片內(nèi)薄膜電阻,用于校準(zhǔn)裝置,使該器件在 25c 時有 298.2 a 的輸 出電流。由于該芯片輸出為模擬量還同時需要 ad 轉(zhuǎn)換器對其進(jìn)行采集。因此不 適用于本設(shè)計 方案二: ds18b20 數(shù)字溫度傳感器耐磨耐碰,體積小,主要根據(jù)應(yīng)用場合的不同而 外觀不同,ds18b20 用途廣泛,如電纜溝測溫,機(jī)房測溫,彈藥庫測溫、農(nóng)業(yè) 大棚測溫,高爐水循環(huán)測溫,鍋爐測溫,潔凈室測溫等場合。使用場合廣,價 格低,實(shí)用性強(qiáng)。 因此本設(shè)計采用方案二中的 ds18b20 芯片進(jìn)行溫度采集。 2.5 整點(diǎn)報時模塊的選型和論證 整點(diǎn)報時模塊集成的語音芯片 ny3p035,ny3p035 是一款具有 pwm 輸出 的 otp 語音標(biāo)準(zhǔn)芯片,該芯片內(nèi)部集成了 09 以及一些常用單位的錄音。使用 時只要根據(jù)錄音存放的位置依次讀出就能播報出當(dāng)前的重量和價格。 2.6 電源模塊 方案一: 選用以下兩塊芯片 lm337 和 lm317 自制一個可調(diào)的電源模塊,lm317 和 lm337 分別是三端可調(diào)式輸出正電壓穩(wěn)壓器和三端可調(diào)式輸出負(fù)電壓穩(wěn)壓器。 通過這 2 塊芯片,我們可以很容易的得到正負(fù) 5v,正負(fù) 12v 和正 3v 電壓,但 由于本設(shè)計需求各模塊體積小,而自制電源體積較大,故不采用此方案。 方案二: 采用 usb 接口供電,既能夠下載程序,也能供電,一舉兩得,故采用此方 案。 2.7 系統(tǒng)整體設(shè)計概述 語音芯片 揚(yáng)聲器 蜂鳴器模塊 主控模塊 單片機(jī) 液晶顯示模塊 l c d 1 6 0 2 溫度測量模塊 d s 1 8 b 2 0 時鐘模塊 d s 1 3 0 2 按鍵模塊 圖 2.7 系統(tǒng)結(jié)構(gòu)框圖 4 本系統(tǒng)是以 stc89c52 單片機(jī)為核心,首先要對系統(tǒng)進(jìn)行初始化,然后單 片機(jī)對鍵盤,ds18b20 等模塊進(jìn)行掃描,實(shí)現(xiàn)對鍵盤的響應(yīng),實(shí)時顯示分鐘、 秒等,對 1602 液晶顯示,鬧鐘、溫度測量等功能,其中,單片機(jī)起到控制和協(xié) 調(diào)各功能模塊的工作。系統(tǒng)的結(jié)構(gòu)框圖見圖 2.7。 5 第三章.系統(tǒng)硬件電路設(shè)計 3.1 主控模塊 單片機(jī)在全部設(shè)計中起到了統(tǒng)領(lǐng)全局,承前啟后的作用,在該設(shè)計中單片 機(jī)需要完成的任務(wù)主要有對鍵盤掃描,對 ds18b20 進(jìn)行及時的檢測,驅(qū)動蜂鳴 器,驅(qū)動液晶顯示需要顯示的內(nèi)容,所以,在本設(shè)計中我們選用 52 系列的單片 機(jī)作為系統(tǒng)的總控制模塊。 如圖 3.1 所示為 stc89c52 單片機(jī)的結(jié)構(gòu)框圖。 時鐘電路 r o m / e p r o m / f l a s h 4 k b r a m 1 2 8 b s f r 2 1 個 定時個 / 計數(shù)器 2 c p u 總線控制 中斷系統(tǒng) 5 個中斷源 2 個優(yōu)先級 串行口 全雙工 1 個 4 個并行口 x t a l 2 x t a l 1 r s t e a a l e p s e n p 0 p 1 p 2 p 3 v s s v c c 圖 3.1 stc89c52 單片機(jī)結(jié)構(gòu)框圖 3.1.1 單片機(jī)的最小系統(tǒng)設(shè)計 6 p1.02345/mosi7ck8ret9xalvnu供+yhzpfw-bu 圖 3.1.1 單片機(jī)最小系統(tǒng)電路圖 圖 3.1.1 所示的電路圖是單片機(jī)在本設(shè)計中的最小系統(tǒng),時鐘電路選用 12m 的晶振,作用是為單片機(jī)提供一個時鐘基準(zhǔn),其執(zhí)行一條指令需要一個機(jī) 械周期,單片機(jī)的復(fù)位電路是讓單片機(jī)的狀態(tài)回到剛上電的狀態(tài),因為 p0 口是 一個漏極準(zhǔn)雙向的 i/o 口,所以需要上拉電阻才能正常工作。 3.2 lcd 液晶顯示器簡介 由于本設(shè)計中要求顯示界面顯示一些參數(shù),因此這里選用了 lcd1602 作為 界面顯示,可以把一些相關(guān)的參數(shù)進(jìn)行顯示。 3.2.1 液晶原理介紹 顯示部分選用 lcd1602 字符型液晶,輔以必要的外接電路組成顯示模塊, 單片機(jī)控制帶字符的 lcd1602 查找其字符庫,從中選出要顯示的字符,設(shè)置光 標(biāo),將之前查找到的字符在此對應(yīng)即可。 3.2.2 液晶模塊簡介 lcd1602 液晶模塊的引腳圖如圖 3.2.2 所示。 圖 3.2.2 lcd1602 引腳圖 7 液晶寄存器選擇控制如表 1。 表 1 寄存器選擇控制 rs r/w 操作說明 0 0 寫入指令寄存器(清除屏幕內(nèi)容顯示等) 0 1 讀位地址計數(shù)器(db0db6)和 busy flag(db7) 1 0 寫入數(shù)據(jù)寄存器(顯示各字型等) 1 1 從數(shù)據(jù)寄存器讀取數(shù)據(jù) 3.2.3 液晶顯示部分與 stc89c52 的接口 如圖 3.2.3 所示。用 stc89c52 的 p0 口作為數(shù)據(jù)線,用 p1.2、p1.1、p1.0 分別作為 lcd 的 en、r/w、rs。其中 en 作為片選信號,在出現(xiàn)下降沿的時 候觸發(fā),rs 是寄存器選擇信號, r/w 是讀寫信號,在整個顯示模塊中,我們 主要設(shè)計步驟如下:首先進(jìn)行清屏,顯示模塊初始化。然后將接口數(shù)據(jù)位設(shè)置 為 8 位,顯示行數(shù)設(shè)置為 2 行,設(shè)定字型為 57 點(diǎn)陣,然后取消光標(biāo)和字體閃 爍, 顯示設(shè)置為整體顯示,最后設(shè)置為正向增量方式且不移位。將要顯示的字 符送到對應(yīng)的數(shù)組中,最后進(jìn)行統(tǒng)一顯示。 p.345/mosi6ckret9xalvnu供+yhzpfwdblcd-u 圖 3.2.3 lcd1602 與 stc89c52 的接口 3.3 鍵盤模塊設(shè)計 本按鍵模塊按鍵一端接單片機(jī)的 i/o 口,另一端接地,由于單片機(jī)的 i/o 8 口內(nèi)部都有上拉電阻,所以在沒有按鍵按下的時候,我們會檢測到高電平,當(dāng) 按鍵被按下,i/o 口與地面等電勢,此時為低電平,因此通過 i/o 端口的狀態(tài)變 化檢測即可知道按下了哪個按鍵。4 個按鍵分別代表以下功能,第一為功能選 擇按鍵,可以切換不同參數(shù)設(shè)置界面,第二個為切換按鍵,可以切換時、分、 秒等參數(shù)進(jìn)行設(shè)置,第三個為增加按鍵,第四個為減少按鍵。其中按鍵還可以 設(shè)置鬧鐘,重置時間等功能。鍵盤模塊電路圖如圖 3.3 所示。p1.0235/mosi67ckret9xalvnu供+w-b 圖 3.3 鍵盤模塊電路圖 3.4 蜂鳴器模塊設(shè)計 本設(shè)計還帶有鬧鐘功能,用戶可以通過按鍵設(shè)定好鬧鐘,當(dāng)當(dāng)前時間跟鬧 鐘時間一致的時候,單片機(jī)就可以驅(qū)動蜂鳴器發(fā)聲。 通過試驗,發(fā)現(xiàn)單片機(jī)的 i/o 口無法直接驅(qū)動蜂鳴器,是因為蜂鳴器的工 作電流一般比較大,所以我們利用三極管開關(guān)電路來提供足夠大的驅(qū)動電流。 本處選用的是 8550 三極管,它是一個 pnp 型的三極管,當(dāng)基極給低電平的時候 三極管導(dǎo)通,這時候蜂鳴器發(fā)聲,當(dāng)給高電平的時候,三極管關(guān)閉,蜂鳴器不 發(fā)聲。 蜂鳴器模塊的電路圖如圖 3.4 所示。 q 圖 3.4 蜂鳴器驅(qū)動電路電路圖 3.5 時鐘模塊的設(shè)計 在本設(shè)計中,時鐘模塊的設(shè)計,我們把 ds1302 這塊串行日歷時鐘芯片作為 核心,因為 ds1302 具有與單片機(jī)的連線很少,節(jié)省單片機(jī)的系統(tǒng)資源的有點(diǎn) ,單片機(jī)通過 i/o 讀取 ds1302 上的數(shù)據(jù)可以得到實(shí)時時間。 由于采用單片機(jī)作為計時模塊會占用硬件資源,而且采用中斷、查詢等方 式也要耗費(fèi)單片機(jī)的資源,可能會造成很大的浪費(fèi),而采用 ds1302 卻可以很好 9 的解決這類問題。 ds1302 是美國 dallas 公司推出的一種帶 ram、高性能、能對年、月、日、 星期、時、分、秒進(jìn)行計時,并且低功耗,可以進(jìn)行閏年補(bǔ)償?shù)臅r鐘電路,工 作電壓為 2.5v5.5v。采用 24 小時或是 12 小時的格式。此外,ds1302 采用雙 電源供電,主電源和備用電源,vcc1 作為備用電源,在模塊整體供電中提供電 壓相對低的電壓,而 vcc2 作為主電源,vcc1 和 vcc2 的供電模式?jīng)Q定如下: vcc2vcc1+0.2 時 由 vcc2 供電 vcc2 /單片機(jī)頭文件 #include“l(fā)cd1602.h“ /液晶 #include“ds1302.h“ /時鐘 #include“key.h“ /按鍵 #include“ds18b20.h“ /溫度傳感器 void displayinit(void) /初始化 lcd 和時鐘的顯示,初始化定時器 lcdinit(); /初始化液晶 void display1(void)/顯示正常界面,時間的函數(shù) ds1302_read_time(); /讀取 ds1302 時間 lcddispnum(1,1,(nian4); /在液晶上顯示年的十位 lcddispnum(2,1,(nian/在液晶上顯示年的個位 lcddispchar(3,1,-); /在液晶上顯示字符- lcddispnum(4,1,(yue4); /在液晶上顯示月的十位 lcddispnum(5,1,(yue /在液晶上顯示月的個位 lcddispchar(6,1,-); /在液晶上顯示字符- lcddispnum(7,1,(ri4); /在液晶上顯示日的十位 lcddispnum(8,1,(ri /在液晶上顯示日的個位 lcddispnum(1,2,(shi4); /在液晶上顯示十的十位 lcddispnum(2,2,(shi /在液晶上顯示十的個位 lcddispchar(3,2,:); /在液晶上顯示顯示字符: lcddispnum(4,2,(fen4); /在液晶上顯示分的十位 lcddispnum(5,2,(fen /在液晶上顯示分的個位 lcddispchar(6,2,:); /在液晶上顯示顯示字符: lcddispnum(7,2,(miao4); /在液晶上顯示秒的十位 lcddispnum(8,2,(miao/在液晶上顯示秒的個位 xingqi = (xingqi /星期 if(xingqi = 1) /判斷并顯示星期的字符 27 lcddispstring(12,1,“mon.“); /如果星期等于 1 則顯示 mon. else if(xingqi = 2) lcddispstring(12,1,“tues“); /如果星期等于 2 則顯示 tues else if(xingqi = 3) lcddispstring(12,1,“wed.“); /如果星期等于 3 則顯示 wed. else if(xingqi = 4) lcddispstring(12,1,“thu.“); /如果星期等于 4 則顯示 thu. else if(xingqi = 5) lcddispstring(12,1,“fri.“); /如果星期等于 5 則顯示 fri. else if(xingqi = 6) lcddispstring(12,1,“sat.“); /如果星期等于 6 則顯示 sat. else if(xingqi = 7) lcddispstring(12,1,“sun.“); /如果星期等于 7 則顯示 sun. fena = (fen /把分的 bcd 碼轉(zhuǎn)成 10 進(jìn)制 shia = (shi /把時的 bcd 碼轉(zhuǎn)成 10 進(jìn)制 /鬧鈴,判斷是否有鬧鈴。如果時間到,則蜂鳴器響,否則不響 if(alarmflag0 = 1 else beep = 1; /轉(zhuǎn)點(diǎn)時的鬧鐘標(biāo)志位要清零 if(shi = 0 if(fen = 0 if(shi4)!=0) if(shi4)=1) music(l_shi); else music(shi4)+1); music(l_shi); if(shi else music(shi music(l_dian); music(l_zheng); /讀取溫度的值 readtemperature(); /顯示溫度的值 lcddispstring(12,2,temperaturedate); void main(void) /初始化操作 displayinit(); music(l_1); while(1)/死循環(huán) if(gfunctioncount = 0)/判斷是否為正常顯示界面 display1();/顯示子函數(shù) 1 keyscan(); /按鍵掃描子函數(shù) #include #include“l(fā)cd1602.h“ /* function: void delayn40us(unsigned int n) description: 延時函數(shù),延時 40us 的整數(shù)倍,傳入值 n 代表延時 時間到 n *40us,不能實(shí)現(xiàn)準(zhǔn)確延時,只能實(shí)現(xiàn)大 概時間的延時,利用的是指令實(shí)現(xiàn)延時功能。 calls: 沒有調(diào)用其它函數(shù) called by: void lcdwritecommand(unsigned char dat); void lcdwritedata(unsigned char dat); input: unsigned int n - 用于延時時間的確定,取值、 為 165535 output: 無 return: 無 */ 29 void delayn40us(unsigned int n) unsigned int i; unsigned char j; for(i=n;i0;i-) for(j=0;j 0 ; x-) for(y = 110 ; y 0 ; y-); void music(z) unsigned char i; shuju=0; rst=1; for(i=0;i0) shuju=1; for(i=0;i4) * 10);/把分的 bcd 碼轉(zhuǎn)成 10 進(jìn) 制 shi = (shi /把時的 bcd 碼轉(zhuǎn)成 10 進(jìn) 制 if(alarmflag0=1 /取消鬧鈴標(biāo)志位 else gfunctioncount+; /小菜單計數(shù)加一,進(jìn)入下一個設(shè)置的參 數(shù)界面 gtimecount = 0; /每次都從秒開始設(shè)定 if(gfunctioncount = 1 /讀取時鐘芯片的時間 miao = (miao /把秒的 bcd 碼轉(zhuǎn)成 10 進(jìn)制 fen = (fen /把分的 bcd 碼轉(zhuǎn)成 10 進(jìn)制 shi = (shi /把時的 bcd 碼轉(zhuǎn)成 10 進(jìn)制 ri = (ri /把日的 bcd 碼轉(zhuǎn)成 10 進(jìn)制 yue = (yue /把月的 bcd 碼轉(zhuǎn)成 10 進(jìn)制 nian = (nian /把年的 bcd 碼轉(zhuǎn)成 10 進(jìn)制 xingqi = (xingqi /把星期的 bcd 碼轉(zhuǎn)成 10 進(jìn)制 lcddispnum(7,2,(miao/10);/寫的是顯示光標(biāo)的前一個字符 lcdcursor(); /顯示光標(biāo) 35 else if(gfunctioncount = 2)/鬧鐘 1 設(shè)定 ds1302_set_time();/把增加的時間寫入 1302 lcdwritecommand(0x01);/*清除屏幕顯示*/ scan10msdelay();scan10msdelay();scan10msdelay();scan10msdelay();/延時 等到清屏 lcddispstring(2,1,“alarm clock“); /顯示字符串 lcddispnum(2,2,alarmclock00/10);/顯示鬧鐘值 lcddispnum(3,2,alarmclock00%10);/顯示鬧鐘值 lcddispchar(4,2,:); /顯示字符: lcddispnum(5,2,alarmclock01/10);/顯示鬧鐘值 lcddispnum(6,2,alarmclock01%10);/顯示鬧鐘值 lcddispchar(7,2,:); /顯示字符: lcddispnum(8,2,alarmclock02/10);/顯示鬧鐘值 lcddispnum(9,2,alarmclock02%10);/顯示鬧鐘值 if(alarmflag0) /判斷是否設(shè)定了鬧鐘 /如果設(shè)定了鬧鐘,顯示 on lcddispchar(12,2, );lcddispchar(14,2,n);lcddispchar(13,2,o); else/否則顯示 off lcddispchar(12,2,o);lcddispchar(14,2,f);lcddispchar(13,2,f); else if(gfunctioncount = 3)/此級菜單顯示時鐘是否需要復(fù)位 lcdnotcursor();/取消光標(biāo)顯示 lcdwritecommand(0x01);/*清除屏幕顯示*/ scan10msdelay();scan10msdelay();scan10msdelay();scan10msdelay(); lcddispstring(3,1,“reset clock“);/顯示字符串 else if(gfunctioncount = 4)/回主菜單 gfunctioncount = 0;/菜單計數(shù)清零 lcdwritecommand(0x01);/*清除屏幕顯示*/ scan10msdelay();scan10msdelay();scan10msdelay();scan10msdelay(); 36 while(!key1); /未松手時,不跳出循環(huán),避免誤檢測 /-/ if(key2 = 0) /同上,判斷第二個按鍵情況 /功能鍵 scan10msdelay();/延時消抖 if(key2 = 0) gtimecount+; /小菜單計數(shù)增加 if(gfunctioncount = 1 else if(gfunctioncount = 1 else if(gfunctioncount = 1 else if(gfunctioncount = 1 else if(gfunctioncount = 1 else if(gfunctioncount = 1 else if(xingqi = 2) lcddispstring(14,1,“e“); else if(xingqi = 3) lcddispstring(14,1,“d“); else if(xingqi = 4) lcddispstring(14,1,“u“); else if(xingqi = 5) lcddispstring(14,1,“i“); else if(xingqi = 6) lcddispstring(14,1,“t“); else if(xingqi = 7) lcddispstring(14,1,“n“); else if(gfunctioncount = 1 lcddispnum(7,2,(miao/10); else if(gfunctioncount = 2 doneflag0=1;lcddispstring(12,2,“ on“);lcddispnum(8,2,alarmclock02/10); else if(gfunctioncount = 2 else if(gfunctioncount = 2 else if(gfunctioncount = 2 doneflag0=0;lcddispchar(12,2,o);lcddispchar(14,2,f); lcddispchar(13,2,f);gtimecount=0; else if(gfunctioncount = 3) /重設(shè)時間 lcddispstring(4,2,“reset ok“); miao =0; /設(shè)定時間的值 fen =0; shi =0; ri =15; yue =4; xingqi=1; nian =12; ds1302_set_time();/將設(shè)定值寫入芯片 while(!key2); /松手檢測 /-/ if(key3 = 0) /同上,判斷第三個按鍵情況 /增加鍵 scan10msdelay(); if(key3 = 0) if(gfunctioncount = 1) /當(dāng)前時間的增加 switch (gtimecount)/根據(jù)小菜單計數(shù)值的不同來調(diào)整不同的值 case 0:/改變秒 miao+;/秒增加 if(miao = 60) /當(dāng)增加到 60 時要?dú)w 0 miao = 0; 38 lcddispnum(8,2,(miao%10);/顯示刷新 個位 lcddispnum(7,2,(miao/10); break; case 1:/改變分 fen+; if(fen = 60) fen = 0; lcddispnum(5,2,(fen%10); lcddispnum(4,2,(fen/10); break; case 2:/改變時 shi+; if(shi = 24) shi = 0; lcddispnum(2,2,(shi%10); lcddispnum(1,2,(shi/10); break; case 3:/改變?nèi)?ri+; if(ri = 32) ri = 1; lcddispnum(8,1,(ri%10); lcddispnum(7,1,(ri/10); break; case 4:/改變月 yue+; if(yue = 13) yue = 1; lcddispnum(5,1,(yue%10); lcddispnum(4,1,(yue/10); break; case 5:/改變年 nian+; if(nian = 100) 39 nian = 0; lcddispnum(2,1,(nian%10); lcddispnum(1,1,(nian/10); break; case 6:/改變星期 xingqi+; if(xingqi = 8) xingqi = 1; if(xingqi = 1) lcddispstring(12,1,“mon.“); else if(xingqi = 2) lcddispstring(12,1,“tues“); else if(xingqi = 3) lcddispstring(12,1,“wed.“); else if(xingqi = 4) lcddispstring(12,1,“thu.“); else if(xingqi = 5) lcddispstring(12,1,“fri.“); else if(xingqi = 6) lcddispstring(12,1,“sat.“); else if(xingqi = 7) lcddispstring(12,1,“sun.“); if(xingqi = 1) lcddispstring(14,1,“n“); else if(xingqi = 2) lcddispstring(14,1,“e“); else if(xingqi = 3) lcddispstring(14,1,“d“); else if(xingqi = 4) lcddispstring(14,1,“u“); else if(xingqi = 5) lcddispstring(14,1,“i“); else if(xingqi = 6) lcddispstring(14,1,“t“); else if(xingqi = 7) lcddispstring(14,1,“n“); break; /end switch /end if gfunctioncount = 1 if(gfunctioncount = 2) /鬧鐘+ 40 switch (gtimecount) case 1:/改變秒 alarmclock02+;/秒增加 if(alarmclock02 = 60) alarmclock02 = 0; lcddispnum(9,2,(alarmclock02%10);/顯示刷新 個位 lcddispnum(8,2,(alarmclock02/10); break; case 2:/改變分 alarmclock01+; if(alarmclock01 = 60) alarmclock01 = 0; lcddispnum(6,2,(alarmclock01%10); lcddispnum(5,2,(alarmclock01/10); break; case 3:/改變時 alarmclock00+; if(alarmclock00 = 24) alarmclock00 = 0; lcddispnum(3,2,(alarmclock00%10); lcddispnum(2,2,(alarmclock00/10); break; /end switch /end if gfunctioncount = 2 while(!key3); /-/ if(key4 = 0) /同上,判斷第二個按鍵情況 /減少鍵 scan10msdelay(); if(key4 = 0) if(gfunctioncount = 1) 41 switch (gtimecount) case 0:/改變秒 miao-;/秒減少 if(miao = -1) miao = 59; lcddispnum(8,2,(miao%10);/顯示刷新 個位 lcddispnum(7,2,(miao/10); break; case 1:/改變分 fen-; if(fen = -1) fen = 59; lcddispnum(5,2,(fen%10); lcddispnum(4,2,(fen/10); break; case 2:/改變時 shi-; if(shi = -1) shi = 23; lcddispnum(2,2,(shi%10); lcddispnum(1,2,(shi/10); break; case 3:/改變?nèi)?ri-; if(ri = -1) ri = 31; lcddispnum(8,1,(ri%10); lcddispnum(7,1,(ri/10); break; case 4:/改變月 yue-; if(yue = -1) yue = 12; lcddispnum(5,1,(yue%10); 42 lcddispnum(4,1,(yue/10); break; case 5:/改變年 nian-; if(nian = -1) nian = 99; lcddispnum(2,1,(nian%10); lcddispnum(1,1,(nian/10); break; case 6:/改變星期 xingqi-; if(xingqi = -1) xingqi = 1; if(xingqi = 7) lcddispstring(12,1,“mon.“); else if(xingqi = 2) lcddispstring(12,1,“tues“); else if(xingqi = 3) lcddispstring(12,1,“wed.“); else if(xingqi = 4) lcddispstring(12,1,“thu.“); else if(xingqi = 5) lcddispstring(12,1,“fri.“); else if(xingqi = 6) lcddispstring(12,1,“sat.“); else if(xingqi = 7) lcddispstring(12,1,“sun.“); if(xingqi = 1) lcddispstring(14,1,“n“); else if(xingqi = 2) lcddispstring(14,1,“e“); else if(xingqi = 3) lcddispstring(14,1,“d“); else if(xingqi = 4) lcddispstring(14,1,“u“); else if(xingqi = 5) lcddispstring(14,1,“i“); else if(xingqi = 6) lcddispstring(14,1,“t“); else if(xingqi = 7) 43 lcddispstring(14,1,“n“); break; / end switch / end if gfunctioncount = 1 if(gfunctioncount = 2) /鬧鐘- switch (gtimecount) case 1:/改變秒 alarmclock02-; if(alarmclock02 = 255) alarmclock02 = 59; lcddispnum(9,2,(alarmclock02%10);/顯示刷新 個位 lcddispnum(8,2,(alarmclock02/10); break; case 2:/改變分 alarmclock01-; if(alarmclock01 = 255) alarmclock01 = 59; lcddispnum(6,2,(alarmclock01%10); lcddispnum(5,2,(alarmclock01/10); break; case 3:/改變時 alarmclock00-; if(alarmclock00 = 255) alarmclo

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論