基于51單片機(jī)的液晶萬年歷設(shè)計(jì)論文(帶溫度顯示)_第1頁
基于51單片機(jī)的液晶萬年歷設(shè)計(jì)論文(帶溫度顯示)_第2頁
基于51單片機(jī)的液晶萬年歷設(shè)計(jì)論文(帶溫度顯示)_第3頁
基于51單片機(jī)的液晶萬年歷設(shè)計(jì)論文(帶溫度顯示)_第4頁
基于51單片機(jī)的液晶萬年歷設(shè)計(jì)論文(帶溫度顯示)_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、摘要在寒假期間我用一周時(shí)間完成了這個(gè)液晶萬年歷,它可以顯示年月日、時(shí)分秒、以及溫度(可上下限報(bào)警),可以對(duì)時(shí)間進(jìn)行加一或減一調(diào)整,并加入了閏、平年時(shí)間調(diào)整,方便可行,已經(jīng)調(diào)試成功。考慮到成本和方便,本作品采用了stc89c52和ds18b20,計(jì)時(shí)用的是51單片機(jī)自帶的十六位定時(shí)器/計(jì)數(shù)器t0,盡管對(duì)時(shí)間進(jìn)行了誤差調(diào)整但是還是有一定的誤差,考慮到學(xué)校后改用ds1302時(shí)鐘芯片,進(jìn)一步減小誤差。溫度顯示精度達(dá)到0.1攝氏度。關(guān)鍵詞: 單片機(jī) ds18b20 萬年歷 溫度1. 硬件工作介紹(1)上電自動(dòng)復(fù)位及手動(dòng)復(fù)位電路 stc89c52單片機(jī)的rst端外部復(fù)位有兩種操作方式:上電自動(dòng)復(fù)位和按鍵手

2、動(dòng)復(fù)位。本設(shè)計(jì)用上電自動(dòng)復(fù)位以及手動(dòng)復(fù)位下結(jié)合的方式外接電路(見附圖)。(2)時(shí)鐘振蕩電路作品中采用12m晶振,其連接方法如圖所示,其中電容的值都為22pf。(3)1602液晶顯示接口1602采用標(biāo)準(zhǔn)的16腳接口(見附圖),其中:第1腳:gnd為地電源第2腳:vcc接5v正電源第3腳:v0為液晶顯示器對(duì)比度調(diào)整端,接正電源時(shí)對(duì)比度最弱,接地電源時(shí)對(duì)比度最高,對(duì)比度過高時(shí)會(huì)產(chǎn)生“鬼影”,使用時(shí)可以通過一個(gè)10k的電位器調(diào)整對(duì)比度第4腳:rs為寄存器選擇,高電平時(shí)選擇數(shù)據(jù)寄存器、低電平時(shí)選擇指令寄存器。第5腳:rw為讀寫信號(hào)線,高電平時(shí)進(jìn)行讀操作,低電平時(shí)進(jìn)行寫操作。當(dāng)rs和rw共同為低電平時(shí)可以

3、寫入指令或者顯示地址,當(dāng)rs為低電平rw為高電平時(shí)可以讀忙信號(hào),當(dāng)rs為高電平rw為低電平時(shí)可以寫入數(shù)據(jù)。第6腳:e端為使能端,當(dāng)e端由高電平跳變成低電平時(shí),液晶模塊執(zhí)行命令。第714腳:d0d7為8位雙向數(shù)據(jù)線。 第15腳:vcc第16:gnd(4)鍵盤鍵盤是通過s3(p3.2),s4(p3.3),s5(p3.4)對(duì)時(shí)鐘進(jìn)行調(diào)整,其s3選擇要調(diào)整的對(duì)象如時(shí),分,日,月等等,并在液晶屏上顯示所選的對(duì)象。s4對(duì)所選中的對(duì)象進(jìn)行加一調(diào)整,而s5對(duì)所選對(duì)象進(jìn)行減一調(diào)整。(5)蜂鳴器 對(duì)溫度進(jìn)行測(cè)量,高低溫超限報(bào)警,正常溫度在15.0-36.0攝氏度,超過最高或低于最低溫度就會(huì)鳴叫報(bào)警。2. 軟件工作

