以DS1302實(shí)時(shí)時(shí)鐘芯片和液晶顯示屏CD1602為基礎(chǔ)設(shè)計(jì)的電子鐘_第1頁
以DS1302實(shí)時(shí)時(shí)鐘芯片和液晶顯示屏CD1602為基礎(chǔ)設(shè)計(jì)的電子鐘_第2頁
以DS1302實(shí)時(shí)時(shí)鐘芯片和液晶顯示屏CD1602為基礎(chǔ)設(shè)計(jì)的電子鐘_第3頁
以DS1302實(shí)時(shí)時(shí)鐘芯片和液晶顯示屏CD1602為基礎(chǔ)設(shè)計(jì)的電子鐘_第4頁
以DS1302實(shí)時(shí)時(shí)鐘芯片和液晶顯示屏CD1602為基礎(chǔ)設(shè)計(jì)的電子鐘_第5頁
免費(fèi)預(yù)覽已結(jié)束,剩余21頁可下載查看

下載本文檔

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

文檔簡介

1、電子系統(tǒng)設(shè)計(jì)實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)名稱以DS1302實(shí)時(shí)時(shí)鐘芯片和液晶顯示屏CD1602為基礎(chǔ)設(shè)計(jì)的電子鐘院(系)別班號(hào)實(shí)驗(yàn)口期2009-6-25至IJ28實(shí)驗(yàn)人姓名學(xué)號(hào)實(shí)驗(yàn)?zāi)康?1、能夠以DS1302實(shí)時(shí)時(shí)鐘芯片和液晶顯示屏CD1602為基礎(chǔ)設(shè)計(jì)一款電子鐘2、熟悉DS1302芯片的工作過程3,熟悉CD1602芯片的工作過程4、可以進(jìn)行必要的擴(kuò)展,如用第三DS18B20新品進(jìn)行溫度采集和顯示5、熟悉掌握51的c程序的編寫6、掌握用Proteus進(jìn)行系統(tǒng)設(shè)計(jì)仿真驗(yàn)證實(shí)驗(yàn)儀器、儀表目錄1、DS1302實(shí)時(shí)時(shí)鐘芯片1片2、LCD1602液晶顯示屏1個(gè),3、80c52芯片1片5、DS18B20芯片一片6、晶振、

2、電容、電阻、開關(guān)各若干等7、proteus仿真軟件8、KeilC5KPC機(jī)實(shí)驗(yàn)設(shè)計(jì)任務(wù)以DS1302實(shí)時(shí)時(shí)鐘芯片和液晶顯示屏LCD1602為基礎(chǔ)設(shè)計(jì)一個(gè)電子鐘,要求:時(shí)間和口期可調(diào)整,按鍵采用3個(gè)按鍵:至少在Proteus上調(diào)試通過。擴(kuò)展:鬧鐘和重要日期提醒功能(增加蜂鳴器),鬧鈴音樂功能實(shí)驗(yàn)步驟1、打開Keil軟件,新建一個(gè)1:程文件,選擇好芯片,并記得在“OptionsforTarget1”的Output選項(xiàng)中,將CreateHEXFil選項(xiàng)勾起來。2、將編寫的程序保存成“.C”的形式3、編譯保存好的C文件,并根據(jù)提示修改程序中的錯(cuò)誤,直到編譯成功為止4、打開proteus軟件,畫出實(shí)驗(yàn)電

3、路圖5、在89c52中,載入原來已生成的HEX文檔6、按卜.運(yùn)行鍵,對Proteus進(jìn)行軟件仿真,觀察運(yùn)行結(jié)果原理、結(jié)果及分析一、設(shè)計(jì)方案原理與設(shè)計(jì)特點(diǎn)分析各個(gè)模塊電路原理分析:1、DS1302時(shí)鐘采集模塊:首先DS1302是DALLAS公司推出的涓流充電時(shí)鐘芯片。內(nèi)含有一個(gè)實(shí)時(shí)時(shí)鐘/口歷和31字節(jié)靜態(tài)RAM通過簡單的串行接口與單片機(jī)進(jìn)行通信實(shí)時(shí)時(shí)鐘/口歷電路提供秒分時(shí)口口期月年的信息每月的天數(shù)和閏年的天數(shù)可自動(dòng)調(diào)整時(shí)鐘操作。DS1302芯片廣腳介紹:XI、X2為32.768KHZ晶振管腳。GND為地。RST復(fù)位腳。VO數(shù)據(jù)輸入/輸出引腳。SCLK串行時(shí)鐘。ccl,Vcc2電源供電管腳。與單片

4、機(jī)連接的信號(hào)線為:DSB02_SCLK接PH6;實(shí)時(shí)時(shí)鐘時(shí)鐘線引腳DS1302JO接P1人7;實(shí)時(shí)時(shí)鐘數(shù)據(jù)線引腳DSB02_RST接P1A5;實(shí)時(shí)時(shí)鐘復(fù)位線引腳C1I-l:lX1vcc-iVCC2X.1;CRYSTALRgTSCLK2工4工0電子鐘總的設(shè)計(jì)模1.1電路原理圖:dTEX T-T112P1.0/T2P1.1ZT2EXP12P1.3P1.4P1.5P1.6P1.7AT89C52X233P:C2-T70特別注意DS1302芯片在讀取或?qū)懭霐?shù)據(jù)時(shí),都是一位一位傳送的,并且每傳送一位,SCLK信月線要仃個(gè)負(fù)跳變。即單片機(jī)對SCLK咬先送高電平,再送低電平。數(shù)據(jù)時(shí)通過IO進(jìn)行傳送的。13數(shù)據(jù)

