簡易家電定時控制裝置單片機課設(shè)_第1頁
簡易家電定時控制裝置單片機課設(shè)_第2頁
簡易家電定時控制裝置單片機課設(shè)_第3頁
簡易家電定時控制裝置單片機課設(shè)_第4頁
簡易家電定時控制裝置單片機課設(shè)_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、課程設(shè)計(論文)任務(wù)書 信息工程 學(xué)院 計算機科學(xué)與技術(shù) 專業(yè) 2014-1 班 一、課程設(shè)計(論文)題目 簡易家電定時控制裝置 二、課程設(shè)計(論文)工作自 2017 年 6 月 19 日起至 2017 年 6 月 29 日止。三、課程設(shè)計(論文) 地點: 5#402 四、課程設(shè)計(論文)內(nèi)容要求:1本課程設(shè)計的目的(1)使學(xué)生掌握系統(tǒng)各功能模塊的基本工作原理; (2)培養(yǎng)學(xué)生基本掌握電路設(shè)計的基本思路和方法; (3)使學(xué)生掌握接收系統(tǒng)調(diào)試;(4)培養(yǎng)學(xué)生分析、解決問題的能力;(5)提高學(xué)生的科技論文寫作能力。 2課程設(shè)計的任務(wù)及要求1)基本要求:(1)對家電的開啟進行預(yù)定時控制,能顯示并設(shè)置

2、預(yù)定時間;(2)對家電的工作時間進行定時控制,能顯示并通過鍵盤設(shè)置工作時間的長短; (3)工作時間到了后,并能聲音報警;(4)設(shè)定時間時,黃色發(fā)光二極管點亮,啟動定時后,紅色發(fā)光二極管點亮。2)創(chuàng)新要求: 在基本要求達(dá)到后,可進行創(chuàng)新設(shè)計,如改善電路性能;對系統(tǒng)進行仿真分析。3)課程設(shè)計論文編寫要求(1)要按照書稿的規(guī)格打印謄寫畢業(yè)論文(2)論文包括目錄、緒論、正文、小結(jié)、參考文獻(xiàn)、謝辭、附錄等(3)畢業(yè)論文裝訂按學(xué)校的統(tǒng)一要求完成4)答辯與評分標(biāo)準(zhǔn): (1)完成原理分析:20分; (2)完成設(shè)計過程(含翻譯):40分; (3)完成調(diào)試:20分;(4)回答問題:20分。5)參考文獻(xiàn):(1)鄧胡

3、濱 .單片機原理及應(yīng)用技術(shù)基于Keil C和Proteus仿真 人民郵電出版社 6)課程設(shè)計進度安排內(nèi)容 天數(shù)地點構(gòu)思及收集資料 2圖書館組裝與調(diào)試 5實驗室撰寫論文 3圖書館、實驗室學(xué)生簽名: 2017 年 6 月 19 日課程設(shè)計(論文)評審意見(1)完成原理分析(20分):優(yōu)()、良()、中()、一般()、差(); (2)設(shè)計分析和翻譯能力(40分):優(yōu)()、良()、中()、一般()、差(); (3)完成調(diào)試(20分):優(yōu)()、良()、中()、一般()、差();(4)回答問題(20分):優(yōu)()、良()、中()、一般()、差();(5)格式規(guī)范性及考勤是否降等級:是()、否()評閱人: 職

4、稱: 副教授 2017 年 6 月 29 日目錄緒論1一、 設(shè)計任務(wù)及要求21.1 設(shè)計目的21.2 基本功能要求21.3拓展功能設(shè)計21.4 功能詳細(xì)設(shè)計3二、硬件電路設(shè)計及描述32.1AT89C52單片機32.2 DS1302數(shù)碼管顯示時鐘42.3矩陣按鍵電路52.4LCD液晶顯示屏電路62.5LED數(shù)碼管動態(tài)顯示72.674HC138譯碼器92.7報警電路10三、程序設(shè)計思想及流程11四、電路的安裝及調(diào)試124.1 安裝步驟124.2 電路的調(diào)試12五、 總結(jié)12六、參考文獻(xiàn)13七、附錄137.1 實物圖137.2仿真圖137.3 部分程序清單14緒論單片微計算機自20世紀(jì)70年代問世以

