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

下載本文檔

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

文檔簡介

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

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

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

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

5、取或?qū)懭霐?shù)據(jù)時,都是一位一位傳送的,并且每傳送一位,sclk信號線要有一個負(fù)跳變。所以在對ds1302具體某地址進(jìn)行一字節(jié)數(shù)據(jù)的寫入或讀取時,都要調(diào)用實(shí)時時鐘寫入一字節(jié)(內(nèi)部函數(shù)) ds1302inputbyte和實(shí)時時鐘讀取一字節(jié)(內(nèi)部函數(shù)) ds1302outputbyte兩個函數(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? 否 否 移動光標(biāo),并返回 是 是2.3加減鍵處理子程序流程圖判斷是否為修改模式 否判斷是否為加一鍵 是轉(zhuǎn)減一鍵程序 否 是判斷num=2?判斷num=3判斷num=1? 否 否 是 是 是修改day值,并返回修改mouth值,并返回修改year值,并返回判斷num=6?判斷num=5?判斷num=4? 否 否 是 是 是 修改小時值,并返回修改分值,并返回修改秒值,并返回減1子程序與加1子程序區(qū)別只在于修改數(shù)值處理不一樣,其他都一樣。3、lcd顯示模塊3.1 lcd顯示模塊電路原理圖3.2 lcd1602芯片以及連線分析液晶顯示器是一

7、種功耗極低的被動式顯示器件,1602廣腳介紹:d0d7數(shù)據(jù)傳送引腳,vss為接地線,vdd為電源線,vee為 lcd驅(qū)動電壓調(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)移動清屏在初始化過程中,要反復(fù)調(diào)用到write_com函數(shù),此函數(shù)實(shí)現(xiàn)向lcd寫入命令的功能。要特別注意寫命

8、令和寫數(shù)據(jù)的rs、rw、en時序問題4、溫度采集顯示模塊4.1溫度采集顯示模塊的原理圖:4.2ds18b20芯片以及連線分析dsl820數(shù)字溫度計提供 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ù)時的時序處理。首先,初始化中,主機(jī)總線先發(fā)送一復(fù)位脈沖(最短為 480us 的低電平信號),接著刻釋放總線并進(jìn)入接收狀態(tài)。 dsl8b20在檢測到總線的上升沿之后,等待 15-60us,接著ds18b20發(fā)出存在脈沖(低電平 持續(xù) 60-240 us)。寫數(shù)據(jù)時序:當(dāng)主機(jī)總線先從高拉至低電平時,就產(chǎn)生寫時間隙。讀書序: 主機(jī)總線先從高拉至低電平時,總線只須保持低電平l7ts之后,再將總線拉高,產(chǎn)生讀時間隙。5、總原理圖以及主程序流程圖:5.1總的原理圖:5.2主程序流程圖:初始化lcd初始化內(nèi)部定時器初始化ds1302從ds1302讀

10、取日期和時間移動光標(biāo)并顯示日期移動光標(biāo)并顯示時間移動光標(biāo)并顯示溫度重復(fù)進(jìn)行按鍵掃描二、proteus仿真結(jié)果:三、實(shí)驗(yàn)數(shù)據(jù)計算處理,性能分析1、數(shù)據(jù)計算處理:1.1計算星期數(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,由年月日計算星期,用以顯示星期數(shù)1.2加減鍵對時間日期改變處理算法對于年月日,時分秒來說,每個變量的最大值和最小值都不一樣,所以當(dāng)年月份時分秒改變時,進(jìn)行處理的算法也不一樣,年沒有最大值,所以不用采取“

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

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

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

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

15、而造成的難以修改的為題。實(shí)驗(yàn)心得:1、通過本次實(shí)驗(yàn),因?yàn)橹敖佑|到的電子系統(tǒng)設(shè)計不多,所以一開始,感覺難以入手,就算上網(wǎng)載了很多程序,也看不懂。后來請求同學(xué)的幫助,了解了要對各種芯片編寫程序時首先應(yīng)找到該芯片的數(shù)據(jù)手冊,根據(jù)數(shù)據(jù)手冊上的說明、時序要求及流程圖編寫對應(yīng)程序。2、其次,再次鞏固了keil c51工程文件的建立,程序編寫以及編譯的掌握程度。最重要的是,因?yàn)橹皇撬接邢?,要自己編寫c程序很難,但在此實(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)在程序分析的時間就很多,為了更好的理解程序,我把每句主要程序的后面都注釋了該語句的意思,詳情可以見程序清單,發(fā)現(xiàn)注釋語義的工作量也是非常大的。寫實(shí)驗(yàn)報告時,每個模塊的流程圖都是自己畫的,用word文檔畫圖真的很麻煩,而且不是很美觀。因?yàn)闀r間比較倉促,流程圖寫的條理性不夠,不過相信以后多多練習(xí),就可以做得更好。5、在這次實(shí)驗(yàn)中我遇到了很多故障,不過通過各種渠道(比如網(wǎng)絡(luò),請教同學(xué),老師等等)解決了一些故障,雖然沒有全部解決,但能在短短一周內(nèi)通過此次作業(yè),實(shí)現(xiàn)電子鐘的功能,還是有點(diǎn)成就感的。在解決這些問題的過程中發(fā)現(xiàn)

17、網(wǎng)絡(luò)確實(shí)是一個很好的學(xué)習(xí)平臺,利用前人的經(jīng)驗(yàn)可以提高自己的解決實(shí)際問題的能力。通過這一個多禮拜的學(xué)習(xí)實(shí)踐,使我對所學(xué)的知識進(jìn)行了系統(tǒng)的復(fù)習(xí)和鞏固,在以前學(xué)習(xí)中不夠清晰的概念得到了更好的理解。相信通過不斷的學(xué)習(xí),能使自己揚(yá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)時按鍵sbit jia=p11;/加一按鍵sbit jian=p12;/減一按鍵sbit m=p13;/退出調(diào)時按鍵sbit beep=p20;/蜂鳴器sbit jtod=p14;/矩陣按鍵轉(zhuǎn)獨(dú)立按鍵,該腳置0sbit t_clk = p16; /*實(shí)時時鐘時鐘線引腳 */sbit t_io = p35; /*實(shí)時時鐘數(shù)據(jù)線引腳 */sbit t_rst = p17; /*實(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; / 給脈沖信號 dat=1; dq = 1; / 給脈沖信號 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)小時 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記時/* 名稱 : v_rtinputbyte()* 功能 : 往ds1302寫入1byte數(shù)據(jù)* 輸入 : ucda 寫入的數(shù)據(jù)* 輸出 : 無*/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ù)* 輸入 :無* 返回值: 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、 : 無*/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è)置的。* 輸入 : 無* 輸出 : 無*/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);/寫入小時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)行顯示* 輸入 : 無* 輸出 : 無*/

35、void run_ds1302(void) unsigned int sec, min, hour, day, month, year;minit(); mwrite(0xcc); / 跳過讀序號列號的操作 mwrite(0x44); / 啟動溫度轉(zhuǎn)換 mdelay(100); minit(); mwrite(0xcc); /跳過讀序號列號的操作 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; /個位elsetemp=temp;temp+=1;temp=4;ly_dis0=0x0c; /負(fù)數(shù) ly_dis1=temp%100/10; /百位ly_dis2=temp%100%10; /十位ly_dis3=0; /個位v_w1302(0x8f, 0);sec = bcdtodec(uc_r1302(0x81); /讀出ds1302中的秒

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論