4、介紹 由于c語言功能豐富,表達(dá)能力和可移植能力強(qiáng),而且操作方便,簡(jiǎn)單易懂,因此軟件部分由c語言編寫,程序的重點(diǎn)和難點(diǎn)是閏月的時(shí)間調(diào)整以及鍵盤對(duì)時(shí)間的調(diào)整,本程序還不是太完善,溫度顯示有規(guī)律性的微微閃爍,懇請(qǐng)老師指正。開始 lcd初始化 t0初始化 時(shí)間、溫度顯示 s3按下否? s4按下否? s5按下否? 否 否是 是 是 時(shí)間加一 n加一,選擇調(diào)整對(duì)象 時(shí)間減一 否 否到最大值否? n=6否?到最小值否? 是 是 是 時(shí)間清零 n清零 時(shí)間清零 主程序流程圖設(shè)計(jì)總結(jié)在制作的過程中,因?yàn)榘遄邮窃趯W(xué)校自己動(dòng)手做的最小系統(tǒng)板,接插線還是比較簡(jiǎn)單的,難的是硬件的調(diào)試,因?yàn)槔碚撆c實(shí)踐總是存在著差距,想出

5、來的東西沒有經(jīng)過實(shí)踐的檢驗(yàn)是不可靠的,任何一個(gè)小小的疏忽大意都能導(dǎo)致失敗。比如說對(duì) hour, min , sec,day, moth的定義,一開始我用的unsigned char ,但是在調(diào)試減一時(shí),減到零時(shí)再按下鍵盤就會(huì)出現(xiàn)亂碼,幾經(jīng)調(diào)試,終于發(fā)現(xiàn)問題地所在并及時(shí)地解決了問題,之后再一次對(duì)硬件進(jìn)行調(diào)試,終于成功了。從這一方面來說,我認(rèn)識(shí)到做要比說難得多,做的過程中必定有很多的阻礙,但是一定要慢慢來,一點(diǎn)一點(diǎn)地找出問題,再一點(diǎn)一點(diǎn)地解決它,這樣的話,到達(dá)成功的彼岸也就僅僅是時(shí)間的問題了。我通過這次設(shè)計(jì),特別是通過對(duì)程序的編寫,深層了解了單片機(jī)內(nèi)部結(jié)構(gòu)和外圍器件的應(yīng)用。我學(xué)到的不僅僅是電子方面

6、的知識(shí),更重要的是,我學(xué)到了作為一名電子設(shè)計(jì)者所必需的心理素質(zhì),那就是決心加上耐心!附錄1:程序代碼:#include #define lcd_data p0 /定義數(shù)據(jù)端口#define _th0_tl0_ (65536 - 50000) #define hi (_th0_tl0_ / 256) /給高8位賦值#define lo (_th0_tl0_ % 256) /給低8位賦值#define m 20 /(1000/50)1秒要20個(gè)中斷的累計(jì) char hour = 0, min = 0, sec = 0,n=0,day=1,moth=1,week=7; /初始化要顯示的值unsign

7、ed char seg_tab = 0x30,0x31,0x32, 0x33, 0x34, 0x35, 0x36, 0x37,0x38, 0x39;/0-9數(shù)字 unsigned int year=8;sbit rs = p2 5; /定義和lcd的連接端口sbit rw = p2 4;sbit e = p2 3;sbit busy = p0 7;sbit s3 = p32;/定義開關(guān)s3選擇鍵sbit s4 = p33;/s4加一鍵sbit s5 = p34;/s5減一鍵sbit dq = p20;/ds18b20sbit speak = p21; /蜂鳴器警報(bào)/*/void delay1(

8、unsigned int num)/短延時(shí)函數(shù)while( num- );/*/void delay(unsigned char t)/長(zhǎng)延時(shí)函數(shù),延時(shí) 1ms*t sunsigned char a;while(-t != 0)for(a = 0; a 0; i-) dq = 0; / 給脈沖信號(hào) dat = 1; dq = 1; / 給脈沖信號(hào) if(dq) dat |= 0x80; delay1(4);return (dat);/*/writeonechar(unsigned char dat)/寫一個(gè)字節(jié)unsigned char i = 0;for (i = 8; i 0; i-) d

9、q = 0; dq = dat&0x01; delay1(5); dq = 1; dat=1;/*/read_disp_temperature(void)/讀取并顯示溫度 unsigned int a = 0, b = 0, c = 0, t = 0; float tt = 0; init_ds18b20();writeonechar(0xcc); / 跳過讀序號(hào)列號(hào)的操作writeonechar(0x44); / 啟動(dòng)溫度轉(zhuǎn)換init_ds18b20();writeonechar(0xcc); /跳過讀序號(hào)列號(hào)的操作writeonechar(0xbe); /讀取溫度寄存器a = readon

