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

下載本文檔

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

文檔簡介

1、.數(shù)字式溫度計(jì)學(xué)生學(xué)號:學(xué)生姓名: 指導(dǎo)教師:劉煥平 機(jī)電工程系2014年 月 日設(shè)計(jì)目標(biāo):設(shè)計(jì)基于單片機(jī)的具有液晶顯示器的實(shí)時(shí)時(shí)鐘,能夠通過液晶顯示器正確顯示當(dāng)前時(shí)間,包括年,月,日,星期,時(shí),分,秒。并且能夠通過按鍵對系統(tǒng)的時(shí)間進(jìn)行修改設(shè)定;能夠顯示當(dāng)前的室溫。研究內(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)測試仿真。設(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)勾起來。2、將編寫的程序保存成“.C”的形式3、編譯保存好的C文件,并根據(jù)提示修改程序中的錯(cuò)誤,直到編譯成功為止4、打開proteus軟件,畫出實(shí)驗(yàn)電路圖5、在89C51中,載入原來已生成的HEX文檔6、按下運(yùn)行鍵,對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通過簡單的串行接口與單片機(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ī)連接的信號線為: DS1302_SCLK 接P16; 實(shí)時(shí)時(shí)鐘時(shí)鐘線引腳 DS1302_IO 接P17; 實(shí)時(shí)時(shí)鐘數(shù)據(jù)線引腳 D

4、S1302_RST 接P15; 實(shí)時(shí)時(shí)鐘復(fù)位線引腳特別注意DS1302芯片在讀取或?qū)懭霐?shù)據(jù)時(shí),都是一位一位傳送的,并且每傳送一位,SCLK信號線要有一個(gè)負(fù)跳變。即單片機(jī)對SCLK咬先送高電平,再送低電平。數(shù)據(jù)時(shí)通過IO進(jìn)行傳送的。1.3數(shù)據(jù)處理子程序流程圖是否調(diào)用時(shí)間獲取子程序DS1302_GetTime 否 是調(diào)用Read1302函數(shù),讀取各個(gè)時(shí)間參數(shù),并存放于ReadValue變量中對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信號線要有一個(gè)負(fù)跳變。所以在對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為寄存器選擇信號,高電平選擇數(shù)據(jù)寄存器,低電平選擇指令寄存器。RW為讀寫控制信號,高電平讀,低電平寫。EN使能信號,讀狀態(tài)下高電平有效,寫狀態(tài)下下降沿有效。 RS連接P20; 寄存器選擇信號RW連接P21; 讀寫控制信號線EN連接P22; 使能信號線3.3LCD初始化程序流程圖:寫指令0x38,顯示模式設(shè)置寫指令,顯示光標(biāo)寫指令,光標(biāo)移動(dòng)清屏在初始化過程中,要反復(fù)調(diào)用到write_com函數(shù),此函數(shù)實(shí)現(xiàn)向lcd寫入命令的功能。要特別注意寫

8、命令和寫數(shù)據(jù)的RS、RW、EN時(shí)序問題4、溫度采集顯示模塊4.1溫度采集顯示模塊的原理圖:4.2DS18B20芯片以及連線分析DSl820數(shù)字溫度計(jì)提供 9 位(二進(jìn)制)溫度讀數(shù),指示器件的溫度、信息經(jīng)過單線接口送入DSl820 或從DSl820送出。因此從主機(jī)CPU到DSl820僅需一條線(和地線) ,DSl820的電源可以由數(shù)據(jù)線本身提供而不需要外部電源。DS18B20廣腳說明: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 的低電平信號),接著刻釋放總線并進(jìn)入接收狀態(tài)。 DSl8b20在檢測到總線的上升沿之后,等待 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加減鍵對時(shí)間日期改變處理算法對于年月日,時(shí)分秒來說,每個(gè)變量的最大值和最小值都不一樣,所以當(dāng)年月份時(shí)分秒改變時(shí),進(jìn)行處理的算法也不一樣,年沒有最大值,所以不用采取

