51单片机c语言电子钟(已加入调时、闹铃、整点报时功能1)万年历2
更新时间:2024-05-15 03:58:01 阅读量: 综合文库 文档下载
51单片机c语言电子钟(已加入调时、闹铃、整点报时功能1)万年历1 ·一个固定数组 ·时钟,秒表,日历,闹钟 */
#include
sbit k7=P1^6;//秒表开启,暂停 sbit k8=P1^7;//未定义 sbit fmq=P3^1;//蜂鸣器
uchar s,s1,flag;//秒,日,切换标志
uchar haomiao,miao1,shi1,fen1,haomiao1,miaobiao,shaomiao;//…… uchar ri=1,yue=1;//日期相关 uchar nzshi,nzfen;//闹钟相关 uint nian=2013; //日期相关 uchar miao,shi,fen;//时间相关
uchar code table10[]={0xc0,0xf9,0xa4,
0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xc8,0x8e,0xff,0xa1};//数字0~9 uchar ks[8]={2,3,10,4,0,0,1,14};//多用数组,初始显示 uchar kg=99;//闹钟开关,默认为关 uchar m[8]={0,0,10,0,0,10,0,0};//秒表 uchar shu,shu1,zt;//秒表相关
/*==============================秒表子函数======*/ int mbiao(void)//从1毫秒到59分59秒99毫秒 { haomiao1++;//每1毫秒加1 if(haomiao1==100) //1秒 { miao1++; //秒+1 haomiao1=0;//计时清零 } if(miao1==60) //一分钟到 { fen1++; //分+1 miao1=0;//秒数清零 } if(fen1==60)//到一小时
- n F
{ fen1=0;//分钟清零 } m[0]=haomiao1; m[1]=haomiao1/10; m[3]=miao1; m[4]=miao1/10;//秒数计算存入数组w m[6]=fen1; m[7]=fen1/10;//分钟计算存入数组w return 0; }
/*===========================时钟数值计算函数===*/ int ssj(void) { if(shu<4)//当调整标志小于4时,计算时间以显示 { ks[6]=shi; ks[7]=shi/10;//小时计算存入数组w ks[3]=fen; ks[4]=fen/10;//分钟计算存入数组w ks[0]=miao; ks[1]=miao/10;//秒数计算存入数组w ks[2]=ks[5]=10; } return 0; }
/*==============================时间计算========*/ int jisuan(void) { haomiao++; //时钟毫秒 shaomiao++;//闪烁时间 s=0; if(haomiao==100) { miao++; flag++;//切换标志+1 ssj(); haomiao=0;//计时清零 shaomiao=0; } if(miao==60) //一分钟到 { fen++; miao=0;//秒数清零 ssj();
flag=0; } if(fen==60)//到一小时 { shi++; fen=0;//分钟清零 ssj(); } if(shi==24)//到了一天 { s1++;//日期加1标志 shi=0;//小时清零 ssj(); } if((miaobiao>0)&&zt==1)//启动秒表 mbiao(); if(miaobiao==3)//秒表置0 { miaobiao=1; haomiao1=255;miao1=fen1=0; mbiao(); } return 0; }
/*==============================显示函数========*/ int xianshi(uchar w[8]) { unsigned int i,j,aa; aa=0xfe;//位选初值1111 1110 for(i=0;i<8;i++)//依次将数组w中八个数取出,并显示 { P2=aa;//位选 j=w[i]; //取出要显示的数码 P0=table10[j];//取出段选编码 aa=_crol_(aa,1);//位选信号循环右移? delay(1);//显示延时 P0=0xff; //消影 } return 0; }
/*==============================日历子函数======*/ int jisuan1(void) { if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)//一三五七八十腊31天永不变
{ if(s1==1)//时钟计满一天 { s1=0;//重新计时 ri++; //日期+1 if(ri==32)//31天到,日期置1,月份加1 { ri=1; yue++; } } if(s1==2) { s1=0; if(ri>1) ri--; else ri=31; } }
if(yue==4||yue==6||yue==9||yue==11)//4,6,9,11月固定30天 { if(s1==1) //时钟到一天 { s1=0; ri++; if(ri==31) //30天到,日期置1,月份加1 { ri=1; yue++; } } if(s1==2) { s1=0; if(ri>1) ri--; else ri=30; } if(ri>30) ri=30; }
if(yue==2)//二月两种情况 { if (nian@0==0||(nian%4==0&&nian0!=0))//闰年2月有29天
{ if(s1==1) { s1=0; ri++; if(ri==30)//29天到,日期置1,月份加1 { ri=1; yue++; } } if(s1==2) { s1=0; if(ri>1) ri--; else ri=29; } if(ri>29) ri=29; }
else //平年2月28天 { if(s1==1) { s1=0; ri++; if(ri>=29)//28天到,日期置1,月份加1 { ri=1; yue++; } } if(s1==2) { s1=0; if(ri>1) ri--; else ri=28; } if(ri>28) ri=28; } }
if(yue==13)//年末了,月份置1,年份加1 { nian++; yue=1; } if(yue==0) { yue=12; // nian--; } ks[0]=ri; ks[1]=ri/10; //计算日期,存入数组n ks[2]=yue; ks[3]=yue/10;//月份,存入数组n ks[4]=nian; ks[5]=nian0/10; ks[6]=nian00/100; ks[7]=nian/1000; //年份,存入数组n return 0; }
/*=============================定时器中断函数===*/ void T0_timer () interrupt 1 {
TH0=(65535-9960)/256; TL0=(65535-9962)%6;//重装初值 s++; if(s==1) { jisuan();//调用时间计算 //l1=~l1;//精度调试 } if(s1==1) {jisuan1();} //调用日期计算 }
/*===============================键扫函数=======*/ int keyscan(void) { if(k1==0&&shu1==0)//功能选择:1次秒数,2次分数,3次时数,4次日数,5次月份,6次年份,7次闹钟时,8次闹钟分,9次开关闹钟,10次清零 { delay(10); //去抖动延时 if(k1==0) {
ssj(); //时间缓存 TR0=1; //开定时器 shu++; //调整项目 if(shu==10){ shu=0;jisuan();ssj();}//等于10退出 while(!k1); //等待按键释放 } } if(k2==0&&shu1==0)//功能选择:1次秒数,2次分数,3次时数,4次日数,5次月份,6次年份,7次闹钟时,8次闹钟分,9次开关闹钟,10次清零 { delay(10); if(k2==0) { while(!k2); ssj(); TR0=1; shu--;//项目-1 if(shu==255){ shu=9;jisuan();ssj();} //小于0,跳转至项目9 } } if(k3==0&&shu>0)//数字加1 { delay(10); if(k3==0) { if(shu==1) miao++; if(shu==2) fen++; if(shu==3) shi++;//时间调整 if(shu==4) s1=1; //日期调整 if(shu==5) yue++;//月份+1 if(shu==6) nian++;//年份 if(shu==7) nzfen++; if(shu==8) nzshi++;//闹钟时间 if(shu==9) kg=87; //闹钟开 if(nian>2090) nian=1930;//日历范围限定 jisuan(); shaomiao=0; //闪烁计时 while(!k3) xianshi(ks);//显示数据,等待按键释放 } } if(k4==0&&shu>0)//数字减1 {
delay(10); if(k4==0) { if(shu==1) miao--; if(shu==2) fen--; if(shu==3) shi--; if(shu==4) s1=2; if(shu==5) yue--; if(shu==6) nian--; if(shu==7) nzfen--; if(shu==8) nzshi--; if(shu==9) kg=99; if(miao==255) miao=59; if(fen==255) fen=59; if(shi==255) shi=23; if(nian<1930) nian=2090; ssj(); shaomiao=0; while(!k4) xianshi(ks); } }
if(k5==0)//确定 { delay(10); if(k5==0) { ssj(); TR0=1;//定时器0,工作方式1 shu=0; //退出调整状态 shu1=0; //退出秒表显示 miaobiao=1;//避免背景秒表被清零 //jisuan(); while(!k5) xianshi(ks); } }
if(k6==0)//秒表 { delay(10); if(k6==0) { miaobiao++;//按下秒表监控 shu1=1; //显示为秒表状态
//zt=0; //秒表待命 if(miaobiao>3) //监控大于3置1 {miaobiao=1;zt=0;}//暂停,清零 while(!k6) xianshi(m); } } if(k7==0&&shu1==1)//秒表状态时为启动秒表功能 { delay(10); if(k7==0) { zt++; //启动 if(zt==2) //暂停 { zt=0; } while(!k7) xianshi(m); } } return 0; }
/*===============================闹钟铃函数=====*/ int bell(void) {
if(haomiao<=10) fmq=0; if(haomiao>10&&haomiao<=20) fmq=1; if(haomiao>20&&haomiao<=30) fmq=0; if(haomiao>30&&haomiao<=40) fmq=1; if(haomiao>40&&haomiao<=50) fmq=0; if(haomiao>50&&haomiao<=60) fmq=1; if(haomiao>60&&haomiao<=70) fmq=0; if(haomiao>70&&haomiao<=99) fmq=1; //1秒四响 return 0;
}
/*================================闹钟存储======*/ int jisuan2(void) { if(nzfen==60) nzfen=0 ; if(nzfen==255) nzfen=59; if(nzshi==24) nzshi=0 ; if(nzshi==255) nzshi=23; ks[0]=nzfen; ks[1]=nzfen/10; ks[3]=nzshi; ks[4]=nzshi/10; ks[5]=kg+3; ks[6]=kg/10+3; ks[2]=10; ks[7]=0; return 0; }
/*==============================调整明暗显示====*/ int shanshuo(void)
{ uchar a=13; //13表示table10[13],0xff if(shu==1) //秒数 { if(shaomiao>60) //暗40毫秒 {ks[0]=ks[1]=a;} else //明60毫秒 ssj(); } if(shu==2)//分钟 { if(shaomiao>60) {ks[3]=ks[4]=a;} else ssj(); } if(shu==3) //小时 { if(shaomiao>60) {ks[6]=ks[7]=a;}
else ssj(); }
if(shu==4)//日数 { if(shaomiao>60) {ks[0]=ks[1]=a;} else jisuan1(); }
if(shu==5) //月份 { if(shaomiao>60) {ks[2]=ks[3]=a;} else jisuan1(); }
if(shu==6)//年份 { if(shaomiao>60) {ks[4]=ks[5]=ks[6]=ks[7]=a;} else jisuan1(); }
if(shu==7) //闹钟分钟 { jisuan2(); if(shaomiao>60) {ks[0]=ks[1]=a;} else jisuan2(); }
if(shu==8)//闹钟小时 { if(shaomiao>60) {ks[3]=ks[4]=a;} else jisuan2(); }
if(shu==9)//闹钟开关 { if(shaomiao>60) {ks[5]=ks[6]=ks[7]=a;} else
{ks[7]=0;jisuan2();} } return 0; }
/*==================================主函数======*/ int main(void) { EA=1; TMOD=0X01; TH0=(65535-9960)/256; TL0=(65535-9962)%6; ET0=1; //初始化定时器0 while(1)//大循环 { if(shu1==0) //开始状态显示 1004--32 xianshi(ks); if(shu!=0&&P1==0xff)//闪烁显示前提 shanshuo(); if(P1!=0xff)//扫描前提 {keyscan();} if(shu1==1)//秒表显示 {xianshi(m);} if(shu==0)//正常显示 { if(flag>27&&flag<30) //显示日期3秒 jisuan1(); //else //xianshi(ks); } if(nzfen==fen&&nzshi==shi&&kg==87)//闹钟 bell(); else fmq=1; if((fen==29&&miao==59)||(fen==59&&miao==59))//半点长鸣 fmq=0; } return 0; }
正在阅读:
51单片机c语言电子钟(已加入调时、闹铃、整点报时功能1)万年历205-15
终于造句02-10
七年级英语上册 Unit 1综合测试卷 人教新目标版04-17
渐渐造句02-09
关于服装品质管理06-21
如饥似渴造句02-09
河南省财政厅关于调整行政事业单位职工和离退休人员逝世后丧葬费标准的通知09-14
密码学课程设计报告05-05
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 闹铃
- 电子钟
- 整点
- 报时
- 单片机
- 万年历
- 语言
- 加入
- 功能
- 2017-2022年中国食品工业米市场运营态势研究报告(目录)
- 雨季施工方案
- 2017广告专业大学生实习报告范文
- 2018高考病句专题练习一
- 台湾纺织创新转型的启示
- 中城建1号信托贷款集合资金信托计划尽调报告 - 图文
- 深入认识翡翠
- 分析化学(第六版)课后参考答案-1
- 《我爱我‘家’——走进新校园》主题综合实践活动第一课时教学设
- 聚合物流变学复习题参考答案2
- 乳酸菌的分离筛选
- 黄坚鱼市场现状调研及发展前景分析报告(目录)
- 2016.6《英语(二)》作业题(一)
- 普外科常见疾病中医护理常规
- 保安部工作手册
- 当前工商机关党风廉政建设存在问题及对策思考(调研报告)1
- 人教版小学语文二年级下册期末试题
- 第四章呼吸系统疾病病人的护理
- 川菜的做法课件资料 - 图文
- 某高速公路监理投标书,投标文件技术部分