5、處理子程序流程圖因?yàn)镈S1302芯片在讀取或?qū)懭霐?shù)據(jù)時(shí),都是一位一位傳送的,并且每傳送一位,SCLK信號(hào)線要有一個(gè)負(fù)跳變。所以在對DS1302具體某地址進(jìn)行一字節(jié)數(shù)據(jù)的寫入或讀取時(shí),都要調(diào)用實(shí)時(shí)時(shí)鐘寫入一字節(jié) (內(nèi)部函數(shù))DS13O2InputByte和實(shí)時(shí)時(shí)鐘讀取一字節(jié) (內(nèi)部函數(shù))DSB02OutputByte兩個(gè)函數(shù)。2、按鍵處理模塊2.1按鍵連線圖P3.0/RXDP3.1/TXDP3.2iNT0P3.3/1NT1P34noP3.5ZT1P3.8/WRF3.7/R&其中按鍵1為模式健,技健2為加1健,按鍵3為減1鍵。馬單片機(jī)連線如卜.:mode連接P3A0;/設(shè)定修改位數(shù)plus連接P3

6、A3;dec連接P3A6;加鍵/減鍵2.2按鍵掃描子程序流程圖:減1子程序與加1子程序區(qū)別只在于修改數(shù)值處理不一樣,其他都一樣。3、LCD顯示模塊3.1 LCD顯示模塊電路原理圖修改yeai,值,并返回修改mouth值,并返回修改day值,并返回/LCD1LM016L3g1262627PO.O/ADOP0.1/AD1P0.2/AD2P0.3/AD3P0.47AMP0.5/AD5P0.6/A06P0.7/AD7P2.0/A8P2.1/A9P22/A10P2.3ZA11P2,-VA12P25gl3P26/A14P27VAi538373635343332212204LRESPAC3.2 LCD160

7、2芯片以及連線分析液晶顯示器是一種功耗極低的被動(dòng)式顯示器件,1602廣腳介紹:D0-D7數(shù)據(jù)傳送引腳,VSS為接地線,VDD為電源線,VEE為LCD驅(qū)動(dòng)電壓調(diào)節(jié),由此可以調(diào)節(jié)顯示亮度。RS為寄存器選擇信號(hào),高電平選擇數(shù)據(jù)寄存器,低電平選擇指令寄存器。RW為讀寫控制信號(hào),高電平讀,低電平寫。EN使能信號(hào),讀狀態(tài)下高電平有效,寫狀態(tài)卜下降沿有效。RS連接P2八。;寄存器選擇信號(hào)RW連接P2A1;讀寫控制信號(hào)線EN連接P2A2;使能信號(hào)線3.3 LCD初始化程序流程圖:在初始化過程中,要反復(fù)調(diào)用到wntjcom函數(shù),此函數(shù)實(shí)現(xiàn)向led寫入命令的功能。要特別注意寫命令和寫數(shù)據(jù)的RS、RW、EN時(shí)序問題

8、4、溫度采集顯示模塊溫度采集顯:示模塊的原理圖:,U1VCCDQGND:DS18B20DS18B20芯片以及連線分析DS1820數(shù)字溫度計(jì)提供9位(二進(jìn)制)溫度讀數(shù),指示器件的溫度、信息經(jīng)過單線接口送入DS1820或從DS1820送出。因此從主機(jī)CPU到DS1820僅需一條線(和地線),DS1820的電源可以由數(shù)據(jù)線本身提供而不需要外部電源。-10k-P1.O7T2P1.1/T2EXP-I.2P1.3P1.4P1.5P1.621.0DS18B20廣腳說明:VCC為電源線,DQ為數(shù)據(jù)線,GND為地線。數(shù)據(jù)線DQ與單片機(jī)PLO相連接。溫度采集出示模塊子程序流程圖:寫和讀取數(shù)據(jù)時(shí)的時(shí)序處理。首先,初

9、始化中,主機(jī)總線先發(fā)送一復(fù)位脈沖(最短為480us的低電平信號(hào)),接著刻釋放總線并進(jìn)入接收狀態(tài)。DS18b2O在檢測到總線的上升沿之后,等待15-60US,接著DS18b20發(fā)出存在脈沖(低電平持續(xù)60-240us)o寫數(shù)據(jù)時(shí)序:當(dāng)主機(jī)總線先從高拉至低電平時(shí),就產(chǎn)生寫時(shí)間隙。讀書序:主機(jī)總線先從高拉至低電平時(shí),總線只須保持低電平17ts之后,再將總線拉高,產(chǎn)生讀時(shí)間隙。5、總原理圖以及主程序流程圖:5.1總的原理圖:.LC2L-Jl:1VCC1:jTni:;Tr7.&AF1iIC1,I-t|2wiki|Sil:ixiJJL:.帕一二KtIQGtDVTM.1,CMtoCO,PC2rePI.?Fx

