


版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、51 单片机电子日历课程设计 程序代码:/*/* 电子日历,有时间显示、闹铃、日期、秒表及键盘设置功能 */* 功能键 A: 设置位数字 +1闹钟模式下为闹钟开关秒表模式下为记时开关 */*功能键B: 设置位数字 -1闹钟模式下为闹钟开关*/*功能键C:设置模式及设置位选择秒表模式下为清零键*/*功能键D: 在四种工作模式下切换设置闹钟开关*/*曹宇 03电子 0201029*/*2006.6.3更新*/*#include#include*这里设置程序初始化时显示的时间 */#define SET_HOUR 12 /* 设置初始化小时 */#define SET_MINUTE 00 /*#de
2、fine SET_SECOND 00 /*设置初始化分钟 */ 设置初始化秒数 */*系统地址 *#define BASE_PORT 0x8000 /* 选通基地址 */#define KEY_LINE BASE_PORT+1 /* 键盘行线地址 */#define KEY_COLUMN BASE_PORT+2 /*键盘列线地址 */#define LED_SEG BASE_PORT+4 /* 数码管段选地址 */#define LED_BIT BASE_PORT+2 /* 数码管位选地址 */#define LED_ON(x) XBYTELED_BIT=(0x01<#define LE
3、D_OFFXBYTELED_SEG=0x00 /*LED显示空 */*在设置模式下对秒分时的宏定义 */#define SECOND 0 /*#define MINUTE 1 /*对应数码管右边两位 */ 对应数码管中间两位 */#define HOUR 2 /*对应数码管左边两位 */*定义四种工作模式*/*以下是所有子函数的声明 */* 系统的初始化程序 */ 动态刷新一次数码管子程序 */#define CLOCK clockstr /* 时钟模式 */ #define ALART alartstr /*闹钟模式 */#define DATE datestr /* 日期模式 */ #de
4、fine TIMER timerstr /* 秒表模式 */ void sys_init(void); void display(void); /*void update_clockstr(void); /* void update_alartstr(void);void update_datestr(void); /*更新时间显示编码 */void update_timerstr(void); /* void deley(int); /* 延时子程序 */ void update_dispbuf(unsigned char *); /* unsigned char getkeycode(vo
5、id); /* void keyprocess(unsigned char); /*更新秒表时间的显示编码 */更新显示缓冲区 */ 获取键值子程序 */ 键值处理子程序 */unsigned char getmonthdays(unsigned int,unsigned char);/*计算某月的天数子程序*/* 功能键功能子函数 */void Akey(void); /* void Bkey(void); /* void Ckey(void); /* void Dkey(void); /*当前设置位 +1 开关闹钟 开关秒表 */ 当前设置位 -1 开关闹钟 */ 设置位选择 秒表清零 *
6、/ 切换四种工作模式 */*全局变量声明部分*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= /*键值代码数组 对应键位: */ 0x70,0x71,0x72,0x73,0x74,0x75, /* 7 8 9 A TRACE RESET*/ / 0xb0,0xb1,0xb2,0xb3,0xb4,0xb5, /* 4 5 6 B STEP MON
7、*/ / 0xd0,0xd1,0xd2,0xd3,0xd4,0xd5, /* 1 2 3 C HERE LAST */ / 0xe0,0xe1,0xe2,0xe3,0xe4,0xe5; /* 0 F E D EXEC NEXT */ struct /* 时间结构体变量 */ unsigned char s;unsigned char m; unsigned char h; clock=SET_SECOND,SET_MINUTE,SET_HOUR;struct /* unsigned char m;unsigned char h; alart=SET_MINUTE,SET_HOUR; struc
8、t /* unsigned int year;unsigned char month; unsigned char day; date=6,1,1;struct /* unsigned char ms; unsigned char s; unsigned char m;闹铃时间结构体变量 */日期结构体变量 */秒表时间结构体变量 */* 更新闹钟时间的显示编码 */更新日期显示编码 */timer=0,0,0;unsigned char dispbuf6; /* unsigned char clockstr6; /* unsigned char alartstr6; /* unsigned
9、char datestr6; /* unsigned char timerstr6; /* unsigned int itime=0,idot; /* unsigned char itime1=0; /*显示缓冲区数组 */时间显示的数码管编码数组 */闹钟显示的数码管编码数组 */ 日期显示的数码管编码数组 */ 秒表显示的数码管编码数组 */ 定时器 0 中断计数 */ 定时器 1 中断计数 */sbit P3j= P3A1; /*外接蜂鸣器的管脚*/bdata bit IsSet=0; /* 设置模式标志位 0 :正常走时 1 :设置模式 */bdata bit Alart_EN=0;
10、/* 闹铃功能允许位 0 :禁止闹铃 1 :允许闹铃 */bdata bit IsBeep=0;/*响铃标志位 0 :未响铃 1 :正在响铃 */ unsigned char SetSelect=0; /* 在设置模式 IsSet=1 时,正在被设置的位 , 对应上面的宏 */ unsigned char *CurrentMode; /* 标 志 当 前 正 设 置 的 功 能 , 如 CurrentMode=CLOCK 或Curre ntMode=ALART 等 */ void timerplus(void);/*函数部分 */void main(void)sys_init();while(
11、1)XBYTEKEY_COLUMN,0x00; /* 给键盘列线赋全零扫描码,判断是否有键按下 */ while(XBYTEKEY_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
12、_init(void)TMOD=Ox22; /* 定时器0和1都设置为工作方式 2,基准定时250 X 2 = 500us=0.5ms*/TH0=6;/*定时器 0 中断服务用来产生 1 秒时钟定时及闹钟蜂鸣器蜂鸣脉冲 */TL0=6; /* 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; /* P
13、3_1=0; /*定时器 1 中断服务留给秒表使用,产生1/100 秒定时 */初始化时钟显示编码数组 */初始化闹钟显示编码数组 */ 初始化日期显示编码数组 */ 初始化秒表显示编码数组 */ 初始化显示缓冲数组 */ 默认的显示摸式为时钟 */ 蜂鸣器接线引脚复位 */void timer0(void) interrupt 1 using 1 /* 定时器 0 中断服务器,用来产生 1 秒定时 */ itime+;if(itime=1000)if(IsSet) /* 在设置模式下,对正在设置的位闪烁显示 */dispbufSetSelect*2=0; /* 对正在设置的位所对应的显示缓
14、冲区元素赋0,使LED灭*/dispbufSetSelect*2+1=0;if(IsBeep) P3_1=!P3_1; /*闹钟模式时,产生峰鸣器响脉冲 */if(CurrentMode=CLOCK)dispbuf2=dispbuf2&0x7f; dispbuf4=dispbuf4&0x7f;if(itime=2000) /*两千次计数为 1S 2000 x 0.5ms=1s*/itime=0; /* 定时 1s 时间到,软计数清零 */clockplus(); /*时间结构体变量秒数加 1 */update_clockstr(); /*更新时间显示编码数组 */if(Curr
15、entMode!=TIMER) update_dispbuf(CurrentMode); /*用时间编码数组更新显示缓冲区 */void timer1(void) interrupt 3 using 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
16、<1000) /*dispbuf2=dispbuf2|0x80;dispbuf4=dispbuf4|0x80;elsedispbuf2=dispbuf2&0x7f;dispbuf4=dispbuf4&0x7f;定时器 1 中断服务器,用来产生 1/100 秒关闭小数点的显示 */闪烁显示小数点 */ if(idot=2000) idot=0;/* 功能模块子函数 */ void clockplus(void) /* if(+clock.s=60) /*clock.s=0;if(+clock.m=60) /*clock.m=0;if(+clock.h=24) /* cloc
17、k.h=0;时间加 1s 判断分,时子函数 */秒位判断 */分位判断 */时位判断 */if(+date.day=(getmonthdays(date.year,date.month)+1) date.day=1;if(+date.month=13) date.month=1;void timerplus() /* if(+timer.ms=100)timer.ms=0;if(+timer.s=60)timer.s=0;if(+timer.m=60) timer.m=0;秒表 1/100 秒位加 1,判断秒、分子程序 */void update_clockstr(void) /*clocks
18、tr0=ledclock.s%10; /* 个位 */ clockstr1=led(int)(clock.s/10); /* 秒数的十位 */ clockstr2=ledclock.m%10; /* clockstr3=led(int)(clock.m/10); clockstr4=ledclock.h%10; clockstr5=led(int)(clock.h/10);void update_alartstr(void) /* /* if(Alart_EN) alartstr0=ledchar1;/* else alartstr0=ledchar2; /* alartstr1=ledcha
19、r0; /* alartstr2=ledalart.m%10; alartstr3=led(int)(alart.m/10);更新时钟显示代码数组 clockstr*/给元素 0 赋相应数码管显示编码,编码序号是秒数的给元素 1 赋相应数码管显示编码,编码序号是以下类推 */更新闹钟显示代码数组 alartstr*/右边两位显示on:闹钟开启of:闹钟关闭*/显示字母 n*/显示字母 f*/显示字母 o*/alartstr4=ledalart.h%10;alartstr5=led(int)(alart.h/10);void update_datestr(void) /* 更新日期显示代码数组
20、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) /* 更新秒表显示代码数组 timerstr*/timerstr0=ledtimer.ms%10; timerstr1=led(int)(timer.ms/10);timer
21、str2=ledtimer.s%10; timerstr3=led(int)(timer.s/10);timerstr4=ledtimer.m%10; timerstr5=led(int)(timer.m/10);void display(void) /*刷新显示六位 LED次 */unsigned char i;for(i=0;i<6;i+)LED_ON(i); /* 选通相应位 */XBYTELED_SEG=dispbufi; /*写显示段码 */deley(50); /*延时显示 */LED_OFF; /* 写LED全灭段码*/void update_dispbuf(unsigne
22、d char *str) /* 更新显示缓冲区子函数 , 参数为要用来更 新缓冲区的源字符数组的首地址 */dispbufO=strO;/*将要更新的源字符数组内容COPY至 dispbuf数组,用作显示缓冲区 */dispbuf1=str1;dispbuf2=str2|0x80;/* 默认把时位和分位后面的小数点显示出来, 根据需要再取舍 */dispbuf3=str3; dispbuf4=str4|0x80;dispbuf5=str5;void deley(int i) /*延时子函数 */while(i-);unsigned char getkeycode(void) /*键盘扫描子程序
23、,返回获得的键码 */unsigned char keycode; /*键码变量 , 一开始存行码 */unsigned char scancode=0x20; /*列扫描码 */unsigned char icolumn=0; /*键的列号 */display(); /* 用刷新数码管显示的时间去抖 */ XBYTEKEY_COLUMN=0x00;keycode=XBYTEKEY_LINE&0x0f; /* 从行端口读入四位行码 */ while(scancode&0x3f)!=0) /* 取 scancode 的低六位,只要没变为全 0, 则执行循环 */ XBYTEKEY
24、_COLUMN=(scancode)&0x3f; /* 给列赋扫描码,第一次为 011111*/ if(XBYTEKEY_LINE&0x0f)=keycode) break; /* 检测按键所在的列跳出循环 */ scancode=scancode>>1; /*列扫描码右移一位 */icolumn+; /* 列号加 1*/ keycode=keycode<<4; /* 把行码移到高四位 */ keycode=keycode|icolumn; /* 由行码和列码组成键码 */ / 等待按键放开XBYTEKEY_COLUMN=0x00; while(XBYT
25、EKEY_LINE&0x0f)!=0x0f) display(); return keycode;void keyprocess(unsigned char keycode) /*键值处理函数 */switch (keycode)case 0x73: Akey();break;case 0xB3: Bkey();break;case 0xD3: Ckey();break;case 0xE3: Dkey(); break;default: break;update_dispbuf(CurrentMode);unsigned char getmonthdays(unsigned int y
26、ear,unsigned char month)/*得到某月的天数*/ 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=28;break;default:days=31;break;return days;/* 功能键子函数部分 */void Akey(void) /* 对当前设置位进行加一操作,如果设置秒位,则给秒位清零 */if(CurrentMode=TIMER) /* 秒表模式下启闭走时 */ TR1=!T
27、R1;return;if(!IsSet) return; /* 如果不是设置模式退出 */switch (SetSelect)case SECOND:if(CurrentMode=CLOCK)clock.s=0; /* 如果当前被设置位是秒位,则清零秒位 */ update_clockstr();if(CurrentMode=ALART)Alart_EN=!Alart_EN;update_alartstr(); if(CurrentMode=DATE)if(+date.day=(getmonthdays(date.year,date.month)+1) date.day=1; update_d
28、atestr();if(CurrentMode=TIMER)TR1=!TR1;break;case MINUTE:if(CurrentMode=CLOCK)if(+clock.m=60) clock.m=0; /*则分位加 1*/update_clockstr();if(CurrentMode=ALART)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=
29、CLOCK)if(+clock.h=24) clock.h=0; /*则时位加 1*/update_clockstr();if(CurrentMode=ALART)if(+alart.h=24) alart.h=0;update_alartstr(); if(CurrentMode=DATE)if(+date.year=100) date.year=0;update_datestr();break;default: break;update_dispbuf(CurrentMode);void Bkey(void) /* 对当前设置位进行减一操作, 如果设置秒分, 函数 */如果当前被设置分位,
30、如果当前被设置时位,则给秒位清零 , 类比 Akey()if(!IsSet) return;switch (SetSelect) case SECOND:if(CurrentMode=CLOCK)clock.s=0; update_clockstr(); if(CurrentMode=ALART) Alart_EN=!Alart_EN; 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(-
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 建筑劳务清包合同
- 园林绿化工程施工合同
- 展厅装修施工合同协议书
- 中介房屋买卖合同大全年
- 医疗健康领域医疗资源分布统计表
- 导购员聘用合同协议书
- 2025年潮州货运上岗证模拟考试0题
- 2025年部编版小学三年级下册课外阅读专项复习题(有答案)
- ic芯片购销合同范本
- 制动气室市场分析及竞争策略分析报告
- 一年级美术课后辅导方案-1
- 新法律援助基础知识讲座
- 《锻造安全生产》课件
- 小学数学1-6年级(含奥数)找规律专项及练习题附详细答案
- 《同济大学简介》课件
- 《建筑摄影5构》课件
- 机电安装工程质量控制
- 爱自己是终身浪漫的开始 心理课件
- 新房房屋买卖合同
- 地铁出入口雨棚施工工艺
- 人工智能引论智慧树知到课后章节答案2023年下浙江大学
评论
0/150
提交评论