#include<reg51.h>
#define uchar unsigned char /*宏定義 */
#define uint unsigned int /*宏定義 */
uchar hour,hour_h,hour_l; /*定義小時,小時的高位,小時的低位*/
uchar min,min_h,min_l; /*分*/
uchar sec,sec_h,sec_l; /*秒*/
uchar int_num; /*定時溢出作用標號*/
sbit key_secadd=P1^1; /*定義了 p1.1為秒增1鍵,用在調時中斷里*/
sbit key_minadd=P1^2; /*定義了 p1.2為分增1鍵,用在調時中斷里*/
sbit key_houradd=P1^3; /*定義了 p1.3為時增1鍵,用在調時中斷里*/
sbit key_intime=P1^0; //按P1.0進入調時
sbit key_quit=P1^5; //P1.5退出調時
sbit bell=P1^5; //小喇叭
void delay(uchar time); /*延時子函數聲明*/
void display(); /*顯示子函數聲明*/
void inter_init(); /*定時器初始化子函數聲明*/
void time24();
/****專用數碼管顯示表***/
uchar code duma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x40}; /*0x40顯示“一”符號*/
uchar code wema[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0x00};
/*小時hour 分min 秒sec*/
//---------------------延時子函數--------------------------------
void delay(uchar time) /*延時子函數*/
{
uchar time_1;
for (;time>0;time--)
for (time_1=100;time_1>0;time_1--);
}
//---------------------初始化T0函數--------------------------
void time0(void) interrupt 1 /*定時器T0服務子程序*/
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
int_num++;
}
//---------------------定時器函數--------------------------
void inter_init() /*定時器初始化子函數*/
{
EA=1; /*開總中斷*/
EX0=1; /*開外部中斷0*/
ET0=1; /*打開定時器T0*/
TMOD=0x01; /*工作方式1*/
TCON = 0x00; /*觸發方式*/
IP = 0x01; /*中斷優先級別,T0優先*/
TH0=(65535-50000)/256; /*置初值,大約50ms一個中斷 */
TL0=(65535-50000)%256;
TR0=1; /*置位TR0,啟動定時器0*/
}
//---------------------24小時時間自加 --------------------------
void time24() /*時間遞增*/
{
if(int_num==20) /*值滿20,大約就是一秒的時間。*/
{ /* 其值設為2,則定時時間快10倍,可做毫秒計時*/
int_num=0;
sec++; /*秒值加1*/
if(sec==60) /*如果秒值滿60,就歸0*/
{
sec=0;
min++; /*分值加1*/
if(min==60)
{
min=0;
hour++; /*分值歸0,時值加1*/
if(hour==24)
{
hour=0; /*時值滿24歸0*/
}
}
}
}
}
//-----------按鍵調整子函數-------------------------------------
void key(void) //按鍵調整子函數
{
if(key_intime==0)
{EA=0; // 關中斷
sec=0; //秒歸零
while(100) //正確
{ display();
if(key_quit==0)
{
EA=1;
break;
}
if(key_secadd==0)
{
delay(1);
if(key_secadd==0)
{
sec++;
while(!key_secadd);
if(sec==60)
{
sec=0;
}
}
}
if(key_minadd==0)
{
delay(80);
if(key_minadd==0)
{
min++;
while(!key_minadd);
if(min==60)
{
min=0;
}
}
}
if(key_houradd==0)
{
delay(80);
if(key_houradd==0)
{
hour++;
while(!key_houradd);
if(hour==24)
{
hour=0;
}
}
}
} }
}
//---------------------數碼管顯示子函數-------------------------------------
void display() /*數碼管顯示子函數*/
{
sec_h=sec/10; /*求出秒高位需要顯示的字符*/
sec_l=sec%10; /*求出秒低位需要顯示的字符*/
min_h=min/10;
min_l=min%10;
hour_h=hour/10;
hour_l=hour%10;
P2=duma[sec_h]; /*顯示秒高位*/
P0=wema[6];
delay(10);
P2=duma[sec_l]; /*顯示秒低位*/
P0=wema[7];
delay(10);
P2=duma[10]; /* “一”符號的顯示 */
P0=wema[5];
delay(10);
P2=duma[min_h]; /*分*/
P0=wema[3];
delay(10);
P2=duma[min_l];
P0=wema[4];
delay(10);
P2=duma[10]; /* “一”符號的顯示 */
P0=wema[2];
delay(10);
P2=duma[hour_h]; /*時*/
P0=wema[0];
delay(10);
P2=duma[hour_l];
P0=wema[1];
delay(10);
}
//---------------------主函數--------------------------------
/*void alarm_clock() //鬧鐘子函數-變頻發聲
{
uint i,j,y,m;
if(hour==00)//時到了00點?
{
if(min>=01){m=0;} //分大于或等于01就把m清零,若不成立向下執行
if(min==00)//到了00分?
{
if(m<15)
{
do{ //循環-變頻
m++; display();
for(i=0;i<2000;i++)
{bell=~bell;for(j=0;j<24;j++);} //取反/
for(y=0;y<2000;y++)
{bell=~bell;for(j=0;j<25;j++);} //取反/
for(i=0;i<2000;i++)
{bell=~bell;for(j=0;j<26;j++);} //取反/
for(i=0;i<2000;i++)
{bell=~bell;for(j=0;j<27;j++);} //取反/
}
while(m<15); //鬧15次結束
}
}
}
}*/
//---------------------主函數--------------------------------
void main()
{
inter_init(); /*定時器初始化*/
hour=23; /*自定義一個初值,方便快速觀察翻轉狀態(可修改)*/
min=59;
sec=50;
while(1)
{
key();
time24(); /*分開時間,分別顯示字符*/
//alarm_clock();//鬧鐘函數
display(); /*調用顯示函數來顯示*/
}
}
|