10、srnra.VKy-ss5.2主程序流程圖:初始化led初始化內(nèi)部定時(shí)器初始化DS1302從DS1302讀取口期和時(shí)間移動(dòng)光標(biāo)并顯示口期移動(dòng)光標(biāo)并顯示時(shí)間移動(dòng)光標(biāo)并顯示溫度重更進(jìn)行按鍵掃描Proteus 仿真結(jié)果:LCD1JMJHXOH1959: : : : : : : : : : : : : : : : : : : : : : : :0502(5060502(506時(shí)黑紫軟33333033330333pzn/vi歌.”0rzGA”P27/A*P3n3Pim。rjxiTjrnranr2069/36/29Ueek200CR3ST1F3J&CE0/M三、實(shí)驗(yàn)數(shù)據(jù)計(jì)算處理,性能分析1、數(shù)據(jù)計(jì)算處理:

11、計(jì)算星期數(shù)的算法days=(today.day4-14-2*todaymonth-3*(today.montl+l)/54-today.year-today.year/4-today.year/100+today.yeai/400)%7,由年月口計(jì)算星期,用以顯示星期數(shù)加減鍵對時(shí)間口期改變處理算法對于年月日,時(shí)分秒來說,每個(gè)變量的最大值和最小值都不一樣,所以當(dāng)年月份時(shí)分秒改變時(shí),進(jìn)行處理的算法也不一樣,年沒有最大值,所以不用采取“封頂”措施,每次年加一處理時(shí),直接自加,而對于月份來說,月份是不能超過13的,所以當(dāng)月份自加到13時(shí)要重新置1,具體處理見程序,在每個(gè)語句后,我都有分析注釋出來。時(shí)分

12、秒進(jìn)位算法當(dāng)秒,分達(dá)到60時(shí),向分進(jìn)位,且秒數(shù)置零,從新開始計(jì)數(shù)。當(dāng)時(shí)達(dá)到24時(shí)也一樣處理。L4年月進(jìn)位算法因?yàn)槊總€(gè)月份的天數(shù)都不同,所以事先先設(shè)定一數(shù)組:由丫0口011出口=31,28,31,30,31,30,31,31,30,31,30,31用以判定12個(gè)月的最大值,接著判斷天數(shù),當(dāng)超過本月最大天數(shù)時(shí),月份加一,且天數(shù)要置1。月份判斷比較簡單,只要超過12,年份就加1,月份置1。2、性能分析:首先,led能夠正確的顯示1302芯片上面的時(shí)間和口期。其次,可以通過三個(gè)按鍵:KI,K2和K3鍵對電子鐘進(jìn)行時(shí)間和口期的調(diào)整。按K1鍵進(jìn)行校時(shí),可以分別對時(shí)及分進(jìn)行單獨(dú)校時(shí),使其校正到標(biāo)準(zhǔn)時(shí)間,校時(shí)

13、時(shí)需要校正哪一位哪一位就閃爍。按K2鍵是為閃爍位進(jìn)行加一的操作。按K3鍵是對閃爍位進(jìn)行減一的操作。多次按K1鍵,當(dāng)全部閃爍位全閃爍完畢時(shí),就可以退出調(diào)整模式。但是,時(shí)間和口期顯示正確, 但溫度顯示錯(cuò)誤。 溫度不能正常顯示的主要原因是DS18b20的數(shù)據(jù)傳輸不正確,不過到現(xiàn)在為止,還沒改正過來。四、實(shí)驗(yàn)過程中故障分析與故障排除的描述故障因?yàn)樽约旱闹R(shí)有限,所以坦誠的說,源代碼都是從網(wǎng)上我的,但是我栽了2個(gè)程序, 一個(gè)是運(yùn)用1602以及18b20和按健處理顯示時(shí)間以及溫度, 另一個(gè)程序是單運(yùn)用出1302和1602顯示時(shí)間而沒有按健處理,所以我做的工作就是這么把這兩個(gè)程序結(jié)合起來,實(shí)現(xiàn)顯示和調(diào)整時(shí)間

14、的功能。這里的故障排除過程:目的是在有按鍵調(diào)整時(shí)間的程序中,要添加DS1302功能。首先,要在主程序的c文件中, 添加#inchide”DS1302.h”語句, 并在mam主函數(shù)中, 加入Imtial_DS1302();語句,進(jìn)行DS1302的初始化,并且添加以卜.語句:InitialDS1302();初始化DS1302DateToStr(&CiuTentTune);從DS1302讀取口期TimeToStr(&CiuTentTime);從DS1302讀取時(shí)間顯示的程序也要有所改變:display_stnng(CiuTentTimeDateStnng);/顯示IJ期此時(shí)參數(shù)傳遞過程是先將DS13

