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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

2、ET_SECOND 00/* 設置初始化分鐘 */ /* 設置初始化秒數(shù) */*系統(tǒng)地址 */#define BASE_PORT 0 x8000 /* 選通基地址 */#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ù)碼管位選地址 */#define LED_ON(x) XBYTELED_BIT=(0 x01#define LED_O

3、FF XBYTELED_SEG=0 x00 /*LED 顯示空 */*#define SECOND 0#define MINUTE 1#define HOUR 2在設置模式下對秒分時的宏定義 /* 對應數(shù)碼管右邊兩位 /*對應數(shù)碼管中間兩位 /*對應數(shù)碼管左邊兩位*/*/*/*/*void sys_init(void);void display(void);void clockplus(void);void update_clockstr(void);void update_alartstr(void);void update_datestr(void);void update_timerst

4、r(void);/* 定義四種工作模式 */#define CLOCK clockstr /* 時鐘模式 */#define ALART alartstr /* 鬧鐘模式 */#define DATE datestr /*日期模式 */#define TIMER timerstr /* 秒表模式 */以下是所有子函數(shù)的聲明 */*系統(tǒng)的初始化程序 */ /*動態(tài)刷新一次數(shù)碼管子程序 */*時間加1S的子程序*/ /*更新時間顯示編碼 */*更新鬧鐘時間的顯示編碼 */*更新日期顯示編碼 */*更新秒表時間的顯示編碼 */void deley(int);/* 延時子程序 */void updat

5、e_dispbuf(unsigned char *); /* 更新顯示緩沖區(qū) */ unsigned char getkeycode(void); /* 獲取鍵值子程序 */ void keyprocess(unsigned char); /* 鍵值處理子程序 */ unsigned char getmonthdays(unsigned int,unsigned char);/* 計算某月的天數(shù)子程序 */* 功能鍵功能子函數(shù) void Akey(void); void Bkey(void); void Ckey(void); void Dkey(void);*/* 當前設置位/* 當前設置位

6、 /*設置位選擇+1 開關鬧鐘 開關秒表 */-1 開關鬧鐘 */ 秒表清零 */* 切換四種工作模式 */*全局變量聲明部分 */unsigned char led10=0 x3F,0 x06,0 x5B,0 x4F,0 x66,0 x6D,0 x7D,0 x07,0 x7F,0 x6F;/* 從 09 的LED 編碼 */unsigned char ledchar3=0 x5c,0 x54,0 x71;/*o n f*/unsigned char key24=/ 0 x70,0 x71,0 x72,0 x73,0 x74,0 x75, /*/ 0 xb0,0 xb1,0 xb2,0 xb3

7、,0 xb4,0 xb5, /*/ 0 xd0,0 xd1,0 xd2,0 xd3,0 xd4,0 xd5, /*/ 0 xe0,0 xe1,0 xe2,0 xe3,0 xe4,0 xe5; /* struct/* 時間結構體變量 */unsigned char s; unsigned char m;unsigned char h; clock=SET_SECOND,SET_MINUTE,SET_HOUR;struct/* 鬧鈴時間結構體變量 */* 鍵值代碼數(shù)組85*/A TRACE RESET*/ MON */對應鍵位:96B STEPC HERED EXECLAST */NEXT */u

8、nsigned char m; unsigned char h;alart=SET_MINUTE,SET_HOUR; struct unsigned int year; unsigned char month; unsigned char day; date=6,1,1;structunsigned char ms; unsigned char s; unsigned char m;timer=0,0,0;unsigned char dispbuf6; /* 顯示緩沖區(qū)數(shù)組 */ unsigned char clockstr6; /* 時間顯示的數(shù)碼管編碼數(shù)組 unsigned char al

9、artstr6; /* unsigned char datestr6; /* unsigned char timerstr6;unsigned int itime=0,idot; /* unsigned char itime1=0;sbit P 3_1= P3A1;/* 日期結構體變量 */* 秒表時間結構體變量 */*/*/鬧鐘顯示的數(shù)碼管編碼數(shù)組日期顯示的數(shù)碼管編碼數(shù)組/* 秒表顯示的數(shù)碼管編碼數(shù)組 */ 定時器 0 中斷計數(shù) */ /*定時器 1 中斷計數(shù) */*/* 外接蜂鳴器的管腳 */bdata bit IsSet=0; /*設置模式標志位0:正常走時 1:設置模式 */bdata

