📄 时钟2.c
字号:
//////////////////////////////////////////////////
// //
// AT89C51时钟程序 //
// //
// 作者: 吴鹏 //
// 时间;2006年2月3日 //
// 大年初六 完成 //
//////////////////////////////////////////////////
#include <reg52.H>
#define uchar unsigned char
//typedef unsigned char uchar
sbit P3_6=P3^6;
sbit P3_7=P3^7;
sbit P2_6=P2^6;
sbit P2_7=P2^7;
//sbit rect_wave=P1^0;
//void timelover(void);
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};// 时钟显示置0
//uchar dbuffer[]={0,0,0,0,0,0};//闹钟显示置0
uchar hour,minute,second,count;
uchar dhour=0,dminute=0,dsecond=0;
uchar i,a,b,j=0,R,T;
void ding(void) ;
void delay(uchar c,uchar d) //延时程序
{for(a=c;a>0;a--)
for(b=d;b>0;b--);
}
void warning(void) //闹钟报警程序
{
uchar p=2;
// TR0=0;
while(p--!=0)
{ P1=0;
P0=0;
delay(100,100);
P1=0xff;
P0=0xff;
delay(100,100);
}
// TR0=1;
}
void main(void)
{
TMOD=0x11;//选择定时器的模式
TH0=0xd8; //定的时间高8位
TL0=0xf0; //定的时间低8位
// TH1=0xff; //定的时间高8位,想想为什么?
// TL1=0xff; //定的时间低8位,想想为什么?
IE=0x82; //中断触发的设定
//IP=0X04;
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; //???????????????
while(P3_6==0);
T=1;
R=1;
}
if(T==1)
ding();
}
}
void tim(void) interrupt 1 //int0 t0 int1 t1 rs
{ // 0 1 2 3 4
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)
{
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)
{for(i=0;i<6;i++)
{
P2=dispbit[i];
P0=table[buffer[i]];
for(a=4;a>0;a--)
for(b=248;b>0;b--);
}
}
if((hour==dhour && minute==dminute && second==dsecond)&&(hour!=0||minute!=0||second!=0))
{warning();} //闹钟报警部分
}
void ding(void) //interrupt 3 //int0 t0 int1 t1 rs
{ int ii,aa,bb; // 0 1 2 3 4
//R=1;
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);
}
// display();
if(R==1)
{
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(ii=0;ii<6;ii++)
{
P2=dispbit[ii];
P0=table[buffer[ii]];
for(aa=4;aa>0;aa--)
for(bb=248;bb>0;bb--);
}
if (P3_6==0) //定时退出部分
{delay(1,100);
while (P3_6==0);
T=0;
R=0;
break;
}
} //TR0=1; //TIME0开始计时
}
/*void timelover(void)
{
TH1=0xff;
TL1=0xff;
TF1=0;
rect_wave=!rect_wave;
}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -