51單片機電子日歷課程設(shè)計_第1頁
51單片機電子日歷課程設(shè)計_第2頁
51單片機電子日歷課程設(shè)計_第3頁
51單片機電子日歷課程設(shè)計_第4頁
51單片機電子日歷課程設(shè)計_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、51 單片機電子日歷課程設(shè)計程序代碼:/*電子日歷,有時間顯示、鬧鈴、日期、秒表及鍵盤設(shè)置功能*/*功能鍵A:設(shè)置位數(shù)字+1鬧鐘模式下為鬧鐘開關(guān)秒表模式下為記時開關(guān)/*功能鍵B:設(shè)置位數(shù)字-1鬧鐘模式下為鬧鐘開關(guān)*/*功能鍵C: 設(shè)置模式及設(shè)置位選擇秒表模式下為清零鍵/*功能鍵D: 在四種工作模式下切換設(shè)置鬧鐘開關(guān)*/*曹宇 03電子 0201029*/*2006.6.3更新*/*/*/*/*/#include #include/*這里設(shè)置程序初始化時顯示的時間 */設(shè)置初始化分鐘*/設(shè)置初始化秒數(shù)*/#define SET_HOUR 12 /* 設(shè)置初始化小時*/ #define SET_M

2、INUTE 00 /*#define SET_SECOND 00 /*/*系統(tǒng)地址*/#define BASE_PORT 0x8000 /* 選通基地址*/# define KEY_LINE BASE_PORT+1 /* 鍵盤行線地址 */# define KEY_COLUMN BASE_PORT+2 /*鍵盤列線地址*/# define LED_SEG BASE_PORT+4 /* 數(shù)碼管段選地址*/#define LED_BIT BASE_PORT+2 /* 數(shù)碼管位選地址*/*LED#define LED_ON(x) XBYTELED_BIT=(0x01<#define LED_O

3、FFXBYTELED_SEG=0x00顯示空 */*在設(shè)置模式下對秒分時的宏定義*/#define SECOND 0 /*#define MINUTE 1 /*#define HOUR 2 /*對應(yīng)數(shù)碼管右邊兩位*/對應(yīng)數(shù)碼管中間兩位*/對應(yīng)數(shù)碼管左邊兩位*/*定義四種工作模式*/#define CLOCK clockstr /*時鐘模式*/#define ALART alartstr /*鬧鐘模式*/#define DATE datestr /*日期模式*/#define TIMER timerstr /*秒表模式*/*void sys_init(void);void display(voi

4、d); /*以下是所有子函數(shù)的聲明/*/系統(tǒng)的初始化程序*/動態(tài)刷新一次數(shù)碼管子程序 */void clockplus(void); /*時間加 1S 的子程序 */void update_clockstr(void); /* void update_alartstr(void);void update_datestr(void); /* void update_timerstr(void);/*/*更新時間顯示編碼*/更新鬧鐘時間的顯示編碼*/更新日期顯示編碼*/更新秒表時間的顯示編碼*/void deley(int); /*延時子程序*/void update_dispbuf(unsign

5、ed char *); /* unsigned char getkeycode(void); /* void keyprocess(unsigned char); /*更新顯示緩沖區(qū) */獲取鍵值子程序鍵值處理子程序*/*/unsigned char getmonthdays(unsigned int,unsigned char);/*計算某月的天數(shù)子程序*/* 功能鍵功能子函數(shù) */void Akey(void); /* void Bkey(void); /* void Ckey(void); /* void Dkey(void); /*當(dāng)前設(shè)置位+1 開關(guān)鬧鐘 開關(guān)秒表 */當(dāng)前設(shè)置位-1

6、 開關(guān)鬧鐘 */設(shè)置位選擇秒表清零 */切換四種工作模式*/*全局變量聲明部分*/unsigned char led10=0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F;/*從09的LED編碼*/ unsigned char ledchar3=0x5c,0x54,0x71;/*o n f*/unsigned char key24= /*鍵值代碼數(shù)組對應(yīng)鍵位: */ 0x70,0x71,0x72,0x73,0x74,0x75, /*789A TRACE RESET*/ 0xb0,0xb1,0xb2,0xb3,0xb4,0xb5, /*456B

7、STEP MON */ 0xd0,0xd1,0xd2,0xd3,0xd4,0xd5, /*123C HERE LAST */ 0xe0,0xe1,0xe2,0xe3,0xe4,0xe5; /* 0 F E D EXEC NEXT */struct /* 時間結(jié)構(gòu)體變量*/unsigned char s;unsigned char m;unsigned char h;clock=SET_SECOND,SET_MINUTE,SET_HOUR;struct/* 鬧鈴時間結(jié)構(gòu)體變量*/unsigned char m;unsigned char h;alart=SET_MINUTE,SET_HOUR;s

