/*******************************************************************************
* 实验名 : 数字钟实验
* 使用的IO : P0,P1,P2
* 实验效果 :HH:MM:SS
*选择设置加1。
*******************************************************************************/
#include<reg51.h>
sbit time=P1^0; //时间设置
sbit timer=P1^1; //闹钟设置
sbit add=P1^2; //加
sbit dec=P1^3; //减
sbit speaker=P3^5; //闹钟输出
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
bit disp_sd; //数码管闪动显示标志位
bit disp_ms; //数码管显示时间/闹钟标志位
bit disp_sdt; //数码管闪动间隔反转标志位
bit zhengdian=0; //整点报时标志位
unsigned char code led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数字0-9的编码
unsigned char time_cc,timer_cc; //调时计数器
unsigned char count0,count1,second,minit,hour; //时间时分秒
unsigned char second1,minit1,hour1; //闹钟时分秒
unsigned char hour_zd; //整点小时记录
unsigned char TempData[8],Key_Num;
/*******************************************************************************
* 函数名 : delay
* 函数功能 : 延时函数
*******************************************************************************/
void delay(void)
{
unsigned int i ;
for(i=0; i<100 ; i++);
}
/*******************************************************************************
* 函数名 : display
* 函数功能 : 时间显示函数
*******************************************************************************/
/*******************************************************************************
* 函数名 : key_scan
* 函数功能 : 按键处理函数
*******************************************************************************/
void key_scan(void)
{
unsigned int i ;
if(time==0)
{
speaker=1;//闹钟输出
for(i=0;i<10;i++)
display();
if(time==0)
{
TR0=0;
do
display();
while(time==0);
disp_sd=1;
disp_ms=0;
time_cc++;
if(time_cc==4)
{
TR0=1;
time_cc=0;
disp_sd=0;
}
}
}
if(timer==0)
{
speaker=1;
for(i=0;i<10;i++)
{
display();
}
if (timer==0)
{
do
display();
while(timer==0);
disp_sd=1; //数码管闪动显示
disp_ms=1; //显示模式为闹钟时间
timer_cc++;
if(timer_cc==4)
{
timer_cc=0;
disp_sd=0; //闪动关闭
disp_ms=0; //切换到时间模式
}
}
}
if(add==0)
{
for(i=0;i<10;i++)
{
display() ;
}
if(add==0)
{
do
display();
while(add==0);
if(disp_ms==0)
{
switch(time_cc)
{
case(0x01): {hour++; if(hour>23) hour=23; break;}
case(0x02): {minit++; if(minit>59) minit=59; break;}
case(0x03): {second++; if(second>59) second=59; break;}
default: break;
}
}
else
{
switch(timer_cc)
{
case(0x01): {if (hour1==23) hour1=23; else hour1++; break;}
case(0x02): {if (minit1==59) minit1=59; else minit1++;break;}
case(0x03): {if (second1==59) second1=59; else second1++; break;}
default :break;
}
}
}
}
if(dec==0)
{
for(i=0;i<10;i++)
{
display();
}
if(dec==0)
{
do
display() ;
while(dec==0) ;
if(disp_ms==0)
{
switch(time_cc)
{
case(0x01): {if (hour==0) hour=0; else hour--; break;}
case(0x02): {if (minit==0) minit=0; else minit-- ;break;}
case(0x03): {if (second==0) second=0; else second--;break;}
default: break;
}
}
else
{
switch(timer_cc)
{
case(0x01): {if(hour1==0) hour1=0; else hour1--;break;}
case(0x02): {if (minit1==0) minit1=0; else minit1--;break;}
case (0x03): {if (second1==0) second1=0; else second1-- ;break;}
default: break;
}}}}}
/*******************************************************************************
* 函数名 : timer_alam
* 函数功能 : 闹钟函数
*******************************************************************************/
void timer_alam(void)
{
if((disp_ms==0)&&(disp_sd==0)) //正常运行时间的状态下
{
if((hour1==hour)&&(minit1==minit))
{
speaker=disp_sdt;
}
else
{
if(zhengdian==1)
{
speaker=disp_sdt;
}
else
speaker=1;
}
}
}
/*******************************************************************************
* 函数名 : main
* 函数功能 :主函数
*******************************************************************************/
void main(void)
{
second=0x00;//时间初始化为 12:00:00
minit=0x00;
hour=12;
count0=0x00;
count1=0x00;
P1=0xFF;
TMOD=0x11;
TL0=0xba;
TH0=0x3c;
TL1=0xba;
TH1=0x3c;
EA=1;
ET0=1;
ET1=1;
TR0=1;
TR1=1;
while(1)
{
key_scan();
display();
timer_alam();
}
}
/*******************************************************************************
* 函数名 : time0_int
* 函数功能 : 中断函数T0
*******************************************************************************/
void time0_int(void) interrupt 1
{
TL0=0xba;
TH0=0x3c;
TR0=1;
count0++ ;
if(count0==20)
{
count0=0;
second++;
if(hour_zd==second) //报时到小时数后关闭报时标志。
{
zhengdian=0;
}
if(second==60)
{
second=0;
minit++;
if(minit==60)
{
zhengdian=1;//开启整点报时
minit=0;
hour++;
hour_zd=hour;
if(hour_zd>12)
hour_zd=hour_zd-12; //12小时制报时方式
if(hour==24)
{
hour=0;
}
}}}}
/*******************************************************************************
* 函数名 : time1_int
* 函数功能 : 中断函数T1
*******************************************************************************/
void timel_int(void) interrupt 3
{
TL1=0xba;
TH1=0x3c;
TR1=1;
count1++ ;
if(count1==10)
{
count1=0;
disp_sdt=~disp_sdt;
}
}
|