|
/*******************************************************************************
* 實驗名 : 數(shù)字鐘實驗
* 使用的IO : P0,P1,P2
* 實驗效果 :HH:MM:SS
*選擇設(shè)置加1。
*******************************************************************************/
#include<reg51.h>
sbit time=P1^0; //時間設(shè)置
sbit timer=P1^1; //鬧鐘設(shè)置
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; //數(shù)碼管閃動顯示標(biāo)志位
bit disp_ms; //數(shù)碼管顯示時間/鬧鐘標(biāo)志位
bit disp_sdt; //數(shù)碼管閃動間隔反轉(zhuǎn)標(biāo)志位
bit zhengdian=0; //整點報時標(biāo)志位
unsigned char code led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//數(shù)字0-9的編碼
unsigned char time_cc,timer_cc; //調(diào)時計數(shù)器
unsigned char count0,count1,second,minit,hour; //時間時分秒
unsigned char second1,minit1,hour1; //鬧鐘時分秒
unsigned char hour_zd; //整點小時記錄
unsigned char TempData[8],Key_Num;
/*******************************************************************************
* 函數(shù)名 : delay
* 函數(shù)功能 : 延時函數(shù)
*******************************************************************************/
void delay(void)
{
unsigned int i ;
for(i=0; i<100 ; i++);
}
/*******************************************************************************
* 函數(shù)名 : display
* 函數(shù)功能 : 時間顯示函數(shù)
*******************************************************************************/
/*******************************************************************************
* 函數(shù)名 : key_scan
* 函數(shù)功能 : 按鍵處理函數(shù)
*******************************************************************************/
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; //數(shù)碼管閃動顯示
disp_ms=1; //顯示模式為鬧鐘時間
timer_cc++;
if(timer_cc==4)
{
timer_cc=0;
disp_sd=0; //閃動關(guān)閉
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;
}}}}}
/*******************************************************************************
* 函數(shù)名 : timer_alam
* 函數(shù)功能 : 鬧鐘函數(shù)
*******************************************************************************/
void timer_alam(void)
{
if((disp_ms==0)&&(disp_sd==0)) //正常運(yùn)行時間的狀態(tài)下
{
if((hour1==hour)&&(minit1==minit))
{
speaker=disp_sdt;
}
else
{
if(zhengdian==1)
{
speaker=disp_sdt;
}
else
speaker=1;
}
}
}
/*******************************************************************************
* 函數(shù)名 : main
* 函數(shù)功能 :主函數(shù)
*******************************************************************************/
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();
}
}
/*******************************************************************************
* 函數(shù)名 : time0_int
* 函數(shù)功能 : 中斷函數(shù)T0
*******************************************************************************/
void time0_int(void) interrupt 1
{
TL0=0xba;
TH0=0x3c;
TR0=1;
count0++ ;
if(count0==20)
{
count0=0;
second++;
if(hour_zd==second) //報時到小時數(shù)后關(guān)閉報時標(biāo)志。
{
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;
}
}}}}
/*******************************************************************************
* 函數(shù)名 : time1_int
* 函數(shù)功能 : 中斷函數(shù)T1
*******************************************************************************/
void timel_int(void) interrupt 3
{
TL1=0xba;
TH1=0x3c;
TR1=1;
count1++ ;
if(count1==10)
{
count1=0;
disp_sdt=~disp_sdt;
}
}
|
|