耗资源//////////////////////////////////////////////////
// //
// AT89C51时钟程序 //
// //
// 作者: 吴鹏 //
// 时间;2006年2月3日 //
// 大年初六 完成 //
//////////////////////////////////////////////////
#include <REG52.H>
#define uchar unsigned char
sbit P3_6=P3^6;
sbit P3_7=P3^7;
sbit P2_6=P2^6;
sbit P2_7=P2^7;
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};// 0-9 十个数字显示
uchar code dispbit[]={0x7f,0xbf,0xf7,0xfb,0xfd,0xfe};// 点亮 数码管
uchar code rjg[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};// 点亮 跑马灯
uchar buffer[]={0,0,0,0,0,0};// 时钟and定时显示置
uchar hour,minute,second,count;
uchar dhour=0,dminute=0,dsecond=0;
uchar j=0,R,T;
void ding(void) ; //定时程序
void delay(uchar c,uchar d) //延时程序
{uchar x,y;
for(x=c;x>0;x--)
for(y=d;y>0;y--);
}
void warning(void) //闹钟报警程序
{
uchar p=2;
while(p--!=0)
{ P1=0;
P0=0;
delay(100,100);
P1=0xff;
P0=0xff;
delay(100,100);
}
}
void main(void)
{
TMOD=0x11;//选择定时器的模式
TH0=0xd8; //定的时间高8位
TL0=0xf0; //定的时间低8位
IE=0x82; //中断触发的设定
TR0=1; //TIMER0开始计时
count=0;
second=0;
minute=0;
hour=0;
while(1)
{if(P3_7==0) //按下P3_7?
{delay(1,100); //延时
hour++;
if(hour==24)
hour=0;
while(P3_7==0);//判断是否被按下
}
if(P2_7==0)
{delay(1,100);
minute++;
if(minute==60)
{minute=0;}
while(P2_7==0);
}
if(P2_6==0)
{delay(1,100);
second++;
if(second==60)
{second=0;}
while(P2_6==0);
}
if(P3_6==0)
{delay(1,100);
// TR0=0; //??? //注意: 在做显示时,要慎用全局变量,如在做本程序的两个显示部分时,
// 原来都统一用的是一个全局变量,那么这就会出现冲突,后来两部分
// 分别改为局部变量,这就OK了!!!!
while(P3_6==0);
T=1; //作标志,使其进入"ding()"
R=1; //作标志,因为两部分显示都存在"buffer[]"里,所以加以区分,否则会出现冲突
}
if(T==1) //检测T值
ding();
}
}
void tim(void) interrupt 1 //int0 t0 int1 t1 rs
{
// 0 1 2 3 4
uchar a1,b1,i1; //这里我使用局部变量
TH0=0xd8;
TL0=0xf0;
count++; //由于其是全局函数,当程序运行100次后,秒加1
R=0;
if (count==100)
{
count=0;
second++;
j++;
P1=rjg[j%8]; //由于有8个LED所以对8取余,使其逐个且有序的亮起来,很巧吧!!
if(second>=60)
{
second=0;
minute++;
if (minute>=60)
{
minute=0;
hour++;
if (hour>=24)
{
second=0;
hour=0;
minute=0;
}
}
}
if(R==0) //检测R值
{
buffer[0]=second%10;
buffer[1]=second/10;
buffer[2]=minute%10;
buffer[3]=minute/10;
buffer[4]=hour%10;
buffer[5]=hour/10;
}
}
if(R==0) //检测R值
{for(i1=0;i1<6;i1++)
{
P2=dispbit[i1];
P0=table[buffer[i1]];
for(a1=4;a1>0;a1--)
for(b1=248;b1>0;b1--);
}
}
if((hour==dhour && minute==dminute && second==dsecond)&&(hour!=0||minute!=0||second!=0))
{warning();} //闹钟报警部分
}
void ding(void) //interrupt 3 //int0 t0 int1 t1 rs
{ // 0 1 2 3 4
int i2,a2,b2;
P2=0xff;
while(1) //闹钟调时
{
if(P3_7==0)
{delay(1,100);
dhour++;
if(dhour==24)
{dhour=0;}
while(P3_7==0);
}
if(P2_7==0)
{delay(1,100);
dminute++;
if(dminute==60)
{dminute=0;}
while(P2_7==0);
}
if(P2_6==0)
{delay(1,100);
dsecond++;
if(dsecond==60)
{dsecond=0;}
while(P2_6==0);
}
if(R==1) //检测R值
{
buffer[0]=dsecond%10;
buffer[1]=dsecond/10;
buffer[2]=dminute%10;
buffer[3]=dminute/10;
buffer[4]=dhour%10;
buffer[5]=dhour/10;
}
for(i2=0;i2<6;i2++)
{
P2=dispbit[i2];
P0=table[buffer[i2]];
for(a2=4;a2>0;a2--)
for(b2=248;b2>0;b2--);
}
if (P3_6==0) //定时退出部分
{delay(1,100);
while (P3_6==0);
T=0; //使T归0
R=0; //使R归0
break; //从while(1)循环中跳出
}
}
}