11、“封頂”措施,每次年加一處理時(shí),直接自加,而對于月份來說,月份是不能超過13的,所以當(dāng)月份自加到13時(shí)要重新置1,具體處理見程序,在每個(gè)語句后,我都有分析注釋出來。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)超過本月最大天數(shù)時(shí),月份加一,且天數(shù)要置1。月份判斷比較簡單,只要超過12,年份就加1,月份置1。2、性能分析: 首先,lcd能夠

12、正確的顯示1302芯片上面的時(shí)間和日期。其次,可以通過五個(gè)按鍵: K1, K2、K3、K4和K5鍵對電子鐘進(jìn)行時(shí)間和日期的調(diào)整。按K1鍵進(jìn)行校時(shí),可以分別對時(shí)及分進(jìn)行單獨(dú)校時(shí),使其校正到標(biāo)準(zhǔn)時(shí)間,校時(shí)時(shí)用K2鍵進(jìn)行調(diào)整,需要校正哪一位哪一位就閃爍。按K3鍵是對閃爍位進(jìn)行加一的操作。按K4鍵是對閃爍位進(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、主程序的開始定義了一組固定單元用來存儲計(jì)數(shù)的秒,分,時(shí)以及定時(shí)時(shí)間的序號等。其次,時(shí),分,秒顯示用了軟件譯碼(查表)的方式,再用了一段固定的程序段進(jìn)行進(jìn)制轉(zhuǎn)化。最后,用查詢方式對按鍵進(jìn)行判斷,若有鍵按下,則進(jìn)行軟件延時(shí)消抖,避免了抖動(dòng)引起的干擾,執(zhí)行相應(yīng)的定時(shí),選時(shí)或調(diào)時(shí)程序段。對當(dāng)前時(shí)間或定時(shí)時(shí)間修改后又返回到最初的顯示程序段,如此循環(huán)下去。2、在硬件上,選用DS1302,LCD1602相結(jié)合,首先DS1302內(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í)鐘操作,這樣讀取數(shù)據(jù)簡單。其

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í)可以檢測所編寫的程序的正確與否。將keil和proteus聯(lián)合起來使用是實(shí)現(xiàn)電子設(shè)計(jì)制作的初步階段,可避免在實(shí)際的硬件操作中因?yàn)殡娐吩韴D或向單片機(jī)燒錄的程序有

15、誤而造成的難以修改的為題。實(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、其次,再次鞏固了Keil C51工程文件的建立,程序編寫以及編譯的掌握程度。最重要的是,因?yàn)橹皇撬接邢蓿约壕帉慍程序很難,但在此實(shí)驗(yàn)中,最大的收獲莫過于看懂別人的程序,分析之后,自己拼湊編寫以實(shí)現(xiàn)不同的功能。并且掌握了52C程序的編寫過程。3、掌握了Proteus的使用方法,從實(shí)際操作中認(rèn)識到Proteus在仿真方

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

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

18、ar tl=0,th=0;sbit ACC0 = ACC0;sbit ACC7 = 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讀

19、寫引腳sbit RS=P25;/1602數(shù)據(jù)/命令選擇引腳uchar code 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(u

20、char x) uchar i; while(x-) for(i=0;i<110;i+);/* 名稱 : enable(uchar del)* 功能 : 1602命令函數(shù)* 輸入 : 輸入的命令值* 輸出 : 無*/void enable(uchar del)RS = 0;RW = 0;P0 = del;E = 1;delay(3);E=0;/* 名稱 : write(uchar del)* 功能 : 1602寫數(shù)據(jù)函數(shù)* 輸入 : 需要寫入1602的數(shù)據(jù)* 輸出 : 無*/void write(uchar del)RS = 1;RW = 0;P0 = del;E = 1;delay(3

21、);E=0;/* 名稱 : L1602_init()* 功能 : 1602初始化,請參考1602的資料* 輸入 : 無* 輸出 : 無*/void L1602_init(void)enable(0x01);enable(0x38);enable(0x06);enable(0x0c);E=0;/分別為0-9,不顯示,負(fù)號/帶小數(shù)點(diǎn)顯示void mdelay(unsigned int i) /如果i是unsigend char類型,則會(huì)出現(xiàn)錯(cuò)誤結(jié)果 while(i-);void mInit(void)/初始化 /unsigned char flag=0; DQ = 0; /單片機(jī)將DQ拉低 mde

