利用定時(shí)器的定時(shí)功能實(shí)現(xiàn)了秒、分、時(shí)的計(jì)數(shù)以24小時(shí)為1天,天累計(jì)滿一個(gè)月相應(yīng)的天數(shù)時(shí)為1個(gè)月,12個(gè)月為1年。 該萬年歷系統(tǒng)包含了多項(xiàng)功能,整個(gè)應(yīng)用上來看由三大功能組成,分別是:時(shí)鐘功能、秒表功能、鬧鐘功。
單片機(jī)源程序如下:
- //==================================================================
- //文件名稱: 應(yīng)用
- //功能說明:
- //硬件描述:
- //資源說明: 11.0592M晶體
- //創(chuàng)建日期:
- //軟件版本: v 1.0
- //==================================================================
- //===========================包含頭文件==============================
- #include <reg51.h>
- #include "timer.h"
- #include "app.h"
- //=============================宏定義===============================
- sbit buzzer = P0^4;
- //============================變量定義==============================
- uchar data event_FIFO[8]; //事件緩沖區(qū)
- uchar data *event_WrIp = event_FIFO; //寫指針
- uchar data *event_RdIp = event_FIFO; //讀指針
- uchar data display[4];
- uchar data sys_State = 0x14; //界面狀態(tài)(初始狀態(tài)顯示時(shí)分)
- uchar data current_Event = 0; //按鍵狀態(tài)
- uchar data month_Day[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; //每個(gè)月最大天數(shù)數(shù)組(二月是由于年份初值給的2015,非閏年,即二月初值為28天。)
- uchar data second = 50; //秒初值
- char data minute = 59; //分初值
- char data hour = 23; //時(shí)初值
- uchar data day = 28; //月初值
- uchar data month = 2; //日初值
- uint data year = 2016; //年初值
- uint data week = 7; //周初值
- char data alarm_Minute = 0; //鬧鐘時(shí)初值
- char data alarm_Hour = 0; //鬧鐘分初值
- bit swatch_Start_Flag = 0; //秒表計(jì)時(shí)開始標(biāo)致位
- bit alarm_Flag = 0;
- uchar alarm_State = 0; //0-free 1-louding 2-handstop 3-stop
- //=================================================
- //函 數(shù) 名: void write_Event(uchar cmd)
- //功能描述: 向事件緩沖區(qū)寫入值
- //輸入?yún)?shù): 寫入的事件值
- //輸出參數(shù): 無
- //設(shè) 計(jì) 者:
- //創(chuàng)建日期:
- //==================================================
- void write_Event(uchar cmd)
- {
- *event_WrIp=cmd;
- if(event_WrIp==(event_FIFO+7)) event_WrIp=event_FIFO;
- else event_WrIp++;
- }
- //=================================================
- //函 數(shù) 名: void write_Event(uchar cmd)
- //功能描述: 從事件緩沖區(qū)讀入值
- //輸入?yún)?shù):
- //輸出參數(shù): 讀出的數(shù)據(jù)值
- //設(shè) 計(jì) 者:
- //創(chuàng)建日期:
- //==================================================
- uchar read_Event(void)
- {
- uchar temp;
- if(event_RdIp!=event_WrIp)
- {
- temp=*event_RdIp;
- if(event_RdIp==(event_FIFO+7)) event_RdIp=event_FIFO;
- else event_RdIp++;
- return temp;
- }
- else return(0);
- }
- //==================================================================
- //函 數(shù) 名: void clock_update(void)
- //功能描述: 時(shí)間自動(dòng)更新函數(shù)
- //輸入?yún)?shù): NULL
- //輸出參數(shù): second、minute、hour、week、day、month、year
- //設(shè) 計(jì) 者:
- //創(chuàng)建日期:
- //==================================================================
- void clock_update(void)
- {
- if( !f_systick_1s ) return;
- f_systick_1s = 0;
- if(++second != 60) return;
- second = 0;
- if(++minute != 60) return;
- minute = 0;
- if(++hour != 24) return;
- hour = 0;
- if(++week == 8) week = 1;
- if(++day <= month_Day[month - 1]) return;
- day = 1;
- if(++month != 13) return;
- month = 1;
- year++;
- month_Day[1] = ( (year%400 == 0) || ( (year%4 == 0)&&(year%100 != 0) ) ) ? 29 : 28; //利用三目運(yùn)算判斷閏年
- }
- //==================================================================
- //函 數(shù) 名: meau1_Display()
- //功能描述: 菜單P-1函數(shù)
- //輸入?yún)?shù): NULL
- //輸出參數(shù): 顯示緩沖區(qū)
- //設(shè) 計(jì) 者:
- //創(chuàng)建日期:
- //==================================================================
- void meau1_Display(void)
- {
- switch(current_Event)
- {
- case 0:break;
- case 1:sys_State = 0x11;break; //顯示年
- case 2:sys_State = 0x20;break; //顯示菜單P-2
- case 4:sys_State = 0x30;break; //顯示菜單P-3
- case 8:break;
- default:break;
- }
- //顯示菜單P-1
- display[0] = 10;
- display[1] = 17;
- display[2] = 21;
- display[3] = 1;
- }
- //==================================================================
- //函 數(shù) 名: meau2_Display(void)
- //功能描述: 菜單P-2函數(shù)
- //輸入?yún)?shù): NULL
- //輸出參數(shù): 顯示緩沖區(qū)
- //設(shè) 計(jì) 者:
- //創(chuàng)建日期:
- //==================================================================
- void meau2_Display(void)
- {
- switch(current_Event)
- {
- case 0:break;
- case 1:sys_State = 0x21;break; //秒表
- case 2:sys_State = 0x30;break; //顯示菜單P-3
- case 4:sys_State = 0x10;break; //顯示菜單P-1
- case 8:break;
- default:break;
- }
- //顯示菜單P-2
- display[0] = 10;
- display[1] = 17;
- display[2] = 21;
- display[3] = 2;
- }
- //==================================================================
- //函 數(shù) 名: meau3_Display()
- //功能描述: 菜單P-3函數(shù)
- //輸入?yún)?shù): NULL
- //輸出參數(shù):
- //設(shè) 計(jì) 者:
- //創(chuàng)建日期:
- //==================================================================
- void meau3_Display(void)
- {
- switch(current_Event)
- {
- case 0:break;
- case 1:sys_State = 0x31;break; //鬧鐘
- case 2:sys_State = 0x10;break; //顯示菜單P-1
- case 4:sys_State = 0x20;break; //顯示菜單P-2
- case 8:break;
- default:break;
- }
- //顯示菜單P-3
- display[0] = 10;
- display[1] = 17;
- display[2] = 21;
- display[3] = 3;
- }
- //==================================================================
- // 設(shè)置函數(shù)
- //==================================================================
- //==================================================================
- //函 數(shù) 名: year_Set()
- //功能描述: 年設(shè)置函數(shù)
- //輸入?yún)?shù): NULL
- //輸出參數(shù):
- //設(shè) 計(jì) 者:
- //創(chuàng)建日期:
- //==================================================================
- void year_Set(void)
- {
- switch(current_Event)
- {
- case 0:break;
- case 1:sys_State = 0x11;break; //顯示年
- case 2:year--;break;
- case 4:year++;break;
- case 8:sys_State = 0x10;break; //顯示菜單P-1
- default:break;
- }
- month_Day[1] = ( (year%400 == 0) || ( (year%4 == 0)&&(year%100 != 0) ) ) ? 29 : 28;
- if(day > month_Day[month - 1])
- day = 1;
- tube(0x00); //數(shù)碼管閃爍
- display[0] = year / 1000;
- display[1] = year / 100 % 10;
- display[2] = year / 10 % 10;
- display[3] = year % 10;
- }
- //==================================================================
- //函 數(shù) 名: week_Set()
- //功能描述: 周設(shè)置函數(shù)
- //輸入?yún)?shù): NULL
- //輸出參數(shù):
- //設(shè) 計(jì) 者:
- //創(chuàng)建日期:
- //==================================================================
- void week_Set(void)
- {
- switch(current_Event)
- {
- case 0:break;
- case 1:sys_State = 0x13;break; //顯示周
- case 2:week--;if(week == 0) week = 7;break; //周--
- case 4:week++;if(week == 8) week = 1;break; //周++
- case 8:sys_State = 0x10;break; //顯示菜單P-1
- default:break;
- }
- tube(0x07);
- display[0] = 20;
- display[1] = 12;
- display[2] = 21;
- display[3] = week;
- }
- //==================================================================
- //函 數(shù) 名: month_Set(void)
- //功能描述: 月設(shè)置函數(shù)
- //輸入?yún)?shù): NULL
- //輸出參數(shù):
- //設(shè) 計(jì) 者:
- //創(chuàng)建日期:
- //==================================================================
- void month_Set(void)
- {
- switch(current_Event)
- {
- case 0:break;
- case 1:sys_State = 0x18;break; //設(shè)置日
- case 2:month--; if(month == 0)month = 12; break; //月--
- case 4:month++; if(month == 13)month = 1; break; //月++
- case 8:sys_State = 0x10;break; //顯示菜單P-1
- default:break;
- }
- if(day > month_Day[month - 1]) day = 1;
- tube(0x0c);
- decimal_Point_On(0x02);
- display[0] = month / 10;
- display[1] = month % 10;
- display[2] = day / 10;
- display[3] = day % 10;
- }
- //==================================================================
- //函 數(shù) 名: void day_Set(void)
- //功能描述: 日設(shè)置函數(shù)
- //輸入?yún)?shù): NULL
- //輸出參數(shù):
- //設(shè) 計(jì) 者:
- //創(chuàng)建日期:
- //==================================================================
- void day_Set(void)
- {
- switch(current_Event)
- {
- case 0:break;
- case 1:sys_State = 0x12;break; //顯示月日
- case 2:
- {
- day--;
- if(day == 0)
- day = month_Day[month - 1]; //使得每個(gè)月的最大天數(shù)與對(duì)應(yīng)月份實(shí)際天數(shù)相等
- break;
- }
- case 4:
- {
- day++;
- if(day > month_Day[month - 1]) //當(dāng)其超過每月最大天數(shù)時(shí),天數(shù)置一
- {
- day = 1;
- }
- break;
- }
- case 8:sys_State = 0x10;break; //顯示菜單P-1
- default:break;
- }
- tube(0x03);
- decimal_Point_On(0x02);
- display[0] = month / 10;
- display[1] = month % 10;
- display[2] = day / 10;
- display[3] = day % 10;;
- }
- //==================================================================
- //函 數(shù) 名: void hour_Set(void)
- //功能描述: 小時(shí)設(shè)置函數(shù)
- //輸入?yún)?shù): NULL
- //輸出參數(shù):
- //設(shè) 計(jì) 者:
- //創(chuàng)建日期:
- //==================================================================
- void hour_Set(void)
- {
- switch(current_Event)
- {
- case 0:break;
- case 1:sys_State = 0x1b;break; //設(shè)置分鐘
- case 2:hour--;if(hour < 0) hour = 23;break; //小時(shí)--
- case 4:hour++;if(hour == 24) hour = 0;break; //小時(shí)++
- case 8:sys_State = 0x10;break; //顯示菜單P-1
- default:break;
- }
- tube(0x0c);
- decimal_Point(0x02);
- display[0] = hour / 10;
- display[1] = hour % 10;
- display[2] = minute / 10;
- display[3] = minute % 10;
- }
- //==================================================================
- //函 數(shù) 名: void minute_Set(void)
- //功能描述: 分鐘設(shè)置函數(shù)
- //輸入?yún)?shù): NULL
- //輸出參數(shù):
- //設(shè) 計(jì) 者:
- //創(chuàng)建日期:
- //==================================================================
- void minute_Set(void)
- {
- switch(current_Event)
- {
- case 0:break;
- case 1:sys_State = 0x14;break; //顯示時(shí)分
- case 2:minute--;if(minute < 0) minute = 59;break; //分鐘--
- case 4:minute++;if(minute == 60) minute = 0;break; //分鐘++
- case 8:sys_State = 0x10;break; //顯示菜單P-1
- default:break;
- }
- tube(0x03);
- decimal_Point(0x02);
- display[0] = hour / 10;
- display[1] = hour % 10;
- display[2] = minute / 10;
- display[3] = minute % 10;
- }
- //==================================================================
- //函 數(shù) 名: void alarm_Hour_Set(void)
- //功能描述: 鬧鐘--小時(shí)設(shè)置
- //輸入?yún)?shù): NULL
- //輸出參數(shù):
- //設(shè) 計(jì) 者:
- //創(chuàng)建日期:
- //==================================================================
- void alarm_Hour_Set(void)
- {
- switch(current_Event)
- {
- case 0:break;
- case 1:sys_State = 0x33;break; //設(shè)置鬧鐘分鐘
- case 2:alarm_Hour--;if(alarm_Hour < 0) alarm_Hour = 23;break; //鬧鐘小時(shí)--
- case 4:alarm_Hour++;if(alarm_Hour == 24) alarm_Hour = 0;break; //鬧鐘小時(shí)++
- case 8:sys_State = 0x30;break; //顯示菜單P-3
- default:break;
- }
- tube(0x0c);
- decimal_Point(0x02);
- display[0] = alarm_Hour / 10;
- display[1] = alarm_Hour % 10;
- display[2] = alarm_Minute / 10;
- display[3] = alarm_Minute % 10;
- }
- //==================================================================
- //函 數(shù) 名: void alarm_Minute_Set(void)
- //功能描述: 鬧鐘--分鐘設(shè)置
- //輸入?yún)?shù):
- //輸出參數(shù):
- //設(shè) 計(jì) 者:
- //創(chuàng)建日期:
- //==================================================================
- void alarm_Minute_Set(void)
- {
- switch(current_Event)
- {
- case 0:break;
- case 1:sys_State = 0x32;break; //設(shè)置鬧鐘小時(shí)
- case 2:alarm_Minute--;if(alarm_Minute < 0) alarm_Minute = 59;break; //鬧鐘分鐘--
- case 4:alarm_Minute++;if(alarm_Minute == 60) alarm_Minute = 0;break;//鬧鐘分鐘++
- case 8:sys_State = 0x30;break; //顯示菜單P-3
- default:break;
- }
- tube(0x03);
- decimal_Point(0x02);
- display[0] = alarm_Hour / 10;
- display[1] = alarm_Hour % 10;
- display[2] = alarm_Minute / 10;
- display[3] = alarm_Minute % 10;
- }
- //==================================================================
- // 顯示程序
- //==================================================================
- //==================================================================
- //函 數(shù) 名: year_Display()
- //功能描述: 年顯示函數(shù)
- //輸入?yún)?shù): NULL
- //輸出參數(shù):
- //設(shè) 計(jì) 者:
- //創(chuàng)建日期:
- //==================================================================
- void year_Display(void)
- {
- switch(current_Event)
- {
- case 0:break;
- case 1:sys_State = 0x16;break; //設(shè)置年
- case 2:sys_State = 0x12;break; //顯示月日
- case 4:sys_State = 0x15;break; //顯示秒
- case 8:sys_State = 0x10;break; //顯示菜單P-1
- default:break;
- }
- display[0] = year / 1000;
- display[1] = year / 100 % 10;
- display[2] = year / 10 % 10;
- display[3] = year % 10;
- }
- //==================================================================
- //函 數(shù) 名: void month_Day_Display(void)
- //功能描述: 月-日顯示函數(shù)
- //輸入?yún)?shù): NULL
- //輸出參數(shù):
- //設(shè) 計(jì) 者:
- //創(chuàng)建日期:
- //==================================================================
- void month_Day_Display(void)
- {
- switch(current_Event)
- {
- case 0:break;
- case 1:sys_State = 0x17;break; //設(shè)置月
- case 2:sys_State = 0x13;break; //顯示周
- case 4:sys_State = 0x11;break; //顯示年
- case 8:sys_State = 0x10;break; //顯示菜單P-1
- default:break;
- }
- display[0] = month / 10;
- display[1] = month % 10;
- display[2] = day / 10;
- display[3] = day % 10;;
- decimal_Point_On(0x02);
- }
- //==================================================================
- //函 數(shù) 名: void week_Display(void)
- //功能描述: 星期顯示函數(shù)
- //輸入?yún)?shù): NULL
- //輸出參數(shù):
- //設(shè) 計(jì) 者:
- //創(chuàng)建日期:
- //==================================================================
- void week_Display(void)
- {
- switch(current_Event)
- {
- case 0:break;
- case 1:sys_State = 0x19;break; //設(shè)置周
- case 2:sys_State = 0x14;break; //顯示時(shí)分
- case 4:sys_State = 0x12;break; //顯示月日
- case 8:sys_State = 0x10;break; //顯示菜單P-1
- default:break;
- }
- display[0] = 20;
- display[1] = 12;
- display[2] = 21;
- display[3] = week;
- }
- //==================================================================
- //函 數(shù) 名: void hour_Minute_Display(void)
- //功能描述: 時(shí)-分顯示函數(shù)
- //輸入?yún)?shù): NULL
- //輸出參數(shù):
- //設(shè) 計(jì) 者:
- //創(chuàng)建日期:
- //==================================================================
- void hour_Minute_Display(void)
- {
- switch(current_Event)
- {
- case 0:break;
- case 1:sys_State = 0x1a;break; //設(shè)置時(shí)
- case 2:sys_State = 0x15;break; //顯示秒
- case 4:sys_State = 0x13;break; //顯示周
- case 8:sys_State = 0x10;break; //顯示菜單P-1
- default:break;
- }
- display[0] = hour / 10;
- display[1] = hour % 10;
- display[2] = minute / 10;
- display[3] = minute % 10;
- decimal_Point(0x02); //點(diǎn)亮小數(shù)點(diǎn)
- }
- //==================================================================
- //函 數(shù) 名: void second_Display(void)
- //功能描述: 秒顯示函數(shù)
- //輸入?yún)?shù): NULL
- //輸出參數(shù):
- //設(shè) 計(jì) 者:
- //創(chuàng)建日期:
- //==================================================================
- void second_Display(void)
- {
- switch(current_Event)
- {
- case 0:break;
- case 1:break;
- case 2:sys_State = 0x11;break; //顯示年
- case 4:sys_State = 0x14;break; //顯示時(shí)分
- case 8:sys_State = 0x10;break; //顯示菜單P-1
- default:break;
- }
- display[0] = 10;
- display[1] = 10;
- display[2] = second / 10;
- display[3] = second % 10;
- }
- //==================================================================
- //函 數(shù) 名: void swatch(void)
- //功能描述: 秒表函數(shù)
- //輸入?yún)?shù):
- //輸出參數(shù):
- //設(shè) 計(jì) 者:
- //創(chuàng)建日期:
- //==================================================================
- void swatch(void)
- {
- static uint data count;
- if(swatch_Start_Flag ==1)
- {
- if(f_systick_10ms == 1) //產(chǎn)生跑秒
- {
- f_systick_10ms = 0;
- count++;
- if(count==9999) count = 0;
- }
- }
- switch(current_Event)
- {
- case 0:break;
- case 1:break; //秒表暫停
- case 2:count = 0; swatch_Start_Flag = 0; break; //秒表清零
- case 4:swatch_Start_Flag = !swatch_Start_Flag; break; //秒表計(jì)數(shù)開始
- case 8:sys_State = 0x20;break; //顯示菜單P-2
- default:break;
- }
- display[0] = count/1000;
- display[1] = count/100%10;
- display[2] = count/10%10;
- display[3] = count%10;
- }
- //==================================================================
- //函 數(shù) 名: void alarm_Clock(void)
- //功能描述: 鬧鐘函數(shù)
- //輸入?yún)?shù):
- //輸出參數(shù):
- //設(shè) 計(jì) 者:
- //創(chuàng)建日期:
- //==================================================================
- void alarm_Clock(void)
- {
- switch(current_Event)
- {
- case 0:break;
- case 1: //設(shè)置鬧鐘小時(shí)
- {
- if(alarm_Flag==1)
- {sys_State = 0x32;}
- else
- {sys_State = 0x30;}
- break;
- }
- case 2: alarm_Flag = 1;break; //顯示ON,開鬧鐘。
-
- case 4:alarm_Flag = 0;break; //顯示OFF,關(guān)閉鬧鐘。
- case 8:sys_State = 0x30;break; //顯示菜單P-3
- default:break;
- }
- if(alarm_Flag==1)
- {
- display[0] = 10;
- display[1] = 10;
- display[2] = 0;
- display[3] = 31;
- }
- else
- {
- display[0] = 10;
- display[1] = 0;
- display[2] = 16;
- display[3] = 16;
- }
- }
- //==================================================================
- //函 數(shù) 名: void alarm_Clock_Loud(void)
- //功能描述:
- //輸入?yún)?shù):
- //輸出參數(shù):
- //設(shè) 計(jì) 者:
- //創(chuàng)建日期:
- //==================================================================
- void alarm_Clock_Loud(void)
- {
- if(alarm_Flag==1)
- {
- if(alarm_Hour == hour && alarm_Minute == minute) //鬧鐘定時(shí)時(shí)間到
- {
- if(alarm_State == 0)
- {
- alarm_State = 1;
- }
- }
- else
- {
- if(alarm_State == 1) //鬧鐘響鈴時(shí)間內(nèi)沒有手動(dòng)停止鬧鐘則一分鐘后鬧鐘自動(dòng)停止
- {
- buzzer = 1;
- }
- alarm_State = 0; //鬧鐘定時(shí)時(shí)間未到開始標(biāo)致位清零
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
萬年歷實(shí)驗(yàn).rar
(104.16 KB, 下載次數(shù): 60)
2018-4-8 18:59 上傳
點(diǎn)擊文件名下載附件
實(shí)現(xiàn)萬年歷 下載積分: 黑幣 -5
|