5、來,已對人類社會產(chǎn)生了巨大的影響。尤其是美國Intel公司生產(chǎn)的MCS-51系列單片機,由于其具有集成度高、處理功能強、可靠性高、系統(tǒng)結(jié)構(gòu)簡單、價格低廉、易于使用等優(yōu)點,在世界范圍內(nèi)已經(jīng)得到廣泛的普及和應(yīng)用。此外,世界各大公司以MCS-51單片機基本內(nèi)核為核心的各種擴展型、增強型的新型的新型單片機不斷推出,所以在今后若干年內(nèi),MCS-51系列以及世界其它各大公司生產(chǎn)的與其兼容的各種增強型、擴展型的單片機,仍是我國單片機應(yīng)用領(lǐng)域的主流型。目前在工業(yè)控制、智能儀器儀表、辦公自動化、家用電器登諸多領(lǐng)域,到處都可看見單片機的蹤影,單片機技術(shù)開發(fā)和應(yīng)用水平已成為一個國家工業(yè)發(fā)展水平的標(biāo)志之一。此裝置硬件

6、使用AT89C52單片機為控制核心,DS1302作為時鐘芯片并同時在掉電時儲存資料,LCD1602液晶顯示屏以及LED數(shù)碼管作為顯示與用戶交互,使用5V繼電器控制外接電器電源的開啟或關(guān)閉。軟件采用模塊化設(shè)計、驅(qū)動、控制、引腳、變量定義等采用多文件編譯,即方便自己設(shè)計修改也方便他人理解。這款家電定時器實現(xiàn)了時鐘顯示,預(yù)定時間設(shè)置、定時操作便捷設(shè)置、報警功能、系統(tǒng)狀態(tài)提示功能。關(guān)鍵詞:單片機;定時控制;AT89S52;第 0 頁1、 設(shè)計任務(wù)及要求1.1 設(shè)計目的根據(jù)本學(xué)年所學(xué)的單片機及微機接口的理論知識設(shè)計裝置的電路結(jié)構(gòu)和相應(yīng)軟件程序設(shè)計。提高學(xué)生實踐能力,培養(yǎng)學(xué)生發(fā)現(xiàn)問題、解決問題的能力,鍛煉

7、學(xué)生理論聯(lián)系實際、綜合應(yīng)用的能力。1.2 基本功能要求(1)對家電的開啟進行預(yù)定時控制,能顯示并設(shè)置預(yù)定時間;(2)對家電的工作時間進行定時控制,能顯示并通過鍵盤設(shè)置工作時間的長短;(3)工作時間到了后,并能聲音報警;(4)設(shè)定時間時,黃色發(fā)光二極管點亮,啟動定時后,紅色發(fā)光二極管點亮。1.3拓展功能設(shè)計(1)使用LCD液晶顯示屏顯示定時時間,方便使用者的實際操作使用。(2)采用矩陣鍵盤進行時間設(shè)置。以使得裝置的時間設(shè)置操作更加的人性化。(3)使用8個LED燈提示裝置所處于的狀態(tài)。當(dāng)LED滾動顯示時表示家電處于閑置狀態(tài),當(dāng)流水燈全部顯示時表示家電處于工作狀態(tài)。1.4 功能詳細(xì)設(shè)計裝置的當(dāng)前時間

8、顯示是用6個數(shù)碼管實現(xiàn)的,顯示格式為“時時:分分:秒秒”。當(dāng)前日期以及定時時間是在LCD液晶顯示屏上顯示。家電工作前程序控制LED燈流動點亮,家電工作后程序控制LED燈全部點亮。矩陣鍵盤的控制功能為: (1) K1、K2、K3、K5、K6、K7、K9、K10、K11、K13分別對應(yīng)數(shù)字19以及數(shù)字0。用于設(shè)置日期時間以及定時 時間的數(shù)值輸入。 (2) K4、K8、K12、K16對應(yīng)光標(biāo)移動上、左、下、右方向。 (3) K14、K15分別對應(yīng)ESC鍵和回車鍵。二、硬件電路設(shè)計及描述2.1AT89C52單片機AT89C52是一個低電壓,高性能CMOS 8位單片機,片內(nèi)含8k bytes的可反復(fù)擦寫

9、的Flash只讀程序存儲器和256 bytes的隨機存取數(shù)據(jù)存儲器(RAM),器件采用ATMEL公司的高密度、非易失性存儲技術(shù)生產(chǎn),兼容標(biāo)準(zhǔn)MCS-51指令系統(tǒng),片內(nèi)置通用8位中央處理器和Flash存儲單元,AT89C52單片機在電子行業(yè)中有著廣泛的應(yīng)用。AT89C52有40個引腳,32個外部雙向輸入/輸出(I/O)端口,同時內(nèi)含2個外中斷口,3個16位可編程定時計數(shù)器,2個全雙工串行通信口,2 個讀寫口線,AT89C52可以按照常規(guī)方法進行編程,也可以在線編程。其將通用的微處理器和Flash存儲器結(jié)合在一起,特別是可反復(fù)擦寫的 Flash存儲器可有效地降低開發(fā)成本。 圖2-12.2 DS13

