可調(diào)萬年歷以及溫度1602液晶顯示設(shè)計完全源程序1_第1頁
可調(diào)萬年歷以及溫度1602液晶顯示設(shè)計完全源程序1_第2頁
可調(diào)萬年歷以及溫度1602液晶顯示設(shè)計完全源程序1_第3頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、可調(diào)萬年歷以及溫度顯示設(shè)計完全源程序1602液晶1作者:日期:基于51單片機系列89C52單片機 的設(shè)計。此為主程序部分,還有另外一部 分為18b20的溫度初始化模塊一并也上 傳啦/*1602液晶顯示程序* * * * *# include<reg52.h># in elude intrins。h> #defi ne uchar un sig ned char#defi ne uint un sig nedintuchar a,miao,shi, fen, ri, yue,nian,week,flag1,key1 n , temp; #defi ne yh 0x80# def

2、ine er 0x80+0x40 /DS1302時鐘芯片與 C51之間的引腳連接定義sbit IO=P1A1;sbit SCLK=P1A° ;sbit RST=P"2;sbit ACC0=ACCA0;sbit ACC7=ACCA7 ;/校時按鍵與C51的引腳連接定義/設(shè)置鍵/加鍵/減鍵/蜂鳴器,通過三極管9012驅(qū)動,sbit key仁P"5;sbit key2=P1A6;sbit key3=P1A7 ;/sbit buzzer=P1A3;端口低電平響typedef unsigned char BYTE ;typedef un sig ned int WORD;t

3、ypedef bit BOOL ;extern GetTemp(void);exter n un sig ned int idata Temperature;externInit18b20 ();un sig ned char a,b,c;sbitIcde n=P2A7;液晶使能位sbitIcdrw=P2A5 ;液晶讀寫位sbitIcdrs=P2A6;/數(shù)據(jù)命令選擇位個人收集整理勿做商業(yè)用途uchar code tab1='-07012 ” ;/年顯示的固定字符uchar code tab2 ="19:50:00"/時間顯示的固定字符void w_cmd(uint

4、date );void w_data( uint date);*定時器1子函數(shù)*void systemni () -TMOD|= 0x11;TH1=0x8e ;/11。0592MTL1=0x33;IE = 0x8A;TR1 = 1;/ * * * * * *延時子函數(shù)* * * *void delay(uchar x )uchar y,z;for(y=x;y > 0; y-)for (z=110;z > 0; z-);/* * * * * * * * * * * * * * /lcdnit ()* 液晶初始化和寫命令及數(shù)據(jù)命令* * * * * * * *void 示,lcden=

5、0; lcdrw=0 ; w_cmd(0x38 );5*7點陣,8位數(shù)據(jù)w_cmd(0x01); w_cmd(0x0c); w_cmd (0x06);初始使能端/寫數(shù)據(jù)選擇/設(shè)置液晶工作模式,意思:16* 2行顯清顯示開顯示不顯示光標(biāo)/整屏不移動,光標(biāo)自動右移w_cmd (yh+1);置之后開始顯示for(a=0 ; a<14;a+) w_data (tab1 a); 分delay (3);w_cmd (er+2);個位置后開始顯示日歷顯示固定符號從第一行第1個位/向液晶屏寫日歷顯示的固定符號部時間顯示固定符號寫入位置,從第2for (a=0; a 8;a+)/寫”命令子程序/寫顯示時間

6、固定符號,兩個冒號w_data (tab2a ) delay(3) ; void w_cmd( uint date) _lcdrs=0; P0=date;delay (5); lcde n=1;delay (5); lcde n=0;void w_data(uint date )/ 寫 數(shù)據(jù)子程序 _lcdrs=1 ; P0=date; delay(3) lcde n=1;delay (5) lcde n=0;/* * * * * DS1302有關(guān)子函數(shù)* *void write_byte (uchar dat) 寫一個字節(jié) _ACC=dat;RST=1;for (a=8;a> 0;a-

7、)IO=ACCO ;SCLK=0 ;SCLK=1 ;ACC=ACC>>1;/讀一個字節(jié)uchar read_byte () _RST=1;for (a=8;a> 0;a-)ACC7=IO ;SCLK=1 ;SCLK=O;.ACC=ACC >> 1; return (ACC);/- 一 - void write_1302 (uchar add, uchar dat) 指定寫入地址,數(shù)據(jù)RST=0;SCLK=0 ;RST=1;write_byte (add);write_byte (dat);SCLK=1 ;RST=0;uchar read_1302 (uchar a

8、dd) 定讀取數(shù)據(jù)來源地址uchar temp;RST=0;SCLK=0;RST=1; write_byte (add); temp=read_byte ();SCLK=1 ;RST=0; return(temp);uchar BCD_Decimal(uchar bcd)返回十進制一uchar Decimal ;Decimal=bcd > >4;return(Decimal=Decimal*10+(bcd & =0x0F) void ds1302_init ()(2010-01 07, 12: 00:00,week4)RST=0;SCLK=0;write_1302 (0x8

9、e,0x00);II向1302芯片寫函數(shù),II從1302讀數(shù)據(jù)函數(shù),指IIBCD碼轉(zhuǎn)十進制函數(shù),輸入 BCD ,II1302芯片初始化子函數(shù)允許寫,禁止寫保護個人收集整理 write_1302 ( 0x80,0x00);初始秒數(shù)據(jù)00write_1302(0x82,0x53);初始分?jǐn)?shù)據(jù)00#write_1302 ( 0x84 , 0x19); 寫入初始小時數(shù)據(jù)12write_1302(0x8a,0x02);初始周數(shù)據(jù)4write_1302 ( 0x86 , 0x12);寫入初始日期數(shù)據(jù)07write_1302 ( 0x88,0x07);入初始月份數(shù)據(jù)01 write_1302 (0x8c,0

10、x11);入初始年份數(shù)據(jù)10write_1302 (0x8e,0x80);勿做商業(yè)用途/向DS1302內(nèi)寫秒寄存器 80H寫入/向DS1302內(nèi)寫分寄存器 82H寫入/向DS1302內(nèi)寫小時寄存器 84H/向DS1302內(nèi)寫周寄存器 8aH寫入/向DS1302內(nèi)寫日期寄存器 86H/向DS1302內(nèi)寫月份寄存器 88H寫/向DS1302內(nèi)寫年份寄存器 8cH寫/打開寫保護/* * * *溫度顯示子函數(shù) * *void write_temp(uchar add,uchar dat) 置_uchar gw, sw;gw=dat % 10;sw=dat/10;w_cmd (er+add);w_dat

11、a (0x30+sw);碼w_data (0x30+gw );碼 _w_data(0xdf);符庫的該符號地址碼w_data (0x43);寫C的地址碼* * * * /向LCD寫溫度數(shù)據(jù),并指定顯示位/取得個位數(shù)字/取得十位數(shù)字/er是頭文件規(guī)定的值 0x80+0x40數(shù)字+30得到該數(shù)字的 LCD1602顯示數(shù)字+30得到該數(shù)字的 LCD1602顯示/顯示溫度的小圓圈符號,0xdf是液晶屏字顯示"C"符號,0x43是液晶屏字符庫里大/* * * * * * 時間顯示子函數(shù)* * */取得個位數(shù)字/取得十位數(shù)字/er是頭文件規(guī)定的值 0x80+0x40數(shù)字+30得到該數(shù)字