22、lay(100); /精確延時(shí) 大于 480us小于960us DQ = 1; /拉高總線 mdelay(30); /flag=DQ; /稍做延時(shí)后 如果flag=0則初始化成功 flag=1則初始化失敗 /mdelay(20);unsigned char Read(void)/讀字節(jié) unsigned char i=0; unsigned char dat = 0; for (i=8;i>0;i-) DQ = 0; / 給脈沖信號 dat>>=1; DQ = 1; / 給脈沖信號 if(DQ) dat|=0x80; mdelay(5); return(dat);void m

23、Write(unsigned char dat)/寫字節(jié) unsigned char i=0; for (i=8; i>0; i-) DQ = 0; DQ = dat&0x01; mdelay(5); DQ = 1; dat>>=1; /裝入自定義字符(漢字)void writch() uchar i,j; enable(0x40); for(i=0;i<8;i+) for(j=0;j<8;j+) write(hanziij);/* 名稱 : L1602_char(uchar hang,uchar lie,char sign)* 功能 : 改變液晶中某位的

24、值,如果要讓第一行,第五個(gè)字符顯示"b" ,調(diào)用該函數(shù)如下 L1602_char(1,5,'b')* 輸入 : 行,列,需要輸入1602的數(shù)據(jù)* 輸出 : 無*/void L1602_char(uchar hang,uchar lie,char sign)uchar a;if(hang = 1) a = 0x80;if(hang = 2) a = 0xc0;a = a + lie - 1;enable(a);write(sign);/* 名稱 : L1602_string(uchar hang,uchar lie,uchar *p)* 功能 : 改變液晶中某

25、位的值,如果要讓第一行,第五個(gè)字符開始顯示"ab cd ef" ,調(diào)用該函數(shù)如下 L1602_string(1,5,"ab cd ef;")* 輸入 : 行,列,需要輸入1602的數(shù)據(jù)* 輸出 : 無*/void L1602_string(uchar hang,uchar lie,uchar *p)uchar a;if(hang = 1) a = 0x80;if(hang = 2) a = 0xc0;a = a + lie - 1;enable(a);while(1)if(*p = '0') break;write(*p);p+;/時(shí)鐘調(diào)

26、節(jié)/void timechange() uchar a,num=1; uchar year,mon,day,hour,min,sec;/進(jìn)入調(diào)時(shí)循環(huán) while(num) if(t=0) delay(5); if(t=0) num+; beep(); while(!t); /退出調(diào)時(shí)按鍵m if(m=0) delay(5); if(m=0) num=0; enable(0x0f); a=uc_R1302(0x81)|0x80; v_W1302(0x8e,0); v_W1302(0x80,a);/調(diào)時(shí)到年以后退出調(diào)時(shí)if(num=7)num=0;/num=1調(diào)秒if(num=1) enable(

27、0xc0+9); if(jia=0) delay(5); if(jia=0) /秒加一 while(!jia); sec=bcdtodec(uc_R1302(0x81)&0x7f); sec+; if(sec>59) sec=0; L1602_char(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);

28、 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=2) /調(diào)分鐘 enable(0xc0+6); if(jia=0) delay(5); if(jia=0) min = bcdtodec(uc_R1302(0x83); min+; while(!jia); if(min>59) min=0; L1602_char(2, 6, min / 10 % 10 + 48); L1602_

29、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(!jian); 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) del