10、02數(shù)碼管顯示時鐘1 DS1302簡介 DS1302 是美國DALLAS公司推出的一款涓流充電時鐘芯片。DS1302時鐘芯片被廣泛應(yīng)用于電話、傳真、便攜式儀器等產(chǎn)品領(lǐng)域,它的主要性能指標(biāo)如下。(1) DS1302是一個實時時鐘芯片,可以提供秒、分、小時、日期、月、年等信息,并且還有軟件自動調(diào)整的能力,可以配置AM/PM來決定采用24小時格式還是12小時格式。(2) 擁有31字節(jié)數(shù)據(jù)存儲RAM。(3) 串行I/O通信方式,相對并行來說比較節(jié)省IO口的使用。(4) DS1302的工作電壓比較寬,在2.05.5V的范圍內(nèi)部都可以正常工作。(5) DS1302這種時鐘芯片功耗一般都很低,它在工作電壓2

11、.0V的時候工作電流小于300nA。(6) DS1302共有8個引腳,有兩種封裝形式。(7) 當(dāng)工作電壓是5V的時候,兼容標(biāo)準(zhǔn)的TTL電平標(biāo)準(zhǔn)。(8) DS1302有兩個電源輸入,一個是主電源,另一個是備用電源??梢允褂秒姵鼗蛘叽笮碗娙荨R允乖谙到y(tǒng)掉電的情況下,時鐘還會繼續(xù)走。2 DS1302結(jié)構(gòu)DS1302的引腳排列,其中Vcc2為主電源,VCC1為后備電源。在主電源關(guān)閉的情況下,也能保持時鐘的連續(xù)運行。DS1302由Vcc1或Vcc2兩者中的較大者供電。當(dāng)Vcc2大于Vcc1+0.2V時,Vcc2給DS1302供電。當(dāng)Vcc2小于Vcc1時,DS1302由Vcc1供電。X1和X2是振蕩源,

12、外接32.768kHz晶振。RST是復(fù)位/片選線,通過把RST輸入驅(qū)動置高電平來啟動所有的數(shù)據(jù)傳送。RST輸入有兩種功能:首先,RST接通控制邏輯,允許地址/命令序列送入移位寄存器;其次,RST提供終止單字節(jié)或多字節(jié)數(shù)據(jù)傳送的方法。當(dāng)RST為高電平時,所有的數(shù)據(jù)傳送被初始化,允許對DS1302進行操作。如果在傳送過程中RST置為低電平,則會終止此次數(shù)據(jù)傳送,I/O引腳變?yōu)楦咦钁B(tài)。上電運行時,在Vcc>2.0V之前,RST必須保持低電平。只有在SCLK為低電平時,才能將RST置為高電平。I/O為串行數(shù)據(jù)輸入輸出端(雙向),后面有詳細(xì)說明。SCLK為時鐘輸入端。 下圖為DS1302的引腳功能

13、圖:圖2-2 DS1302引腳圖2.3矩陣按鍵電路矩陣按鍵電路如圖2-3所示。圖2-3按鍵電路矩陣鍵盤又稱為行列式鍵盤,它是用4條I/O線作為行線,4條I/O線作為列線組成的鍵盤。在行線和列線的每一個交叉點上,設(shè)置一個按鍵。這樣鍵盤中按鍵的個數(shù)是4×4個。這種行列式鍵盤結(jié)構(gòu)能夠有效地提高單片機系統(tǒng)中I/O口的利用率。工作時先從P1口的高四位輸出低電平,低四位輸出高電平,從P1口的低四位讀取鍵盤狀態(tài)。再從P1口的低四位輸出低電平,高四位輸出高電平,從P1口的高四位讀取鍵盤狀態(tài)。將兩次讀取結(jié)果組合起來就可以得到當(dāng)前按鍵的特征編碼。使用上述方法我們得到16個鍵的特征編碼。2.4LCD液晶顯

14、示屏電路(1)、LCD1602簡介1602液晶顯示屏可以顯示2行,每行16個字符的液晶。它的工作電壓是4.55.5V,對于這點在設(shè)計電路的時候,直接按照5V系統(tǒng)設(shè)計,但是保證5V系統(tǒng)最低不能低于4.5V。在5V工作電壓下測量它的工作電流是2mA。這個2mA僅僅是指液晶,而它的黃綠背光都是LED做的,所以功耗不會太小。(2) 、LCD1602管腳功能1602采用標(biāo)準(zhǔn)的16腳接口,其中:第1腳:VSS為電源地第2腳:VCC接5V電源正極第3腳:V0為液晶顯示器對比度調(diào)整端,接正電源時對比度最弱,接地電源時對比度最高(對比度過高時會 產(chǎn)生“鬼影”,使用時可以通過一個10K的電位器調(diào)整對比度)。第4腳

