版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024至2030年中國新型粉煤灰混凝土數(shù)據(jù)監(jiān)測研究報告
- 2024至2030年中國多功能采暖爐數(shù)據(jù)監(jiān)測研究報告
- 2024年四川省成都市中考語文試題含答案
- 2024至2030年中國SB十二直裙數(shù)據(jù)監(jiān)測研究報告
- 2024年中國偏式掛頭不銹鋼喉箍市場調(diào)查研究報告
- 非人力資源經(jīng)理的人力資源管理講師版
- 倉庫內(nèi)人員流動管理計劃
- 出國打工合同
- 動漫行業(yè)月度個人工作計劃
- 報停啟用供用電協(xié)議書范本
- 2024-2030年街舞培訓(xùn)行業(yè)市場發(fā)展分析及發(fā)展趨勢前景預(yù)測報告
- 《2024版CSCO胰腺癌診療指南》更新要點 2
- 2024-2030年中國蛋及蛋制品行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略分析報告
- +陜西省渭南市富平縣2023-2024學(xué)年九年級上學(xué)期摸底數(shù)學(xué)試卷
- 2023年法律職業(yè)資格《客觀題卷一》真題及答案
- 2024中國民航機場建設(shè)集團限公司校園招聘304人高頻考題難、易錯點模擬試題(共500題)附帶答案詳解
- 《探究與實踐 交通運輸在全球經(jīng)濟發(fā)展中的作用》課件-2024-2025學(xué)年七年級地理上冊湘教版
- 《信息技術(shù)基礎(chǔ)與應(yīng)用(第2版)(上冊)》高職全套教學(xué)課件
- 2024年高考模擬考試英語試卷及答案
- 2024至2030年中國維生素D滴劑行業(yè)市場深度研究及發(fā)展趨勢預(yù)測報告
- 2024年中國全屋定制行業(yè)市場調(diào)查、產(chǎn)業(yè)鏈全景及市場需求規(guī)模預(yù)測報告
評論
0/150
提交評論