




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、摘要在寒假期間我用一周時間完成了這個液晶萬年歷,它可以顯示年月日、時分秒、以及溫度(可上下限報(bào)警),可以對時間進(jìn)行加一或減一調(diào)整,并加入了閏、平年時間調(diào)整,方便可行,已經(jīng)調(diào)試成功??紤]到成本和方便,本作品采用了STC89c52和DS18B20,計(jì)時用的是51單片機(jī)自帶的十六位定時器/計(jì)數(shù)器T0,盡管對時間進(jìn)行了誤差調(diào)整但是還是有一定的誤差,考慮到學(xué)校后改用DS1302時鐘芯片,進(jìn)一步減小誤差。溫度顯示精度達(dá)到0.1攝氏度。關(guān)鍵詞: 單片機(jī) DS18B20 萬年歷 溫度1. 硬件工作介紹(1)上電自動復(fù)位及手動復(fù)位電路 STC89c52單片機(jī)的RST端外部復(fù)位有兩種操作方式:上電自動復(fù)位和按鍵手
2、動復(fù)位。本設(shè)計(jì)用上電自動復(fù)位以及手動復(fù)位下結(jié)合的方式外接電路(見附圖)。(2)時鐘振蕩電路作品中采用12M晶振,其連接方法如圖所示,其中電容的值都為22pF。(3)1602液晶顯示接口1602采用標(biāo)準(zhǔn)的16腳接口(見附圖),其中:第1腳:GND為地電源第2腳:VCC接5V正電源第3腳:V0為液晶顯示器對比度調(diào)整端,接正電源時對比度最弱,接地電源時對比度最高,對比度過高時會產(chǎn)生“鬼影”,使用時可以通過一個10K的電位器調(diào)整對比度第4腳:RS為寄存器選擇,高電平時選擇數(shù)據(jù)寄存器、低電平時選擇指令寄存器。第5腳:RW為讀寫信號線,高電平時進(jìn)行讀操作,低電平時進(jìn)行寫操作。當(dāng)RS和RW共同為低電平時可以
3、寫入指令或者顯示地址,當(dāng)RS為低電平RW為高電平時可以讀忙信號,當(dāng)RS為高電平RW為低電平時可以寫入數(shù)據(jù)。第6腳:E端為使能端,當(dāng)E端由高電平跳變成低電平時,液晶模塊執(zhí)行命令。第714腳:D0D7為8位雙向數(shù)據(jù)線。 第15腳:VCC第16:GND(4)鍵盤鍵盤是通過S3(P3.2),S4(p3.3),S5(p3.4)對時鐘進(jìn)行調(diào)整,其S3選擇要調(diào)整的對象如時,分,日,月等等,并在液晶屏上顯示所選的對象。S4對所選中的對象進(jìn)行加一調(diào)整,而S5對所選對象進(jìn)行減一調(diào)整。(5)蜂鳴器 對溫度進(jìn)行測量,高低溫超限報(bào)警,正常溫度在15.0-36.0攝氏度,超過最高或低于最低溫度就會鳴叫報(bào)警。2. 軟件工作
4、介紹 由于C語言功能豐富,表達(dá)能力和可移植能力強(qiáng),而且操作方便,簡單易懂,因此軟件部分由C語言編寫,程序的重點(diǎn)和難點(diǎn)是閏月的時間調(diào)整以及鍵盤對時間的調(diào)整,本程序還不是太完善,溫度顯示有規(guī)律性的微微閃爍,懇請老師指正。開始 LCD初始化 T0初始化 時間、溫度顯示 S3按下否? S4按下否? S5按下否? 否 否是 是 是 時間加一 N加一,選擇調(diào)整對象 時間減一 否 否到最大值否? N=6否?到最小值否? 是 是 是 時間清零 N清零 時間清零 主程序流程圖設(shè)計(jì)總結(jié)在制作的過程中,因?yàn)榘遄邮窃趯W(xué)校自己動手做的最小系統(tǒng)板,接插線還是比較簡單的,難的是硬件的調(diào)試,因?yàn)槔碚撆c實(shí)踐總是存在著差距,想出
5、來的東西沒有經(jīng)過實(shí)踐的檢驗(yàn)是不可靠的,任何一個小小的疏忽大意都能導(dǎo)致失敗。比如說對 hour, min , sec,day, moth的定義,一開始我用的unsigned char ,但是在調(diào)試減一時,減到零時再按下鍵盤就會出現(xiàn)亂碼,幾經(jīng)調(diào)試,終于發(fā)現(xiàn)問題地所在并及時地解決了問題,之后再一次對硬件進(jìn)行調(diào)試,終于成功了。從這一方面來說,我認(rèn)識到做要比說難得多,做的過程中必定有很多的阻礙,但是一定要慢慢來,一點(diǎn)一點(diǎn)地找出問題,再一點(diǎn)一點(diǎn)地解決它,這樣的話,到達(dá)成功的彼岸也就僅僅是時間的問題了。我通過這次設(shè)計(jì),特別是通過對程序的編寫,深層了解了單片機(jī)內(nèi)部結(jié)構(gòu)和外圍器件的應(yīng)用。我學(xué)到的不僅僅是電子方面
6、的知識,更重要的是,我學(xué)到了作為一名電子設(shè)計(jì)者所必需的心理素質(zhì),那就是決心加上耐心!附錄1:程序代碼:#include <reg51.h>#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個中斷的累計(jì) char hour = 0, min = 0, sec = 0,N=0,day=1,moth=1,week=7;
7、/初始化要顯示的值unsigned 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)
8、/*/void delay1(unsigned int num)/短延時函數(shù)while( num- );/*/void Delay(unsigned char t)/長延時函數(shù),延時 1MS*t Sunsigned char a;while(-t != 0)for(a = 0; a < 125; a+);/*/void Timer0Init(void) /初始化定時器0程序TMOD = 0x01; /設(shè)置模式1 定時器0 工作方式0TH0 = HI; /給TH0,TL0賦初始值TL0 = LO;TR0 = 1; /啟動定時器0ET0 = 1; /定時器中斷開EA = 1;/總中斷開/*/
9、void Read_Busy(void)/讀忙信號判斷doLcd_Data = 0xff;RS = 0;RW = 1;E = 0;Delay(2);E = 1; while(Busy);/*/ void Write_Comm(unsigned char lcdcomm) /寫指令函數(shù)Lcd_Data = lcdcomm;RS = 0;RW = 0;E = 0;Read_Busy();E = 1;/*/void Write_Data(unsigned char lcddata)/寫數(shù)據(jù)函數(shù)Lcd_Data = lcddata;RS = 1;RW = 0;E = 0;Read_Busy();E =
10、 1;/*/void Init_LCD(void)/初始化LCDDelay(400); /稍微延時,等待LCD進(jìn)入工作狀態(tài)Write_Comm(0x01);/清顯示W(wǎng)rite_Comm(0x02);/光標(biāo)歸位Write_Comm(0x38);/8位2行5*8Write_Comm(0x06);/文字不動,光標(biāo)右移Write_Comm(0x0c);/顯示開/關(guān),光標(biāo)開閃爍開Write_Comm(0x18);/左移/*/Init_DS18B20(void)/初始化ds1820unsigned char x = 0;DQ = 1; /DQ復(fù)位delay1(8); /稍做延時DQ = 0; /單片機(jī)將D
11、Q拉低delay1(80); /精確延時 大于 480usDQ = 1; /拉高總線delay1(14);x = DQ; /稍做延時后 如果x=0則初始化成功 x=1則初始化失敗 delay1(20);/*/ReadOneChar(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; delay1(4);return (dat);/*/WriteOneCh
12、ar(unsigned char dat)/寫一個字節(jié)unsigned char i = 0;for (i = 8; i > 0; i-) DQ = 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); / 跳過讀序號列號的操作WriteOneChar(0x44); / 啟動溫度
13、轉(zhuǎn)換Init_DS18B20();WriteOneChar(0xCC); /跳過讀序號列號的操作WriteOneChar(0xBE); /讀取溫度寄存器a = ReadOneChar();b = ReadOneChar();t = b;t <<= 8;t = t | a;tt = t * 0.0625; t = tt * 10 + 0.5; /放大10倍輸出并四舍五入a = t / 100; /十位b = t / 10 - a * 10; /個位 c = t - a * 100 - b * 10; /小數(shù)位 if(t>=360)|(t<=150) /溫度報(bào)警范圍 spe
14、ak=0; else speak=1; Write_Comm(0x8d); /lcd顯示溫度 Write_Data( SEG_TABa); Write_Data( SEG_TABb); Write_Data( '.'); Write_Data( SEG_TABc);/*/void main(void)/主函數(shù)-數(shù)字讀取和計(jì)算Init_LCD(); /初始化 LCD Timer0Init();/初始化定時器0 Write_Comm(0x83); /寫入":"字符 Write_Data(':'); Write_Comm(0x86); Write_
15、Data(':'); Write_Comm(0x89);/溫度提示字符 Write_Data('T'); Write_Data('e'); Write_Data('m'); Write_Data('p'); Write_Comm(0xc1);/第二行首地址 /寫入"20 - -"字符 Write_Data('2'); Write_Data('0'); Write_Comm(0xc5); Write_Data('-'); Write_Comm(0xc
16、8); Write_Data('-'); Write_Comm(0xcb); Write_Data('-'); while(1) Read_Disp_Temperature(); /溫度 if(S3=0) delay1(10); if(S3=0) N+; if(N>6) N=0; while(S3=0); Write_Comm(0xcf); Write_Data(SEG_TABN); /顯示切換鍵位所示的位置 N /0:秒,1:分,2:時,3:日,4:月,5:年 6:星期 if(S4=0)/時間調(diào)整-加 delay1(10); if(S4=0) if(N=
17、1) min+; if(min=60) min=0; Write_Comm(0x84); Write_Data(SEG_TABmin/10); Write_Comm(0x85); Write_Data(SEG_TABmin%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)&&da
18、y=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(day=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
19、=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); 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_TABy
20、ear/10); while(S4=0); if(S5=0)/時間調(diào)整-減 delay1(10); if(S5=0) if(N=1) min-;if(min<0) min=59; Write_Comm(0x84); Write_Data(SEG_TABmin/10); Write_Comm(0x85); Write_Data(SEG_TABmin%10); if(N=2) hour-;if(hour<0)hour=23; Write_Comm(0x81); Write_Data(SEG_TABhour/10); Write_Comm(0x82); Write_Data(SEG_TA
21、Bhour%10); if(N=3) day-; if(moth=2&&(year%4=0)&&day<1)day=29; if(moth=2&&(year%4!=0)&&day<1)day=28; if(moth=4|moth=6|moth=9|moth=11)&&day<1)day=30; if(day<1)day=31; Write_Comm(0xC9); Write_Data(SEG_TABday/10); Write_Comm(0xCa); Write_Data(SEG_TABda
22、y%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(year<0)year=50; Write_Comm(0xc3); Write_Data(SEG_TAByear/10); Write_Comm(0xc4); Write_Data(SEG_TAByear%10); if(N=6) week-; if(week=0) week=7; Writ
23、e_Comm(0xcc); Write_Data(SEG_TABweek); while(S5=0); /*/void IsrTimer0(void) interrupt 1 using 1 /定時器0中斷服務(wù)程序static unsigned char count = 0;/定義靜態(tài)變量countTR0 = 0; /時間誤差調(diào)整 TL0 += (_TH0_TL0_ + 9) % 256; TH0 += (_TH0_TL0_ + 9) / 256 + (char)CY; TR0 = 1;count+;if(count = M)/1秒種時間到count = 0;sec+;if(sec = 60)
24、/1分鐘時間到min+;sec = 0;if(min = 60)/1小時時間到hour+;min = 0;if(hour = 24)/24小時時間到 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)|(day=32) /一個月到 moth+; day=1; if(moth=13) /一年到 year+; moth=1; Write_Comm(0x81); /時間顯示 Write_Data(SEG_TABhour/10); Write_Comm(0x82); Write_Data(SEG_TABhour%10); Write_Comm(0x83); Write_Data(':'); Write_Com
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 項(xiàng)目管理考試技巧與方法試題及答案
- 注冊會計(jì)師考試的界限與專業(yè)化趨勢分析試題及答案
- 有效項(xiàng)目管理技巧試題及答案
- 高中攝影課題申報(bào)書
- 學(xué)科素養(yǎng)課題申報(bào)書
- 理財(cái)中的創(chuàng)新思維培養(yǎng)與實(shí)踐試題及答案
- 項(xiàng)目管理協(xié)調(diào)能力測試試題及答案
- 注冊會計(jì)師考試整體把握試題及答案
- 遼寧高校課題申報(bào)書
- 2025年注冊會計(jì)師答案解析及試題
- 銀行從業(yè)資格考試題庫附參考答案(共791題精心整理)
- 年產(chǎn)20噸阿齊沙坦原料藥生產(chǎn)車間的設(shè)計(jì)和實(shí)現(xiàn)材料學(xué)專業(yè)
- 原地面高程復(fù)測記錄表正式版
- 高等學(xué)校建筑學(xué)專業(yè)本科(五年制)教育評估標(biāo)準(zhǔn)
- 滬寧城際接觸網(wǎng)專業(yè)驗(yàn)收標(biāo)準(zhǔn)
- MQ2535門座起重機(jī)安裝方案
- 過程審核VDA6.3檢查表
- 安徽省融資性擔(dān)保公司代償損失核銷管理暫行辦法
- 第六課-吸煙者的煩惱-《橋梁》實(shí)用漢語中級教程(上)課件
- 長城哈弗h6驅(qū)動橋畢業(yè)設(shè)計(jì)
- 地下車庫建筑結(jié)構(gòu)設(shè)計(jì)土木工程畢業(yè)設(shè)計(jì)
評論
0/150
提交評論