DS12C887電子時鐘(附程序)_第1頁
DS12C887電子時鐘(附程序)_第2頁
DS12C887電子時鐘(附程序)_第3頁
DS12C887電子時鐘(附程序)_第4頁
DS12C887電子時鐘(附程序)_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、下面附有實物圖和引腳接法圖及程序時鐘實物圖LCD1602引腳連接P1.0 P1.1 P1.2 P0.0P0.7DS12C887引腳連接(打叉的表示不接)蜂鳴器引腳連接 按鍵引腳連接 P1.3 P3.4P3.5 P3.6 P3.7源程序#include<reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charsbit lcdrs=P10;sbit rw=P11;sbit lcden=P12;sbit s1=P34; /功能鍵sbit s2=P35; /增大鍵sbit s3

2、=P36; /減小鍵sbit s4=P37; /鬧鈴查看鍵sbit beep=P13;/蜂鳴器sbit dscs=P17;sbit dsas=P16;sbit dsrw=P15;sbit dsds=P14;sbit dsirq=P33; /中斷bit flag1,flag_ri;/定義標志位 flag1設(shè)置鬧鈴uchar count,s1num,flag,t0_num;char miao,shi,fen,year,month,day,week,amiao,afen,ashi;char code table=" 20 - - " / 20 - - uchar code tab

3、le1=" : : " / : : void write_ds(uchar,uchar); uchar read_ds(uchar);void set_time();void read_alarm();void set_alarm(uchar,uchar,uchar); void delayms(uint z)/延時毫秒的程序uint x,y;for(x=z;x>0;x-)for(y=112;y>0;y-);void di()beep=0;delayms(100);beep=1;void write_cmd(uchar cmd)lcden=0;lcdrs=0;P

4、0=cmd;_nop_();lcden=1;delayms(1);lcden=0; _nop_();void write_dat(uchar dat)lcden=0;lcdrs=1;P0=dat; _nop_();lcden=1;delayms(1);lcden=0;_nop_();void lcdint()lcden=0;write_cmd(0x38); / 顯示模式設(shè)置write_cmd(0x0c); /開顯示,不顯示光標,不閃爍write_cmd(0x06); /寫一個字符后地址加1,屏幕不移write_cmd(0x01);/清屏delayms(1);void init()uchar n

5、um;rw=0;EA=1;/開總中斷EX1=1;/開外部中斷1IT1=1;/外部中斷下降沿觸發(fā)flag1=0; t0_num=0;s1num=0;week=1;/*write_ds(0x0A,0x20);/打開振蕩器write_ds(0x0B,0x26);/設(shè)置24小時模式,數(shù)據(jù)二進制格式,開啟鬧鈴中斷set_time();/設(shè)置上電默認時間,調(diào)試的時候用 */lcdint();write_cmd(0x80);for(num=0;num<15;num+) write_dat(tablenum);write_cmd(0xc0);for(num=0;num<11;num+)write_

6、dat(table1num);void write_sfm(uchar add,char date) /寫時間,2位一起寫char shi,ge;shi=date/10;ge=date%10;write_cmd(0xc0+add);write_dat(0x30+shi);write_dat(0x30+ge);void write_nyr(uchar add,char date)/年月日char shi,ge;shi=date/10;ge=date%10;write_cmd(0x80+add);write_dat(0x30+shi);write_dat(0x30+ge);void write_w

7、eek(char we)/星期write_cmd(0x80+12);switch(we)case 1: write_dat('M');write_dat('O');write_dat('N');break;case 2: write_dat('T');write_dat('U');write_dat('E');break;case 3: write_dat('W');write_dat('E');write_dat('D');break;case 4:

8、 write_dat('T');write_dat('H');write_dat('U');break;case 5: write_dat('F');write_dat('R');write_dat('I');break;case 6: write_dat('S');write_dat('A');write_dat('T');break;case 7: write_dat('S');write_dat('U');writ

