#include <AT89X52.h> //头文件
#define uchar unsigned char
#define uint unsigned int
sbit start=P3^2; //按键定义
sbit stop=P3^3 ; //时钟暂停
sbit jia1=P2^0; //小时调整按键定义
sbit jia2=P2^1; //分调整按键定义
sbit jian1=P2^2; //闹钟按键分调整
sbit jian2=P2^3; // 闹钟时按键调整
sbit dian=P1^1;
sbit ff=P1^0; //闹铃端口输出
uchar num[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8 ,0x80,0x90 };//数码管字码显示
uchar num1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78 ,0x00,0x10 };
uchar num2[]= {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8 ,0x80,0x90 };
uchar disp[]={0,0,0,0,0,0,0,0,0,0,0,0};
uchar sss=0;
uchar ssss=0;
uchar shi,fen,miao,shi1,fen1,miao1;
void display(); //显示函数声明
void delay(uint d); //延时函数声明
void scan(); //按键扫描函数声明
void baojing(); //整点报时函数声明
void display1(); //闹铃调整显示函数声明
void naoling(); //闹铃主函数声明
void dddd(); //闹铃振动频率函数声明
///**************************************主程序 ****************************
main()
{
TMOD=0X10; //选定时器T1 T1 0001 T0 0 工作方式1
TH1=0X3C;//充初值65535----50000us+15536= 0.05S
TL1=0XB0;
EA=1 ;
ET1=1;
dian=0;
ff=0;
shi=11;
fen=59;
miao=50;
P2=0XfF;
shi1=13;
fen1=3;
miao1=0;
while(1)
{ scan(); //调用按键扫描子程序
display();//调用时间显示子程序
baojing();//调用整点报时子程序
naoling();//调用闹铃子程序
}
}
//********************************定时器中断处理程序 *****************************
void ddd() interrupt 3
{
TH1=0X3C; //充初值65535----50000us+15536= 0.05S
TL1=0XB0;
sss=sss+1;
if(sss>=20)
{dian=~dian;
}
// 计数单元加一
if(sss>=20 ) //判断中断是否够20次 (1s)
{
sss=0; //清计数单元,为下一次计数做准备
miao=miao+1;
}
if(miao>=60)
{
miao=0;
fen=fen+1;
}
if(fen>=60)
{fen=0;
shi=shi+1;
}
if(shi>=24)
{shi=0;
}
disp[0]=num[shi/10]; // 时十位显示
disp[1]=num[shi%10]; // 时个位
disp[2]=num[fen/10]; // 分十位
disp[3]=num[fen%10]; // 分个位
disp[4]=num[miao/10];// 秒十位
disp[5]=num[miao%10];// 秒个位
disp[6]=num2[shi1/10]; // 时十位显示
disp[7]=num2[shi1%10]; // 时个位
disp[8]=num2[fen1/10]; // 分十位
disp[9]=num2[fen1%10]; // 分个位
disp[10]=num2[miao1/10];// 秒十位
disp[11]=num2[miao1%10];// 秒个位
}
//************闹铃频率子程序 *****************************************************
void dddd()
{uchar i;
for(i=0;i<125;i++)
ff=~ff;
}
//*********************************显示子程序 ***********************************
void display()
{P0=disp[0]; //送字型码
P2=0x7f; //送数码管位码
delay(1);
P0=disp[1];
P2=0xbf;
delay(1);
P0=disp[2];
P2=0xdf;
delay(1);
P0=disp[3];
P2=0xef;
delay(1);
}
//**********************************延时 程序 ******************************
void delay(uint d)
{uchar i;
while(d--)
{for(i=0;i<125;i++)
{;}
}
}
//******************按键扫描*********************************************************
void scan()
{if (start==0)
{delay(100);
if(start==0)
TR1=1;
P1=0X7f ;
}
else if (stop==0)
{delay(100);
if(stop==0)
TR1=0;
P1=0XFF;
}
else if(jia1==0)//按下时加一
{delay(100);
if(jia1==0)
shi=shi+1;
display();
}
else if(jia2==0)//按下分加一
{delay(100);
if(jia2==0)
fen=fen+1;
display();
}
}
//*************** 整点报时 ***********************************************
void baojing()
{
if (fen==0&&miao==0)
P1_0=0;
if (miao==1)
P1_0=1;
}
void naoling () //闹铃子程序
{while(jian1==0)
{ delay(100);
if(jian1==0)
fen1=fen1+1;
P1_2=0;
display1();
delay(1000);
}
while(jian2==0)
{ delay(100);
if(jian2==0)
shi1=shi1+1;
display1();
delay(1000);
}
if(shi==shi1&&fen==fen1)
{ dddd();
if(miao>10)
P1_0=1;
}
}
//****************** 闹铃调整显示程序 *************************************
void display1()
{ P0=disp[6];
P2=0x7f;
delay(1);
P0=disp[7];
P2=0xbf;
delay(1);
P0=disp[8];
P2=0xdf;
delay(1);
P0=disp[9];
P2=0xef;
delay(1);
}