版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、/*多功能电子时钟单片机:stc89c52系列或其兼容型号 外部晶振:12mhz功能:1、支持多个时钟同时运行(clockcount) 2、每个时钟都具备12小时模式和24小时模式 3、12小时模式时,具备am/pm的led指示功能 4、每个时钟都具备闹铃功能 5、每个时钟的时间和闹铃时间都可设置 (自适应12小时模式和24小时模式)日期:2012.7.17(佳木斯大学65周年校庆)*/ #include reg52.h#define fosc(12)/系统晶振,以mhz为单位#define msecond(10)/定时器的定时时间,以毫秒为单位#define clockcount(3)/时钟
2、个数#define vtl0(65536-msecond*fosc/12*1000)%256)/计算定时器初值#define vth0(65536-msecond*fosc/12*1000)/256)#define segport(p0)/显示器段码口#define weiport(p1)/显示器位码口#define flashhour(1)/小时闪烁判断值#define flashminute(2)/分钟闪烁判断值#define flashsecond(3)/秒闪烁判断值#define flashall(4)/所有位闪烁判断值#define flashnone(5)/不闪烁判断值#defin
3、e flashfreq(10)/小时、分、秒闪烁时的频率,值越大越慢#define alarmtime(30000)/自动撤销闹铃前的等待时间,值越大时间越长#define alarmon(1)/打开闹铃判断值#define alarmoff(2)/关闭闹铃判断值#define timemode12(1)/12小时模式#define timemode24(2)/24小时模式#define am(1)/代表上午#define pm(2)/代表下午#define key1(1)/1号按键的键值#define key2(2)/2号按键的键值#define key3(3)/3号按键的键值#define
4、 nokey(4)/无按键时的返回键值#define beepon(1)/打开蜂鸣器的电平#define beepoff(0)/关闭蜂鸣器的电平#define ledon(1)/点亮led时的电平#define ledoff(0)/熄灭led时的电平#define beepfreq(10)/蜂鸣器的发声频率,值越大越慢#define keyspeed(30)/按键的响应速度,值越大响应越慢#define keywaittime(1000)/无按键时,自动退出前的等待时间,值越大时间越长sbit key1=p20;/1号按键,以下程序设定为“功能键”sbit key2=p21;/2号按键,以下程
5、序设定为“增键”sbit key3=p22;/3号按键,以下程序设定为“减键”sbit beep=p27;/闹铃驱动口线sbit amled=p23;/am指示灯sbit pmled=p24;/pm指示灯typedef struct/定义一个时钟结构体类型tclock unsigned char hour;unsigned char minute;unsigned char second;unsigned int msecond; /毫秒unsigned char timemode;/表示时钟模式,是12小时模式还是24小时模式unsigned char amorpm;/表示当前是上午还是下午
6、unsigned char alarmopen;/是否打开闹铃的控制位unsigned char alarmhour;unsigned char alarmminute;unsigned char alarmflag; /闹铃时间到标志unsigned int alarmtime;/为自动退出闹铃状态服务unsigned char alarmamorpm;/表示闹铃是设置在上午还是下午 tclock;unsigned char code segcode=/共阴极管 dp g f e d c b a 0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x
7、6f,0x00;tclock clockclockcount,*pclock;/时钟数组和时钟指针unsigned char keywaitflag=0,adjusttimeflag=0;/用于函数间协调的两个标志unsigned char whichclock=0;/存放当前所选时钟的下标unsigned char dispbuf6;/显示缓冲区unsigned char keywaittime=0;/为无按键时的自动退出服务/通用的软件延时函数/x要延时的时间,范围0255void xdelay(unsigned char x) unsigned char y; for(;x0;x-) f
8、or(y=30;y0;y-);/将所选时钟的数据填充到显示缓冲区/pclock指向时钟的指针void filldispbuf(tclock *pclock) dispbuf0=segcodepclock-hour/10; dispbuf1=segcodepclock-hour%10; dispbuf2=segcodepclock-minute/10; dispbuf3=segcodepclock-minute%10; dispbuf4=segcodepclock-second/10; dispbuf5=segcodepclock-second%10;/将所选时钟的闹铃时间填充到显示缓冲区/pc
9、lock指向时钟的指针void fillalarmtodispbuf(tclock *pclock) dispbuf0=segcode10; dispbuf1=segcode10; dispbuf2=segcodepclock-alarmhour/10; dispbuf3=segcodepclock-alarmhour%10; dispbuf4=segcodepclock-alarmminute/10; dispbuf5=segcodepclock-alarmminute%10;/显示函数,用于显示时间,可闪烁显示/flashwhich指定闪烁的部分,可取值flashhour、/flashmi
10、nute、flashsecond、flashall、flashnonevoid display(unsigned char flashwhich) unsigned char weicode,i; static unsigned char nstate=0,flashcount=flashfreq; weicode=0xfe; for(i=0;i0) segport=dispbufi;else flashcount=flashfreq; nstate=1; break; case 1: /offif(-flashcount0) segport=dispbuf10;else flashcount
11、=flashfreq; nstate=0; break; default: nstate=0; else segport=dispbufi;break;case flashminute:if (i=2)|(i=3) switch(nstate) case 0: /onif(-flashcount0) segport=dispbufi;else flashcount=flashfreq; nstate=1; break; case 1: /offif(-flashcount0) segport=dispbuf10;else flashcount=flashfreq; nstate=0; brea
12、k; default: nstate=0; else segport=dispbufi;break;case flashsecond:if (i=4)|(i=5) switch(nstate) case 0: /onif(-flashcount0) segport=dispbufi;else flashcount=flashfreq; nstate=1; break; case 1: /offif(-flashcount0) segport=dispbuf10;else flashcount=flashfreq; nstate=0; break; default: nstate=0; else
13、 segport=dispbufi;break;case flashall:switch(nstate) case 0: /onif(-flashcount0) segport=dispbufi;else flashcount=flashfreq; nstate=1; break; case 1: /offif(-flashcount0) segport=dispbuf10;else flashcount=flashfreq; nstate=0; break; default: nstate=0;break;default: segport=dispbufi;flashcount=flashf
14、req; weiport=weicode; weicode=1; weicode|=1; xdelay(10); /显示指定时钟的时钟下标(编号)/aclock时钟下标void displayclock(unsigned char xclock) dispbuf0=0x39;/c dispbuf1=0x38;/l dispbuf2=0x3f;/o dispbuf3=0x39;/c dispbuf4=0x00;/熄灭 dispbuf5=segcodexclock;/时钟编号 display(flashnone);/用于显示所选时钟闹铃的开关状态/onoff开关状态,可取值为alarmon、ala
15、rmoffvoid displayonoffalarm(unsigned char onoroff) dispbuf0=0x77;/a dispbuf1=0x38;/l dispbuf2=0x77;/a if (onoroff=alarmon) dispbuf3=0x00;/熄灭 dispbuf4=0x5c;/o dispbuf5=0x54;/n else dispbuf3=0x5c;/o dispbuf4=0x71;/f dispbuf5=0x71;/f display(flashnone); /用于显示时钟的时间模式(12小时制或24小时制)/xtimemode时间模式,可取值为timem
16、ode12、timemode24void displaytimemode(unsigned char xtimemode) if (xtimemode=timemode12) dispbuf0=segcode1; /1 dispbuf1=segcode2; /2 else dispbuf0=segcode2; /2 dispbuf1=segcode4; /4 dispbuf2=0x74; /h dispbuf3=0x5c; /o dispbuf4=0x1c; /u dispbuf5=0x70; /r display(flashnone);/键盘函数,返回值为按键的键值/返回值包括key1,ke
17、y2,key3,nokeyunsigned char key(void) static unsigned char xcount=0; if (+xcountalarmopen=alarmoff; pclock-timemode=timemode24; amled=ledoff; pmled=ledoff;void main(void) unsigned char nstate=0,akey,temp=0; init(); while(1) akey=key(); switch(nstate) case 0:/时钟正常运行filldispbuf(clock+whichclock);displa
18、y(flashnone);if(clockwhichclock.alarmflag)/驱动闹钟蜂鸣器 if(+temp=beepfreq) temp=0; beep=1; if(akey!=nokey) clockwhichclock.alarmflag=0;temp=0;beep=beepoff; if (akey=key1) keywaittime=0; nstate=1; break; case 1: /选择时钟keywaitflag=1;/等待按键时间内无按键,自动返回运行状态if (keywaittime=keywaittime) nstate=0; keywaitflag=0; k
19、eywaittime=0;if (akey=key1) keywaittime=0; clockwhichclock.msecond=0; nstate=2; if (akey=key2) keywaittime=0; if(whichclock0) whichclock-;displayclock(whichclock); break; case 2:/选择时间模式(12小时制或24小时制)keywaitflag=1;/等待按键时间内无按键,自动返回运行状态if (keywaittime=keywaittime) nstate=0; keywaitflag=0; keywaittime=0;
20、if (akey=key1) keywaittime=0; adjusttimeflag=1; nstate=3;if (clockwhichclock.timemode=timemode12) displaytimemode(timemode12); if (clockwhichclock.amorpm=pm)pmled=ledon; amled=ledoff; else pmled=ledoff; amled=ledon; if (akey=key2)|(akey=key3) keywaittime=0;clockwhichclock.timemode=timemode24;clockwh
21、ichclock.hour+=12; else displaytimemode(timemode24); amled=ledoff; pmled=ledoff; if (akey=key2)|(akey=key3) clockwhichclock.timemode=timemode12;if (clockwhichclock.hour=12) keywaittime=0; clockwhichclock.hour-=12; clockwhichclock.amorpm=pm; else clockwhichclock.amorpm=am; break; case 3:/调整所选时钟的小时key
22、waitflag=1;/等待按键时间内无按键,自动返回运行状态if (keywaittime=keywaittime) nstate=0; keywaitflag=0; keywaittime=0;if (akey=key1) keywaittime=0; nstate=4; if (akey=key2) keywaittime=0; if (clockwhichclock.timemode=timemode12) if (clockwhichclock.hour12) clockwhichclock.hour+;else if (clockwhichclock.amorpm=pm) cloc
23、kwhichclock.amorpm=am;clockwhichclock.hour=0; else clockwhichclock.amorpm=pm;clockwhichclock.hour=0; else if (clockwhichclock.hour0) clockwhichclock.hour-; filldispbuf(clock+whichclock);display(flashhour); break; case 4:/调整所选时钟的分钟keywaitflag=1;/等待按键时间内无按键,自动返回运行状态if (keywaittime=keywaittime) nstate=
24、0; keywaitflag=0; keywaittime=0;if (akey=key1) keywaittime=0; nstate=5; if (akey=key2) keywaittime=0; if(clockwhichclock.minute0) clockwhichclock.minute-; filldispbuf(clock+whichclock);display(flashminute); break; case 5:/调整所选时钟的秒keywaitflag=1;/等待按键时间内无按键,自动返回运行状态if (keywaittime=keywaittime) nstate=
25、0; keywaitflag=0; keywaittime=0;if (akey=key1) keywaittime=0; adjusttimeflag=0; nstate=6; if (akey=key2) keywaittime=0; if(clockwhichclock.second0) clockwhichclock.second-; filldispbuf(clock+whichclock);display(flashsecond); break; case 6:/开关闹铃功能keywaitflag=1;/等待按键时间内无按键,自动返回运行状态if (keywaittime=keyw
26、aittime) nstate=0; keywaitflag=0; keywaittime=0;if (akey=key1) keywaittime=0; if(clockwhichclock.alarmopen) nstate=7; else nstate=0; if(clockwhichclock.alarmopen) displayonoffalarm(alarmon); if(akey=key2)|(akey=key3) keywaittime=0; clockwhichclock.alarmopen=alarmoff; else displayonoffalarm(alarmoff)
27、; if(akey=key2)|(akey=key3) keywaittime=0; clockwhichclock.alarmopen=alarmon; break; case 7:/调整闹铃小时keywaitflag=1;/等待按键时间内无按键,自动返回运行状态if (keywaittime=keywaittime) nstate=0; keywaitflag=0; keywaittime=0;if (akey=key1) keywaittime=0; nstate=8; if (akey=key2) keywaittime=0; if (clockwhichclock.timemode=
28、timemode12) if (clockwhichclock.alarmhour12) clockwhichclock.alarmhour+;else if (clockwhichclock.alarmamorpm=pm) clockwhichclock.alarmamorpm=am;clockwhichclock.alarmhour=0; else clockwhichclock.alarmamorpm=pm;clockwhichclock.alarmhour=0; else if(clockwhichclock.alarmhour0) clockwhichclock.alarmhour-
29、; fillalarmtodispbuf(clock+whichclock);display(flashminute);break; case 8:/调整闹铃分钟keywaitflag=1;/等待按键时间内无按键,自动返回运行状态if (keywaittime=keywaittime) nstate=0; keywaitflag=0; keywaittime=0;if (akey=key1) keywaittime=0; nstate=0; if (akey=key2) keywaittime=0; if(clockwhichclock.alarmminute0) clockwhichclock.alarmminute-; fillalarmtodispbuf(clock+whichclock);display(flashsecond); break; default: nstate=0; /t0定时器10ms中断服务函数void t0int(void) interr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【正版授权】 ISO 20679:2025 EN Ships and marine technology - Marine environment protection - Testing of ship biofouling in-water cleaning systems
- 我的家乡叙事课程设计
- 弦乐小夜曲课程设计
- 中西医执业医师模拟试卷16
- 矿井灌浆设计课程设计
- 站姿坐姿课程设计
- 花艺烘焙课程设计
- 药品验收入门课程设计
- 互联网行业安全管理实践
- 领导班子与教学院校协调计划
- 职业生涯规划班会课教案设计
- 微观经济学(对外经济贸易大学)智慧树知到期末考试答案2024年
- (正式版)HGT 6277-2024 甲醇制烯烃(MTO)级甲醇
- 注射用更昔洛韦的临床疗效研究
- 2023年1月广东省自考00634广告策划试题及答案含解析
- 2024年青海西部机场集团青海机场有限公司招聘笔试参考题库含答案解析
- 中国绿色建筑现状与未来展望
- 河南省洛阳市2023-2024学年高二上学期期末考试英语试题(解析版)
- 超声检查医疗纠纷的防范培训课件
- 采购管理的流程与原则
- 2022-2023学年山东省东营市东营区七年级(上)期末历史试卷(五四学制)(附答案详解)
评论
0/150
提交评论