9、e_dat('N');break;void keyscan()if(flag_ri=1)if(s1=0)|(s2=0)|(s3=0)|(s4=0)/按任意鍵取消鬧鐘報警delayms(5);if(s1=0)|(s2=0)|(s3=0)|(s4=0)while(!(s1&&s2&&s3&&s4);di();flag_ri=0;if(s1=0) /如果功能按鍵1按下delayms(5); /去抖動if(s1=0) while(!s1); /等待松手s1num+;/記下次數(shù)di(); /蜂鳴器響if(flag1=1) /設(shè)置鬧鈴為1時才

10、對s1num調(diào)整,只調(diào)秒,分,時if(s1num>3)s1num=1;flag=1;/在調(diào)整時間時標志位flag為1,不進行正常操作switch(s1num)case 1:write_cmd(0xc0+10); write_cmd(0x0f);break; /按一下秒鐘 指針顯示閃爍case 2:write_cmd(0xc0+7); break;case 3:write_cmd(0xc0+4); break;case 4:write_cmd(0x80+12); break;case 5:write_cmd(0x80+9); break;case 6:write_cmd(0x80+6);

11、break;case 7:write_cmd(0x80+3); break;default: /用default可以解決s1num跑飛s1num=0;write_cmd(0x0c); /按了8次關(guān)閃爍,flag=0,退出調(diào)整,顯示時間flag=0;write_ds(0,miao); /將調(diào)整后的時間寫入ds12c887write_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!=0)/S1有按下過,檢測S2,S3if(s2=0

12、)/如果按鍵2按下執(zhí)行加delayms(5);if(s2=0)while(!s2);di();switch(s1num)case 1:miao+; if(miao>59)miao=0;write_sfm(10,miao);write_cmd(0x80+0x40+10); break; case 2:fen+; if(fen>59)fen=0;write_sfm(7,fen);write_cmd(0x80+0x40+7); break; case 3:shi+; if(shi>23)shi=0;write_sfm(4,shi);write_cmd(0x80+0x40+4); b

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

14、_cmd(0x80+3); break; if(s3=0)delayms(5);if(s3=0)while(!s3);di();switch(s1num)case 1:miao-; if(miao<0)miao=59;write_sfm(10,miao);write_cmd(0x80+0x40+10); break; case 2:fen-; if(fen<0)fen=59;write_sfm(7,fen);write_cmd(0x80+0x40+7); break; case 3:shi-; if(shi<0)shi=23;write_sfm(4,shi);write_cm

15、d(0x80+0x40+4); break; case 4:week-; if(week<1)week=7;write_week(week);write_cmd(0x80+12); break; case 5:day-; if(day<1)day=31;write_nyr(9,day);write_cmd(0x80+9); break; case 6:month-; if(month<1)month=12;write_nyr(6,month);write_cmd(0x80+6); break; case 7:year-; if(year<0)year=99;write_

16、nyr(3,year);write_cmd(0x80+3); break; if(s4=0)delayms(5);if(s4=0)while(!s4);di(); flag1=flag1;/鬧鈴調(diào)好后再按一次鍵返回if(flag1=0) /退出鬧鐘設(shè)置保存數(shù)值flag=0; /啟動時間顯示write_cmd(0x80+0x40);write_dat(' ');write_dat(' ');write_cmd(0x0c); /清屏下,否則光標亂跳 (鬧鈴調(diào)時間時)write_ds(1,miao);write_ds(3,fen);write_ds(5,shi);el

17、se /設(shè)置鬧鐘read_alarm(); /讀原始數(shù)據(jù)miao=amiao;fen=afen;shi=ashi;write_cmd(0xc0);write_dat('R');write_dat('i');write_cmd(0x80+0x40);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=da

18、te; /寫數(shù)據(jù)dsrw=1;dsas=1;dscs=1;uchar read_ds(uchar add) /讀12c887uchar ds_date;dsas=1;dsds=1;dsrw=1;dscs=0;P0=add;dsas=0;dsds=0;P0=0xff;ds_date=P0;dsds=1;dsas=1;dscs=1;return ds_date;/*void set_time() /初始化write_ds(0,0);/秒write_ds(1,10);/秒鬧鈴write_ds(2,34);/分鐘write_ds(3,34);/分鐘鬧鈴write_ds(4,15);/小時write_ds(5,15);/

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論