8、truct/* 日期結(jié)構(gòu)體變量*/unsigned int year;unsigned char month;unsigned char day;date=6,1,1;struct/*秒表時間結(jié)構(gòu)體變量*/unsigned char ms;unsigned char s;unsigned char m;timer=0,0,0;unsigned char dispbuf6; /*unsigned char clockstr6; /*unsigned char alartstr6; /*unsigned char datestr6; /*unsigned char timerstr6; /* un

9、signed int itime=0,idot; /* unsigned char itime1=0; /*顯示緩沖區(qū)數(shù)組*/時間顯示的數(shù)碼管編碼數(shù)組*/鬧鐘顯示的數(shù)碼管編碼數(shù)組*/日期顯示的數(shù)碼管編碼數(shù)組*/秒表顯示的數(shù)碼管編碼數(shù)組 */定時器 0 中斷計數(shù) */定時器 1 中斷計數(shù) */ sbit P3_1=P3A1; /* 外接蜂鳴器的管腳*/bdata bit IsSet=0; /* 設(shè)置模式標(biāo)志位0 :正常走時 1 :設(shè)置模式*/bdata bit Alart_EN=0; /* 鬧鈴功能允許位0 :禁止鬧鈴 1 :允許鬧鈴 */bdata bit IsBeep=0; /* 響鈴標(biāo)志位

10、0 :未響鈴 1 :正在響鈴 */unsigned char SetSelect=0; /* 在設(shè)置模式IsSet=1 時,正在被設(shè)置的位, 對應(yīng)上面的宏*/ unsigned char *CurrentMode; /* 標(biāo) 志 當(dāng) 前 正 設(shè) 置 的 功 能 , 如 CurrentMode=CLOCK 或/*函數(shù)部分 */CurrentMode=ALART 等 */ void timerplus(void);void main(void)sys_init();while(1)XBYTEKEY_COLUMN,0x00; /* 給鍵盤列線賦全零掃描碼,判斷是否有鍵按下*/while(XBYTEK

11、EY_LINE&0x0f)=0x0f) /*檢測是否有鍵按下,無則一直進行LED的刷新 顯示 */if(Alart_EN&&(clock.h=alart.h)&&(clock.m=alart.m)IsBeep=1;else IsBeep=0;P3_1=0; display(); keyprocess(getkeycode(); /* 有鍵按下時得到鍵值,并送入鍵值處理程序 */ display(); /*可要可不要*/ void sys_init(void) TMOD=0x22;/* 定時器0和1都設(shè)置為工作方式 2,基準(zhǔn)定時250 X 2= 500us

12、=0.5ms*/ TH0=6;/* 定時器 0 中斷服務(wù)用來產(chǎn)生1 秒時鐘定時及鬧鐘蜂鳴器蜂鳴脈沖 */TL0=6;/*定時器 1 中斷服務(wù)留給秒表使用,產(chǎn)生1/100 秒定時 */TH1=6;TL1=6;ET0=1;ET1=1;EA=1;TR0=1;update_clockstr(); /*update_alartstr(); /*update_datestr();/*update_timerstr();/*update_dispbuf(clockstr);/*CurrentMode=CLOCK; /*P3_1=0;/*初始化時鐘顯示編碼數(shù)組*/初始化鬧鐘顯示編碼數(shù)組*/初始化日期顯示編碼數(shù)

13、組*/初始化秒表顯示編碼數(shù)組*/初始化顯示緩沖數(shù)組*/默認(rèn)的顯示摸式為時鐘 */蜂鳴器接線引腳復(fù)位*/void timer0(void) interrupt 1 using 1 /*定時器 0 中斷服務(wù)器,用來產(chǎn)生1 秒定時 */itime+;if(itime=1000)if(IsSet) /*在設(shè)置模式下,對正在設(shè)置的位閃爍顯示*/dispbufSetSelect*2=0; /*對正在設(shè)置的位所對應(yīng)的顯示緩沖區(qū)元素賦0,使LED滅*/dispbufSetSelect*2+1=0;if(IsBeep) P3_1=!P3_1; /* 鬧鐘模式時,產(chǎn)生峰鳴器響脈沖*/if(CurrentMode=

14、CLOCK) dispbuf2=dispbuf2&0x7f;dispbuf4=dispbuf4&0x7f;if(itime=2000) /*兩千次計數(shù)為 1S 2000 X 0.5ms=1s*/itime=0; /* 定時 1s 時間到,軟計數(shù)清零*/clockplus(); /* 時間結(jié)構(gòu)體變量秒數(shù)加1 */update_clockstr(); /*更新時間顯示編碼數(shù)組*/if(CurrentMode!=TIMER) update_dispbuf(CurrentMode); /*用時間編碼數(shù)組更新顯示緩沖區(qū) */ void timer1(void) interrupt 3 u

15、sing 2 /*定時 */idot+;if(+itime1=20)/*20*0.5ms=10ms*/itime1=0;timerplus();update_timerstr();if(CurrentMode=TIMER)update_dispbuf(timerstr);dispbuf2=dispbuf2&0x7f; /*dispbuf4=dispbuf4&0x7f;if(idot<1000)/*dispbuf2=dispbuf2|0x80;dispbuf4=dispbuf4|0x80;elsedispbuf2=dispbuf2&0x7f;dispbuf4=dis

16、pbuf4&0x7f;定時器 1 中斷服務(wù)器,用來產(chǎn)生1/100 秒關(guān)閉小數(shù)點的顯示*/閃爍顯示小數(shù)點 */if(idot=2000) idot=0;/* 功能模塊子函數(shù) */ void clockplus(void) /* if(+clock.s=60) /*clock.s=0;if(+clock.m=60) /*clock.m=0;if(+clock.h=24) /*clock.h=0;時間加 1s 判斷分,時子函數(shù)*/秒位判斷*/分位判斷 */時位判斷*/if(+date.day=(getmonthdays(date.year,date.month)+1)date.day=1;i

17、f(+date.month=13) date.month=1;void timerplus() /*秒表 1/100 秒位加 1,判斷秒、分子程序*/if(+timer.ms=100)timer.ms=0;if(+timer.s=60)timer.s=0;if(+timer.m=60)timer.m=0;void update_clockstr(void) /*更新時鐘顯示代碼數(shù)組 clockstr*/clockstr0=ledclock.s%10; /*個位 */clockstr1=led(int)(clock.s/10); /*秒數(shù)的十位*/clockstr2=ledclock.m%10;

18、 /* clockstr3=led(int)(clock.m/10); clockstr4=ledclock.h%10;clockstr5=led(int)(clock.h/10);給元素 0 賦相應(yīng)數(shù)碼管顯示編碼,編碼序號是秒數(shù)的給元素 1 賦相應(yīng)數(shù)碼管顯示編碼,編碼序號是以下類推 */void update_alartstr(void) /*更新鬧鐘顯示代碼數(shù)組 alartstr*/*右邊兩位顯示on:鬧鐘開啟of:鬧鐘關(guān)閉*/顯示字母n*/顯示字母f*/顯示字母o*/if(Alart_EN) alartstr0=ledchar1;/* else alartstr0=ledchar2; /

19、* alartstr1=ledchar0; /* alartstr2=ledalart.m%10;alartstr3=led(int)(alart.m/10);alartstr4=ledalart.h%10;alartstr5=led(int)(alart.h/10);void update_datestr(void) /*更新日期顯示代碼數(shù)組 datestr*/datestr0=leddate.day%10;datestr1=led(int)(date.day/10);datestr2=leddate.month%10;datestr3=led(int)(date.month/10);dat

20、estr4=leddate.year%10;datestr5=led(int)(date.year/10); void update_timerstr(void) /*更新秒表顯示代碼數(shù)組 timerstr*/timerstr0=ledtimer.ms%10;timerstr1=led(int)(timer.ms/10);timerstr2=ledtimer.s%10;timerstr3=led(int)(timer.s/10);timerstr4=ledtimer.m%10;timerstr5=led(int)(timer.m/10);void display(void) /*刷新顯示六位

21、LED一次 */unsigned char i; for(i=0;i<6;i+) LED_ON(i); /* 選通相應(yīng)位*/XBYTELED_SEG=dispbufi; /* 寫顯示段碼*/deley(50); /*延時顯示 */LED_OFF; /* 寫LED全滅段碼*/ void update_dispbuf(unsigned char *str) /* 更新顯示緩沖區(qū)子函數(shù), 參數(shù)為要用來更新緩沖區(qū)的源字符數(shù)組的首地址*/dispbuf0=str0;/*將要更新的源字符數(shù)組內(nèi)容COP在dispbuf數(shù)組,用作顯示緩沖區(qū) */dispbuf1=str1;dispbuf2=str2|0

22、x80;/* 默認(rèn)把時位和分位后面的小數(shù)點顯示出來, 根據(jù)需要再取舍 */dispbuf3=str3;dispbuf4=str4|0x80;dispbuf5=str5;void deley(int i) /* 延時子函數(shù) */ while(i-);unsigned char getkeycode(void) /* 鍵盤掃描子程序,返回獲得的鍵碼*/unsigned char keycode; /* 鍵碼變量 , 一開始存行碼*/unsigned char scancode=0x20; /* 列掃描碼 */unsigned char icolumn=0; /* 鍵的列號 */display();

23、/*用刷新數(shù)碼管顯示的時間去抖*/XBYTEKEY_COLUMN=0x00;keycode=XBYTEKEY_LINE&0x0f; /* 從行端口讀入四位行碼*/while(scancode&0x3f)!=0) /* 取 scancode 的低六位,只要沒變?yōu)槿?, 則執(zhí)行循環(huán)*/ XBYTEKEY_COLUMN=(scancode)&0x3f; /* 給列賦掃描碼,第一次為 011111*/ if(XBYTEKEY_LINE&0x0f)=keycode) break; /* 檢測按鍵所在的列跳出循環(huán)*/scancode=scancode>>1; /

24、* 列掃描碼右移一位*/icolumn+; /* 列號加 1*/ keycode=keycode<<4; /* 把行碼移到高四位*/keycode=keycode|icolumn; /* 由行碼和列碼組成鍵碼*/ 等待按鍵放開XBYTEKEY_COLUMN=0x00;while(XBYTEKEY_LINE&0x0f)!=0x0f) display();return keycode;void keyprocess(unsigned char keycode) /* 鍵值處理函數(shù) */switch (keycode)case 0x73: Akey();break;case 0x

