#include <REGX52.H>
#include "Delay.h"
#include "Buzzer.h"
unsigned int hour=12,min=1,sec=0,day=27,month=2,year=2022,year_1=20,year_2=22; //对时分秒日月年进行定义和赋值
unsigned int week=1,b=30,i=1,c=0,d=0,e=0,f,g,h=0,k=0,l=0,p,q,z=13; //星期,b为二月计数,其他均为用来计数,
unsigned int N1hour=12,N1min=1,N1miao=0,N2hour=0,N2min=0,N2miao=0;//闹钟的时分秒
unsigned int Timer0Count=0; //定时器设定为没10毫秒打断一次,当目的是每1秒钟让秒数加一,就让定时器打断100次,总时长为1秒,
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x01,0x08,0x09,0x00};//最后一个显示空后三个为定时器标志
void shijian()//防止调时溢出
{
if(hour==25)
hour=1;
if(hour==0)
hour==24;
if(min==61)
min=1;
if(min==0)
min=60;
if(week==8)
week=1;
if(week==0)
week=7;
if(month==13)
month=1;
if(month==0)
month=12;
if((year%4==0)&&(year%100!=0)||(year%400==0))
{
if(day==30)
day=1;
if(day==0)
day=29;
}
else
{
if(day==29)
day=1;
if(day==0)
day=28;
}
}
void runnian(void)//判断闰年及二月变化
{
if((year%4==0)&&(year%100!=0)||(year%400==0))
{
if((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)||(month==12))
b=31;
if((month==4)||(month==6)||(month==9)||(month==11))
b=30;
if(month==2)
b=29;
}
else
{
if((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)||(month==12))
b=31;
if((month==4)||(month==6)||(month==9)||(month==11))
b=30;
if(month==2)
b=28;
}
}
void NixieTube(unsigned char Location,Number)//数码管位选段选
{
switch(Location)
{
case 1:P2_4=1;P2_3=1;P2_2=1;break;
case 2:P2_4=1;P2_3=1;P2_2=0;break;
case 3:P2_4=1;P2_3=0;P2_2=1;break;
case 4:P2_4=1;P2_3=0;P2_2=0;break;
case 5:P2_4=0;P2_3=1;P2_2=1;break;
case 6:P2_4=0;P2_3=1;P2_2=0;break;
case 7:P2_4=0;P2_3=0;P2_2=1;break;
case 8:P2_4=0;P2_3=0;P2_2=0;break;
}
P0=NixieTable[Number];
Delay(1);
P0=0x00;
}
void Timer0_Init(void) //10毫秒@11.0592MHz
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x00; //设置定时初值
TH0 = 0xDC; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0=1; //中断初始化
EA=1; //中断初始化
PT0=0; //中断初始化
}
void main()
{
Timer0_Init(); //定时器初始化
runnian();
while(1)
{
if(P3_3==0)//界面切换判断
{
Delay(20);
while(P3_3==0);
Delay(20);
i++;
if(i>=4)
i=1;
}
if(N1hour==hour&&N1min==min&&z==10||z==12)//闹钟1到时响
{
Buzzer(10);
if(P3_0==0||P3_1==0||P3_2==0||P3_3==0) N1min=0;//任意按键按下闹钟关闭
}
if(N2hour==hour&&N2min==min&&z==11||z==12)//闹钟2到时响
{
Buzzer(10);
if(P3_0==0||P3_1==0||P3_2==0||P3_3==0) N2min=0;//任意按键按下闹钟关闭
}
if(i==1)//时分秒<主界面>
{
NixieTube(1,hour/10);
NixieTube(2,hour%10);
NixieTube(3,min/10);
NixieTube(4,min%10);
NixieTube(5,sec/10);
NixieTube(6,sec%10);
NixieTube(7,z);
NixieTube(8,week);
if(P3_1==0)
{
Delay(20);while(P3_1==0);Delay(20);c=c+1;h=h+1;//按键1按下进入调时 c为调时位置 h为调时位置转换
while(1)
{
if(P3_1==0) {Delay(20);while(P3_1==0);Delay(20);c=c+1;h=h+1;}//按键1按下计数调时
switch(c)
{
case 1://秒调时
if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);sec=0;}
for(f=0;f<=50;f++)
{ NixieTube(1,hour/10);
NixieTube(2,hour%10);
NixieTube(3,min/10);
NixieTube(4,min%10);
NixieTube(5,sec/10);
NixieTube(6,sec%10);
NixieTube(7,z);
NixieTube(8,week);}
for(g=0;g<=50;g++)
{ NixieTube(1,hour/10);
NixieTube(2,hour%10);
NixieTube(3,min/10);
NixieTube(4,min%10);
NixieTube(5,13);
NixieTube(6,13);
NixieTube(7,z);
NixieTube(8,week);}f=0;g=0;if(h==2) {h=0;}break;
case 2://分调时
if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);min=min+1;}shijian();
if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);min=min-1;}shijian();
for(f=0;f<=50;f++)
{ NixieTube(1,hour/10);
NixieTube(2,hour%10);
NixieTube(3,min/10);
NixieTube(4,min%10);
NixieTube(5,sec/10);
NixieTube(6,sec%10);
NixieTube(7,z);
NixieTube(8,week);}
for(g=0;g<=50;g++)
{ NixieTube(1,hour/10);
NixieTube(2,hour%10);
NixieTube(3,13);
NixieTube(4,13);
NixieTube(5,sec/10);
NixieTube(6,sec%10);
NixieTube(7,z);
NixieTube(8,week);}f=0;g=0;if(h==1){ h=0;}break;
case 3://时调时
if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);hour=hour+1;}shijian();
if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);hour=hour-1;}shijian();
for(f=0;f<=50;f++)
{ NixieTube(1,hour/10);
NixieTube(2,hour%10);
NixieTube(3,min/10);
NixieTube(4,min%10);
NixieTube(5,sec/10);
NixieTube(6,sec%10);
NixieTube(7,z);
NixieTube(8,week);}
for(g=0;g<=50;g++)
{ NixieTube(1,13);
NixieTube(2,13);
NixieTube(3,min/10);
NixieTube(4,min%10);
NixieTube(5,sec/10);
NixieTube(6,sec%10);
NixieTube(7,z);
NixieTube(8,week);}f=0;g=0;if(h==1){ h=0;}break;
case 4://星期调时
if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);week=week+1;}shijian();
if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);week=week-1;}shijian();
for(f=0;f<=50;f++)
{ NixieTube(1,hour/10);
NixieTube(2,hour%10);
NixieTube(3,min/10);
NixieTube(4,min%10);
NixieTube(5,sec/10);
NixieTube(6,sec%10);
NixieTube(7,z);
NixieTube(8,week);}
for(g=0;g<=50;g++)
{ NixieTube(1,hour/10);
NixieTube(2,hour%10);
NixieTube(3,min/10);
NixieTube(4,min%10);
NixieTube(5,sec/10);
NixieTube(6,sec%10);
NixieTube(7,z);
NixieTube(8,13);}f=0;g=0;if(h==1){ h=0;}break;
case 5://闹钟开关
if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);p++;}
if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);q++;}
if(p==1) z=10;//闹钟一标志位
if(p==2) z=13;
if(q==1) z=11;//闹钟二标志位
if(q==2) z=13;
//if(p==1&&q==1) z=12;
if(p>=3) p=1;
if(q>=3) q=1;
for(f=0;f<=50;f++)
{ NixieTube(1,hour/10);
NixieTube(2,hour%10);
NixieTube(3,min/10);
NixieTube(4,min%10);
NixieTube(5,sec/10);
NixieTube(6,sec%10);
NixieTube(7,z);
NixieTube(8,week);}
for(g=0;g<=50;g++)
{ NixieTube(1,hour/10);
NixieTube(2,hour%10);
NixieTube(3,min/10);
NixieTube(4,min%10);
NixieTube(5,sec/10);
NixieTube(6,sec%10);
NixieTube(7,13);
NixieTube(8,week);}f=0;g=0;if(h==1){ h=0;}break;
}
if(c>=6) c=1;//防溢出
if(P3_3==0) break;//退出死循环
}
}
}
if(i==2)//年月日显示
{
NixieTube(1,year_1/10);
NixieTube(2,year_1%10);
NixieTube(3,year_2/10);
NixieTube(4,year_2%10);
NixieTube(5,month/10);
NixieTube(6,month%10);
NixieTube(7,day/10);
NixieTube(8,day%10);
if(P3_1==0)
{
Delay(20);while(P3_1==0);Delay(20);d=d+1;e=e+1;//年月日调节 d,e与c,h作用相同
while(1)
{
if(P3_1==0) {Delay(20);while(P3_1==0);Delay(20);d=d+1;e=e+1;}
switch(d)
{
case 1://年调时
if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);year_2=year_2+1;}
if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);year_2=year_2-1;}
for(f=0;f<=50;f++)
{ NixieTube(1,year_1/10);
NixieTube(2,year_1%10);
NixieTube(3,year_2/10);
NixieTube(4,year_2%10);
NixieTube(5,month/10);
NixieTube(6,month%10);
NixieTube(7,day/10);
NixieTube(8,day%10);}
for(g=0;g<=50;g++)
{ NixieTube(1,13);
NixieTube(2,13);
NixieTube(3,13);
NixieTube(4,13);
NixieTube(5,month/10);
NixieTube(6,month%10);
NixieTube(7,day/10);
NixieTube(8,day%10);}f=0;g=0;if(e==2) h=0;break;
case 2://月调时
if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);month=month+1;}shijian();
if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);month=month-1;}shijian();
for(f=0;f<=50;f++)
{ NixieTube(1,year_1/10);
NixieTube(2,year_1%10);
NixieTube(3,year_2/10);
NixieTube(4,year_2%10);
NixieTube(5,month/10);
NixieTube(6,month%10);
NixieTube(7,day/10);
NixieTube(8,day%10);}
for(g=0;g<=50;g++)
{ NixieTube(1,year_1/10);
NixieTube(2,year_1%10);
NixieTube(3,year_2/10);
NixieTube(4,year_2%10);
NixieTube(5,13);
NixieTube(6,13);
NixieTube(7,day/10);
NixieTube(8,day%10);}f=0;g=0;if(e==1) h=0;break;
case 3://日调时
if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);day=day+1;}shijian();
if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);day=day-1;}shijian();
for(f=0;f<=50;f++)
{ NixieTube(1,year_1/10);
NixieTube(2,year_1%10);
NixieTube(3,year_2/10);
NixieTube(4,year_2%10);
NixieTube(5,month/10);
NixieTube(6,month%10);
NixieTube(7,day/10);
NixieTube(8,day%10);}
for(g=0;g<=50;g++)
{ NixieTube(1,year_1/10);
NixieTube(2,year_1%10);
NixieTube(3,year_2/10);
NixieTube(4,year_2%10);
NixieTube(5,month/10);
NixieTube(6,month%10);
NixieTube(7,13);
NixieTube(8,13);}f=0;g=0;if(e==1) h=0;break;
}
if(d>=4) d=1;if(P3_3==0) break;
}
}
}
if(i==3)//闹钟显示模块
{
NixieTube(1,N1hour/10);
NixieTube(2,N1hour%10);
NixieTube(3,N1min/10);
NixieTube(4,N1min%10);
NixieTube(5,N2hour/10);
NixieTube(6,N2hour%10);
NixieTube(7,N2min/10);
NixieTube(8,N2min%10);
if(P3_1==0)
{
Delay(20);while(P3_1==0);Delay(20);k=k+1;l=l+1;
while(1)
{
if(P3_1==0) {Delay(20);while(P3_1==0);Delay(20);k=k+1;l=l+1;}//k,l与c,h作用相同
switch(k)
{
case 1://时钟1调时
if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);N1hour=N1hour+1;}
if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);N1hour=N1hour-1;}
for(f=0;f<=50;f++)
{NixieTube(1,N1hour/10);
NixieTube(2,N1hour%10);
NixieTube(3,N1min/10);
NixieTube(4,N1min%10);
NixieTube(5,N2hour/10);
NixieTube(6,N2hour%10);
NixieTube(7,N2min/10);
NixieTube(8,N2min%10);}
for(g=0;g<=50;g++)
{NixieTube(1,13);
NixieTube(2,13);
NixieTube(3,N1min/10);
NixieTube(4,N1min%10);
NixieTube(5,N2hour/10);
NixieTube(6,N2hour%10);
NixieTube(7,N2min/10);
NixieTube(8,N2min%10);}f=0;g=0;if(l==2) l=0;break;
case 2://时钟1调分
if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);N1min=N1min+1;}
if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);N1min=N1min-1;}
for(f=0;f<=50;f++)
{NixieTube(1,N1hour/10);
NixieTube(2,N1hour%10);
NixieTube(3,N1min/10);
NixieTube(4,N1min%10);
NixieTube(5,N2hour/10);
NixieTube(6,N2hour%10);
NixieTube(7,N2min/10);
NixieTube(8,N2min%10);}
for(f=0;f<=50;f++)
{NixieTube(1,N1hour/10);
NixieTube(2,N1hour%10);
NixieTube(3,13);
NixieTube(4,13);
NixieTube(5,N2hour/10);
NixieTube(6,N2hour%10);
NixieTube(7,N2min/10);
NixieTube(8,N2min%10);}f=0;g=0;if(l==1) l=0;break;
case 3://时钟2调时
if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);N2hour=N2hour+1;}
if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);N2hour=N2hour-1;}
for(f=0;f<=50;f++)
{NixieTube(1,N1hour/10);
NixieTube(2,N1hour%10);
NixieTube(3,N1min/10);
NixieTube(4,N1min%10);
NixieTube(5,N2hour/10);
NixieTube(6,N2hour%10);
NixieTube(7,N2min/10);
NixieTube(8,N2min%10);}
for(f=0;f<=50;f++)
{NixieTube(1,N1hour/10);
NixieTube(2,N1hour%10);
NixieTube(3,N1min/10);
NixieTube(4,N1min%10);
NixieTube(5,13);
NixieTube(6,13);
NixieTube(7,N2min/10);
NixieTube(8,N2min%10);}f=0;g=0;if(l==1) l=0;break;
case 4://时钟2调分
if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);N2min=N2min+1;}
if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);N2min=N2min-1;}
for(f=0;f<=50;f++)
{NixieTube(1,N1hour/10);
NixieTube(2,N1hour%10);
NixieTube(3,N1min/10);
NixieTube(4,N1min%10);
NixieTube(5,N2hour/10);
NixieTube(6,N2hour%10);
NixieTube(7,N2min/10);
NixieTube(8,N2min%10);}
for(f=0;f<=50;f++)
{NixieTube(1,N1hour/10);
NixieTube(2,N1hour%10);
NixieTube(3,N1min/10);
NixieTube(4,N1min%10);
NixieTube(5,N2hour/10);
NixieTube(6,N2hour%10);
NixieTube(7,13);
NixieTube(8,13);}f=0;g=0;if(l==1) l=0;break;
}if(k>=5) k=1;if(P3_3==0) break;
}
}
}
}
}
void Timer0_Routine() interrupt 1 //中断
{
TL0 = 0x00; //设置定时初值,让定时器重新开始计时
TH0 = 0xDC; //设置定时初值
Timer0Count++; //每10ms打断一次,计数器加1
if(Timer0Count>=100) //当计数器到100,即经过1秒后让秒加一,然后时分做出响应变化
{
Timer0Count=0;
sec++;
if(sec>=60)
{
min++;
sec=0;
if(min>=60)
{
hour++;
min=0;
if(hour>=24)
{
day++;c++;
hour=0;
runnian();
if(day>=b)
{
month++;
day=1;
if(month>=13)
{
year++;
month=1;
}
}
}
}
}
if(c>=7)
{
week=week+1;
c=0;
if(week>=8)
{
week=1;
}
}
}
}
|