10、 bit Alart_EN=0; /*鬧鈴功能允許位0:禁止鬧鈴 1:允許鬧鈴 */bdata bit IsBeep=0;/* 響鈴標志位0:未響鈴1:正在響鈴 */unsigned char SetSelect=0; /* 在設置模式 IsSet=1 時,正在被設置的位 ,對應上面的宏 */unsigned char *CurrentMode;CurrentMode=ALART 等 */* 標志當前正 設置的 功能,如 CurrentMode=CLOCK 或void timerplus(void);/*void main(void)函數(shù)部分 */sys_init();while(1)XBYT

11、EKEY_COLUMN,0 x00;/*給鍵盤列線賦全零掃描碼,判斷是否有鍵按下*/while(XBYTEKEY_LINE&0 x0f)=0 x0f)新顯示 */* 檢測是否有鍵按下,無則一直進行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=0 x22;/* 定時器 01

12、 都設置為工作方式2,基準定時 250X 2= 500us=0.5ms*/TH0=6;/*定時器中斷服務用來產生 1秒時鐘定時及鬧鐘蜂鳴器蜂鳴脈沖 */TL0=6;/*定時器中斷服務留給秒表使用,產生1/100 秒定時 */TR0=1;TH1=6;TL1=6;ET0=1;ET1=1;EA=1;update_clockstr(); update_alartstr(); update_datestr(); update_timerstr(); update_dispbuf(clockstr);/*CurrentMode=CLOCK; P3_1=0;/*初始化時鐘顯示編碼數(shù)組 */*初始化鬧鐘顯示編

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

14、式時,產生峰鳴器響脈沖 */if(CurrentMode=CLOCK)dispbuf2=dispbuf2&0 x7f;dispbuf4=dispbuf4&0 x7f;if(itime=2000)/* 兩千次計數(shù)為 1S 2000 x 0.5ms=1s*/itime=0; /*定時1s時間到,軟計數(shù)清零 */clockplus(); /* 時間結構體變量秒數(shù)加 1 */ update_clockstr(); /* 更新時間顯示編碼數(shù)組 */if(CurrentMode!=TIMER) update_dispbuf(CurrentMode); /* 用時間編碼數(shù)組更新 顯示緩沖區(qū) */void t

15、imer1(void) interrupt 3 using 2/* 定時器 1 中斷服務器,用來產生 1/100 秒定時 */idot+;if(+itime1=20)/*20*0.5ms=10ms*/itime1=0;timerplus();update_timerstr();if(CurrentMode=TIMER)update_dispbuf(timerstr); dispbuf2=dispbuf2&0 x7f; dispbuf4=dispbuf4&0 x7f;if(idot1000)/* 關閉小數(shù)點的顯示 */* 閃爍顯示小數(shù)點 */dispbuf2=dispbuf2|0 x80;dis

16、pbuf4=dispbuf4|0 x80;elsedispbuf2=dispbuf2&0 x7f;dispbuf4=dispbuf4&0 x7f; 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) /* 時位判斷 */ /*時間加 1s 判斷分,時子函數(shù) */* 秒位判斷 */分位判斷 */clock.h=0;if(+date.day=(getmonthdays(date.year,date.mo

17、nth)+1) date.day=1;if(+date.month=13) date.month=1; /*秒表 1/100 秒位加 1,判斷秒、分子程序 */void timerplus()if(+timer.ms=100)timer.ms=0;if(+timer.s=60)timer.s=0;if(+timer.m=60)timer.m=0;void display(void)/*刷新顯示六位 LED 一次 */void display(void)/*刷新顯示六位 LED 一次 */void update_clockstr(void) /* 更新時鐘顯示代碼數(shù)組 clockstr*/clo

18、ckstr0=ledclock.s%10; /* 給元素 0 賦相應數(shù)碼管顯示編碼, 編碼序號是秒數(shù)的個位 */clockstr1=led(int)(clock.s/10); /* 給元素 1 賦相應數(shù)碼管顯示編碼,編碼序號是秒數(shù)的十 位*/clockstr2=ledclock.m%10; /* 以下類推 */ clockstr3=led(int)(clock.m/10); clockstr4=ledclock.h%10; clockstr5=led(int)(clock.h/10);void update_alartstr(void)/* 更新鬧鐘顯示代碼數(shù)組 alartstr*/*右邊兩位

19、顯示on:鬧鐘開啟 of:鬧鐘關閉*/if(Alart_EN) alartstr0=ledchar1;/* else alartstr0=ledchar2; alartstr1=ledchar0; alartstr2=ledalart.m%10; alartstr3=led(int)(alart.m/10); alartstr4=ledalart.h%10; alartstr5=led(int)(alart.h/10);顯示字母 n*/* 顯示字母 f*/*顯示字母o*/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); datestr4=leddate.year%10; datestr5=led(int)(date.year/10);void update_timerstr(void)/*更

溫馨提示

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

評論

0/150

提交評論