利用定时器的定时功能实现了秒、分、时的计数以24小时为1天,天累计满一个月相应的天数时为1个月,12个月为1年。 该万年历系统包含了多项功能,整个应用上来看由三大功能组成,分别是:时钟功能、秒表功能、闹钟功。
单片机源程序如下:
- //==================================================================
- //文件名称: 应用
- //功能说明:
- //硬件描述:
- //资源说明: 11.0592M晶体
- //创建日期:
- //软件版本: v 1.0
- //==================================================================
- //===========================包含头文件==============================
- #include <reg51.h>
- #include "timer.h"
- #include "app.h"
- //=============================宏定义===============================
- sbit buzzer = P0^4;
- //============================变量定义==============================
- uchar data event_FIFO[8]; //事件缓冲区
- uchar data *event_WrIp = event_FIFO; //写指针
- uchar data *event_RdIp = event_FIFO; //读指针
- uchar data display[4];
- uchar data sys_State = 0x14; //界面状态(初始状态显示时分)
- uchar data current_Event = 0; //按键状态
- uchar data month_Day[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; //每个月最大天数数组(二月是由于年份初值给的2015,非闰年,即二月初值为28天。)
- uchar data second = 50; //秒初值
- char data minute = 59; //分初值
- char data hour = 23; //时初值
- uchar data day = 28; //月初值
- uchar data month = 2; //日初值
- uint data year = 2016; //年初值
- uint data week = 7; //周初值
- char data alarm_Minute = 0; //闹钟时初值
- char data alarm_Hour = 0; //闹钟分初值
- bit swatch_Start_Flag = 0; //秒表计时开始标致位
- bit alarm_Flag = 0;
- uchar alarm_State = 0; //0-free 1-louding 2-handstop 3-stop
- //=================================================
- //函 数 名: void write_Event(uchar cmd)
- //功能描述: 向事件缓冲区写入值
- //输入参数: 写入的事件值
- //输出参数: 无
- //设 计 者:
- //创建日期:
- //==================================================
- void write_Event(uchar cmd)
- {
- *event_WrIp=cmd;
- if(event_WrIp==(event_FIFO+7)) event_WrIp=event_FIFO;
- else event_WrIp++;
- }
- //=================================================
- //函 数 名: void write_Event(uchar cmd)
- //功能描述: 从事件缓冲区读入值
- //输入参数:
- //输出参数: 读出的数据值
- //设 计 者:
- //创建日期:
- //==================================================
- 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);
- }
- //==================================================================
- //函 数 名: void clock_update(void)
- //功能描述: 时间自动更新函数
- //输入参数: NULL
- //输出参数: second、minute、hour、week、day、month、year
- //设 计 者:
- //创建日期:
- //==================================================================
- 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; //利用三目运算判断闰年
- }
- //==================================================================
- //函 数 名: meau1_Display()
- //功能描述: 菜单P-1函数
- //输入参数: NULL
- //输出参数: 显示缓冲区
- //设 计 者:
- //创建日期:
- //==================================================================
- 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;
- }
- //==================================================================
- //函 数 名: meau2_Display(void)
- //功能描述: 菜单P-2函数
- //输入参数: NULL
- //输出参数: 显示缓冲区
- //设 计 者:
- //创建日期:
- //==================================================================
- 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;
- }
- //==================================================================
- //函 数 名: meau3_Display()
- //功能描述: 菜单P-3函数
- //输入参数: NULL
- //输出参数:
- //设 计 者:
- //创建日期:
- //==================================================================
- 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;
- }
- //==================================================================
- // 设置函数
- //==================================================================
- //==================================================================
- //函 数 名: year_Set()
- //功能描述: 年设置函数
- //输入参数: NULL
- //输出参数:
- //设 计 者:
- //创建日期:
- //==================================================================
- 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); //数码管闪烁
- display[0] = year / 1000;
- display[1] = year / 100 % 10;
- display[2] = year / 10 % 10;
- display[3] = year % 10;
- }
- //==================================================================
- //函 数 名: week_Set()
- //功能描述: 周设置函数
- //输入参数: NULL
- //输出参数:
- //设 计 者:
- //创建日期:
- //==================================================================
- 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;
- }
- //==================================================================
- //函 数 名: month_Set(void)
- //功能描述: 月设置函数
- //输入参数: NULL
- //输出参数:
- //设 计 者:
- //创建日期:
- //==================================================================
- void month_Set(void)
- {
- switch(current_Event)
- {
- case 0:break;
- case 1:sys_State = 0x18;break; //设置日
- 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;
- }
- //==================================================================
- //函 数 名: void day_Set(void)
- //功能描述: 日设置函数
- //输入参数: NULL
- //输出参数:
- //设 计 者:
- //创建日期:
- //==================================================================
- 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]; //使得每个月的最大天数与对应月份实际天数相等
- break;
- }
- case 4:
- {
- day++;
- if(day > month_Day[month - 1]) //当其超过每月最大天数时,天数置一
- {
- 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;;
- }
- //==================================================================
- //函 数 名: void hour_Set(void)
- //功能描述: 小时设置函数
- //输入参数: NULL
- //输出参数:
- //设 计 者:
- //创建日期:
- //==================================================================
- void hour_Set(void)
- {
- switch(current_Event)
- {
- case 0:break;
- case 1:sys_State = 0x1b;break; //设置分钟
- case 2:hour--;if(hour < 0) hour = 23;break; //小时--
- case 4:hour++;if(hour == 24) hour = 0;break; //小时++
- 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;
- }
- //==================================================================
- //函 数 名: void minute_Set(void)
- //功能描述: 分钟设置函数
- //输入参数: NULL
- //输出参数:
- //设 计 者:
- //创建日期:
- //==================================================================
- void minute_Set(void)
- {
- switch(current_Event)
- {
- case 0:break;
- case 1:sys_State = 0x14;break; //显示时分
- 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;
- }
- //==================================================================
- //函 数 名: void alarm_Hour_Set(void)
- //功能描述: 闹钟--小时设置
- //输入参数: NULL
- //输出参数:
- //设 计 者:
- //创建日期:
- //==================================================================
- void alarm_Hour_Set(void)
- {
- switch(current_Event)
- {
- case 0:break;
- case 1:sys_State = 0x33;break; //设置闹钟分钟
- case 2:alarm_Hour--;if(alarm_Hour < 0) alarm_Hour = 23;break; //闹钟小时--
- case 4:alarm_Hour++;if(alarm_Hour == 24) alarm_Hour = 0;break; //闹钟小时++
- 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;
- }
- //==================================================================
- //函 数 名: void alarm_Minute_Set(void)
- //功能描述: 闹钟--分钟设置
- //输入参数:
- //输出参数:
- //设 计 者:
- //创建日期:
- //==================================================================
- void alarm_Minute_Set(void)
- {
- switch(current_Event)
- {
- case 0:break;
- case 1:sys_State = 0x32;break; //设置闹钟小时
- 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;
- }
- //==================================================================
- // 显示程序
- //==================================================================
- //==================================================================
- //函 数 名: year_Display()
- //功能描述: 年显示函数
- //输入参数: NULL
- //输出参数:
- //设 计 者:
- //创建日期:
- //==================================================================
- void year_Display(void)
- {
- switch(current_Event)
- {
- case 0:break;
- case 1:sys_State = 0x16;break; //设置年
- 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;
- }
- //==================================================================
- //函 数 名: void month_Day_Display(void)
- //功能描述: 月-日显示函数
- //输入参数: NULL
- //输出参数:
- //设 计 者:
- //创建日期:
- //==================================================================
- void month_Day_Display(void)
- {
- switch(current_Event)
- {
- case 0:break;
- case 1:sys_State = 0x17;break; //设置月
- 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);
- }
- //==================================================================
- //函 数 名: void week_Display(void)
- //功能描述: 星期显示函数
- //输入参数: NULL
- //输出参数:
- //设 计 者:
- //创建日期:
- //==================================================================
- void week_Display(void)
- {
- switch(current_Event)
- {
- case 0:break;
- case 1:sys_State = 0x19;break; //设置周
- case 2:sys_State = 0x14;break; //显示时分
- 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;
- }
- //==================================================================
- //函 数 名: void hour_Minute_Display(void)
- //功能描述: 时-分显示函数
- //输入参数: NULL
- //输出参数:
- //设 计 者:
- //创建日期:
- //==================================================================
- void hour_Minute_Display(void)
- {
- switch(current_Event)
- {
- case 0:break;
- case 1:sys_State = 0x1a;break; //设置时
- 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); //点亮小数点
- }
- //==================================================================
- //函 数 名: void second_Display(void)
- //功能描述: 秒显示函数
- //输入参数: NULL
- //输出参数:
- //设 计 者:
- //创建日期:
- //==================================================================
- 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; //显示时分
- case 8:sys_State = 0x10;break; //显示菜单P-1
- default:break;
- }
- display[0] = 10;
- display[1] = 10;
- display[2] = second / 10;
- display[3] = second % 10;
- }
- //==================================================================
- //函 数 名: void swatch(void)
- //功能描述: 秒表函数
- //输入参数:
- //输出参数:
- //设 计 者:
- //创建日期:
- //==================================================================
- void swatch(void)
- {
- static uint data count;
- if(swatch_Start_Flag ==1)
- {
- if(f_systick_10ms == 1) //产生跑秒
- {
- 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; //秒表计数开始
- 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;
- }
- //==================================================================
- //函 数 名: void alarm_Clock(void)
- //功能描述: 闹钟函数
- //输入参数:
- //输出参数:
- //设 计 者:
- //创建日期:
- //==================================================================
- void alarm_Clock(void)
- {
- switch(current_Event)
- {
- case 0:break;
- case 1: //设置闹钟小时
- {
- 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,关闭闹钟。
- 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;
- }
- }
- //==================================================================
- //函 数 名: void alarm_Clock_Loud(void)
- //功能描述:
- //输入参数:
- //输出参数:
- //设 计 者:
- //创建日期:
- //==================================================================
- void alarm_Clock_Loud(void)
- {
- if(alarm_Flag==1)
- {
- if(alarm_Hour == hour && alarm_Minute == minute) //闹钟定时时间到
- {
- if(alarm_State == 0)
- {
- alarm_State = 1;
- }
- }
- else
- {
- if(alarm_State == 1) //闹钟响铃时间内没有手动停止闹钟则一分钟后闹钟自动停止
- {
- buzzer = 1;
- }
- alarm_State = 0; //闹钟定时时间未到开始标致位清零
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
万年历实验.rar
(104.16 KB, 下载次数: 60)
|