基于51單片機和DS12C887時鐘芯片的c語言程序_第1頁
基于51單片機和DS12C887時鐘芯片的c語言程序_第2頁
基于51單片機和DS12C887時鐘芯片的c語言程序_第3頁
基于51單片機和DS12C887時鐘芯片的c語言程序_第4頁
基于51單片機和DS12C887時鐘芯片的c語言程序_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、基于51單片機和ds12c887時鐘芯片的c語言程序代碼1:#include<reg52.h>#include<define.h>void delay(uint z)/延時函數(shù)uint x,y;for(x=z;x>0;x-)for(y=110;y>0;y-);void di() /蜂鳴器報警聲音beep=0;delay(100);beep=1;void write_com(uchar com)/寫液晶命令函數(shù)rs=0;lcden=0;p0=com;delay(3);lcden=1;delay(3);lcden=0;void write_date(uchar

2、date)/寫液晶數(shù)據(jù)函數(shù)rs=1;lcden=0;p0=date;delay(3);lcden=1;delay(3);lcden=0;void init()/初始化函數(shù)uchar num;ea=1;/打開總中斷ex1=1;/開外部中斷1it1=1;/設(shè)置負跳變沿觸發(fā)中斷flag1=0;/變量初始化t0_num=0;s1num=0;week=1;dula=0;/關(guān)閉數(shù)碼管顯示wela=0;lcden=0;rd=0;/*以下幾行在首次設(shè)置ds12c887時使用,以后不必再寫入write_ds(0x0a,0x20);/打開振蕩器write_ds(0x0b,0x26);/設(shè)置24小時模式,數(shù)據(jù)二進制

3、格式/開啟鬧鈴中斷set_time();/設(shè)置上電默認時間-*/write_com(0x38);/1602液晶初始化write_com(0x0c);write_com(0x06);write_com(0x01);write_com(0x80);for(num=0;num<15;num+)/寫入液晶固定部分顯示write_date(tablenum);delay(1);write_com(0x80+0x40);for(num=0;num<11;num+)write_date(table1num);delay(1);void write_sfm(uchar add,char date)

4、/1602液晶刷新時分秒函數(shù)4為時,7為分,10為秒char shi,ge;shi=date/10;ge=date%10;write_com(0x80+0x40+add);write_date(0x30+shi);write_date(0x30+ge);void write_nyr(uchar add,char date)/1602液晶刷新年月日函數(shù)3為年,6為分,9為秒char shi,ge;shi=date/10;ge=date%10;write_com(0x80+add);write_date(0x30+shi);write_date(0x30+ge);void write_week(c

5、har we)/寫液晶星期顯示函數(shù)write_com(0x80+12);switch(we)case 1:write_date('m');delay(5);write_date('o');delay(5);write_date('n');break;case 2:write_date('t');delay(5);write_date('u');delay(5);write_date('e');break;case 3:write_date('w');delay(5);write_da

6、te('e');delay(5);write_date('d');break;case 4:write_date('t');delay(5);write_date('h');delay(5);write_date('u');break;case 5:write_date('f');delay(5);write_date('r');delay(5);write_date('i');break;case 6:write_date('s');delay(5)