30、ay(5); if(jia=0) hour = bcdtodec(uc_R1302(0x85); hour+; while(!jia); if(hour>23) hour=0; L1602_char(2, 3, hour / 10 % 10 + 48); L1602_char(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;

31、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(jia=0) delay(5); if(jia=0) hour = bcdtodec(uc_R1302(0x87); day+; while(!jia); if(day>31) day=0; L1602_char(1, 11, day / 10 % 10 + 48); L1602_char(1, 12, day % 1

32、0 + 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_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(u

33、c_R1302(0x89); mon+; while(!jia); if(mon>12) mon=0; L1602_char(1, 8, mon / 10 % 10 + 48); L1602_char(1, 9, mon % 10 + 48); v_W1302(0x88,dectobcd(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_

34、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); year+; while(!jia); if(year>20) year=0; L1602_char(1, 5, year / 10 % 10 + 48); L1602_char(1, 6, year % 10 + 48); v_W1302(0x8c,dectobcd(year); if(jian=

35、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, 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()

36、* 功能 : 往DS1302寫入1Byte數(shù)據(jù)* 輸入 : ucDa 寫入的數(shù)據(jù)* 輸出 : 無*/void v_RTInputByte(uchar ucDa)uchar i;ACC = ucDa;T_RST = 1;for(i=8; i>0; i-)T_IO = ACC0;T_CLK = 1;T_CLK = 0;ACC = ACC >> 1;/* 名稱 : uc_RTOutputByte()* 功能 : 從DS1302讀取1Byte數(shù)據(jù)* 輸入 :無* 返回值: ACC*/uchar uc_RTOutputByte(void) uchar i;T_RST = 1;for(i

37、=8; i>0; 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ù)* 返回值 : 無*/void v_W1302(uchar ucAddr, uchar ucDa)T_RST = 0;T_CLK = 0;T_RST = 1;v_RTInputByte(ucAddr); / 寫地址 _nop_();_nop_();v_

38、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 ucDa;T_RST = 0;T_CLK = 0;T_RST = 1;v_RTInputByte(ucAddr); /寫地址,命令_nop_();_nop_();ucDa = uc_RTOutputByte(); /讀1Byte數(shù)據(jù)T_CLK

39、= 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=(bcd&0x70)>>4)*10+(bcd&0x0f);return data1;uchar dectobcd(uchar dec) uchar dat;dat=(dec/10)<<4|(de

40、c%10);return dat;/* 名稱 : Write_DS1302Init()* 功能 : 往DS1302中寫入數(shù)據(jù)。最開始顯示的數(shù)據(jù)就是在這里設(shè)置的。* 輸入 : 無* 輸出 : 無*/void Write_DS1302Init(void)v_W1302(0x8e,0);v_W1302(0x80,0x00);/寫入秒v_W1302(0x8e,0);v_W1302(0x82,0x00);/寫入分v_W1302(0x8e,0);v_W1302(0x84,0x00);/寫入小時(shí)v_W1302(0x8e,0);v_W1302(0x86,0x00);/寫入日v_W1302(0x8e,0);v_

41、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)行顯示* 輸入 : 無* 輸出 : 無*/void Run_DS1302(void) unsigned int sec, min, hour, day, month, year;mInit(); mWrite(0xCC); /

42、跳過讀序號列號的操作 mWrite(0x44); / 啟動(dòng)溫度轉(zhuǎn)換 mdelay(100); mInit(); mWrite(0xCC); /跳過讀序號列號的操作 mWrite(0xBE); /讀取溫度寄存器等 mdelay(100); tl=Read(); /讀取溫度值低位 th=Read(); /讀取溫度值高位 temp=th<<8; temp|=tl;if(temp<=0x0800)temp>>=4; /右移4位,相當(dāng)于乘0.0625,將溫度化為十進(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=

溫馨提示

  • 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)僅提供信息存儲空間,僅對用戶上傳內(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

提交評論