15、:RS為寄存器選擇,高電平1時選擇數(shù)據(jù)寄存器、低電平0時選擇指令寄存器。第5腳:RW為讀寫信號線,高電平(1)時進行讀操作,低電平(0)時進行寫操作。第6腳:E(或EN)端為使能(enable)端。第714腳:D0D7為8位雙向數(shù)據(jù)端。第1516腳:空腳或背燈電源。15腳背光正極,16腳背光負(fù)極。圖2-5中斷觸發(fā)電路2.5LED數(shù)碼管動態(tài)顯示 (1)LED結(jié)構(gòu)原理LED數(shù)碼管(LED Segment Displays)是由多個發(fā)光二極管封裝在一起組成“8”字型的器件,引線已在接完成,只需引出它們的各個筆劃,公共電極。隨著信息時代的突飛猛進,越來越多的照明及工程應(yīng)用需要要求更高的顯示方案,同樣,

16、作為單片機的驅(qū)動顯示也離不開LED數(shù)碼管驅(qū)動顯示方案。LED數(shù)碼管顯示主要分為靜態(tài)顯示和動態(tài)顯示。 對于人機交互式單片機系統(tǒng)來說,不僅需要響應(yīng)用戶輸入,同時也需要將一些測控信息輸出顯示。這些顯示信息可以提供實時的數(shù)據(jù)或圖形結(jié)果,以便于掌握系統(tǒng) 的狀態(tài)并進行分析處理。目前,在單片機中最常用的是LED數(shù)碼管顯示。其成本低廉、使用簡便,可以顯示數(shù)字或幾個特定的字符。(2)動態(tài)顯示原理動態(tài)顯示是指每隔一段時間循環(huán)點亮每個LED數(shù)碼管,每次只有一個LED被點亮。根據(jù)人眼的視覺暫留效應(yīng),當(dāng)循環(huán)點亮的速度很快的時候,可以認(rèn)為各個LED是穩(wěn)定顯示的。動態(tài)顯示的硬件連接比較簡單,這里使用了8個LED數(shù)碼管,將所

17、有LED的8段引腳并聯(lián)在一起,連接到8位的I/O數(shù)據(jù)總線上。而各個LED的共陽極引 腳或共陰極引腳分別由另一組I/O線控制,從圖中可以看出,使用兩個8位的I/O端口便可以動態(tài)顯示8位LED數(shù)碼管。其中一個并口作為LED數(shù)碼管的控制引腳,另一個并口作為公共的數(shù)據(jù)總線。程序中采用掃描顯示的方式,即在同一時刻,只使用一個LED顯示數(shù)據(jù)。通過為共陰極LED(或共陽極LED)的公共引腳賦低電平(或高電平),從而選擇 某個LED顯示。如此循環(huán),使每個LED顯示該LED應(yīng)顯示的數(shù)據(jù),并進行適當(dāng)?shù)难訒r,形成視覺暫留效果。這樣便可以達(dá)到動態(tài)顯示的目的。圖2-6 LED電路圖2.674HC138譯碼器74HC13

18、8譯碼器作用是把3種輸入狀態(tài)翻譯為8種輸出狀態(tài)。74HC138一共是6個輸入引腳,但是其中4,5,6這三個引腳是使能引腳。這三個引腳如果不符合規(guī)定的輸入要求Y0到Y(jié)7不管輸入的1,2,3引腳是什么電平狀態(tài),總是高電平。圖2-5 74HC138譯碼器其真值表為:2.7報警電路報警電路如圖2-6所示。利用了三極管作為開關(guān)管驅(qū)動蜂鳴器發(fā)聲。圖2-6報警電路三、程序設(shè)計思想及流程開始開中斷配置T0定時初始化LED,時鐘模塊,LCD檢測按鍵是否按下是執(zhí)行相應(yīng)按鍵函數(shù) 否是否到定時時間是響鈴、LED全亮 否圖3-1流程圖四、電路的安裝及調(diào)試4.1 安裝步驟1.檢查元件的好壞按電路圖買好元件后首先檢查買回元