12、的LCD1602顯示碼數(shù)字+30得到該數(shù)字的LCD1602顯示碼void write_sfm(uchar add , uchar dat)現(xiàn)示數(shù)據(jù)兩個參數(shù)uchar gw,sw;gw=dat % 10;sw=dat/10;w_cmd(er+add );w_data(0x30+sw );w_data(0x30+gw );/向LCD寫時分秒,有顯示位置加、/ * * * * *年、月、日顯示子函數(shù)void write_ ny r(uchar add,uchar dat) 示數(shù)據(jù),兩個參數(shù)uchar gw, sw;gw=dat%10;sw=dat/10;w_cmd (yh+add);w_data (

13、0x30+sw); w_data(0x30+gw);* */向LCD寫年月日,有顯示位置加數(shù)、/取得個位數(shù)字取得十位數(shù)字/設(shè)定顯示位置為第一個位置 +add/數(shù)字+30得到該數(shù)字的 LCD1602顯示碼數(shù)字+30得到該數(shù)字的LCD1602顯示碼/* * *寫星期子函數(shù)* *void write_week (uchar week) _/寫星期函數(shù)w_cmd (yh+0x0c);/星期字符的顯示位置switch (week)case 1:w_data (' M ; w_data ('O'); w_data('N '); break;/星期數(shù)為1時,顯示cas

14、e 2: w_data (' T'); w_data('U'); w_data('E '); break;case 3:w_data('W '); w_data('E ;') w_data( ' )D: break;星期數(shù)據(jù)為2時顯示/星期數(shù)據(jù)為3時顯示case 4: w_data (' T'; w_data( ' )H' w_data ('U ' break;/星期數(shù)據(jù)為4是顯示case 5:w_data ('F ');w_data('

15、;R');w_data (');'break;/星期數(shù)據(jù)為5時顯示case 6: w_data (' S') w_data('T ;') w_data( ' A');/星期數(shù)據(jù)為6時顯示break;case 7:w_data (' $; w_data ('U '); w_data( ' )N: break;/ * *鍵盤掃描有關(guān)函數(shù)*void keysca n()if (key1=0)delay(9);if (key1=0 )/ buzzer=0;/ delay(20);/ buzzer=1

16、;while (!key1);key1n+ ;if (key1 n=9 )key1n=1;年、返回,8個功能循環(huán)switch(key1 n)case 1:TR0=0 ;TR仁0 ;w_cmd (er+0x09); w_cmd(0x0f);temp= (miao)/10*16+(miao) write_1302(0x8e,0x00 ); write_1302(0x80,0x80|temp) write_1302 ( 0x8e, 0x80); break;case 2:w_cmd (er+6);/write_1602com(0x0f); break;case 3:w_cmd (er+3);/wri

17、te_1602com (0x0f); break;case 4: w_cmd(yh+0x0e);/星期數(shù)據(jù)為7時顯示* * * * */key1為功能鍵(設(shè)置鍵)延時,用于消抖動/延時后再次確認(rèn)按鍵按下/蜂鳴器短響一次設(shè)置按鍵共有秒、分、時、星期、日、月、/關(guān)閉定時器/設(shè)置按鍵按動一次,秒位置顯示光標(biāo)/設(shè)置光標(biāo)為閃爍% 10;/秒數(shù)據(jù)寫入 DS1302;/miao按2次fen位置顯示光標(biāo)按動3次,shi/按動4次,week個人收集整理勿做商業(yè)用途write_1602com (OxOf);break;case 5: w_cmd(yh+0x0a) ;/按動 5 次,riwrite_1602com

18、(0x0f);break;case 6: w_cmd (yh+0x07) ;/按動 6 次,yuewrite_1602com (OxOf);break;case 7:w_cmd(yh+0x04) ;/按動 7 次,nian/write_1602com (0x0f);break;case 8:w_cmd (0x0c);/按動到第8次,設(shè)置光標(biāo)不閃爍TR0=1 ; 打開定時器temp= ( miao)/10*16+ (miao)% 10;write_1302 (0x8e, 0x00);write_1302 (0x80, 0x00|temp);/miao 數(shù)據(jù)寫入 DS1302write_1302(

19、0x8e,0x80);break;/- 一 - 一 -一key2 一-一 一 if (key1n!=0 )鍵次數(shù)不等于零)if(key2=0)delay (10);if(key2=0 )/ buzzer=0;/ delay (20);/ buzzer=1; while (!key2);switch (key1 n) case 1: miao+;if (miao=60) miao=0; write_sfm(0x08,miao );temp= (miao) /10*16+(miao )當(dāng)key1按下以下。再按以下鍵才有效/上調(diào)鍵/蜂鳴器短響一次/設(shè)置鍵按動1次,調(diào)秒鍵(按個人收集整理勿做商業(yè)用途w

20、rite_1302(0x8e,0x00 ); write_1302 ( 0x80, temp);write_1302(0x8e,0x80 );w_cmd(er+0x09 );write_1602com(0x0b);break;case 2: fen+;if(fen=60 )fen=0;write_sfm (0x05,fen);temp= (fen)/10 玄 16+ (fen)%10 ; write_1302 (0x8e,0x00); write_1302(0x82,temp); write_1302(0x8e,0x80);w_cmd(er+6 );break;case 3:shi+;if (

21、shi=24)shi=0;write_sfm(2,shi);temp= (shi) /10 * 16+ (shi) %10;write_1302 (0x8e,0x00);write_1302 (0x84,temp);write_1302 ( 0x8e, 0x80);w_cmd (er+3);break;case 4: week+;if(week=8 )week=1;w_cmd (yh+0x0C);write_week (week);temp=(week)/10 玄 16+(week)% 10;write_1302 (0x8e, 0x00);write_1302 (0x8a,temp);writ

22、e_1302 ( 0x8e,0x80);w_cmd (yh+0x0e);break;case 5: ri+;if(ri=32)ri=1;write_nyr(9 , ri);temp=(ri)/10*16+(ri) % 10;write_1302(0x8e , 0x00);write_1302(0x86 , temp);write_1302 (0x8e, 0x80);w_cmd (yh+10);break;case 6:yue+;if(yue=13 )yue=1 ;write_nyr (6,yue);temp= (yue)/10*16+(yue ) %10; write_1302(0x8e ,

23、0x00); write_1302 (0x88,temp); write_1302 (0x8e,0x80); w_cmd(yh+7 );break;case 7: nian+;if(nian=100)nian=0;write_nyr(3 , nian);temp=(nian)/10 * 16+(nian ) %10; write_1302 (0x8e, 0x00); write_1302 ( 0x8c,temp); write_1302(0x8e,0x80);w_cmd(yh+4);break;/減鍵key3 ,各句功能參照加鍵'注釋if(key3=0)delay (10);if(ke

24、y3=0 ) buzzer=0;調(diào)延時,消抖動/蜂鳴器短響一次/delay (20);/buzzer=1; while (!key3); switch(key1 n )case 1: miao-; if(miao= 1) miao=59;write_sfm(0x08,miao );temp=(miao) /10* 16+ (miao)%10;write_1302(0x8e ,0x00);write_1302(0x80 ,temp);個人收集整理勿做商業(yè)用途write_1302 (0x8e, 0x80);w_cmd (er+0x09);write_1602com(0x0b);break;case

