#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(); /*调用显示函数来显示*/
}
}
|