19、件的好壞,按各元件的檢測方法分別進行檢測,一定要仔細(xì)認(rèn)真。而且要認(rèn)真核對原理圖是否一致,在檢查好后才可上件、焊件,防止出現(xiàn)錯誤焊件后不便改正。2.放置、焊接各元件按原理圖的位置放置各元件,在放置過程中要先放置、焊接較低的元件,后焊較高的和要求較高的元件。特別是容易損壞的元件要后焊,在焊集成芯片時連續(xù)焊接時間不要超過10s,注意芯片的安裝方向。4.2 電路的調(diào)試首先燒入顯示程序,看顯示正不正常。在調(diào)試程序時,發(fā)現(xiàn)有的指令用的不正確,導(dǎo)致電路功能不能完全實現(xiàn),另外軟件程序中的延時有的過長、有的過短等等。5、 總結(jié)這一學(xué)年所學(xué)的單片機及微機接口知識在這次的課程設(shè)計中得到了充分的體驗,在完成這個畢業(yè)設(shè)

20、計的過程中,也遇到了不少問題,但在老師和同學(xué)的幫助下,問題很快就得到了解決。在此過程中,我也學(xué)到了不少的新知識,自己的動手能力里得到了大大的提高,分析問題和總結(jié)問題也積累了不少的經(jīng)驗,在此我衷心的感謝老師。感謝老師對我完成這個課題的支持與幫助,在設(shè)計過程中給了我寶貴的建議和意見,同時也感謝我的同組同學(xué),為我提供了很多的資料和幫助。六、參考文獻(xiàn)(1)鄧胡濱 .單片機原理及應(yīng)用技術(shù)基于Keil C和Proteus仿真 人民郵電出版社七、附錄7.1 實物圖 7.2仿真圖 7.3 部分程序清單#ifndef _CONFIG_H#define _CONFIG_H/* 通用頭文件 */#include &

21、lt;reg52.h>#include <intrins.h>/* 數(shù)據(jù)類型定義 */typedef signed char int8; / 8位有符號整型數(shù)typedef signed int int16; /16位有符號整型數(shù)typedef signed long int32; /32位有符號整型數(shù)typedef unsigned char uint8; / 8位無符號整型數(shù)typedef unsigned int uint16; /16位無符號整型數(shù)typedef unsigned long uint32; /32位無符號整型數(shù)/* 全局運行參數(shù)定義 */#define

22、 SYS_MCLK (11059200/12) /系統(tǒng)主時鐘頻率,即振蕩器頻率÷12/* IO引腳分配定義 */sbit KEY_IN_1 = P24; /矩陣按鍵的掃描輸入引腳1sbit KEY_IN_2 = P25; /矩陣按鍵的掃描輸入引腳2sbit KEY_IN_3 = P26; /矩陣按鍵的掃描輸入引腳3sbit KEY_IN_4 = P27; /矩陣按鍵的掃描輸入引腳4sbit KEY_OUT_1 = P23; /矩陣按鍵的掃描輸出引腳1sbit KEY_OUT_2 = P22; /矩陣按鍵的掃描輸出引腳2sbit KEY_OUT_3 = P21; /矩陣按鍵的掃描輸出引

23、腳3sbit KEY_OUT_4 = P20; /矩陣按鍵的掃描輸出引腳4sbit ADDR0 = P10; /LED位選譯碼地址引腳0sbit ADDR1 = P11; /LED位選譯碼地址引腳1sbit ADDR2 = P12; /LED位選譯碼地址引腳2sbit ADDR3 = P13; /LED位選譯碼地址引腳3sbit ENLED = P14; /LED顯示部件的總使能引腳#define LCD1602_DB P0 /1602液晶數(shù)據(jù)端口sbit LCD1602_RS = P10; /1602液晶指令/數(shù)據(jù)選擇引腳sbit LCD1602_RW = P11; /1602液晶讀寫引腳s

24、bit LCD1602_E = P15; /1602液晶使能引腳sbit DS1302_CE = P17; /DS1302片選引腳sbit DS1302_CK = P35; /DS1302通信時鐘引腳sbit DS1302_IO = P34; /DS1302通信數(shù)據(jù)引腳sbit I2C_SCL = P37; /I2C總線時鐘引腳sbit I2C_SDA = P36; /I2C總線數(shù)據(jù)引腳sbit BUZZER = P16; /蜂鳴器控制引腳#endif#ifndef _DS1302_H#define _DS1302_Hstruct sTime /日期時間結(jié)構(gòu) uint16 year; /年 u

25、int8 mon; /月 uint8 day; /日 uint8 hour; /時 uint8 min; /分 uint8 sec; /秒 uint8 week; /星期;#ifndef _DS1302_C#endifvoid InitDS1302();void GetRealTime(struct sTime *time);void SetRealTime(struct sTime *time);#endif#ifndef _KEY_BOARD_H#define _KEY_BOARD_H#ifndef _KEY_BOARD_C#endifvoid KeyScan();void KeyDriv