15、02向部的時(shí)間和口期通過DS1302_GetTime函數(shù)讀取出來存放到Time中,期通過DateToStr函數(shù)將Tune中的數(shù)據(jù)傳到DateStnng數(shù)組中,而時(shí)間通過imeloStr函數(shù)將lime中的數(shù)據(jù)傳到limebtrmg數(shù)組中,最后通過displaystnng函數(shù)顯不出來。故障二:通過上面兩個(gè)函數(shù)的合并后,發(fā)現(xiàn)編譯一直出錯(cuò),如卜圖所示:clock.c(7):warningC318:can11openfile1DS13O2.h1后來發(fā)現(xiàn),我只是在前面加入頭文件”DS1302.h”,但是忘記把這個(gè)文件放在工程目錄除所以該工程一直找不到,結(jié)果一直出錯(cuò)。故障三:當(dāng)修改完程序后,按下按鍵時(shí),發(fā)現(xiàn)

16、什么反腐都沒有,后來又在排查了程序,感覺程序都沒錯(cuò),但是就是沒反應(yīng)。偶然之間,發(fā)現(xiàn)要長按按鍵,就可以實(shí)現(xiàn)按鍵調(diào)整時(shí)間的功能。因?yàn)樵诎存I掃描程序中,設(shè)置了軟件防抖動(dòng)功能,所以要長按按鍵,才能調(diào)整時(shí)間。故障四:溫度顯示錯(cuò)誤。因?yàn)闀r(shí)間有限,前面整合兩個(gè)程序就花了太多的時(shí)間,來不及再調(diào)整溫度顯示模塊,自(2推測,應(yīng)該是中間函數(shù)參數(shù)傳遞出現(xiàn)錯(cuò)誤,在主程序的main函數(shù)中,顯示溫度是display_string(“OO0C”)語句,所以溫度一直顯示00.0C,事后有時(shí)間會(huì)再進(jìn)行參數(shù)調(diào)整。一故障五:在實(shí)驗(yàn)開始時(shí),感覺不懂如何運(yùn)用proteus,就連對C52進(jìn)行程序燒寫時(shí),都不知道如何才能生成Hex文檔,萬事

17、開頭難,只能踏踏實(shí)實(shí)一步一步學(xué)習(xí),后來請教同學(xué)才知道在“OptionsfbrTaiget1”的Output選項(xiàng)中,要將CreateHEXFil選項(xiàng)勾起來才可以。五、實(shí)驗(yàn)結(jié)論以及體會(huì)實(shí)驗(yàn)結(jié)論:1、在該電子鐘的設(shè)計(jì)中修改定時(shí)或調(diào)整時(shí)間時(shí)采用了閃爍,在編程上,首先進(jìn)行了初始化定義了程序的入II地址以及中斷的入II地址,在主程序的開始定義了一組固定單元用來存儲(chǔ)計(jì)數(shù)的秒,分,時(shí)以及定時(shí)時(shí)間的序號(hào)等。其次,時(shí),分,秒顯示用了軟件譯碼(查表)的方式,再用了一段固定的程序段進(jìn)行進(jìn)制轉(zhuǎn)化。最后,用查詢方式對按鍵進(jìn)行判斷,若有鍵按下,則進(jìn)行軟件延時(shí)消抖,避免了抖動(dòng)引起的干擾,執(zhí)行相應(yīng)的定時(shí),選時(shí)或調(diào)時(shí)程序段。對當(dāng)

18、前時(shí)間或定時(shí)時(shí)間修改后又返回到最初的顯示程序段,如此循環(huán)下去。2、在硬件上,選用DS1302,LCD1602相結(jié)合,首先DS1302內(nèi)含有一個(gè)實(shí)時(shí)時(shí)鐘/口歷和31字節(jié)靜態(tài)RAZ通過筒單的串行接口與單片機(jī)進(jìn)行通信實(shí)時(shí)時(shí)鐘/口歷電路提供秒分時(shí)日口期月年的信息每月的天數(shù)和閏年的天數(shù)可自動(dòng)調(diào)整時(shí)鐘操作,這樣讀取數(shù)據(jù)簡單。其次,選用LCD1602進(jìn)行顯示時(shí),數(shù)據(jù)位串行輸入,接II連線少,低功耗,顯示清晰。并旦本實(shí)驗(yàn)的電子鐘即要實(shí)現(xiàn)時(shí)間的現(xiàn)實(shí),還要實(shí)現(xiàn)口期的現(xiàn)實(shí),所以若是運(yùn)用數(shù)碼管進(jìn)行顯示的話,就算運(yùn)用動(dòng)態(tài)顯示,所占用的io多,并且所需的數(shù)碼管個(gè)數(shù)多,硬件史:雜。3、pioteus是一個(gè)非常好用的仿真軟件

19、,其具有強(qiáng)大的電路原理圖繪制功能,且可以實(shí)現(xiàn)模擬電路仿真、數(shù)字電路仿真、單片機(jī)及其外圍電路組成的系統(tǒng)仿真、健盤、LCD系統(tǒng)仿真等多種功能:和keil聯(lián)合使用時(shí)可以檢測所編寫的程序的正確與否。將keil和proteus聯(lián)合起來使用是實(shí)現(xiàn)電子設(shè)計(jì)制作的初步階段,可避免在實(shí)際的硬件操作中因?yàn)殡娐吩韴D或向單片機(jī)燒錄的程序有誤而造成的難以修改的為題.實(shí)驗(yàn)心得:1、通過本次實(shí)驗(yàn),因?yàn)橹敖佑|到的電子系統(tǒng)設(shè)計(jì)不多,所以一開始,感覺難以入手,就算上網(wǎng)載了很多程序,也看不懂。后來請求同學(xué)的幫助,了解了要對各種芯片編寫程序時(shí)首先應(yīng)找到該芯片的數(shù)據(jù)手冊,根據(jù)數(shù)據(jù)手冊上.的說明、時(shí)序要求及流程圖編寫對應(yīng)程序。2、其

