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

下載本文檔

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

文檔簡介

課程設計(論文)任務書信息工程學院計算機科學與技術專業(yè)2014-1班一、課程設計(論文)題目簡易家電定時控制裝置二、課程設計(論文)工作自2017年6月19日起至一2017年6月29日止。三、課程設計(論文)地點:5#402四、課程設計(論文)內(nèi)容要求:本課程設計的目的使學生掌握系統(tǒng)各功能模塊的基本工作原理;培養(yǎng)學生基本掌握電路設計的基本思路和方法;使學生掌握接收系統(tǒng)調試;培養(yǎng)學生分析、解決問題的能力;提高學生的科技論文寫作能力。課程設計的任務及要求基本要求:對家電的開啟進行預定時控制,能顯示并設置預定時間;一對家電的工作時間進行定時控制,能顯示并通過鍵盤設置工作時間的長短;工作時間到了后,并能聲音報警;設定時間時,黃色發(fā)光二極管點亮,啟動定時后,紅色發(fā)光二極管點亮。創(chuàng)新要求:在基本要求達到后,可進行創(chuàng)新設計,如改善電路性能;對系統(tǒng)進行仿真分析。課程設計論文編寫要求要按照書稿的規(guī)格打印譽寫畢業(yè)論文論文包括目錄、緒論、正文、小結、參考文獻、謝辭、附錄等畢業(yè)論文裝訂按學校的統(tǒng)一要求完成答辯與評分標準:完成原理分析:20分;完成設計過程(含翻譯):40分;完成調試:20分;回答問題:20分。參考文獻:(1)鄧胡濱.《單片機原理及應用技術一一基于KeilC和Proteus仿真》人民郵電出版社6)課程設計進度安排內(nèi)容天數(shù)地點構思及收集資料2圖書館組裝與調試5實驗室撰寫論文3圖書館、實驗室學生簽名:2017年6月19日課程設計(論文)評審意見(1)完成原理分析(20分):優(yōu)()、良()、中()、一般()、差();(2)設計分析和翻譯能力(40分)();:優(yōu)()、良()、.中()、一般()、差(3)完成調試(20分):優(yōu)()、良()、中()、一般()、差();(4)回答問題(20分):優(yōu)()、良()、中()、一般()、差();(5)格式規(guī)范性及考勤是否降等級:是()、否()評閱人:職稱:_副教授2017年6月29日目錄TOC\o"1-5"\h\z\o"CurrentDocument"緒論1\o"CurrentDocument"一、設計任務及要求21.1設計目的2\o"CurrentDocument"1.2基本功能要求2\o"CurrentDocument"1.3拓展功能設計2\o"CurrentDocument"1.4功能詳細設計3\o"CurrentDocument"二、硬件電路設計及描述3AT89C52單片機3DS1302數(shù)碼管顯示時鐘4\o"CurrentDocument"矩陣按鍵電路5LCD液晶顯示屏電路6LED數(shù)碼管動態(tài)顯示774HC138譯碼器9\o"CurrentDocument"報警電路10\o"CurrentDocument"三、程序設計思想及流程11\o"CurrentDocument"四、電路的安裝及調試124.1安裝步驟124.2電路的調試12\o"CurrentDocument"五、總結12\o"CurrentDocument"六、參考文獻13\o"CurrentDocument"七、附錄137.1實物圖137.2仿真圖137.3部分程序清單14緒論單片微計算機自20世紀70年代問世以來,已對人類社會產(chǎn)生了巨大的影響。尤其是美國Intel公司生產(chǎn)的MCS-51系列單片機,由于其具有集成度高、處理功能強、可靠性高、系統(tǒng)結構簡單、價格低廉、易于使用等優(yōu)點,在世界范圍內(nèi)已經(jīng)得到廣泛的普及和應用。此外,世界各大公司以MCS-51單片機基本內(nèi)核為核心的各種擴展型、增強型的新型的新型單片機不斷推出,所以在今后若干年內(nèi),MCS-51系列以及世界其它各大公司生產(chǎn)的與其兼容的各種增強型、擴展型的單片機,仍是我國單片機應用領域的主流型。目前在工業(yè)控制、智能儀器儀表、辦公自動化、家用電器登諸多領域,到處都可看見單片機的蹤影,單片機技術開發(fā)和應用水平已成為一個國家工業(yè)發(fā)展水平的標志之一。此裝置硬件使用AT89C52單片機為控制核心,DS1302作為時鐘芯片并同時在掉電時儲存資料,LCD1602液晶顯示屏以及LED數(shù)碼管作為顯示與用戶交互,使用5V繼電器控制外接電器電源的開啟或關閉。軟件采用模塊化設計、驅動、控制、引腳、變量定義等采用多文件編譯,即方便自己設計修改也方便他人理解。這款家電定時器實現(xiàn)了時鐘顯示,預定時間設置、定時操作便捷設置、報警功能、系統(tǒng)狀態(tài)提示功能。關鍵詞:單片機;定時控制;AT89S52;一、設計任務及要求1.1設計目的根據(jù)本學年所學的單片機及微機接口的理論知識設計裝置的電路結構和相應軟件程序設計。提高學生實踐能力,培養(yǎng)學生發(fā)現(xiàn)問題、解決問題的能力,鍛煉學生理論聯(lián)系實際、綜合應用的能力。1.2基本功能要求(1)對家電的開啟進行預定時控制,能顯示并設置預定時間;(2)對家電的工作時間進行定時控制,能顯示并通過鍵盤設置工作時間的長短;(3)工作時間到了后,并能聲音報警;(4)設定時間時,黃色發(fā)光二極管點亮,啟動定時后,紅色發(fā)光二極管點亮。1.3拓展功能設計(1)使用LCD液晶顯示屏顯示定時時間,方便使用者的實際操作使用。(2)采用矩陣鍵盤進行時間設置。以使得裝置的時間設置操作更加的人性化。(3)使用8個LED燈提示裝置所處于的狀態(tài)。當LED滾動顯示時表示家電處于閑置狀態(tài),當流水燈全部顯示時表示家電處于工作狀態(tài)。1.4功能詳細設計裝置的當前時間顯示是用6個數(shù)碼管實現(xiàn)的,顯示格式為“時時:分分:秒秒”。當前日期以及定時時間是在LCD液晶顯示屏上顯示。家電工作前程序控制LED燈流動點亮,家電工作后程序控制LED燈全部點亮。矩陣鍵盤的控制功能為:K1、K2、K3、K5、K6、K7、K9、K10、K11、K13分別對應數(shù)字1—9以及數(shù)字0。用于設置日期時間以及定時時間的數(shù)值輸入。K4、K8、K12、K16對應光標移動上、左、下、右方向。K14、K15分別對應ESC鍵和回車鍵。二、硬件電路設計及描述2.1AT89C52單片機AT89C52是一個低電壓,高性能CMOS8位單片機,片內(nèi)含8kbytes的可反復擦寫的Flash只讀程序存儲器和256bytes的隨機存取數(shù)據(jù)存儲器(RAM),器件采用ATMEL公司的高密度、非易失性存儲技術生產(chǎn),兼容標準MCS-51指令系統(tǒng),片內(nèi)置通用8位中央處理器和Flash存儲單元,AT89C52單片機在電子行業(yè)中有著廣泛的應用。AT89C52有40個引腳,32個外部雙向輸入/輸出(I/O)端口,同時內(nèi)含2個外中斷口,3個16位可編程定時計數(shù)器,2個全雙工串行通信口,2個讀寫口線,AT89C52可以按照常規(guī)方法進行編程,也可以在線編程。其將通用的微處理器和Flash存儲器結合在一起,特別是可反復擦寫的Flash存儲器可有效地降低開發(fā)成本。(T2)P1.DC:hvcc140(T2EX}P1.1CZ239□POO(ADO)P1,2匚333nPO.1(AD11)P1.3匚437□PD.2(AD2)P1.4匚53G□PO.3(AD3)(MOSI)P1.5匚635PP0.4(AD4)(MISO}P1.6C734二1PO.5(AD5)(SCK)P1.7匚833bPG.6(ADS)RST「■9疊—321PO.7(AD7)(RXDJP3.O匚1Q"事卷慮咧hEA-A/PPCFX口1P3JC1130口ALE/PROG(INTO)P3.2匚1229□PSENJNT1}P3.3匚132&pP2.7(A15)(TO)P3.4L1427□PS6(T1)P3.5「1526二IP2.5(A13)(WR>PS.6?—IB25口P2.4(A12)(RD)P3-71724P23(A11)XTAL2~ia23P2.2(AW)XTAL1匚1922□P2.1(A9)2021P2.0(AS)圖2-12.2DS1302數(shù)碼管顯示時鐘DS1302簡介DS1302是美國DALLAS公司推出的一款涓流充電時鐘芯片。DS1302時鐘芯片被廣泛應用于電話、傳真、便攜式儀器等產(chǎn)品領域,它的主要性能指標如下。DS1302是一個實時時鐘芯片,可以提供秒、分、小時、日期、月、年等信息,并且還有軟件自動調整的能力,可以配置AM/PM來決定采用24小時格式還是12小時格式。擁有31字節(jié)數(shù)據(jù)存儲RAM。串行I/O通信方式,相對并行來說比較節(jié)省IO口的使用。DS1302的工作電壓比較寬,在2.0—5.5V的范圍內(nèi)部都可以正常工作。DS1302這種時鐘芯片功耗一般都很低,它在工作電壓2.0V的時候工作電流小于300nA。DS1302共有8個引腳,有兩種封裝形式。當工作電壓是5V的時候,兼容標準的TTL電平標準。DS1302有兩個電源輸入,一個是主電源,另一個是備用電源??梢允褂秒姵鼗蛘叽笮碗娙?。以使在系統(tǒng)掉電的情況下,時鐘還會繼續(xù)走。DS1302結構DS1302的引腳排列,其中Vcc2為主電源,VCC1為后備電源。在主電源關閉的情況下,也能保持時鐘的連續(xù)運行。DS1302由Vcc1或Vcc2兩者中的較大者供電。當Vcc2大于Vcc1+0.2V時,Vcc2給DS1302供電。當Vcc2小于Vcc1時,DS1302由Vcc1供電。X1和X2是振蕩源,外接32.768kHz晶振。RST是復位/片選線,通過把RST輸入驅動置高電平來啟動所有的數(shù)據(jù)傳送°RST輸入有兩種功能:首先,RST接通控制邏輯,允許地址/命令序列送入移位寄存器;其次,RST提供終止單字節(jié)或多字節(jié)數(shù)據(jù)傳送的方法。當RST為高電平時,所有的數(shù)據(jù)傳送被初始化,允許對DS1302進行操作。如果在傳送過程中RST置為低電平,則會終止此次數(shù)據(jù)傳送,I/O引腳變?yōu)楦咦钁B(tài)。上電運行時,在Vcc>2.0V之前,RST必須保持低電平。只有在SCLK為低電平時,才能將RST置為高電平。I/O為串行數(shù)據(jù)輸入輸出端(雙向),后面有詳細說明。SCLK為時鐘輸入端。下圖為DS1302的引腳功能圖:VcciSCLKI/ORST圖2-2DS1302引腳圖2.3矩陣按鍵電路VcciSCLKI/ORST圖2-2DS1302引腳圖矩陣按鍵電路如圖2-3所示。圖2-3按鍵電路矩陣鍵盤又稱為行列式鍵盤,它是用4條I/O線作為行線,4條I/O線作為列線組成的鍵盤。在行線和列線的每一個交叉點上,設置一個按鍵。這樣鍵盤中按鍵的個數(shù)是4X4個。這種行列式鍵盤結構能夠有效地提高單片機系統(tǒng)中I/O口的利用率。工作時先從P1口的高四位輸出低電平,低四位輸出高電平,從P1口的低四位讀取鍵盤狀態(tài)。再從P1口的低四位輸出低電平,高四位輸出高電平,從P1口的高四位讀取鍵盤狀態(tài)。將兩次讀取結果組合起來就可以得到當前按鍵的特征編碼。使用上述方法我們得到16個鍵的特征編碼。2.4LCD液晶顯示屏電路(1)、LCD1602簡介1602液晶顯示屏可以顯示2行,每行16個字符的液晶。它的工作電壓是4.5—5.5V,對于這點在設計電路的時候,直接按照5V系統(tǒng)設計,但是保證5V系統(tǒng)最低不能低于4.5V。在5V工作電壓下測量它的工作電流是2mA。這個2mA僅僅是指液晶,而它的黃綠背光都是LED做的,所以功耗不會太小。(2)、LCD1602管腳功能1602采用標準的16腳接口,其中:第1腳:VSS為電源地