25、 2: fen-;if(fe n= 1)fen=59;write_sfm(5,fen );temp=(fen) /10 玄 16+(fen )% 10;write_1302(0x8e,0x00 );write_1302 (0x82, temp);write_1302(0x8e , 0x80);w_cmd (er+6);break;case 3:shi-;if(shi= 1)shi=23;write_sfm(2 , shi);temp=(shi) /10* 16+(shi) %10;write_1302(0x8e , 0x00);write_1302 ( 0x84, temp);write_13

26、02 (0x8e, 0x80);w_cmd(er+3 );break;case 4:week-;if(week=0)week=7;w_cmd (yh+0x0C);write_week (week);temp=(week) /10*16+ (week) %10;write_1302 ( 0x8e,0x00);write_1302 (0x8a,temp);write_1302 (0x8e,0x80);w_cmd (yh+0x0e );break;case 5:ri-;if (ri=0 )ri=31;write_nyr(9 , ri);temp= (ri)/10 衣 16+ (ri)% 10;/十進

27、制轉(zhuǎn)換成 DS1302 要求的 DCB 碼 write_1302 ( 0x8e,0x00); /允許寫,禁止寫保護write_1302 ( 0x86,temp) ; /向DS1302內(nèi)寫日期寄存器 86H寫入調(diào)整 后的日期數(shù)據(jù)BCD碼write_1302(0x8e,0x80);/ 打開寫保護w_cmd ( yh+10); /因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,所以需要光標(biāo)回位break;case 6:yue-;if (yue=O)yue=12;write_nyr (6, yue);temp= (yue) /10*16+(yue) % 10; 十進制轉(zhuǎn)換成 DS1302 要求的 DCB

28、 碼write_1302(0x8e,0x00);允許寫,禁止寫保護write_1302 ( 0x88,temp); /向DS1302內(nèi)寫月份寄存器 88H寫入調(diào)整后 的月份數(shù)據(jù)BCD碼write_1302 ( 0x8e, 0x80) ;/打開寫保護 w_cmd ( yh+7);因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一, 所以需要光標(biāo)回位break;case 7:nian-;if(n ia n=-1)nian=99 ;write_nyr(3, nian);temp=(nian ) /10* 16+(nian)%10 ; /十進制轉(zhuǎn)換成 DS1302 要求的 DCB 碼 write_1302

29、( 0x8e, 0x00);/ 允許寫,禁止寫保護 write_1302(0x8c,temp) ; /向DS1302內(nèi)寫年份寄存器 8cH寫入調(diào)整后的 年份數(shù)據(jù)BCD碼write_1302(0x8e,0x80 ); /打開寫保護 w_cmd (yh+4); /因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一, 所以需要光標(biāo)回位break;* * *“ ” TO中斷”初始* * * * *void in trupt()TMOD=0x01 ;EA=1;ET0=1;TH0=(65536 50000)/256 ; TL0= (65536-50000) % 256; TR0=1 ;/ * void init ()/ ” T中斷”初始選擇16位定時器0x01/開總中斷/開“ T0中斷允許位定時器裝初值/定時器、計數(shù)器設(shè)置函數(shù) */* *TMOD=Ox11 ;THO=O ;TLO=O;EA=1 ;ET0=1;TR0=1;* *主函數(shù)*指定定時/計數(shù)器的工作方式為3/定時器T0的高四位=0/定時器T0的低四位=0/系統(tǒng)允許有開放的中斷/允許T0中斷開啟中斷,啟動定時器v

溫馨提示

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

最新文檔

評論

0/150

提交評論