7、;write_date('a');delay(5);write_date('t');break;case 7:write_date('s');delay(5);write_date('u');delay(5);write_date('n');break;void keyscan()if(flag_ri=1)/這里用來取消鬧鐘報警,任一鍵取消報警if(s1=0)|(s2=0)|(s3=0)|(s4=0)delay(5);if(s1=0)|(s2=0)|(s3=0)|(s4=0)while(!(s1&&

8、s2&&s3&&s4); di();flag_ri=0;/清除報警標(biāo)志 if(s1=0)/檢測s1delay(5);if(s1=0)s1num+;/記錄按下次數(shù)if(flag1=1)if(s1num=4)s1num=1;flag=1;while(!s1);di();switch(s1num)/光標(biāo)閃爍點定位case 1: write_com(0x80+0x40+10); write_com(0x0f);break;case 2: write_com(0x80+0x40+7);break;case 3: write_com(0x80+0x40+4);break;c

9、ase 4: write_com(0x80+12);break;case 5: write_com(0x80+9);break;case 6: write_com(0x80+6);break;case 7: write_com(0x80+3);break;case 8: s1num=0;write_com(0x0c);flag=0;write_ds(0,miao);write_ds(2,fen);write_ds(4,shi);write_ds(6,week);write_ds(7,day);write_ds(8,month);write_ds(9,year);break;if(s1num!=

10、0)/只有當(dāng)s1按下后,才檢測s2和s3if(s2=0)delay(1);if(s2=0)while(!s2);di();switch(s1num)/根據(jù)功能鍵次數(shù)調(diào)節(jié)相應(yīng)數(shù)值case 1:miao+;if(miao=60)miao=0;write_sfm(10,miao);write_com(0x80+0x40+10); break;case 2:fen+;if(fen=60)fen=0;write_sfm(7,fen);write_com(0x80+0x40+7); break;case 3:shi+;if(shi=24)shi=0;write_sfm(4,shi);write_com(0

11、x80+0x40+4); break;case 4:week+;if(week=8)week=1;write_week(week);write_com(0x80+12);break;case 5:day+;if(day=32)day=1;write_nyr(9,day);write_com(0x80+9);break;case 6:month+;if(month=13)month=1;write_nyr(6,month);write_com(0x80+6);break;case 7:year+;if(year=100)year=0;write_nyr(3,year);write_com(0x8

12、0+3);break;if(s3=0)delay(1);if(s3=0)while(!s3);di();switch(s1num)/根據(jù)功能鍵次數(shù)調(diào)節(jié)相應(yīng)數(shù)值case 1:miao-;if(miao=-1)miao=59;write_sfm(10,miao);write_com(0x80+0x40+10);break; case 2:fen-;if(fen=-1)fen=59;write_sfm(7,fen);write_com(0x80+0x40+7);break;case 3:shi-;if(shi=-1)shi=23;write_sfm(4,shi);write_com(0x80+0x4

13、0+4);break;case 4:week-;if(week=0)week=7;write_week(week);write_com(0x80+12);break;case 5:day-;if(day=0)day=31;write_nyr(9,day);write_com(0x80+9);break;case 6:month-;if(month=0)month=12;write_nyr(6,month);write_com(0x80+6);break;case 7:year-;if(year=-1)year=99;write_nyr(3,year);write_com(0x80+3);bre

14、ak;if(s4=0)/檢測s4delay(5);if(s4=0)flag1=flag1;while(!s4);di();if(flag1=0)/退出鬧鐘設(shè)置時保存數(shù)值flag=0;write_com(0x80+0x40);write_date(' ');write_date(' ');write_com(0x0c);write_ds(1,miao);write_ds(3,fen);write_ds(5,shi);else/進入鬧鐘設(shè)置read_alarm();/讀取原始數(shù)據(jù)miao=amiao;/重新賦值用以按鍵調(diào)節(jié)fen=afen;shi=ashi;writ

15、e_com(0x80+0x40);write_date('r');/顯示標(biāo)志write_date('i');write_com(0x80+0x40+3);write_sfm(4,ashi);/送液晶顯示鬧鐘時間write_sfm(7,afen);write_sfm(10,amiao);void write_ds(uchar add,uchar date)/寫12c887函數(shù)dscs=0;dsas=1;dsds=1;dsrw=1;p0=add;/先寫地址dsas=0;dsrw=0;p0=date;/再寫數(shù)據(jù)dsrw=1;dsas=1;dscs=1;uchar re

16、ad_ds(uchar add)/讀12c887函數(shù) uchar ds_date;dsas=1;dsds=1;dsrw=1;dscs=0;p0=add;/先寫地址dsas=0;dsds=0;p0=0xff;ds_date=p0;/再讀數(shù)據(jù)dsds=1;dsas=1;dscs=1;return ds_date;/*-首次操作12c887時給予寄存器初始化-void set_time()/首次上電初始化時間函數(shù)write_ds(0,0);write_ds(1,0);write_ds(2,0);write_ds(3,0);write_ds(4,0);write_ds(5,0);write_ds(6,

17、0);write_ds(7,0);write_ds(8,0);write_ds(9,0);-*/void read_alarm()/讀取12c887鬧鐘值amiao=read_ds(1);afen=read_ds(3);ashi=read_ds(5);void main()/主函數(shù)init();/調(diào)用初始化函數(shù)while(1)keyscan();/按鍵掃描if(flag_ri=1)/當(dāng)鬧鐘中斷時進入這里di();delay(100);di();delay(500);if(flag=0&&flag1=0)/正常工作時進入這里keyscan();/按鍵掃描year=read_ds(

18、9);/讀取12c887數(shù)據(jù)month=read_ds(8);day=read_ds(7);week=read_ds(6);shi=read_ds(4);fen=read_ds(2);miao=read_ds(0);write_sfm(10,miao);/送液晶顯示write_sfm(7,fen);write_sfm(4,shi);write_week(week);write_nyr(3,year);write_nyr(6,month);write_nyr(9,day);void exter() interrupt 2/外部中斷1服務(wù)程序uchar c; /進入中斷表示鬧鐘時間到,flag_r

19、i=1; /設(shè)置標(biāo)志位,用以大程序中報警提示c=read_ds(0x0c);/讀取12c887的c寄存器表示響應(yīng)了中斷代碼2:#include<reg52.h>#include"shijian.h"/*模式選擇*/void keyscan1()if(s4=0); delay(5); if(s4=0) s4num+;while(!s4);switch(s4num)case 1:flag1=flag1;if(flag1=1) /打鈴時間間隔設(shè)置標(biāo)志位(防止在設(shè)置時顯示時間) /把鬧鈴的寄存器作為打鈴的寄存器使用read_alarm(); /先讀取鬧鈴時間miao=a

20、miao; /在把鬧鈴值賦給時間值用以調(diào)節(jié)fen=afen; shi=ashi;write_com(0x80+0x40);write_date('r'); /顯示標(biāo)志write_date('i');write_com(0x80+0x40+3);display(0x40+4,ashi); /顯示間隔時間display(0x40+7,afen);display(0x40+10,amiao);break;/*/case 2: flag1=flag1;if(flag1=0) /清除標(biāo)志位flag=0;write_com(0x80+0x40);write_date(

21、9; ');/清除打鈴時間間隔標(biāo)志位write_date(' ');write_com(0xc0);write_ds(1,miao); /儲存間隔時間write_ds(3,fen);write_ds(5,shi);/*/flag_paobiao=flag_paobiao;miao_pb=0;/先把跑表值都賦為0fen_pb=0;tt=0;while(!s2);if(flag_paobiao=1)init_paobiao();/*/break;case 3:flag_paobiao=flag_paobiao;if(flag_paobiao=0)write_com(0x80

22、+0x40);write_date(' ');write_date(' ');/*/flag2=flag2;if(flag2=1)miao=miaonz1; /把鬧鈴值賦給時間值用來調(diào)整鬧鈴fen=fennz1; shi=shinz1;write_com(0x80+0x40);write_date('n');write_date('z');write_date('1');write_com(0x80+0x40+3);display(0x40+4,shinz1);display(0x40+7,fennz1);disp

23、lay(0x40+10,miaonz1);break;/*/case 4:flag2=flag2;if(flag2=0)miaonz1=miao; /把調(diào)整好的時間值賦回給鬧鈴值(保存鬧鈴值)fennz1=fen;shinz1=shi;flag=0;write_com(0x80+0x40);write_date(' ');write_date(' ');write_date(' ');/*/flag21=flag21;if(flag21=1)miao=miaonz2; fen=fennz2; shi=shinz2;write_com(0x80+0

24、x40);write_date('n');write_date('z');write_date('2');write_com(0x80+0x40+3);display(0x40+4,shinz2);display(0x40+7,fennz2);display(0x40+10,miaonz2); delay(5);break;/*/ case 5:flag21=flag21;if(flag21=0)miaonz2=miao;fennz2=fen;shinz2=shi;flag=0;write_com(0x80+0x40);write_date(&#

25、39; ');write_date(' ');write_date(' '); /*溫濕度*/ flag22=flag22; if(flag22=1)write_com(0x80);write_date('w');write_date(':');write_date(' ');write_date(' ');write_date('.');write_date(' ');write_date(' ');write_date(' '

26、;);write_date('s');write_date(':');write_date(' ');write_date(' ');write_date('.'); tempval=measure_t(); humival=measure_h(); if(error=0) delayms(500); dis_tempval=c_t(tempval); disply_t(dis_tempval); dis_humival=c_h(dis_tempval,humival); disply_h(dis_humival)

27、; break; /*/ case 6:flag22=flag22;if(flag22=0)write_com(0x80);write_date(' ');write_date('2');write_date('0');write_date(' ');write_date(' ');write_date('-');write_date(' ');write_date(' ');write_date('-');write_date(' '

28、);write_date(' ');write_date(' ');write_date(' ');write_date(' ');write_date(' ');write_date(' ');flag23=flag23;if(flag23=1) write_com(0x80);write_date('u');write_date(':');write_date(' ');write_date('.');write_date('

29、; ');write_date(' ');write_date('v');write_date(' ');write_date('i');write_date(':');write_date(' ');write_date('.');write_date(' ');write_date(' ');write_date('a');write_date(' '); adval=readadc() ; /讀取ad值 d

30、isply_y(adval); /電壓值顯示 delay(30); / ad_val=255-adval; / disply_l(ad_val); /電壓值顯示 delay(30); break;case 7:flag23=flag23;if(flag23=0)write_com(0x80);write_date(' ');write_date('2');write_date('0');write_date(' ');write_date(' ');write_date('-');write_dat

31、e(' ');write_date(' ');write_date('-');write_date(' ');write_date(' ');write_date(' ');write_date(' ');write_date(' ');write_date(' ');write_date(' ');break; case 8:s4num=0;break; /*/if(flag_paobiao=1)if(s2=0)delay(5);if(s2=0)while(!s2);tr0=tr0;display_paobiao();void shijian()uchar miaoy;year=read_ds(9);month=read_ds(8);day=read_ds(7);week=read_ds(6);shi=read_ds(4);fen=read_ds(2);miaoy=miao; /把當(dāng)前秒賦給miaoy用以判斷秒是否變化miao=read_ds(0); if(flag3=

溫馨提示

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

最新文檔

評論

0/150

提交評論