第2腳:VCC接5V電源正極第3腳:V0為液晶顯示器對比度調整端,接正電源時對比度最弱,接地電源時對比度最高(對比度過高時會產(chǎn)生“鬼影”,使用時可以通過一個10K的電位器調整對比度)。第4腳:RS為寄存器選擇,高電平1時選擇數(shù)據(jù)寄存器、低電平0時選擇指令寄存器。第5腳:RW為讀寫信號線,高電平(1)時進行讀操作,低電平(0)時進行寫操作。第6腳:E(或EN)端為使能(enable)端。第7?14腳:D0?D7為8位雙向數(shù)據(jù)端。第15?16腳:空腳或背燈電源。15腳背光正極,16腳背光負極。LQO-J寸〔?【;<?-DBti圖2-5中斷觸發(fā)電路LQO-J寸〔?【;<?-DBti2.5LED數(shù)碼管動態(tài)顯示(1)LED結構原理LED數(shù)碼管(LEDSegmentDisplays)是由多個發(fā)光二極管封裝在一起組成“8”字型的器件,引線已在接完成,只需引出它們的各個筆劃,公共電極。隨著信息時代的突飛猛進,越來越多的照明及工程應用需要要求更高的顯示方案,同樣,作為單片機的驅動顯示也離不開LED數(shù)碼管驅動顯示方案。LED數(shù)碼管顯示主要分為靜態(tài)顯示和動態(tài)顯示。對于人機交互式單片機系統(tǒng)來說,不僅需要響應用戶輸入,同時也需要將一些測控信息輸出顯示。這些顯示信息可以提供實時的數(shù)據(jù)或圖形結果,以便于掌握系統(tǒng)的狀態(tài)并進行分析處理。目前,在單片機中最常用的是LED數(shù)碼管顯示。其成本低廉、使用簡便,可以顯示數(shù)字或幾個特定的字符。(2)動態(tài)顯示原理動態(tài)顯示是指每隔一段時間循環(huán)點亮每個LED數(shù)碼管,每次只有一個LED被點亮。根據(jù)人眼的視覺暫留效應,當循環(huán)點亮的速度很快的時候,可以認為各個LED是穩(wěn)定顯示的。動態(tài)顯示的硬件連接比較簡單,這里使用了8個LED數(shù)碼管,將所有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應顯示的數(shù)據(jù),并進行適當?shù)难訒r,形成視覺暫留效果。這樣便可以達到動態(tài)顯示的目的。圖2-6LED電路圖2.674HC138譯碼器74HC138譯碼器作用是把3種輸入狀態(tài)翻譯為8種輸出狀態(tài)。74HC138一共是6個輸入引腳,但是其中4,5,6這三個引腳是使能引腳。這三個引腳如果不符合規(guī)定的輸入要求Y0到Y7不管輸入的1,2,3引腳是什么電平狀態(tài),總是高電平。CD74HC13S.CDMHCT13&CG74HC23A,CDHHCTZ18(PD1P,SOIC)TCPVIEW圖2-574HC138圖2-574HC138譯碼器C㈣(TTJS:阿商網(wǎng)函吃冊Y1Y2Y3viY5VE其真值表為:74HC138集成譯碼器功能表輸入輸出E3E2ElAwAiAoVOYiY2Y3Y4Y5Y6Y7XHXXXXBiHHHHHHHXXHXXXffHMHHHHHLXXXXXHHHHHHHHHLLLLLLHHHHHHHHLLLLHHLHHHHHHLLLEfLHHLHHHHHHL1LHHHHHLHHHHHLLHLLHHHHLHHHLLHLHHHHHHLHHHLLHHLHHHHHHLHHLLHHHHHHHHHHL承口一高由平L一低電平*一任意電平E3,F2>El為輸入使能端AlAi'Ac為二進制教據(jù)輸入端為8個輸出信號字母上面的J號說明該輸入或輸出是低電平有效2.7報警電路報警電路如圖2-6所示。利用了三極管作為開關管驅動蜂鳴器發(fā)聲。圖2-6報警電路三、程序設計思想及流程圖3-1流程圖四、電路的安裝及調試4.1安裝步驟檢查元件的好壞按電路圖買好元件后首先檢查買回元件的好壞,按各元件的檢測方法分別進行檢測,一定要仔細認真。而且要認真核對原理圖是否一致,在檢查好后才可上件、焊件,防止出現(xiàn)錯誤焊件后不便改正。放置、焊接各元件按原理圖的位置放置各元件,在放置過程中要先放置、焊接較低的元件,后焊較高的和要求較高的元件。特別是容易損壞的元件要后焊,在焊集成芯片時連續(xù)焊接時間不要超過10s,注意芯片的安裝方向。4.2電路的調試首先燒入顯示程序,看顯示正不正常。在調試程序時,發(fā)現(xiàn)有的指令用的不正確,導致電路功能不能完全實現(xiàn),另外軟件程序中的延時有的過長、有的過短等等。五、總結這一學年所學的單片機及微機接口知識在這次的課程設計中得到了充分的體驗,在完成這個畢業(yè)設計的過程中,也遇到了不少問題,但在老師和同學的幫助下,問題很快就得到了解決。在此過程中,我也學到了不少的新知識,自己的動手能力里得到了大大的提高,分析問題和總結問題也積累了不少的經(jīng)驗,在此我衷心的感謝老師。感謝

老師對我完成這個課題的支持與幫助,在設計過程中給了我寶貴的建議和意見,同時也感謝我的同組同學,為我提供了很多的資料和幫助。六、參考文獻(1)鄧胡濱.《單片機原理及應用技術一一基于KeilC和Proteus仿真》人民郵電出版社七、附錄7.1實物圖mH1*4—01一01廣菖at07"307.2仿真圖7.3部分程序清單#ifndef_CONFIG_H#define_CONFIG_H/*通用頭文件*/#include<reg52.h>#include<intrins.h>/*數(shù)據(jù)類型定義*/typedefsignedcharint8;//8位有符號整型數(shù)typedefsignedintint16;//16位有符號整型數(shù)typedefsignedlongint32;//32位有符號整型數(shù)typedefunsignedcharuint8;//8位無符號整型數(shù)typedefunsignedintuint16;//16位無符號整型數(shù)typedefunsignedlonguint32;//32位無符號整型數(shù)/*全局運行參數(shù)定義*/#defineSYS_MCLK(11059200/12)〃系統(tǒng)主時鐘頻率,即振蕩器頻率4-12/*IO引腳分配定義*/sbitKEY_IN_1=P2A4;//矩陣按鍵的掃描輸入引腳1sbitKEY_IN_2=P2A5;//矩陣按鍵的掃描輸入引腳2sbitKEY_IN_3=P2A6;//矩陣按鍵的掃描輸入引腳3sbitKEY_IN_4=P2A7;//矩陣按鍵的掃描輸入引腳4sbitKEY_OUT_1=P2A3;〃矩陣按鍵的掃描輸出引腳1sbitKEY_OUT_2=P2A2;〃矩陣按鍵的掃描輸出引腳2sbitKEY_OUT_3=P2A1;//矩陣按鍵的掃描輸出引腳3sbitKEY_OUT_4=P2A0;〃矩陣按鍵的掃描輸出引腳4sbitADDR0=P1A0;//LED位選譯碼地址引腳0sbitADDR1=P1A1;//LED位選譯碼地址引腳1sbitADDR2=P1A2;//LED位選譯碼地址引腳2sbitADDR3=P1A3;//LED位選譯碼地址引腳3sbitENLED=P1A4;//LED顯示部件的總使能引腳#defineLCD1602_DBP0//1602液晶數(shù)據(jù)端口sbitLCD1602_RS=P1A0;//1602液晶指令/數(shù)據(jù)選擇引腳sbitLCD1602_RW=P1A1;//1602液晶讀寫引腳sbitLCD1602_E=P1A5;//1602液晶使能引腳sbitDS1302_CE=P1A7;//DS1302片選引腳sbitDS1302_CK=P3A5;//DS1302通信時鐘引腳sbitDS1302_IO=P3A4;//DS1302通信數(shù)據(jù)引腳sbitI2C_SCL=P3A7;//I2C總線時鐘引腳sbitI2C_SDA=P3A6;//I2C總線數(shù)據(jù)引腳sbitBUZZER=P1A6;//蜂鳴器控制引腳#endif#ifndef_DS1302_H#define_DS1302_HstructsTime(〃日期時間結構uint16year;//年uint8mon;//月uint8day;//日uint8hour;〃時uint8min;//分uint8sec;//秒uint8week;〃星期};#ifndef_DS1302_C#endifvoidInitDS1302();voidGetRealTime(structsTime*time);voidSetRealTime(structsTime*time);#endif#ifndef_KEY_BOARD_H#define_KEY_BOARD_H#ifndef_KEY_BOARD_C#endifvoidKeyScan();voidKeyDriver();#endif#ifndef_LCD1602_H#define_LCD1602_H#ifndef_LCD1602_C#endifvoidInitLcd1602();voidLcdClearScreen();voidLcdOpenCursor();voidLcdCloseCursor();voidLcdSetCursor(uint8x,uint8y);voidLcdShowStr(uint8x,uint8y,uint8*str);voidLcdShowChar(uint8x,uint8y,uint8chr);#endif#define_MAIN_C#include"config.h"#include"Lcd1602.h"#include"LedBuzzer.h"#include"keyboard.h"#include"DS1302.h"#include"Time.h"#include"main.h"bitflag2s=0;//2s定時標志位bitflag200ms=0;//200ms定時標志uint8T0RH=0;//T0重載值的高字節(jié)uint8T0RL=0;//T0重載值的低字節(jié)staticint*alarm=0;〃鬧鐘標志位enumeStaSystemstaSystem=E_NORMAL;〃系統(tǒng)運行狀態(tài)voidmain(){EA=1;〃開總中斷ConfigTimer0(1);//配置T0定時1msInitLed();//初始化LED模塊InitDS1302();//初始化實時時鐘模塊InitLcd1602();//初始化液晶模while(!flag2s);〃上電后延時2秒flag2s=0;RefreshTime();//刷新當前時間RefreshAlarm();〃鬧鐘設定值顯示while(1)〃進入主循環(huán){KeyDriver();〃執(zhí)行按鍵驅動if(flag200ms)〃每隔200ms執(zhí)行以下分支{flag200ms=0;FlowingLight(alarm);//流水燈效果實現(xiàn)RefreshTime();//刷新當前時間AlarmMonitor(alarm);〃監(jiān)控鬧鐘if(staSystem==E_NORMAL)〃正常運行時刷新日期顯示{RefreshDate(0);}}}}/*配置并啟動T0,ms-T0定時時間*/voidConfigTimer0(uint16ms)//定時1ms{uint32tmp;tmp=(SYS_MCLK*ms)/1000;〃計算所需的計數(shù)值tmp=65536-tmp;〃計算定時器重載值tmp=tmp+33;〃補償中斷響應延時造成的誤差T0RH=(uint8)(tmp>>8);〃定時器重載值拆分為高低字節(jié)T0RL=(uint8)tmp;TMOD&=0xF0;〃清零T0的控制位11110000TMOD|=0x01;//配置T0為模式1xxxxxxx1TH0=T0RH;//加載T0重載值TL0=T0RL;ET0=1;//使能T0中斷TR0=1;〃啟動T0}/*T0中斷服務函數(shù),實現(xiàn)系統(tǒng)定時和按鍵掃描*/voidInterruptTimer0()interrupt1〃每次1ms{staticuint8tmr2s=0;staticuint8tmr200ms=0;TH0=T0RH;//重新加載重載值TL0=T0RL;tmr200ms++;//定時200msif(tmr200ms>=200)//200ms{tmr200ms=0;flag200ms=1;tmr2s++;//定時2sif(tmr2s>=10)//200ms*10=2S{tmr2s=0;flag2s=1;}}KeyScan();〃執(zhí)行按鍵掃描}#define_DS1302_C#include"config.h"#include"DS1302.h"/*發(fā)送一個字節(jié)到DS1302通信總線上*/voidDS1302ByteWrite(uint8dat){uint8mask;for(mask=0x01;mask!=0;mask<<=1)//低位在前,逐位移出{if((mask&dat)!=0)//首先輸出該位數(shù)據(jù)DS1302_IO=1;elseDS1302_IO=0;DS1302_CK=1;//然后拉高時鐘DS1302_CK=0;〃再拉低時鐘,完成一個位的操作}DS1302_IO=1;//最后確保釋放IO引腳}/*由DS1302通信總線上讀取一個字節(jié)*/uint8DS1302ByteRead(){uint8mask;uint8dat=0;for(mask=0x01;mask!=0;mask<<=1)//低位在前,逐位讀取{if(DS1302_IO!=0)〃首先讀取此時的IO引腳,并設置dat中的對應位{dat|=mask;}DS1302_CK=1;//然后拉高時鐘DS1302_CK=0;〃再拉低時鐘,完成一個位的操作}returndat;〃最后返回讀到的字節(jié)數(shù)據(jù)}/*用單次寫操作向某一寄存器寫入一個字節(jié),reg-寄存器地址,dat-待寫入字節(jié)*/voidDS1302SingleWrite(uint8reg,uint8dat){DS1302_CE=1;〃使能片選信號DS1302ByteWrite((reg<<1)|0x80);〃發(fā)送寫寄存器指令DS1302ByteWrite(dat);〃寫入字節(jié)數(shù)據(jù)DS1302_CE=0;〃除能片選信號}/*用單次讀操作從某一寄存器讀取一個字節(jié),reg-寄存器地址,返回值-讀到的字節(jié)*/uint8DS1302SingleRead(uint8reg){uint8dat;DS1302_CE=1;〃使能片選信號DS1302ByteWrite((reg<<1)|0x81);〃發(fā)送讀寄存器指令dat=DS1302ByteRead();〃讀取字節(jié)數(shù)據(jù)DS1302_CE=0;〃除能片選信號returndat;}/*DS1302初始化,如發(fā)生掉電則重新設置初始時間*/voidInitDS1302(){uint8dat;structsTimecodeInitTime[]={〃默認初始值:2014-01-0112:30:00星期30x2014,0x01,0x01,0x12,0x30,0x00,0x03};DS1302_CE=0;//初始化DS1302通信引腳DS1302_CK=0;dat=DS1302SingleRead(0);〃讀取秒寄存器if((dat&0x80)!=0)〃由秒寄存器最高位CH的值判斷DS1302是否已停止{DS1302SingleWrite(7,0x00);//撤銷寫保護以允許寫入數(shù)據(jù)SetRealTime(&InitTime);〃設置DS1302為默認的初始時間}}#define_KEY_BOARD_C#include"config.h"#include"keyboard.h"#include"Time.h"constuint8codeKeyCodeMap[4][4]={//矩陣按鍵到標準鍵碼的映射表{'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,0x27}〃數(shù)字鍵0、ESC鍵、回車鍵、向右鍵};uint8pdataKeySta[4][4]={//全部矩陣按鍵的當前狀態(tài){1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}};/*按鍵驅動函數(shù),檢測按鍵動作,調度相應動作函數(shù),需在主循環(huán)中調用*/voidKeyDriver(){uint8i,j;staticuint8pdatabackup[4][4]={//按鍵值備份,保存前一次的值{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的矩陣按鍵{for(j=0;j<4;j++){if(backup[i][j]!=KeySta[i][j])〃檢測按鍵動作{if(backup[i][j]!=0)//按鍵按下時執(zhí)行動作{KeyAction(KeyCodeMap[i][j]);〃調用按鍵動作函數(shù)}backup[i][j]=KeySta[i][j];//刷新前一次的備份值}}}/*按鍵掃描函數(shù),需在定時中斷中調用,推薦調用間隔1ms*/voidKeyScan(){uint8i;staticuint8keyout=0;//矩陣按鍵掃描輸出索引staticuint8keybuf[4][4]={//矩陣按鍵掃描緩沖區(qū){0xFF,0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF,0xFF}};//將一行的4個按鍵值移入緩沖區(qū)keybuf[keyout][0]=(keybuf[keyout][0]<<1)|KEY_IN_1;keybuf[keyout][1]=(keybuf[keyout][1]<<1)|KEY_IN_2;keybuf[keyout]⑵=(keybuf[keyout]⑵<<1)|KEY_IN_3;keybuf[keyout][3]=(keybuf[keyout][3]<<1)|KEY_IN_4;〃消抖后更新按鍵狀態(tài)for(i=0;i<4;i++)〃每行4個按鍵,所以循環(huán)4次{if((keybuf[keyout][i]&0x0F)==0x00){〃連續(xù)4次掃描值為0,即4*4ms內(nèi)都是按下狀態(tài)時,可認為按鍵已穩(wěn)定的按下KeySta[keyout][i]=0;}elseif((keybuf[keyout][i]&0x0F)==0x0F){〃連續(xù)4次掃描值為1,即4*4ms內(nèi)都是彈起狀態(tài)時,可認為按鍵已穩(wěn)定的彈起KeySta[keyout][i]=1;}}〃執(zhí)行下一次的掃描輸出keyout++;〃輸出索引遞增keyout&=0x03;〃索引值加到4即歸零switch(keyout)//根據(jù)索引值,釋放當前輸出引腳,拉低下次的輸出引腳{case0:KEY_OUT_4=1;KEY_OUT_1=0;break;case1:KEY_OUT_1=1;KEY_OUT_2=0;break;case2:KEY_OUT_2=1;KEY_OUT_3=0;break;case3:KEY_OUT_3=1;KEY_OUT_4=0;break;default:break;}}#define_LCD1602_C#include"config.h"#include"Lcd1602.h"uint8tmpP0;〃暫存P0口的值bittmpADDR0;〃暫存LED位選譯碼地址0的值bittmpADDR1;〃暫存LED位選譯碼地址1的值/*暫停LED動態(tài)掃描,暫存相關引腳的值*/voidLedScanPause(){ENLED=1;tmpP0=P0;tmpADDR0=ADDR0;tmpADDR1=ADDR1;}/*恢復LED動態(tài)掃描,恢復相關引腳的值*/voidLedScanContinue(){ADDR0=tmpADDR0;ADDR1=tmpADDR1;P0=tmpP0;ENLED=0;}/*等待液晶準備好*/voidLcdWaitReady(){uint8sta;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表示液晶正忙,重復檢測直到其等于0為止}/*向LCD1602液晶寫入一字節(jié)命令,cmd-待寫入命令值*/voidLcdWriteCmd(uint8cmd){LedScanPause();LcdWaitReady();LCD1602_RS=0;LCD1602_RW=0;LCD1602_DB=cmd;LCD1602_E=1;LCD1602_E=0;LedScanContinue();}/*向LCD1602液晶寫入一字節(jié)數(shù)據(jù),dat-待寫入數(shù)據(jù)值*/voidLcdWriteDat(uint8dat){LedScanPause();LcdWaitReady();LCD1602_RS=1;LCD1602_RW=0;LCD1602_DB=dat;LCD1602_E=1;LCD1602_E=0;LedScanContinue();}/*清屏*/voidLcdClearScreen(){LcdWriteCmd(0x01);}/*打開光標的閃爍效果*/voidLcdOpenCursor(){LcdWriteCmd(0x0F);}/*關閉光標顯示*/voidLcdCloseCursor(){LcdWriteCmd(0x0C);}#define_TIME_C#include"config.h"#include"DS1302.h"#include"LedBuzzer.h"#include"Lcd1602.h"#include"Time.h"#include"main.h"uint8codeWeekMod[]={〃星期X字符圖片表0xFF,0x99,0x00,0x00,0x00,0x81,0xC3,0xE7,//星期日(紅心)0xEF,0xE7,0xE3,0xE7,0xE7,0xE7,0xE7,0xC3,〃星期10xC3,0x81,0x9D,0x87,0xC3,0xF9,0xC1,0x81,〃星期20xC3,0x81,0x9D,0xC7,0xC7,0x9D,0x81,0xC3,〃星期30xCF,0xC7,0xC3,0xC9,0xC9,0x81,0xCF,0xCF,〃星期40x81,0xC1,0xF9,0xC3,0x87,0x9D,0x81,0xC3,〃星期50xC3,0x81,0xF9,0xC3,0x81,0x99,0x81,0xC3,〃星期6};bitstaMute=0;〃靜音標志位uint8AlarmHour=0x07;〃鬧鐘時間的小時數(shù)uint8AlarmMin=0x30;〃鬧鐘時間的分鐘數(shù)structsTimeCurTime;〃當前日期時間uint8SetIndex=0;〃設置位索引uint8pdataSetAlarmHour;〃鬧鐘小時數(shù)設置緩沖uint8pdataSetAlarmMin;〃鬧鐘分鐘數(shù)設置緩沖structsTimepdataSetTime;//日期時間設置緩沖區(qū)/*獲取當前日期時間,并刷新時間和星期的顯示*/voidRe

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論