51单片机c语言电子钟(已加入调时、闹铃、整点报时功能1)万年历2

更新时间:2024-05-15 03:58:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

51单片机c语言电子钟(已加入调时、闹铃、整点报时功能1)万年历1 ·一个固定数组 ·时钟,秒表,日历,闹钟 */

#include #include #define uint unsigned int #define uchar unsigned char sbit k1=P1^0;//功能键进1 sbit k2=P1^1;//功能键退1 sbit k3=P1^2;//调整加1 sbit k4=P1^3;//调整减1 sbit k5=P1^4;//确定 sbit k6=P1^5;//显示秒表

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; }

本文来源:https://www.bwwdw.com/article/ee07.html

Top