20、次,再次鞏固了KeilC51工程文件的建立,程序編寫以及編譯的掌握程度。最重要的是,因?yàn)橹皇撬接邢蓿约壕帉慍程序很難,但在此實(shí)驗(yàn)中,最大的收獲莫過于看懂別人的程序,分析之后,自己拼湊編寫以實(shí)現(xiàn)不同的功能。并且掌握了52c程序的編寫過程。3、掌握了Proteus的使用方法,從實(shí)際操作中認(rèn)識(shí)到Proteus在仿真方面的優(yōu)越性,激發(fā)了自己學(xué)習(xí)Proteus的興趣;4、因?yàn)樽约阂薷某绦颍詥螁位ㄙM(fèi)在程序分析的時(shí)間就很多,為了更好的理解程序,我把每句主要程序的后面都注釋了該語句的意思,詳情可以見程序清單,發(fā)現(xiàn)注釋語義的工作量也是非常大的。寫實(shí)驗(yàn)報(bào)告時(shí),每個(gè)模塊的流程圖都是自己畫的,用WORD文

21、檔畫圖真的很麻煩,而旦不是很美觀。因?yàn)闀r(shí)間比較倉促,流程圖寫的條理性不夠,不過相信以后多多練習(xí),就可以做得更好。5、在這次實(shí)險(xiǎn)中我遇到了很多故障,不過通過各種渠道(比如網(wǎng)絡(luò),請教同學(xué),老師等等)解決了一些故障,雖然沒有全部解決,但能在短短一周內(nèi)通過此次作業(yè),實(shí)現(xiàn)電子鐘的功能, 還是有點(diǎn)成就感的。 在解決這些問即的過程中發(fā)現(xiàn)網(wǎng)絡(luò)確實(shí)是一個(gè)很好的學(xué)習(xí)平臺(tái),利用前人的經(jīng)驗(yàn)可以提高自12的解決實(shí)際問題的能力。 通過這一個(gè)多禮拜的學(xué)習(xí)實(shí)踐, 使我對所學(xué)的知識(shí)進(jìn)行了系統(tǒng)的復(fù)習(xí)和鞏固,在以前學(xué)習(xí)中不夠清晰的概念得到了更好的理解。相信通過不斷的學(xué)習(xí),能使自己揚(yáng)長補(bǔ)短。六、程序清單1、主程序#include#i

22、nclude,lcdl602.h包含頭文件,直接引用顯示文件#includendsl8b20hM#mcludenDS1302.hH#defineucharunsignedchar#defiiieunitunsignedmt#defineTIMERO_COUNTOxEEllsbitmode=P3A0;/設(shè)定修改位數(shù)sbitplus=P3A3;加鍵sbitdec=P3A6;減鍵ucharcount,s1num,timerO_tick,count=0;typedefstructchai-hour;chai,nuiiute;charsecond;tune;typedefstructuintyear;u

