多功能数字钟程序.docx
《多功能数字钟程序.docx》由会员分享,可在线阅读,更多相关《多功能数字钟程序.docx(16页珍藏版)》请在冰豆网上搜索。
多功能数字钟程序
多功能数字钟程序
功能:
1、可显示日期、星期、时、分、秒,进入不同的模式显示不同项目;
2、可调整时间,被选中的项目闪烁;
3、内含两个闹钟,可分别设置开与关,可修改闹钟时间;
4、半点、整点提示,闹钟到了响铃声;
硬件:
1、三个按键,本程序用的是矩阵键盘的其中三个,若每个按键单独接至I/O口,则程序自己改;
2、四个共阴七段数码管,接法可通过分析程序得出,也可根据自己的硬件修改程序;
3、两个led,接法也需自己分析程序得出,也可根据自己的硬件修改程序;
4、蜂鸣器或喇叭一个;
5、9013晶体管5个,作开关用;
6、电阻就不用说啦;
7、还要一款单片机;
操作说明;
假设三个键,分别命名为1、2、3。
一般状态下,显示时、分,此时摁下1键,进入调整时间状态,2、3键对选中的项目进行加、减,1键移动修改的项目,所有项目移动完,再按下1键就是确认;
一般状态下,显示时、分,此时摁下2键,进入闹钟设置状态,2、3键对选中的项目进行加、减,1键移动修改的项目,所有项目移动完,再按下1键就是确认;
一般状态下,显示时、分,此时摁下3键,修改要显示的项目;
闹钟响后,按下2键可关掉闹钟,若不管,则过两分钟后自动关掉。
#include
#include
#include
//************************************************************
#defineucharunsignedchar
#defineuintunsignedint
//*********************************************************************************
ucharcodedisp[]={0xee,0x48,0xad,0xcd,0x4b,0xc7,0xe7,0x4c,0xef,0xcf};//数码管显示0~9
ucharmonth=8,date=8,week=1,hour=8,min=8,second;//定义月、日、星期、小时、分钟、秒
ucharc1_h=12,c1_m,c2_h=6,c2_m=30;//定义闹钟1、闹钟2的时、分
ucharmode;//一般状态下数码管时间显示模式
ucharshow;//数码管时间显示模式
uintk;
bitbeep1,beep2,sound,v;//喇叭
bitc1_on,c2_on,set_time,set_clock;//闹钟开关标志、进入设置状态标志
bitl=0,r=0,s1=1,s2=1;//数码管闪烁标志
sbitP2_2=P2^2;//数码管之间的led
sbitP2_3=P2^3;//数码管之间的led
sbitP2_7=P2^7;//数码管片选端口
sbitP2_6=P2^6;//数码管片选端口
sbitP2_5=P2^5;//数码管片选端口
sbitP2_4=P2^4;//数码管片选端口
sbitP2_1=P2^1;//喇叭端口
//*******************************************************************************************
voidDelay(void)//数码管显示延时
{
uinti;
for(i=0;i<800;i++);
}
voidDelay025ms(void)
{
uchari,j,k;
for(i=1;i>0;i--)
for(j=1;j>0;j--)
for(k=16;k>0;k--);
}//延时程序
voidDelay5ms(void)
{
uchari,j,k;
for(i=5;i>0;i--)
for(j=4;j>0;j--)
for(k=124;k>0;k--);
}
//*************************************//确定按键*****************************************
voidset_table()
{ucharkey;//按键key
ucharselect;//要修改的变量
bitloose;
P1=0x0f;
switch(P1)//确定列按键
{
case0x0e:
{Delay5ms();//跳过抖动区
P1=0xf0;
switch(P1)//确定行按键
{
case0xe0:
{key=41;}break;
case0xd0:
{key=42;}break;
case0xb0:
{key=43;}break;
default:
break;
}
}break;
default:
{key=44;loose=0;}//loose==0表示之前按键松开,避免长按键重复操作
}
//************************************************//各按键对应功能**********************************
switch(key)
{case41:
{//第一个键对应功能
if(loose==0)
{
loose=1;//保证按下一次只执行一次操作
if(set_clock==1||set_time==1)//进入设置状态
{
if(set_time==1)
{
if(select>=5)//确认设置结束
{
r=0;
set_time=0;
show=0;
}
else{select++;
switch(select)
{
case2:
{l=0;r=1;}break;
case3:
{show=2;}break;
case4:
{show=3;l=1;r=0;}break;
case5:
{l=0;r=1;}break;
default:
break;
}
}
}
elseif(select==6){r=0;set_clock=0;show=0;l=0;}
else
{select++;
switch(select)
{
case2:
{l=0;r=1;}break;
case3:
{show=5;}break;
case4:
{show=6;l=1;r=0;}break;
case5:
{l=0;r=1;}break;
case6:
{show=7;}break;
default:
break;
}
}
}
else{set_time=1;select=1;show=1;l=1;r=0;}//进入时间设置
}
}break;
//*******************************************//第二个键对应功能*******************
case42:
{
if(loose==0)
{
loose=1;
if(set_clock==1||set_time==1)//表示已经进入设置状态
{
if(set_time==1)
{
switch(select)
{
case1:
{if(month==12)month=1;elsemonth++;}break;//月份设置
case2:
{
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)//日期设置
{
if(date==31)date=1;
elsedate++;
}
elseif(date==30)date=1;
elsedate++;
}break;
case3:
{if(week==7)week=1;elseweek++;}//星期设置
case4:
{if(hour==23)hour=0;elsehour++;}break;//小时设置
case5:
{if(min==59)min=0;elsemin++;}break;//分钟设置
default:
break;
}
}
else
{
switch(select)
{
case1:
{if(c1_h==23)c1_h=0;elsec1_h++;}break;//闹钟1设置
case2:
{if(c1_m==59)c1_m=0;elsec1_m++;}break;
case3:
{c1_on=~c1_on;}break;//闹钟1开关设置
case4:
{if(c2_h==23)c2_h=0;elsec2_h++;}break;//闹钟2设置
case5:
{if(c2_m==23)c2_m=0;elsec2_m++;}break;
case6:
{c2_on=~c2_on;}break;//闹钟2开关设置
default:
break;
}
}
}
elseif(beep1==1||beep2==1)beep1=beep2=0;//关掉正在响的闹钟
else{set_clock=1;select=1;show=4;l=1;}//进入闹钟设置
}
}break;
//***************************************//第三个键对应功能******************************
case43:
{
if(loose==0)
{
loose=1;
if(set_clock==1||set_time==1)//进入设置状态
{
if(set_time==1)
{
switch(select)
{
case1:
{if(month==1)month=12;elsemonth--;}break;//月份设置
case2:
{
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)//日期设置
{
if(date==1)date=31;elsedate--;
}
elseif(date==1)date=30;elsedate--;
}break;
case3:
{if(week==1)week=7;elseweek--;}break;//星期设置
case4:
{if(hour==0)hour=23;elsehour--;}break;//小时设置
case5:
{if(min==0)min=59;elsemin--;}break;//分钟设置
default:
break;
}
}
else
{
switch(select)
{
case1:
{if(c1_h==0)c1_h=23;elsec1_h--;}break;//闹钟1设置
case2:
{if(c1_m==0)c1_m=59;elsec1_m--;}break;
case3:
{c1_on=~c1_on;}break;//闹钟1开关设置
case4:
{if(c2_h==0)c2_h=23;elsec2_h--;}break;//闹钟2设置
case5:
{if(c2_m==0)c2_m=59;elsec2_m--;}break;
case6:
{c2_on=~c2_on;}break;//闹钟2开关设置
default:
break;
}
}
}
else
{
if(mode==3)mode=0;elsemode++;//模式选择
}
}
}break;
default:
break;
}
}
//*****************************************//定时0中断****************************
voidincsec()interrupt1
{uintj,i,x;
j++;
i++;
x++;
if(x==1226)//使被修改的项目闪烁
{x=0;
if(r==1){s2=~s2;}
else{s2=1;}
if(l==1){s1=~s1;}
else{s1=1;}
}
if(i==1843){P2_2=~P2_2;P2_3=~P2_3;}//使led闪烁
if(j==3687)
{
second++;//加1秒
P2_2=~P2_2;P2_3=~P2_3;//使led闪烁
j=0;i=0;
}
}
voidbeep()interrupt3
{
ucharmi,rui,duo;
k++;
if(k<2000)//mi响约46ms,四分之一拍
{
mi++;
if(mi==2){mi=0;P2_1=~P2_1;}
}
if(k>3000&&k<5000)
{
mi++;
if(mi==2){mi=0;P2_1=~P2_1;}
}
if(k>6000&&k<10000)
{
rui++;
if(rui==3){rui=0;P2_1=~P2_1;}
}
if(k==22000){rui=0;}
if(k>11000&&k<15000)
{
duo++;
if(duo==4){duo=0;P2_1=~P2_1;}
}
if(k==15000){k=0;duo=0;}
}
//***********************************主函数main************************************
voidmain()
{
uchara,b,c,d;
uchare,f,g,h;
ucharsec1,sec2;
ucharc1_a,c1_b,c1_c,c1_d;
ucharc2_a,c2_b,c2_c,c2_d;
ucharxx,l;
//*************************************特殊功能寄存器设置********************************************
TMOD=0x22;//定时0端口功能为定时,在工作方式二
TR0=1;TR1=0;//启动定时0,关断定时1
EA=1;ET0=1;ET1=1;//开总中断及T0中断
ES=0;EX1=0;EX0=0;//关中断
TH0=0x06;TL0=0x06;//计数器T0初始值00000110
TH1=0x88;TL1=0x88;//计数器T1初始值11101010
P2_2=0;P2_3=1;//小时与分钟之间的led
//***************************************************************************************************
while
(1)
{
set_table();//扫描按键有无按下
a=hour/10;b=hour%10;c=min/10;d=min%10;//要显示的时、分
e=month/10;f=month%10;g=date/10;h=date%10;//要显示的月、日
sec1=second/10;sec2=second%10;//要显示的秒
c1_a=c1_h/10;c1_b=c1_h%10;c1_c=c1_m/10;c1_d=c1_m%10;//要显示的闹钟1
c2_a=c2_h/10;c2_b=c2_h%10;c2_c=c2_m/10;c2_d=c2_m%10;//要显示的闹钟2
//*************数码管扫描显示*************//选择第一个数码管,高电平有效
if(s1)
{
P0=0x00;//关断段信号
P2_7=1;P2_6=0;P2_5=0;P2_4=0;
switch(show)
{
case0:
{switch(mode)//正常显示
{
case0:
P0=disp[a];break;//模式0显示时、分
case1:
P0=disp[e];break;//模式1显示月、日
case2:
P0=0x01;break;//模式2显示星期
case3:
P0=0x01;break;//模式3显示秒
default:
break;
}
}break;
case1:
P0=disp[e];break;//显示月、日
case2:
P0=0x01;break;//显示星期
case3:
P0=disp[a];break;//显示时、分
case4:
P0=disp[c1_a];break;//显示闹钟1
case5:
P0=0x01;break;//显示闹钟1的开关状态
case6:
P0=disp[c2_a];break;//显示闹钟2
case7:
P0=0x01;break;//显示闹钟2的开关状态
default:
break;
}
Delay();
//********************************//选择第二个数码管********************************************************
P0=0x00;
P2_7=0;P2_6=1;P2_5=0;P2_4=0;
switch(show)
{
case0:
{switch(mode)
{
case0:
P0=disp[b];break;
case1:
P0=disp[f];break;
case2:
P0=0x01;break;
case3:
P0=0x01;break;
default:
break;
}
}break;
case1:
P0=disp[f];break;
case2:
P0=0x01;break;
case3:
P0=disp[b];break;
case4:
P0=disp[c1_b];break;
case5:
P0=0x01;break;
case6:
P0=disp[c2_b];break;
case7:
P0=0x01;break;
default:
break;
}
Delay();
}
//*************************//选择第三个数码管*****************************************