10、echar();b = readonechar();t = b;t =360)|(t6) n=0; while(s3=0); write_comm(0xcf); write_data(seg_tabn); /顯示切換鍵位所示的位置 n /0:秒,1:分,2:時(shí),3:日,4:月,5:年 6:星期 if(s4=0)/時(shí)間調(diào)整-加 delay1(10); if(s4=0) if(n=1) min+; if(min=60) min=0; write_comm(0x84); write_data(seg_tabmin/10); write_comm(0x85); write_data(seg_tabmi

11、n%10); if(n=2) hour +; if(hour=24) hour=0; write_comm(0x81); write_data(seg_tabhour/10); write_comm(0x82); write_data(seg_tabhour%10); if(n=3) day+; if(moth=2&(year%4=0)&day=30)day=1; /閏年2月天數(shù)計(jì)算 if(moth=2&(year%4!=0)&day=29)day=1; /平年2月 if(moth=4|moth=6|moth=9|moth=11)&day=31)day=1;/4,6,9,11月計(jì)算 if(da

12、y=32)day=1;/1,3,5,7,8,10,12月天數(shù)計(jì)算 write_comm(0xc9); write_data(seg_tabday/10); write_comm(0xca); write_data(seg_tabday%10); if(n=4) moth+; if(moth=13)moth=1; write_comm(0xc6); write_data(seg_tabmoth/10); write_comm(0xc7); write_data(seg_tabmoth%10); if(n=5) year+; if(year=51)year=0; write_comm(0xc3);

13、 write_data(seg_tabyear/10); write_comm(0xc4); write_data(seg_tabyear%10); if(n=6)week+; if(week=8) week=1; write_comm(0xcc); write_data(seg_tabyear/10); while(s4=0); if(s5=0)/時(shí)間調(diào)整-減 delay1(10); if(s5=0) if(n=1) min-;if(min0) min=59; write_comm(0x84); write_data(seg_tabmin/10); write_comm(0x85); wri

14、te_data(seg_tabmin%10); if(n=2) hour-;if(hour0)hour=23; write_comm(0x81); write_data(seg_tabhour/10); write_comm(0x82); write_data(seg_tabhour%10); if(n=3) day-; if(moth=2&(year%4=0)&day1)day=29; if(moth=2&(year%4!=0)&day1)day=28; if(moth=4|moth=6|moth=9|moth=11)&day1)day=30; if(day1)day=31; write_c

15、omm(0xc9); write_data(seg_tabday/10); write_comm(0xca); write_data(seg_tabday%10); if(n=4) moth-; if(moth=0)moth=12; write_comm(0xc6); write_data(seg_tabmoth/10); write_comm(0xc7); write_data(seg_tabmoth%10); if(n=5) year-; if(year0)year=50; write_comm(0xc3); write_data(seg_tabyear/10); write_comm(0

16、xc4); write_data(seg_tabyear%10); if(n=6) week-; if(week=0) week=7; write_comm(0xcc); write_data(seg_tabweek); while(s5=0); /*/void isrtimer0(void) interrupt 1 using 1 /定時(shí)器0中斷服務(wù)程序static unsigned char count = 0;/定義靜態(tài)變量counttr0 = 0; /時(shí)間誤差調(diào)整 tl0 += (_th0_tl0_ + 9) % 256; th0 += (_th0_tl0_ + 9) / 256 +

17、(char)cy; tr0 = 1;count+;if(count = m)/1秒種時(shí)間到count = 0;sec+;if(sec = 60)/1分鐘時(shí)間到min+;sec = 0;if(min = 60)/1小時(shí)時(shí)間到hour+;min = 0;if(hour = 24)/24小時(shí)時(shí)間到 day+; week+;hour = 0;min = 0;sec = 0;if(week=8) week=1; if(moth=2&(year%4=0)&day=30)|(moth=2&(year%4!=0)&day=29)|(moth=4|moth=6|moth=9|moth=11)&day=31)|(

18、day=32) /一個(gè)月到 moth+; day=1; if(moth=13) /一年到 year+; moth=1; write_comm(0x81); /時(shí)間顯示 write_data(seg_tabhour/10); write_comm(0x82); write_data(seg_tabhour%10); write_comm(0x83); write_data(:); write_comm(0x84); write_data(seg_tabmin/10); write_comm(0x85); write_data(seg_tabmin%10); write_comm(0x86); write_data(:); write_comm(0x87); write_data(seg_tabsec/10); writ

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(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)論