23、cliarmonth;chai-day;date;timenow=10,20,0;顯示時(shí)間初始值datetoday=2009,1,8;charcodedayofinonthQ=31,28,31,30,31,30,31,31,30,31,30.31);設(shè)定月份數(shù)組,用以判定12個(gè)月的最大值charcodeweekday4=Week1JWeek2JWeek3”,,fWeek4tlWeek5lHWeek6M;,Week7H);/設(shè)定行星期顯示數(shù)ucharmonthday(ucharyearjicharmonth)(if(month=2&year%4=0)用以判定是否為潤年,其2月有29天retiin

24、i(29);elseretum(dayofinonthmonth-1);非閏年時(shí)的該月份天數(shù)voiddisplay_xreek()/由年月口計(jì)算星期,用以顯示星血數(shù)chardays;days=(todayday+1+2*today.month+3*(today.month+1)5+today.year+todayyear4-today.year/100+today.year/400)%7;display_string(&weekdaydays0);)staticvendtimerO_imtialize(void)Z/timeiOinitialize(EA=0;設(shè)置不接受所有中斷timerO_t

25、ick=O;TRO=O;關(guān)閉TunerOTMOD=OXO1;設(shè)置TmieiO為模式2,16位工作模式TLO=(TIMERO_COUNT&0X00FF);設(shè)置TmieiO低八展值THO=(TIMERO_COUNT8); 設(shè)置TimerO高八位數(shù)值PT1=1;設(shè)置TimerO的優(yōu)先級為最高ETO=1;設(shè)置接受Timer。的中斷TR0=1;/啟動(dòng)TmierOEA=1;設(shè)置系統(tǒng)接受中斷voidMite_time(ucharadd,ucharnumber)寫時(shí)間gotoxy(2,add);displaydata(number);voidTite_nqi(ucharaddAicharnumber)寫口期(

26、gotoxy(l,add);display_data(number);voidkeyscan()按鍵掃描程序ucharmodenum;設(shè)定modenuni,來判斷是哪一位要修改,當(dāng)mode_num為零時(shí),為非修改模式if(mode=0)“修改位”的選擇(delay(5);延時(shí)if(mode=0)/當(dāng)外部按鍵mode沒按卜.一次時(shí),都使mode_nuni自加,即modemun表示為按鍵mode按下的次數(shù)mode_num+;while。mode);TR0=0;Tite_com(0 x0f);if(mode_mun=1)gotoxy(l,4);當(dāng)當(dāng)nKde_num為1時(shí),為年份改變位,光標(biāo)移到(1,

27、4)if(mode_num=2)gotoxy(l,7);當(dāng)modenum為2時(shí),為月份改變位,光標(biāo)移到(1,7)if(mode_nuiii=3)gotoxy(l,10);當(dāng)modenum為3時(shí),為口期改變位,光標(biāo)移到(:10)if(mode_num=4)gotoxy(2,2);當(dāng)mode_nuin為4時(shí),為小時(shí)改變位,光標(biāo)移到(2,2)iftmode_num=5)gotoxy(2,5);當(dāng)mode_mim為5時(shí),為分鐘改變位,光標(biāo)移到(二,5)if(mode_nmii=6)gotoxy(2,8);當(dāng)modenum為6時(shí),為秒數(shù)改變位,光標(biāo)移到(2,8)if(mode_iium=7)II當(dāng)mod

28、enum為7時(shí),退出修改模式mode_num=0;非修改模式時(shí), 將modemim置零, 有助于判斷是否為修改模式xTite_com(0 x0c);TRO=1;)if(mode_mun?=0)為修改模式時(shí),加減健的處還子程序(if(plus=O)當(dāng)加鍵為零,即外部觸發(fā)一次時(shí),進(jìn)行以下處理(delay(5);/延時(shí)if(phis=O)延時(shí)再次判斷加健,防止抖動(dòng)(while。plus);if(mode_num=1)當(dāng)為年份改變時(shí),年份自加一,并且顯示修改后的口期(todayyear+;write_riqi(l,todayyear/100);/因?yàn)槟攴葜饕亲顪貎晌辉诟淖儯猿?00來計(jì)算年份值

29、,除以100求得的商值為十位wnte_nqi(3,today.year%100);余數(shù)為個(gè)位gotoxy(l,12);display_weekO; 因?yàn)楦淖兛谄诙紩?huì)改變周數(shù),金以要重新顯示gotoxy(l,4);)if(mode_niun=2)以下處理同上(today.month+;if(today.month=13)today.month=l;/特別注意, 月份不能超過12,當(dāng)為13時(shí),要將月份置1xTite_nqi(6joday.month);gotoxy(l,12);display_week();gotoxy(l,7);)if(mode_mun=3)以下處理同上(today.day+;i

30、f(to(iay.daymonthday(today,year,today.month)/特別要判斷每個(gè)月份的最大值,不能超過此數(shù),超過后要將天數(shù)置一todayday=l;wnte_nqi(9,today.day);gotoxy(l,12);display_week();gotoxy(lJO);)if(mode_niim=4)以卜.處理同上now.hoiir+;if(nowhoiir=24)now.houi-0;小時(shí)不能超過24wnte_time(1,now.hour);gotoxy(2,2);if(mode_num=5)以卜處理同上now.uuiiute+;if(nowniniute=60)

31、nownunute=0;xnte_tune(4,now.minute);gotoxy(2,5);if(mode_num=6)以卜處理同上(now.second+;iftnow.second=60)now.second=0;xTite_tmie(7,now.second);gotoxy(2,8);)if(dec=O) 減鍵的處理和加健處理處理相反(delay(5);if(dec=O)(while。dec);if(mode_num=1)today.year-;wnte_nqi(1,today.year/lOO);NTite_nqi(3,today,year%100);gotoxy(l,12);go

32、toxy(l,4);if(mode_nuin=2)(today.month;if(today.montli=0)todaymonth=12; 要注意月份的最小值為1,當(dāng)減為零時(shí),要講月份置為12Tite_nqi(6,today,month);display_week0;gotoxy(l,12);display_week();gotoxy(l,7);)if(mode_nuin=3)(today.day-;if(today.day=0) 當(dāng)天數(shù)減為0時(shí), 要重新賦值,為上一個(gè)月的最大值today.day=monthday(today,year,today.month);xTite_nqi(9,to

33、day,day);gotoxy(l,12);display_week();gotoxy(l,10);if(mode_num=4)(now.houi-;if(now.hour0)now.hoiir=23;當(dāng)小時(shí)數(shù)小于0時(shí),要重新賦值,置為23xTite_time(l,nowhoiu);gotoxy(2,2);if(mode_num=5)(now.minute;iftnow.minute0)now.imnute=59;/注意點(diǎn)同上,ATite_time(4,now.minute);gotoxy(2,5);if(mode_nuin=6)(now.second;if(now.secondmonthda

34、y(today.yeai;today.month)、 判斷天數(shù),當(dāng)超過本月最大天數(shù)時(shí),向月份進(jìn)位,且天數(shù)置一todayday=l;today.mouth+;if(todaymonth=13)/判斷月份,當(dāng)月份超過12時(shí),向年份進(jìn)位,月份置一todaymonth=l;today.year+;vnte_nqi(6,todaymonth);。在位置6處,向?qū)懺路輜nte_nqi(9,todayday);在位置9處,向led寫天應(yīng)gotoxy(l,12);display_weekO;)Tvnte_time(l,now.hour);/在位置1處,向led寫時(shí)數(shù))write_time(4jiow.iiim

35、ute);/在位置4處,向led寫分?jǐn)?shù))nite_tinie(7,now.second);/在位置7處,向led寫秒數(shù))voidinainOSYSTEMTIMECuiTentTime;imtJcdO;初始化ledtimei-O_uiitialize();/初始化內(nèi)部定時(shí)器Imtial_DS13020;初始化DS1302DateToStr(&CunentTime);/從DS13O2讀取口期TimeToStr(&CiinentTune);/從DS13O2讀取時(shí)間gotoxy(l,l);display_stnng(CurrentTime.DateStnng);顯示口期displayweekO;顯示周

