📄 clock.c
字号:
#include <AT89X52.H>
sbit w=P2^7; //星期显示控制位//
sbit z=P2^6; //无显示控制位//
sbit f=P2^5; //秒显示控制位//
sbit m=P2^4; //十秒显示控制位//
sbit g=P2^3; //分钟显示控制位//
sbit s=P2^2; //十分显示控制位//
sbit b=P2^1; //小时显示控制位//
sbit q=P2^0; //十小时显示控制位//
unsigned char data sec_cou;
unsigned char data fla_cou;
unsigned char data hms;
unsigned char data hml;
unsigned char data ymd;
unsigned char code shuma[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //译码表//
unsigned char code yuefen[13]={00,32,29,32,31,32,31,32,32,31,32,31,32};
struct Time
{
unsigned char second;
unsigned char minu;
unsigned char hour;
unsigned char week;
}time;
struct Alarm
{
unsigned char second;
unsigned char minu;
unsigned char hour;
unsigned char length;
}alarm;
struct Date
{
unsigned char year;
unsigned char month;
unsigned char day;
}date;
bit TG=1;
bit TZ=1;
bit TD=1;
bit TF=1;
bit TW=1;
bit TT=0;
bit AG=1;
bit AZ=1;
bit AD=1;
bit AF=1;
bit AW=1;
bit AT=0;
bit DG=1;
bit DZ=1;
bit DD=1;
bit DF=1;
bit DT=0;
bit NZ=0;
bit flash=0;
unsigned char n=0; //**下列为子函数声明**//
unsigned char p=0;
unsigned char u=0;
unsigned char i=0;
void delay(unsigned char j); //延迟子函数//
void tiaoshi(void); //调时子函数//
void tiaozheng(void); //时间修正子函数//
void key_flash(void); //按键闪烁判断子函数//
void display(void); //显示子函数//
void qingling(void); //清零子函数//
void alarm_tiaoshi(void); //调时子函数//
void alarm_tiaozheng(void); //时间修正子函数//
void alarm_key_flash(void); //按键闪烁判断子函数//
void alarm_display(void); //显示子函数//
void alarm_qingling(void); //清零子函数//
void date_tiaoshi(void); //调时子函数//
void date_tiaozheng(void); //时间修正子函数//
void date_key_flash(void); //按键闪烁判断子函数//
void date_display(void); //显示子函数//
void date_qingling(void); //清零子函数//
void key_zhuanhuan(void);
void naozhong(void);
//==================================================================================================//
main() //**主函数**//
{
sec_cou=0; //记数标志与时间值初始化//
fla_cou=0;
time.second=0;
time.minu=30;
time.hour=12;
time.week=1;
alarm.second=0;
alarm.minu=0;
alarm.hour=0;
alarm.length=1;
date.year=0;
date.month=0;
date.day=0;
TMOD=0x01; //定时器T0,工作模式1//
TH0=0x3c; //50ms//
TL0=0xb0;
EA=1;
ET0=1;
TR0=1;
while(1)
{
switch(i)
{
case 0:key_flash();display();tiaoshi();tiaozheng();qingling();break;
case 1:alarm_key_flash();alarm_display();alarm_tiaoshi();alarm_tiaozheng();alarm_qingling();break;
case 2:date_key_flash();date_display();date_tiaoshi();date_tiaozheng();date_qingling();break;
}
key_zhuanhuan();
naozhong();
}
}
//===========================================================================================//
void shizhong(void) interrupt 1 using 1 //**中断程序,产生时钟秒信号**//
{
TR0=0;
sec_cou++;
fla_cou++;
if(fla_cou==5) //闪烁间隔为50ms*5次=250ms//
{
flash=!flash;
fla_cou=0;
}
if(sec_cou==19) //产生秒信号:50ms*20次=1000ms=1s//
{
time.second++;
sec_cou=0;
if(time.second==60) //分钟信号判断:1s*60次=60s=1m//
{
time.minu++;
time.second=0;
if(time.minu==60) //小时信号判断:1m*60次=60m=1h//
{
time.hour++;
time.minu=0;
if(time.hour==24)
{
time.week++;
date.day++;
time.hour=0;
if(time.week==8)
{
time.week=1;
}
if(date.day=yuefen[date.month])
{
date.month++;
date.day=1;
if(date.month==13)
{
date.year++;
date.month=1;
if(date.year==100)
date.year=0;
}
}
}
}
}
}
TH0=0x3c; //恢复计数器初始值//
TL0=0xb0;
TR0=1;
}
//===========================================================================================//
void delay(unsigned char j) //*延迟子函数*//
{
unsigned char k,l;
for(k=0;k<j;k++)
for(l=0;l<255;l++)
;
}
//==============================================================================================//
void display(void) //*显示子函数*//*动态扫描法*//
{
P0=0x80;
b=0;
delay(2);
b=1;
P0=0x80;
g=0;
delay(2);
g=1;
if(TG) //AG为小时位闪烁标志位//
{
P0=shuma[time.hour/10];
q=0;
delay(2);
q=1;
P0=shuma[time.hour%10];
// P0_7=1;
b=0;
delay(2);
b=1;
}
if(TZ) //AZ为分钟位闪烁标志位//
{
P0=shuma[time.minu/10];
s=0;
delay(2);
s=1;
P0=shuma[time.minu%10];
// P0_7=1;
g=0;
delay(2);
g=1;
}
if(TD) //AD为秒位闪烁标志位//
{
P0=shuma[time.second/10];
m=0;
delay(2);
m=1;
P0=shuma[time.second%10];
f=0;
delay(2);
f=1;
}
P0=shuma[10];
z=0;
delay(2);
z=1;
if(TW)
{
P0=shuma[time.week];
w=0;
delay(2);
w=1;
}
}
//=================================================================================================//
void key_flash(void) //*闪烁子函数*//
{
if(P1_3==0)
{
while(P1_3==0)
display();
n++; //n表示某两位闪烁:n=0 -> 不闪烁,退出调时状态//
} // n=1 -> 小时位闪烁,小时位处于可调时状态//
if(n==5) // n=2 -> 分钟位闪烁,分钟位处于可调时状态//
n=0; // n=3 -> 秒位闪烁,秒位处于可调时状态//
if(n!=1)
TG=1;
if(n!=2)
TZ=1;
if(n!=3) //KT为可调时标志:KT=0 -> 不可调时//
TD=1; // KT=1 -> 可调时//
if(n!=4)
TW=1;
switch(n)
{
case 0:TT=0;break;
case 1:TG=flash;hms=time.hour;TT=1;break; //hms为调时临时变量,需要调整某位时则先把其初始值放到hms中//
case 2:TZ=flash;hms=time.minu;TT=1;break;
case 3:TD=flash;hms=time.second;TT=1;break;
case 4:TW=flash;hms=time.week;TT=1;break;
}
}
//=================================================================================================//
void tiaoshi(void) //*调时子函数*//
{
if(P1_6==0) //按P1_6键进行时间调整//
{
while(P1_6==0)
display();
if(TT==1) //检验可调标志位KT//
{
hms++;
switch(n)
{
case 1:time.hour=hms;break; //根据n不同,返回给不同的位: n=1 -> 返回给小时位//
case 2:time.minu=hms;break; // n=2 -> 返回给分钟位//
case 3:time.second=hms;break; // n=3 -> 返回给秒位//
case 4:time.week=hms;break;
}
}
}
}
//===================================================================================================//
void tiaozheng(void) //*时间修正子函数*//
{
if(time.hour==24)
time.hour=0;
if(time.minu==60)
time.minu=0;
if(time.second==60)
time.second=0;
if(time.week==8)
time.week=1;
}
//=====================================================================================================//
void qingling(void) //*清零子函数*//
{
if(P1_7==0) //P1_0为清零键//
{
while(P1_7==0)
display();
switch(n)
{
case 0:time.hour=0;time.minu=0;time.second=0;time.week=1;break; //根据n不同,清零位不同:n=0 -> 全部位清零//
case 1:time.hour=0;break; // n=1 -> 小时位清零//
case 2:time.minu=0;break; // n=2 -> 分钟位清零//
case 3:time.second=0;break; // n=3 -> 秒位清零//
case 4:time.week=1;break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -