帶有溫度顯示和液晶顯示器的實(shí)時(shí)時(shí)鐘設(shè)計(jì)_第1頁(yè)
帶有溫度顯示和液晶顯示器的實(shí)時(shí)時(shí)鐘設(shè)計(jì)_第2頁(yè)
帶有溫度顯示和液晶顯示器的實(shí)時(shí)時(shí)鐘設(shè)計(jì)_第3頁(yè)
帶有溫度顯示和液晶顯示器的實(shí)時(shí)時(shí)鐘設(shè)計(jì)_第4頁(yè)
帶有溫度顯示和液晶顯示器的實(shí)時(shí)時(shí)鐘設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩14頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、數(shù)字式溫度計(jì)學(xué)生學(xué)號(hào):學(xué)生姓名: 指導(dǎo)教師:劉煥平 機(jī)電工程系2014年 月 日設(shè)計(jì)目標(biāo):設(shè)計(jì)基于單片機(jī)的具有液晶顯示器的實(shí)時(shí)時(shí)鐘,能夠通過(guò)液晶顯示器正確顯示當(dāng)前時(shí)間,包括年,月,日,星期,時(shí),分,秒。并且能夠通過(guò)按鍵對(duì)系統(tǒng)的時(shí)間進(jìn)行修改設(shè)定;能夠顯示當(dāng)前的室溫。研究?jī)?nèi)容:學(xué)習(xí)eda軟件proteus的使用,能夠利用proteus軟件畫出電路圖并實(shí)現(xiàn)仿真。學(xué)習(xí)電子系統(tǒng)設(shè)計(jì)步驟,按步驟完成電子系統(tǒng)的概要設(shè)計(jì)、選型、詳細(xì)設(shè)計(jì),系統(tǒng)測(cè)試仿真。設(shè)計(jì)帶有溫度顯示基于單片機(jī)具有液晶顯示功能的實(shí)時(shí)時(shí)鐘,編寫程序,并利用proteus軟件進(jìn)行模擬仿真。研究方法:繪制原理圖及電路圖,利用軟件環(huán)境編程調(diào)試。實(shí)驗(yàn)步

2、驟:1、打開keil軟件,新建一個(gè)工程文件,選擇好芯片,并記得在 “options for target 1”的output選項(xiàng)中,將create hex fil選項(xiàng)勾起來(lái)。2、將編寫的程序保存成“.c”的形式3、編譯保存好的c文件,并根據(jù)提示修改程序中的錯(cuò)誤,直到編譯成功為止4、打開proteus軟件,畫出實(shí)驗(yàn)電路圖5、在89c51中,載入原來(lái)已生成的hex文檔6、按下運(yùn)行鍵,對(duì)proteus進(jìn)行軟件仿真,觀察運(yùn)行結(jié)果原理結(jié)果及分析一、設(shè)計(jì)方案原理與設(shè)計(jì)特點(diǎn)分析電子鐘總的設(shè)計(jì)模塊:按鍵處理模塊89c51cpu控制模塊溫度采集模塊lcd顯示模塊ds1302時(shí)鐘采集模塊各個(gè)模塊電路原理分析:1、

3、ds1302時(shí)鐘采集模塊:1.1電路原理圖:1.2 ds1302分析:首先ds1302是dallas公司推出的涓流充電時(shí)鐘芯片。內(nèi)含有一個(gè)實(shí)時(shí)時(shí)鐘/日歷和31字節(jié)靜態(tài)ram通過(guò)簡(jiǎn)單的串行接口與單片機(jī)進(jìn)行通信實(shí)時(shí)時(shí)鐘/日歷電路提供秒分時(shí)日日期月年的信息每月的天數(shù)和閏年的天數(shù)可自動(dòng)調(diào)整時(shí)鐘操作。ds1302芯片廣腳介紹:x1、x2為32.768khz晶振管腳。gnd 為地。rst復(fù)位腳。i/o數(shù)據(jù)輸入/輸出引腳。sclk串行時(shí)鐘。vcc1,vcc2電源供電管腳。與單片機(jī)連接的信號(hào)線為: ds1302_sclk 接p16; 實(shí)時(shí)時(shí)鐘時(shí)鐘線引腳 ds1302_io 接p17; 實(shí)時(shí)時(shí)鐘數(shù)據(jù)線引腳 ds

4、1302_rst 接p15; 實(shí)時(shí)時(shí)鐘復(fù)位線引腳特別注意ds1302芯片在讀取或?qū)懭霐?shù)據(jù)時(shí),都是一位一位傳送的,并且每傳送一位,sclk信號(hào)線要有一個(gè)負(fù)跳變。即單片機(jī)對(duì)sclk咬先送高電平,再送低電平。數(shù)據(jù)時(shí)通過(guò)io進(jìn)行傳送的。1.3數(shù)據(jù)處理子程序流程圖是否調(diào)用時(shí)間獲取子程序ds1302_gettime 否 是調(diào)用read1302函數(shù),讀取各個(gè)時(shí)間參數(shù),并存放于readvalue變量中對(duì)readvalue數(shù)據(jù)進(jìn)行轉(zhuǎn)換,轉(zhuǎn)換成十進(jìn)制數(shù),并賦給time指針中。調(diào)用年份轉(zhuǎn)換成可供lcd顯示的字段子程序datetostr時(shí)間轉(zhuǎn)換成可供lcd顯示的字段子程序timetostr結(jié)束因?yàn)閐s1302芯片在讀

5、取或?qū)懭霐?shù)據(jù)時(shí),都是一位一位傳送的,并且每傳送一位,sclk信號(hào)線要有一個(gè)負(fù)跳變。所以在對(duì)ds1302具體某地址進(jìn)行一字節(jié)數(shù)據(jù)的寫入或讀取時(shí),都要調(diào)用實(shí)時(shí)時(shí)鐘寫入一字節(jié)(內(nèi)部函數(shù)) ds1302inputbyte和實(shí)時(shí)時(shí)鐘讀取一字節(jié)(內(nèi)部函數(shù)) ds1302outputbyte兩個(gè)函數(shù)。2、按鍵處理模塊2.1按鍵連線圖從左到右依次是:進(jìn)位鍵,數(shù)字加,數(shù)字減,退出mode模式鍵2.2按鍵掃描子程序流程圖:mode鍵是否按下將進(jìn)位按鍵鍵次數(shù)存放于變量mode_num中mode_num=5?mode_num=1?mode_num=2?mode_num=4?mode_num=3? 否 否 否 否 是

6、是 是 是 是mode_num=6?mode_num=7? 否 否 移動(dòng)光標(biāo),并返回 是 是2.3加減鍵處理子程序流程圖判斷是否為修改模式 否判斷是否為加一鍵 是轉(zhuǎn)減一鍵程序 否 是判斷num=2?判斷num=3判斷num=1? 否 否 是 是 是修改day值,并返回修改mouth值,并返回修改year值,并返回判斷num=6?判斷num=5?判斷num=4? 否 否 是 是 是 修改小時(shí)值,并返回修改分值,并返回修改秒值,并返回減1子程序與加1子程序區(qū)別只在于修改數(shù)值處理不一樣,其他都一樣。3、lcd顯示模塊3.1 lcd顯示模塊電路原理圖3.2 lcd1602芯片以及連線分析液晶顯示器是一

7、種功耗極低的被動(dòng)式顯示器件,1602廣腳介紹:d0d7數(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連接p20; 寄存器選擇信號(hào)rw連接p21; 讀寫控制信號(hào)線en連接p22; 使能信號(hào)線3.3lcd初始化程序流程圖:寫指令0x38,顯示模式設(shè)置寫指令,顯示光標(biāo)寫指令,光標(biāo)移動(dòng)清屏在初始化過(guò)程中,要反復(fù)調(diào)用到write_com函數(shù),此函數(shù)實(shí)現(xiàn)向lcd寫入命令的功能。要特別注意寫命

8、令和寫數(shù)據(jù)的rs、rw、en時(shí)序問(wèn)題4、溫度采集顯示模塊4.1溫度采集顯示模塊的原理圖:4.2ds18b20芯片以及連線分析dsl820數(shù)字溫度計(jì)提供 9 位(二進(jìn)制)溫度讀數(shù),指示器件的溫度、信息經(jīng)過(guò)單線接口送入dsl820 或從dsl820送出。因此從主機(jī)cpu到dsl820僅需一條線(和地線) ,dsl820的電源可以由數(shù)據(jù)線本身提供而不需要外部電源。ds18b20廣腳說(shuō)明:vcc為電源線,dq為數(shù)據(jù)線,gnd為地線。數(shù)據(jù)線dq與單片機(jī)p1.0相連接。4.3溫度采集顯示模塊子程序流程圖:直接向18b20發(fā)送溫度變換命令 讀取溫度寄存器的溫度值讀低八位讀高八位進(jìn)行讀取數(shù)據(jù)處理,得出溫度存放

9、于變量temp中 在此程序中,要特別注意初始化,寫和讀取數(shù)據(jù)時(shí)的時(shí)序處理。首先,初始化中,主機(jī)總線先發(fā)送一復(fù)位脈沖(最短為 480us 的低電平信號(hào)),接著刻釋放總線并進(jìn)入接收狀態(tài)。 dsl8b20在檢測(cè)到總線的上升沿之后,等待 15-60us,接著ds18b20發(fā)出存在脈沖(低電平 持續(xù) 60-240 us)。寫數(shù)據(jù)時(shí)序:當(dāng)主機(jī)總線先從高拉至低電平時(shí),就產(chǎn)生寫時(shí)間隙。讀書序: 主機(jī)總線先從高拉至低電平時(shí),總線只須保持低電平l7ts之后,再將總線拉高,產(chǎn)生讀時(shí)間隙。5、總原理圖以及主程序流程圖:5.1總的原理圖:5.2主程序流程圖:初始化lcd初始化內(nèi)部定時(shí)器初始化ds1302從ds1302讀

10、取日期和時(shí)間移動(dòng)光標(biāo)并顯示日期移動(dòng)光標(biāo)并顯示時(shí)間移動(dòng)光標(biāo)并顯示溫度重復(fù)進(jìn)行按鍵掃描二、proteus仿真結(jié)果:三、實(shí)驗(yàn)數(shù)據(jù)計(jì)算處理,性能分析1、數(shù)據(jù)計(jì)算處理:1.1計(jì)算星期數(shù)的算法days=(today.day+1+2*today.month+3*(today.month+1)/5+today.year+today.year/4-today.year/100+today.year/400)%7,由年月日計(jì)算星期,用以顯示星期數(shù)1.2加減鍵對(duì)時(shí)間日期改變處理算法對(duì)于年月日,時(shí)分秒來(lái)說(shuō),每個(gè)變量的最大值和最小值都不一樣,所以當(dāng)年月份時(shí)分秒改變時(shí),進(jìn)行處理的算法也不一樣,年沒(méi)有最大值,所以不用采取“

11、封頂”措施,每次年加一處理時(shí),直接自加,而對(duì)于月份來(lái)說(shuō),月份是不能超過(guò)13的,所以當(dāng)月份自加到13時(shí)要重新置1,具體處理見(jiàn)程序,在每個(gè)語(yǔ)句后,我都有分析注釋出來(lái)。1.3時(shí)分秒進(jìn)位算法當(dāng)秒,分達(dá)到60時(shí),向分進(jìn)位,且秒數(shù)置零,從新開始計(jì)數(shù)。當(dāng)時(shí)達(dá)到24時(shí),也一樣處理。1.4年月日進(jìn)位算法因?yàn)槊總€(gè)月份的天數(shù)都不同,所以事先先設(shè)定一數(shù)組:dayofmonth=31,28,31,30,31,30,31,31,30,31,30,31用以判定12個(gè)月的最大值,接著判斷天數(shù),當(dāng)超過(guò)本月最大天數(shù)時(shí),月份加一,且天數(shù)要置1。月份判斷比較簡(jiǎn)單,只要超過(guò)12,年份就加1,月份置1。2、性能分析: 首先,lcd能夠正

12、確的顯示1302芯片上面的時(shí)間和日期。其次,可以通過(guò)五個(gè)按鍵: k1, k2、k3、k4和k5鍵對(duì)電子鐘進(jìn)行時(shí)間和日期的調(diào)整。按k1鍵進(jìn)行校時(shí),可以分別對(duì)時(shí)及分進(jìn)行單獨(dú)校時(shí),使其校正到標(biāo)準(zhǔn)時(shí)間,校時(shí)時(shí)用k2鍵進(jìn)行調(diào)整,需要校正哪一位哪一位就閃爍。按k3鍵是對(duì)閃爍位進(jìn)行加一的操作。按k4鍵是對(duì)閃爍位進(jìn)行減一的操作。按k5鍵,就可以退出調(diào)整模式。但是,時(shí)間和日期顯示正確,但溫度顯示錯(cuò)誤。溫度不能正常顯示的主要原因是ds18b20的數(shù)據(jù)傳輸不正確。五、實(shí)驗(yàn)結(jié)論以及體會(huì)實(shí)驗(yàn)結(jié)論:1、在該電子鐘的設(shè)計(jì)中修改定時(shí)或調(diào)整時(shí)間時(shí)采用了閃爍,在編程上,首先進(jìn)行了初始化定義了程序的入口地址以及中斷的入口地址,在主

13、程序的開始定義了一組固定單元用來(lái)存儲(chǔ)計(jì)數(shù)的秒,分,時(shí)以及定時(shí)時(shí)間的序號(hào)等。其次,時(shí),分,秒顯示用了軟件譯碼(查表)的方式,再用了一段固定的程序段進(jìn)行進(jìn)制轉(zhuǎn)化。最后,用查詢方式對(duì)按鍵進(jìn)行判斷,若有鍵按下,則進(jìn)行軟件延時(shí)消抖,避免了抖動(dòng)引起的干擾,執(zhí)行相應(yīng)的定時(shí),選時(shí)或調(diào)時(shí)程序段。對(duì)當(dāng)前時(shí)間或定時(shí)時(shí)間修改后又返回到最初的顯示程序段,如此循環(huán)下去。2、在硬件上,選用ds1302,lcd1602相結(jié)合,首先ds1302內(nèi)含有一個(gè)實(shí)時(shí)時(shí)鐘/日歷和31字節(jié)靜態(tài)ram通過(guò)簡(jiǎn)單的串行接口與單片機(jī)進(jìn)行通信實(shí)時(shí)時(shí)鐘/日歷電路提供秒分時(shí)日日期月年的信息每月的天數(shù)和閏年的天數(shù)可自動(dòng)調(diào)整時(shí)鐘操作,這樣讀取數(shù)據(jù)簡(jiǎn)單。其次

14、,選用lcd1602進(jìn)行顯示時(shí),數(shù)據(jù)位串行輸入,接口連線少,低功耗,顯示清晰。并且本實(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ù)多,硬件復(fù)雜。3、proteus是一個(gè)非常好用的仿真軟件,其具有強(qiáng)大的電路原理圖繪制功能,且可以實(shí)現(xiàn)模擬電路仿真、數(shù)字電路仿真、單片機(jī)及其外圍電路組成的系統(tǒng)仿真、鍵盤、lcd系統(tǒng)仿真等多種功能;和keil聯(lián)合使用時(shí)可以檢測(cè)所編寫的程序的正確與否。將keil和proteus聯(lián)合起來(lái)使用是實(shí)現(xiàn)電子設(shè)計(jì)制作的初步階段,可避免在實(shí)際的硬件操作中因?yàn)殡娐吩韴D或向單片機(jī)燒錄的程序有誤

15、而造成的難以修改的為題。實(shí)驗(yàn)心得:1、通過(guò)本次實(shí)驗(yàn),因?yàn)橹敖佑|到的電子系統(tǒng)設(shè)計(jì)不多,所以一開始,感覺(jué)難以入手,就算上網(wǎng)載了很多程序,也看不懂。后來(lái)請(qǐng)求同學(xué)的幫助,了解了要對(duì)各種芯片編寫程序時(shí)首先應(yīng)找到該芯片的數(shù)據(jù)手冊(cè),根據(jù)數(shù)據(jù)手冊(cè)上的說(shuō)明、時(shí)序要求及流程圖編寫對(duì)應(yīng)程序。2、其次,再次鞏固了keil c51工程文件的建立,程序編寫以及編譯的掌握程度。最重要的是,因?yàn)橹皇撬接邢?,要自己編寫c程序很難,但在此實(shí)驗(yàn)中,最大的收獲莫過(guò)于看懂別人的程序,分析之后,自己拼湊編寫以實(shí)現(xiàn)不同的功能。并且掌握了52c程序的編寫過(guò)程。3、掌握了proteus的使用方法,從實(shí)際操作中認(rèn)識(shí)到proteus在仿真方面

16、的優(yōu)越性,激發(fā)了自己學(xué)習(xí)proteus的興趣;4、因?yàn)樽约阂薷某绦?,所以單單花費(fèi)在程序分析的時(shí)間就很多,為了更好的理解程序,我把每句主要程序的后面都注釋了該語(yǔ)句的意思,詳情可以見(jiàn)程序清單,發(fā)現(xiàn)注釋語(yǔ)義的工作量也是非常大的。寫實(shí)驗(yàn)報(bào)告時(shí),每個(gè)模塊的流程圖都是自己畫的,用word文檔畫圖真的很麻煩,而且不是很美觀。因?yàn)闀r(shí)間比較倉(cāng)促,流程圖寫的條理性不夠,不過(guò)相信以后多多練習(xí),就可以做得更好。5、在這次實(shí)驗(yàn)中我遇到了很多故障,不過(guò)通過(guò)各種渠道(比如網(wǎng)絡(luò),請(qǐng)教同學(xué),老師等等)解決了一些故障,雖然沒(méi)有全部解決,但能在短短一周內(nèi)通過(guò)此次作業(yè),實(shí)現(xiàn)電子鐘的功能,還是有點(diǎn)成就感的。在解決這些問(wèn)題的過(guò)程中發(fā)現(xiàn)

17、網(wǎng)絡(luò)確實(shí)是一個(gè)很好的學(xué)習(xí)平臺(tái),利用前人的經(jīng)驗(yàn)可以提高自己的解決實(shí)際問(wèn)題的能力。通過(guò)這一個(gè)多禮拜的學(xué)習(xí)實(shí)踐,使我對(duì)所學(xué)的知識(shí)進(jìn)行了系統(tǒng)的復(fù)習(xí)和鞏固,在以前學(xué)習(xí)中不夠清晰的概念得到了更好的理解。相信通過(guò)不斷的學(xué)習(xí),能使自己揚(yáng)長(zhǎng)補(bǔ)短。六、程序清單1、主程序#include#include#define uchar unsigned char#define uint unsigned intsbit dq=p30;unsigned int temp;unsigned char ly_dis4=0,0,0,0;unsigned char tl=0,th=0;sbit acc0 = acc0;sbit a

18、cc7 = acc7;sbit t=p10;/進(jìn)入調(diào)時(shí)按鍵sbit jia=p11;/加一按鍵sbit jian=p12;/減一按鍵sbit m=p13;/退出調(diào)時(shí)按鍵sbit beep=p20;/蜂鳴器sbit jtod=p14;/矩陣按鍵轉(zhuǎn)獨(dú)立按鍵,該腳置0sbit t_clk = p16; /*實(shí)時(shí)時(shí)鐘時(shí)鐘線引腳 */sbit t_io = p35; /*實(shí)時(shí)時(shí)鐘數(shù)據(jù)線引腳 */sbit t_rst = p17; /*實(shí)時(shí)時(shí)鐘復(fù)位線引腳 */sbit e=p27;/1602使能引腳sbit rw=p26;/1602讀寫引腳sbit rs=p25;/1602數(shù)據(jù)/命令選擇引腳uchar c

19、ode hanzi8=0x04,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02,0x0f,0x09,0x0f,0x09,0x0f,0x09,0x13,0x11,0x1f,0x11,0x11,0x1f,0x11,0x11,0x1f,0x00;void v_w1302(uchar ucaddr, uchar ucda);uchar uc_r1302(uchar);uchar dectobcd(uchar bcd);uchar bcdtodec(uchar);void beep();void delay(uchar x) uchar i; while(x-) for(i=0;i

20、0;i-) dq = 0; / 給脈沖信號(hào) dat=1; dq = 1; / 給脈沖信號(hào) if(dq) dat|=0x80; mdelay(5); return(dat);void mwrite(unsigned char dat)/寫字節(jié) unsigned char i=0; for (i=8; i0; i-) dq = 0; dq = dat&0x01; mdelay(5); dq = 1; dat=1; /裝入自定義字符(漢字)void writch() uchar i,j; enable(0x40); for(i=0;i8;i+) for(j=0;j59) sec=0; l1602_c

21、har(2, 9, sec/10%10+48); l1602_char(2, 10, sec%10 + 48); v_w1302(0x80,dectobcd(sec)|0x80); if(jian=0) /秒減一 delay(5); if(jian=0) while(!jian); sec=bcdtodec(uc_r1302(0x81); sec-; if(sec=-1) sec=59; l1602_char(2, 9, sec/10%10+48); l1602_char(2, 10, sec%10 + 48); v_w1302(0x80,dectobcd(sec)|0x80); if(num

22、=2) /調(diào)分鐘 enable(0xc0+6); if(jia=0) delay(5); if(jia=0) min = bcdtodec(uc_r1302(0x83); min+; while(!jia); if(min59) min=0; l1602_char(2, 6, min / 10 % 10 + 48); l1602_char(2, 7, min % 10 + 48); v_w1302(0x82,dectobcd(min); if(jian=0) delay(5); if(jian=0) min = bcdtodec(uc_r1302(0x83); min-; while(!jia

23、n); if(min=-1) min=59; l1602_char(2, 6, min / 10 % 10 + 48); l1602_char(2, 7, min % 10 + 48); v_w1302(0x82,dectobcd(min); if(num=3) /調(diào)小時(shí) enable(0xc0+3); if(jia=0) delay(5); if(jia=0) hour = bcdtodec(uc_r1302(0x85); hour+; while(!jia); if(hour23) hour=0; l1602_char(2, 3, hour / 10 % 10 + 48); l1602_c

24、har(2, 4, hour % 10 + 48); v_w1302(0x84,dectobcd(hour); if(jian=0) delay(5); if(jian=0) while(!jian); hour = bcdtodec(uc_r1302(0x85); hour-; if(hour=-1) hour=23; l1602_char(2, 3, hour / 10 % 10 + 48); l1602_char(2, 4, hour % 10 + 48); v_w1302(0x84,dectobcd(hour); if(num=4) /調(diào)日期 enable(0x80+11); if(j

25、ia=0) delay(5); if(jia=0) hour = bcdtodec(uc_r1302(0x87); day+; while(!jia); if(day31) day=0; l1602_char(1, 11, day / 10 % 10 + 48); l1602_char(1, 12, day % 10 + 48); v_w1302(0x86,dectobcd(day); if(jian=0) delay(5); if(jian=0) while(!jian); day=bcdtodec(uc_r1302(0x87); day-; if(day=-1) day=31; l1602

26、_char(1,11,day/10%10+48); l1602_char(1,12,day%10+48); v_w1302(0x86,dectobcd(day); if(num=5)/調(diào)月份 enable(0x80+8); if(jia=0) delay(5); if(jia=0) mon = bcdtodec(uc_r1302(0x89); mon+; while(!jia); if(mon12) mon=0; l1602_char(1, 8, mon / 10 % 10 + 48); l1602_char(1, 9, mon % 10 + 48); v_w1302(0x88,dectobc

27、d(mon); if(jian=0) delay(5); if(jian=0) while(!jian); mon = bcdtodec(uc_r1302(0x89); mon-; if(mon=-1) mon=12; l1602_char(1, 8, mon / 10 % 10 + 48); l1602_char(1, 9, mon % 10 + 48); v_w1302(0x88,dectobcd(mon); if(num=6)/調(diào)年份 enable(0x80+5); if(jia=0) delay(5); if(jia=0) year = bcdtodec(uc_r1302(0x8d);

28、 year+; while(!jia); if(year20) year=0; l1602_char(1, 5, year / 10 % 10 + 48); l1602_char(1, 6, year % 10 + 48); v_w1302(0x8c,dectobcd(year); if(jian=0) delay(5); if(jian=0) while(!jian); year = bcdtodec(uc_r1302(0x8d); year-; if(year=-1) year=20; l1602_char(1, 5, year / 10 % 10 + 48); l1602_char(1,

29、 6, year % 10 + 48); v_w1302(0x8c,dectobcd(year); if(num=0)/關(guān)閉光標(biāo)閃爍enable(0x0c); v_w1302(0x80,uc_r1302(0x81)&0x7f);/開啟1302記時(shí)/* 名稱 : v_rtinputbyte()* 功能 : 往ds1302寫入1byte數(shù)據(jù)* 輸入 : ucda 寫入的數(shù)據(jù)* 輸出 : 無(wú)*/void v_rtinputbyte(uchar ucda)uchar i;acc = ucda;t_rst = 1;for(i=8; i0; i-)t_io = acc0;t_clk = 1;t_clk =

30、 0;acc = acc 1;/* 名稱 : uc_rtoutputbyte()* 功能 : 從ds1302讀取1byte數(shù)據(jù)* 輸入 :無(wú)* 返回值: acc*/uchar uc_rtoutputbyte(void) uchar i;t_rst = 1;for(i=8; i0; i-)acc = acc 1;acc7 = t_io;t_clk = 1;t_clk = 0;return(acc);/* 名稱 : v_w1302(uchar ucaddr, uchar ucda)* 功能 : 往ds1302寫入數(shù)據(jù)* 輸入 : ucaddr: ds1302地址, ucda: 要寫的數(shù)據(jù)* 返回值

31、 : 無(wú)*/void v_w1302(uchar ucaddr, uchar ucda)t_rst = 0;t_clk = 0;t_rst = 1;v_rtinputbyte(ucaddr); / 寫地址 _nop_();_nop_();v_rtinputbyte(ucda); / 寫1byte數(shù)據(jù)t_clk = 1;t_rst = 0;/* 名稱 : uc_r1302(uchar ucaddr)* 功能 : 讀取ds1302某地址的數(shù)據(jù)* 輸入 : ucaddr: ds1302地址* 返回值 : ucda :讀取的數(shù)據(jù)*/uchar uc_r1302(uchar ucaddr)uchar u

32、cda;t_rst = 0;t_clk = 0;t_rst = 1;v_rtinputbyte(ucaddr); /寫地址,命令_nop_();_nop_();ucda = uc_rtoutputbyte(); /讀1byte數(shù)據(jù)t_clk = 1;t_rst = 0;return(ucda);/* 名稱 : bcdtodec(uchar bcd)* 功能 : bcd碼轉(zhuǎn)換為dec碼(dec碼為十進(jìn)制數(shù)據(jù):bcd:0x11-dec為數(shù)值11(hex:0x0b)* 輸入 : bcd碼* 輸出 : dec碼*/uchar bcdtodec(uchar bcd)uchar data1; data1=

33、(bcd&0x70)4)*10+(bcd&0x0f);return data1;uchar dectobcd(uchar dec) uchar dat;dat=(dec/10)4|(dec%10);return dat;/* 名稱 : write_ds1302init()* 功能 : 往ds1302中寫入數(shù)據(jù)。最開始顯示的數(shù)據(jù)就是在這里設(shè)置的。* 輸入 : 無(wú)* 輸出 : 無(wú)*/void write_ds1302init(void)v_w1302(0x8e,0);v_w1302(0x80,0x00);/寫入秒v_w1302(0x8e,0);v_w1302(0x82,0x00);/寫入分v_w1

34、302(0x8e,0);v_w1302(0x84,0x00);/寫入小時(shí)v_w1302(0x8e,0);v_w1302(0x86,0x00);/寫入日v_w1302(0x8e,0);v_w1302(0x88,0x00);/寫入月v_w1302(0x8e,0);v_w1302(0x8a,0x00);/寫入星期v_w1302(0x8e,0);v_w1302(0x8c,0x00);/寫入年 v_w1302(0x90,0xa6);/單二極管,2k電阻充電/* 名稱 : run_ds1302(void)* 功能 : 讀出ds1302中的數(shù)據(jù),并在液晶1602上進(jìn)行顯示* 輸入 : 無(wú)* 輸出 : 無(wú)*/

35、void run_ds1302(void) unsigned int sec, min, hour, day, month, year;minit(); mwrite(0xcc); / 跳過(guò)讀序號(hào)列號(hào)的操作 mwrite(0x44); / 啟動(dòng)溫度轉(zhuǎn)換 mdelay(100); minit(); mwrite(0xcc); /跳過(guò)讀序號(hào)列號(hào)的操作 mwrite(0xbe); /讀取溫度寄存器等 mdelay(100); tl=read(); /讀取溫度值低位 th=read(); /讀取溫度值高位 temp=th8; temp|=tl;if(temp=4; /右移4位,相當(dāng)于乘0.0625,將

36、溫度化為十進(jìn)制 temp*=10; /擴(kuò)大10倍,顯示一位小數(shù)ly_dis0=temp/1000; /千位ly_dis1=temp%1000/100; /百位ly_dis2=temp%1000%100/10; /十位ly_dis3=temp%1000%100%10; /個(gè)位elsetemp=temp;temp+=1;temp=4;ly_dis0=0x0c; /負(fù)數(shù) ly_dis1=temp%100/10; /百位ly_dis2=temp%100%10; /十位ly_dis3=0; /個(gè)位v_w1302(0x8f, 0);sec = bcdtodec(uc_r1302(0x81); /讀出ds1302中的秒

溫馨提示

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

評(píng)論

0/150

提交評(píng)論