36、幾gotoxy(2,l);display_stnng(CurrentTime.TuneSbing);顯小時(shí)間gotoxy(2,10);display_stniig(OO.OC);顯示溫度while(l)keyscan();2、kdl602頭文件程序:#defineucharmisignedchar#defineunitmisignedintsbitrs=P2AO;、寄存器選擇信號(hào)sbitrw=P27;讀寫控制信號(hào)線sbitlcden=P2A2;使能信號(hào)線#defineIcdjnode0 x38#definedisplay_cursorOxOf#defiiietindisplay_cursor0

37、 x0ccharcodemt_to_char=0123456789M;*voiddelay(umtx)延時(shí)程序(uinta,b;fbr(a=x;aO;a)for(b=10;b0;b-);*voidmte_com(ucharcom)寫命令(P0=com;寫命令,記住時(shí)序問題rs=O;rs要為低電平lcden=O;使led使能端產(chǎn)生一個(gè)正脈沖delay(lO);lcden=l;delay(10);lcden=0;)*voidwritedate(uchardate)寫數(shù)據(jù)PO=date;送出rs=l;lcden=0;/使led使能端產(chǎn)生一個(gè)正脈沖delay(lO);lcden=l;delay(10)

38、;lcden=0;)*delay(15);,ATite_com(lcd_mode);/模式設(shè)置delay(20);xTite_com(undisplay_cursor);顯示光標(biāo)delay(20);】vnte_com(0 x06);光標(biāo)移動(dòng)delay(20);wnte_com(0 x01);清屏delay(20);)*voiddisplay_stnng(char*p)寫字符串while(*p)write_date(*p);delay(20);Pf)*將數(shù)據(jù)送到P0口準(zhǔn)備傳寫數(shù)據(jù)時(shí),rs要為高電平voidniit_lcd(-oid)/初始化lcdl602*voidgotoxy(ucharXAic

39、haiy)設(shè)置移動(dòng)坐標(biāo)lf(X=l)vnte_com(0 x80+y);elseTite_com(OxcO+y);)*voiddisplay_data(charnumber)顯示數(shù)據(jù)(ucharx,y;x=iiuinber/10;將取得的數(shù)據(jù)轉(zhuǎn)換成十進(jìn)制y=iiumber%10;Tite_date(int_to_charx);uTite_date(int_to_chaiy);一一一#defineAM(X)X#definePM(X)(X+12)/轉(zhuǎn)成24小時(shí)制#defineDS1302_SECOND0 x80/時(shí)鐘芯片的寄生器位置,存放時(shí)間,如0 x80放的的秒數(shù)#defineDS13O2_MI

40、NUTE0 x82#defineDS1302_HOUR0 x84#defineDS1302_WEEK0 x8A#defineDS1302_DAY0 x86#defineDS1302_MONTH0 x88#defineDS1302_YEAR0 x8C#defineDS1302_RAM(X)(0 xC0+(X)*2)用于計(jì)竟DS1302_RAM地址的宏RAM命令控制字地址:0 xC0-0 xFD3、dsl302頭文件程序#ifiidef_REAL_TDIER_DS1302_2003_7_21_#define_REAL_TIMER_DS1302_2003_7_21_sbitDS1302_CLK=P1

41、A6;實(shí)時(shí)時(shí)鐘時(shí)鐘線引腳sbitDS1302JO=P1A7;實(shí)時(shí)時(shí)鐘數(shù)據(jù)線引麗sbitDS1302_RST=P1A5;實(shí)時(shí)時(shí)鐘復(fù)位線引麗sbitACC0=ACCA0;sbitACC7=ACCA7;typedefstruct_SYSTEMTIME_(unsignedcharSecond;unsignedcharMmute;unsignedchai,Hour;unsignedcharWeek;unsignedcharDay;unsignedcharMontli;unsignedcharYear,unsignedcharDateStnng9;unsignedcharlimeString9;SYSTE

42、MTIME;定義的時(shí)間類型voidDS1302InputByte(uiisigiiedchard)/實(shí)時(shí)時(shí)鐘寫入一字節(jié)(內(nèi)部函數(shù))(unsignedchari;ACC=d;fdr(i=8;i0;i-)(DS1302JO=ACC0;將IO線上的數(shù)據(jù)存放在ACC中DS13O2_CLK=1;特別注意,DS13O2寫一數(shù)據(jù)時(shí),CLK要產(chǎn)生一負(fù)脈沖DS1302_CLK=0;ACC=ACC1;每次移位一位)unsignedcharDS1302OutputByte(void)/實(shí)時(shí)時(shí)鐘讀取一字節(jié)(內(nèi)部函數(shù))(unsignedchari;fbr(i=8;i0;i)(ACC=ACC1;將前一個(gè)卜降沿讀出的數(shù)據(jù)右

43、移一位從而讀出該次讀出的數(shù)放入ACC7ACC7=DS1302JO;DS1302CLK=1;DS1302_CLK=0;/SCLK卜降沿讀出DS1302的數(shù))rehim(ACC);voidWnte1302(unsignedcharucAddi;unsignedcharucDa) 其中Addr為DS1302地址,ucData為要寫的數(shù)據(jù)|DS1302_RST=0;寫數(shù)據(jù)時(shí),加注意RST產(chǎn)生一上升沿,CLK為低電平DS1302_CLK=0;DS1302_RST=1;DS1302InputByte(ucAddr);/地址,命令DS1302InputByte(ucDa);/寫1字節(jié)數(shù)據(jù)DS1302_CLK

44、=1;DS13O2_RST=O;)unsignedcharReadl302(unsignedcharucAddr) 讀取DS1302某地址的數(shù)據(jù)unsignedcharucData;DS13O2_RST=O;DS13O2_CLK=O;DS1302_RST=1;DS1302InputByte(ucAddi|0 x01);/地址,命令ucData=DS13020utputByteO;/讀1字節(jié)數(shù)據(jù)DS1302_CLK=1;DS1302_RST=0;retiini(ucData);)voidDS1302_SetProtect(bitflag)/是否寫保護(hù)Mag)Write1302(0 x8E,0 x

45、80);/0 x8E控制字節(jié)地址,bit7=WPWP=l禁止數(shù)據(jù)寫入DS13O2elseWrite13O2(Ox8E,OxOO);/WP=0允許寫入DS1302)voidDS1302_SetTime(unsignedcharAddress,unsignedcharalue)/設(shè)置時(shí)間函數(shù)(DS1302_SetProtect(0);Wntel302(Addiess,(Aalue/10)4|(Value%10); 讀寫數(shù)據(jù)時(shí)要特別注意數(shù)據(jù)的處理, 要寫的數(shù)據(jù)要進(jìn)行拼湊,將Value數(shù)據(jù)的十位取出,放入高四位,Value的個(gè)位放在低四位上)voidDS1302_GetTuiie(SYSTEMTIME

46、Time)(unsignedcharReadalue;用來傳遞讀取1302的數(shù)據(jù)ReadAalue=Readl3O2(DS1302_SECOND);?讀取秒數(shù),存放在Readhhie變量中Time-Second=(Readalue&0 x70)4)*10+(Readalue&OxOF);將ReadXalue數(shù)據(jù)的第4、5、6位取出,實(shí)際上就是秒數(shù)的卜位,但是以二進(jìn)制的形式表示,所以要進(jìn)行移位,向右移四位, 在乘以10,在加上ReadVahie變最中秒數(shù)的,將十六進(jìn)制的數(shù)化成卜進(jìn)制數(shù)表示,并放在Time-Second中ReadAalue=Readl302(DS1302_MINUTE);Time-

47、Minute=(Readalue&0 x70)4)*10+(Readalue&0 x0F);/R卜.ReadHue=Read1302(DS1302_HOUR);Tnne-Houi-=(ReadAalue&0 x70)4)*10+(ReadAahie&OxOF);同hReadXalue=Read13O2(DS1302_DAY);Tnne-Day=(ReadAalue&0 x70)4)*10+(ReadVah】e&OxOF);同hReadXalue=Read13O2(DS1302_WEEK);Tmie-Week=(ReadBlue&0 x70)4)*10+(Readalue&OxOF);同上Rea

48、dalue=Readl3O2(DS1302_MONTH);Tune-Month=(Readalue&0 x70)4)*10+(Readalue&OxOF);同上ReadAalue=Readl3O2(DS13O2_YEAR);Tmie-Year=(ReadAalue&0 x70)4)*10+(ReadAalue&OxOF);同上voidDateToStr(SYSTEMTIME*Time)/年份轉(zhuǎn)換成可供led顯示的字段子程序Tune-DateStnngO=Time-Year/10+O;/Time-DateStiiiigO中存放的就是要顯示年的十位Tmie-DateStmig1=Tmie-Yeai-%10+O;/Tmie-DateStrmgl中存:放的就是要顯示年的個(gè)位Time-DateStnng2=年和月份之間用-分開Tmie-DateStnng3=Time-Month/10+,0,;/rrinie-DateStniig3中存放的就是要顯示月份的十位Tnne-DateStniig4=Time-Month%10+,0,;/Tinie-DateStrmg4中存放的就是要顯示月份的個(gè)位lime-DateStnng=Tmie-DateStruig6=Tuue-Day/10+5Time-DateStrmg中存放的就是要顯示口的十位Time-DateStrmg7=Tiin

溫馨提示

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

評論

0/150

提交評論