26、er();#endif#ifndef _LCD1602_H#define _LCD1602_H#ifndef _LCD1602_C#endifvoid InitLcd1602();void LcdClearScreen();void LcdOpenCursor();void LcdCloseCursor();void LcdSetCursor(uint8 x, uint8 y);void LcdShowStr(uint8 x, uint8 y, uint8 *str);void LcdShowChar(uint8 x, uint8 y, uint8 chr);#endif#define _MA

27、IN_C#include "config.h"#include "Lcd1602.h"#include "LedBuzzer.h"#include "keyboard.h"#include "DS1302.h"#include "Time.h"#include "main.h"bit flag2s = 0; /2s定時標(biāo)志位bit flag200ms = 0; /200ms定時標(biāo)志uint8 T0RH = 0; /T0重載值的高字節(jié)uint8 T0RL =

28、 0; /T0重載值的低字節(jié)static int *alarm = 0; /鬧鐘標(biāo)志位enum eStaSystem staSystem = E_NORMAL; /系統(tǒng)運行狀態(tài)void main() EA = 1; /開總中斷 ConfigTimer0(1); /配置T0定時1ms InitLed(); /初始化LED模塊 InitDS1302(); /初始化實時時鐘模塊 InitLcd1602(); /初始化液晶模 while (!flag2s); /上電后延時2秒 flag2s = 0; RefreshTime(); /刷新當(dāng)前時間 RefreshAlarm(); /鬧鐘設(shè)定值顯示 whi

29、le (1) /進入主循環(huán) KeyDriver(); /執(zhí)行按鍵驅(qū)動 if (flag200ms) /每隔200ms執(zhí)行以下分支 flag200ms = 0; FlowingLight(alarm); /流水燈效果實現(xiàn) RefreshTime(); /刷新當(dāng)前時間 AlarmMonitor(alarm); /監(jiān)控鬧鐘 if (staSystem = E_NORMAL) /正常運行時刷新日期顯示 RefreshDate(0); /* 配置并啟動T0,ms-T0定時時間 */void ConfigTimer0(uint16 ms)/定時1ms uint32 tmp; tmp = (SYS_MCLK

30、*ms)/1000; /計算所需的計數(shù)值 tmp = 65536 - tmp; /計算定時器重載值 tmp = tmp + 33; /補償中斷響應(yīng)延時造成的誤差 T0RH = (uint8)(tmp>>8); /定時器重載值拆分為高低字節(jié) T0RL = (uint8)tmp; TMOD &= 0xF0; /清零T0的控制位11110000 TMOD |= 0x01; /配置T0為模式1 xxxxxxx1 TH0 = T0RH; /加載T0重載值 TL0 = T0RL; ET0 = 1; /使能T0中斷 TR0 = 1; /啟動T0/* T0中斷服務(wù)函數(shù),實現(xiàn)系統(tǒng)定時和按鍵掃

31、描 */void InterruptTimer0() interrupt 1 /每次1ms static uint8 tmr2s = 0; static uint8 tmr200ms = 0; TH0 = T0RH; /重新加載重載值 TL0 = T0RL; tmr200ms+; /定時200ms if (tmr200ms >= 200) /200ms tmr200ms = 0; flag200ms = 1; tmr2s+; /定時2s if (tmr2s >= 10) /200ms*10=2S tmr2s = 0; flag2s = 1; KeyScan(); /執(zhí)行按鍵掃描#d

32、efine _DS1302_C#include "config.h"#include "DS1302.h"/* 發(fā)送一個字節(jié)到DS1302通信總線上 */void DS1302ByteWrite(uint8 dat) uint8 mask; for (mask=0x01; mask!=0; mask<<=1) /低位在前,逐位移出 if (mask&dat) != 0) /首先輸出該位數(shù)據(jù) DS1302_IO = 1; else DS1302_IO = 0; DS1302_CK = 1; /然后拉高時鐘 DS1302_CK = 0;

33、/再拉低時鐘,完成一個位的操作 DS1302_IO = 1; /最后確保釋放IO引腳/* 由DS1302通信總線上讀取一個字節(jié) */uint8 DS1302ByteRead() uint8 mask; uint8 dat = 0; for (mask=0x01; mask!=0; mask<<=1) /低位在前,逐位讀取 if (DS1302_IO != 0) /首先讀取此時的IO引腳,并設(shè)置dat中的對應(yīng)位 dat |= mask; DS1302_CK = 1; /然后拉高時鐘 DS1302_CK = 0; /再拉低時鐘,完成一個位的操作 return dat; /最后返回讀到的

34、字節(jié)數(shù)據(jù)/* 用單次寫操作向某一寄存器寫入一個字節(jié),reg-寄存器地址,dat-待寫入字節(jié) */void DS1302SingleWrite(uint8 reg, uint8 dat) DS1302_CE = 1; /使能片選信號 DS1302ByteWrite(reg<<1)|0x80); /發(fā)送寫寄存器指令 DS1302ByteWrite(dat); /寫入字節(jié)數(shù)據(jù) DS1302_CE = 0; /除能片選信號/* 用單次讀操作從某一寄存器讀取一個字節(jié),reg-寄存器地址,返回值-讀到的字節(jié) */uint8 DS1302SingleRead(uint8 reg) uint8 d

35、at; DS1302_CE = 1; /使能片選信號 DS1302ByteWrite(reg<<1)|0x81); /發(fā)送讀寄存器指令 dat = DS1302ByteRead(); /讀取字節(jié)數(shù)據(jù) DS1302_CE = 0; /除能片選信號 return dat;/* DS1302初始化,如發(fā)生掉電則重新設(shè)置初始時間 */void InitDS1302() uint8 dat; struct sTime code InitTime = /默認(rèn)初始值:2014-01-01 12:30:00 星期3 0x2014,0x01,0x01, 0x12,0x30,0x00, 0x03 ;

36、DS1302_CE = 0; /初始化DS1302通信引腳 DS1302_CK = 0; dat = DS1302SingleRead(0); /讀取秒寄存器 if (dat & 0x80) != 0) /由秒寄存器最高位CH的值判斷DS1302是否已停止 DS1302SingleWrite(7, 0x00); /撤銷寫保護以允許寫入數(shù)據(jù) SetRealTime(&InitTime); /設(shè)置DS1302為默認(rèn)的初始時間 #define _KEY_BOARD_C#include "config.h"#include "keyboard.h"

37、;#include "Time.h"const uint8 code KeyCodeMap44 = /矩陣按鍵到標(biāo)準(zhǔn)鍵碼的映射表 '1', '2', '3', 0x26 , /數(shù)字鍵1、數(shù)字鍵2、數(shù)字鍵3、向上鍵 '4', '5', '6', 0x25 , /數(shù)字鍵4、數(shù)字鍵5、數(shù)字鍵6、向左鍵 '7', '8', '9', 0x28 , /數(shù)字鍵7、數(shù)字鍵8、數(shù)字鍵9、向下鍵 '0', 0x1B, 0x0D, 0x

38、27 /數(shù)字鍵0、ESC鍵、 回車鍵、 向右鍵;uint8 pdata KeySta44 = /全部矩陣按鍵的當(dāng)前狀態(tài) 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1;/* 按鍵驅(qū)動函數(shù),檢測按鍵動作,調(diào)度相應(yīng)動作函數(shù),需在主循環(huán)中調(diào)用 */void KeyDriver() uint8 i, j; static uint8 pdata backup44 = /按鍵值備份,保存前一次的值 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ; for (i=0; i<4; i+) /循環(huán)檢測4*4的矩陣

39、按鍵 for (j=0; j<4; j+) if (backupij != KeyStaij) /檢測按鍵動作 if (backupij != 0) /按鍵按下時執(zhí)行動作 KeyAction(KeyCodeMapij); /調(diào)用按鍵動作函數(shù) backupij = KeyStaij; /刷新前一次的備份值 /* 按鍵掃描函數(shù),需在定時中斷中調(diào)用,推薦調(diào)用間隔1ms */void KeyScan() uint8 i; static uint8 keyout = 0; /矩陣按鍵掃描輸出索引 static uint8 keybuf44 = /矩陣按鍵掃描緩沖區(qū) 0xFF, 0xFF, 0xFF

40、, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ; /將一行的4個按鍵值移入緩沖區(qū) keybufkeyout0 = (keybufkeyout0 << 1) | KEY_IN_1; keybufkeyout1 = (keybufkeyout1 << 1) | KEY_IN_2; keybufkeyout2 = (keybufkeyout2 << 1) | KEY_IN_3; keybufkeyout3 = (keybufkeyout3 <<

41、; 1) | KEY_IN_4; /消抖后更新按鍵狀態(tài) for (i=0; i<4; i+) /每行4個按鍵,所以循環(huán)4次 if (keybufkeyouti & 0x0F) = 0x00) /連續(xù)4次掃描值為0,即4*4ms內(nèi)都是按下狀態(tài)時,可認(rèn)為按鍵已穩(wěn)定的按下 KeyStakeyouti = 0; else if (keybufkeyouti & 0x0F) = 0x0F) /連續(xù)4次掃描值為1,即4*4ms內(nèi)都是彈起狀態(tài)時,可認(rèn)為按鍵已穩(wěn)定的彈起 KeyStakeyouti = 1; /執(zhí)行下一次的掃描輸出 keyout+; /輸出索引遞增 keyout &