25、B3: Bkey();break;case 0xD3: Ckey();break;case 0xE3: Dkey();break;default: break;update_dispbuf(CurrentMode);unsigned char getmonthdays(unsigned int year,unsigned char month)/*得到某月的天數(shù)*/unsigned char days;switch (month)case 4:case 6:case 9:case 11:days=30;break;case 2: if(year%4=0) days=29;else days=2

26、8;break;default:days=31;break;return days;/* 功能鍵子函數(shù)部分*/void Akey(void) /*對當(dāng)前設(shè)置位進行加一操作,如果設(shè)置秒位,則給秒位清零*/if(CurrentMode=TIMER) /*秒表模式下啟閉走時*/ TR1=!TR1;return;if(!IsSet) return; /*如果不是設(shè)置模式退出 */switch (SetSelect)case SECOND:if(CurrentMode=CLOCK)clock.s=0; /*如果當(dāng)前被設(shè)置位是秒位,則清零秒位*/update_clockstr(); if(CurrentM

27、ode=ALART)Alart_EN=!Alart_EN;update_alartstr();if(CurrentMode=DATE)if(+date.day=(getmonthdays(date.year,date.month)+1) date.day=1;update_datestr();if(CurrentMode=TIMER)TR1=!TR1;break;case MINUTE:if(CurrentMode=CLOCK)if(+clock.m=60) clock.m=0; /*如果當(dāng)前被設(shè)置分位,則分位加 1*/update_clockstr();if(CurrentMode=ALAR

28、T)if(+alart.m=60) alart.m=0;update_alartstr();if(CurrentMode=DATE)if(+date.month=13) date.month=1;update_datestr();break;case HOUR: if(CurrentMode=CLOCK)if(+clock.h=24) clock.h=0; /*如果當(dāng)前被設(shè)置時位,則時位加 1*/update_clockstr();if(CurrentMode=ALART)if(+alart.h=24) alart.h=0;update_alartstr();if(CurrentMode=DA

29、TE)if(+date.year=100) date.year=0;update_datestr();break;default: break;update_dispbuf(CurrentMode);void Bkey(void) /* 對當(dāng)前設(shè)置位進行減一操作, 如果設(shè)置秒分, 則給秒位清零, 類比 Akey()函數(shù) */if(!IsSet) return;switch (SetSelect)case SECOND:if(CurrentMode=CLOCK)clock.s=0;update_clockstr();if(CurrentMode=ALART)Alart_EN=!Alart_EN;

30、update_alartstr();if(CurrentMode=DATE)if(-date.day=0x00)date.day=getmonthdays(date.year,date.month);update_datestr();break;case MINUTE:if(CurrentMode=CLOCK)if(-clock.m=0xff) clock.m=59;update_clockstr();if(CurrentMode=ALART)if(-alart.m=0xff) alart.m=59;update_alartstr();if(CurrentMode=DATE)if(-date.month=0x00) date.month=12;update_datestr();break;case HOUR: if(CurrentMode=CLOCK)if(-clock.h=0xff

溫馨提示

  • 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

提交評論