单片机电子日历(电子时钟)程序

51 单片机?电子日历(电子时钟)程序

经过两天的?调试,完成了51 ?单片机电子?日历课程设?计,现在把C程?序源代码帖?出来纪念一?下:

硬件实验箱?是伟福LA?B2000 ?实验箱

程序代码:

/****************************************************************************/

/* 电子日历,有时间显示?、闹铃、日期、秒表及键盘?设置功能*/

/* 功能键A: 设置位数字?+1 闹钟模式下?为闹钟开关? 秒表模式下?为记时开关? */

/* 功能键B: 设置位数字-?1 闹钟模式下?为闹钟开关? */

/* 功能键C:设置模式及?设置位选择? 秒表模式下?为清零键*/

/* 功能键D:在四种工作?模式下切换?设置闹钟开?关*/

/* 曹宇03 电子02010 ?29 */

/* 2006.6.3 更新*/

/****************************************************************************/

#inclu ?de

#inclu ?de

/*************** 这里设置程?序初始化时?显示的时间*?***************/ #defin ?e

SET_H ?OUR 12 /* 设置初始化?小时*/

#defin ?e SET_M I?NUTE ?00 /* 设置初始化?分钟*/

#defin ?e SET_S ?E COND ?00 /* 设置初始化?秒数*/

/************************* 系统地址****************************/

#defin ?e BASE_ ?PORT 0x800 0? /* 选通基地址*?/

#defin ?e KEY_L I?NE BASE_ ?PORT+1 /* 键盘行线地?址*/

#defin ?e KEY_C ?OLUMN ?BASE_ ?PORT+2 /* 键盘列线地?址*/

#defin ?e LED_S ?EG BASE_ ?PORT+4 /* 数码管段选?地址*/

#defin ?e LED_B I?T BASE_ ?PORT+2 /* 数码管位选?地址*/

#defin ?e LED_O ?N(x) XBYTE [?LED_B I?T]=(0x01<

5*=""

#defin ?e LED_O ?FF XBYTE [?LED_S ?EG]=0x00 /*LED 显示?空*/

在设置模式?下对秒分时?的宏定义*****************/

#defin ?e SECON ?D 0 /* 对应数码管?右边两位*/ #defin ?e MINUT ?E 1 /*对应数码管?中间两位*/

#defin ?e HOUR 2 /*对应数码管?左边两位*/

定义四种工?作模式

#defin ?e CLOCK ?clock s?tr /* 时钟模式*/

#defin ?e ALART ?alart s?tr /*闹钟模式*/

#defin ?e DATE dates t?r /*日期模式*/ #defin ?e TIMER ?timer s?tr /* 秒表模式*/

以下是所有?子函数的声?明*********************/

void sys i ?nit(void); /*系统的初始?化程序*/

void displ ?a y(void); /* 动态刷新一?次数码管子?程序*/ void clock ?plus(void); /* 时间加

1S?的子程序*/ void updat e?_clo c?kstr (?void); /* 更新时间显?示编码*/ void updat ?e_ala

r?tstr (?void); /*更新闹钟时?间的显示编?码*/

void updat ?e_dat ?e str(void); /* 更新日期显?示编码*/ void updat ?e_tim ?erstr (?void); /*更新秒表时?间的显示编?码*/

void deley (?int); /* 延时子程序*?/

void updat e?_dis?pbuf(unsig ?ned char *); /*更新显示缓?冲区*/ unsig n?ed char getke y?code

(?void); /* 获取键值子?程序*/ void keypr ?ocess (?unsig n?ed char); /* 键值处理子?程序*/ unsig ?ned char getmo ?nthday?s(unsig ?ned int,unsig ?ned char);/* 计算某月的?天数子程序*?/

/*功能键功能?子函数*/

void Akey(void); /*当前设置位?+1 开关闹钟开关秒表*/

void Bkey(void);

void Ckey(void); /* 当前设置位-?1 开关闹钟*/ /* 设置位选择? 秒表清零*/

void Dkey(void); /*切换四种工?作模式*/

/*****************

全局变量声?明部分*********************/

*****

unsig ?ned char led[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};/* 从0~9 的LED ?编

码*/

unsig n?ed char ledch ?ar[3]={0x5c,0x54,0x71};/*o n f*/ //unsig ?ned char key[24]={ /* 键值代码数?组对应键位:*/

// 0x70,0x71,0x72,0x73,0x74,0x75, /* 7 8 9 A TRACE ?RESET ?*/

// 0xb0,0xb1,0xb2,0xb3,0xb4,0xb5, /* 4 5 6 B STEP MON */

// 0xd0,0xd1,0xd2,0xd3,0xd4,0xd5, /* 1 2 3 C HERE LAST */

// 0xe0,0xe1,0xe2,0xe3,0xe4,0xe5}; /* 0 F E D EXEC NEXT */

struc t?{ /* 时间结构体?变量*/

unsig ?ned char s;

unsig ?ned char m; unsig ?ned char h;

}clock ?={SET_S ?ECOND ,?SET_M I?NUTE ,?SET_H ?OUR}; struc t?{ /*闹铃时间结?构体变量*/

unsig n?ed char m;

unsig ?ned char h;

}alart ?={SET_M I?NUTE ,?SET_H ?OUR};

struc t?{ /*日期结构体?变量*/

unsig n?ed int year;

unsig ?ned char month ;?

unsig n?ed char day;

}date={6,1,1};

struc t?{ /*秒表时间结?构体变量*/ unsig ?ned char ms;

unsig ?n ed char s;

unsig ?ned char m;

}timer ?={0,0,0};

unsig ?ned char dispb ?uf[6]; /* 显示缓冲区?数组*/

unsig n?ed char clock s?tr[6]; /* 时间显示的?数码管编码?数组*/ unsig n?ed char alart s?tr[6];

}

相关主题
相关文档
最新文档