42、;= 0x03; /索引值加到4即歸零 switch (keyout) /根據(jù)索引值,釋放當(dāng)前輸出引腳,拉低下次的輸出引腳 case 0: KEY_OUT_4 = 1; KEY_OUT_1 = 0; break; case 1: KEY_OUT_1 = 1; KEY_OUT_2 = 0; break; case 2: KEY_OUT_2 = 1; KEY_OUT_3 = 0; break; case 3: KEY_OUT_3 = 1; KEY_OUT_4 = 0; break; default: break; #define _LCD1602_C#include "config.h&

43、quot;#include "Lcd1602.h"uint8 tmpP0; /暫存P0口的值bit tmpADDR0; /暫存LED位選譯碼地址0的值bit tmpADDR1; /暫存LED位選譯碼地址1的值/* 暫停LED動態(tài)掃描,暫存相關(guān)引腳的值 */void LedScanPause() ENLED = 1; tmpP0 = P0; tmpADDR0 = ADDR0; tmpADDR1 = ADDR1;/* 恢復(fù)LED動態(tài)掃描,恢復(fù)相關(guān)引腳的值 */void LedScanContinue() ADDR0 = tmpADDR0; ADDR1 = tmpADDR1; P

44、0 = tmpP0; ENLED = 0;/* 等待液晶準(zhǔn)備好 */void LcdWaitReady() uint8 sta; LCD1602_DB = 0xFF; LCD1602_RS = 0; LCD1602_RW = 1; do LCD1602_E = 1; sta = LCD1602_DB; /讀取狀態(tài)字 LCD1602_E = 0; while (sta & 0x80); /bit7等于1表示液晶正忙,重復(fù)檢測直到其等于0為止/* 向LCD1602液晶寫入一字節(jié)命令,cmd-待寫入命令值 */void LcdWriteCmd(uint8 cmd) LedScanPause(

45、); LcdWaitReady(); LCD1602_RS = 0; LCD1602_RW = 0; LCD1602_DB = cmd; LCD1602_E = 1; LCD1602_E = 0; LedScanContinue();/* 向LCD1602液晶寫入一字節(jié)數(shù)據(jù),dat-待寫入數(shù)據(jù)值 */void LcdWriteDat(uint8 dat) LedScanPause(); LcdWaitReady(); LCD1602_RS = 1; LCD1602_RW = 0; LCD1602_DB = dat; LCD1602_E = 1; LCD1602_E = 0; LedScanCo

46、ntinue();/* 清屏 */void LcdClearScreen()LcdWriteCmd(0x01);/* 打開光標(biāo)的閃爍效果 */void LcdOpenCursor()LcdWriteCmd(0x0F);/* 關(guān)閉光標(biāo)顯示 */void LcdCloseCursor()LcdWriteCmd(0x0C);#define _TIME_C#include "config.h"#include "DS1302.h"#include "LedBuzzer.h"#include "Lcd1602.h"#incl

47、ude "Time.h"#include "main.h"uint8 code WeekMod = /星期X字符圖片表 0xFF, 0x99, 0x00, 0x00, 0x00, 0x81, 0xC3, 0xE7, /星期日(紅心) 0xEF, 0xE7, 0xE3, 0xE7, 0xE7, 0xE7, 0xE7, 0xC3, /星期1 0xC3, 0x81, 0x9D, 0x87, 0xC3, 0xF9, 0xC1, 0x81, /星期2 0xC3, 0x81, 0x9D, 0xC7, 0xC7, 0x9D, 0x81, 0xC3, /星期3 0xCF

48、, 0xC7, 0xC3, 0xC9, 0xC9, 0x81, 0xCF, 0xCF, /星期4 0x81, 0xC1, 0xF9, 0xC3, 0x87, 0x9D, 0x81, 0xC3, /星期5 0xC3, 0x81, 0xF9, 0xC3, 0x81, 0x99, 0x81, 0xC3, /星期6;bit staMute = 0; /靜音標(biāo)志位uint8 AlarmHour = 0x07; /鬧鐘時間的小時數(shù)uint8 AlarmMin = 0x30; /鬧鐘時間的分鐘數(shù)struct sTime CurTime; /當(dāng)前日期時間uint8 SetIndex = 0; /設(shè)置位索引uint8 pdata SetAlarmHour; /鬧鐘小時數(shù)設(shè)置緩沖uint8 pdata SetAlarmMin; /鬧鐘分鐘數(shù)設(shè)置緩沖struct sTime pdata Se

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論