📄 智能电子表.c
字号:
////////////////////////////////////////
// 智能电子表
// 功能:日历、时钟、秒表、定时器、温度计
////////////////////////////////////// //
#include <reg52.h>
#include <absacc.h>
#include <math.h> //使用89s52
#define uchar unsigned char
#define uint unsigned int
#define IN3 XBYTE[0xFEF3]
uchar tab[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
uchar display[6];
uchar cover1,cover2,cover3;
uchar m,m0,mo,s,s0,so,i,h,dm,ds,dh,status,status1,status2,status3,status4,key,flag0,flag1,flag3,flag4,flag5,flag6;
uint time,time1,time0,timeo,dd,mm,weekday,t;
sbit P21=P2^1; //给出蜂鸣器驱动信号
void dlms(uchar count) //延迟函数,参数为毫秒数
{unsigned char i,j;
for(i=0;i<count;i++)
for(j=0;j<100;j++) ;
}
void timer0(void) interrupt 1 using 1
{
TH0=-9216/256;
TL0=-9216%256;
t=0x00;
XBYTE[0xFEF3]=0x00;
t=XBYTE[0xFEF3];
time=time+1; time0=time0+1;
if(m==dm&h==dh) //到达定时时间,输出信号是蜂鸣器响
{
if((s-ds)%2==1) //每隔1s响一次
P21=0x80;
else
P21=0x00;
}
if(time==100) //时钟计时
{
time=0;
s=s+1;
if(s==60)
{
s=0;
m=m+1;
if(m==60)
{
m=0;
h=h+1;
if(h==24)
{
h=0;
dd=dd+1; //日期为mm:dd
weekday=weekday+1; //weekday为星期
weekday=weekday%7+1;
if((dd==30&(mm==2|4|6|9|11))|(dd==31))
{
dd=1;
mm=mm+1;
if(mm==12)
{
mm=1;
}
}
}
}
}
}
switch(flag0)
{ case 0: break;
case 1: display[0]=m/10;display[1]=m%10;display[2]=s/10; //显示时钟
display[3]=s%10;display[5]=h/10;display[4]=h%10;
break;
case 2: if(time0==100) //秒表计时
{
time0=0;
s0=s0+1;
if(s0==60)
{
s0=0;
m0=m0+1;
if(m0==60)
{
m0=0;
}
}
}
display[0]=s0/10;display[1]=s0%10;display[2]=time0/10; //显示计时秒表
display[3]=time0%10;display[5]=m0/10;display[4]=m0%10;
break;
case 3: display[0]=mm/10;display[1]=mm%10;display[2]=dd/10; //显示日期
display[3]=dd%10;display[5]=0;display[4]=weekday%10;
break;
case 4: display[0]=so/10;display[1]=so%10;display[2]=timeo/10; //显示暂停秒表
display[3]=timeo%10;display[5]=mo/10;display[4]=mo%10;
break;
case 5: display[0]=dm/10;display[1]=dm%10;display[2]=ds/10; //显示定时
display[3]=ds%10;display[5]=dh/10;display[4]=dh%10;
break;
break;
case 6: display[0]=0;display[1]=t/100;display[2]=t/10; //显示温度
display[3]=t%10;display[5]=0;display[4]=0;
break;
}
}
void timer1(void) interrupt 3 using 3
{
TH1=-50000/256;
TL1=-50000%256;
time1=time1+1;
if(time1==4)
{ //去抖动
time1=0;
if(P2|0x0f!=0xff)
{
key=~(P2|0x0f);
if(key==0x10) //总控制键key5
{
status=status+1;
if(status==5)
{
status=0;
}
cover1=0x7f;
cover2=0x7f;
cover3=0x7f;
flag1=0;
flag3=0;
flag4=0;
flag5=0;
//%%%%%%%%%%%%%%以下为秒表功能 %%%%%%%%%%%%%%%%%%
if(status==1)
{
flag1=1; //秒表功能标志
time0=0;timeo=0; //秒表清零
s0=0;so=0;
m0=0;mo=0;
flag0=4;
}
}
if(key==0x20&flag1==1)
{
status1=status1+1;
if(status1==2)
{
status1=0;
}
if(status1==0) //按2次则停止计时
{ mo=m0;
so=s0;
timeo=time0;
flag0=4;
}
else //按1次继续计时
{ time0=timeo;
s0=so;
m0=mo;
flag0=2;
}
}
if(key==0x40&flag1==1) //秒表清零
{
time0=0;timeo=0;
s0=0;so=0;
m0=0;mo=0;
flag0=4;
}
//%%%%%%%%%%%%%%以上为秒表功能,以下为定时%%%%%%%%%%%%%%%%%%
if(status==4)
{
flag5=1; //定时标志
flag0=5;
}
if(key==0x20&flag5==1)
{ cover1=0x7f;
cover2=0x7f;
cover2=0x7f;
status2=status2+1;
// k=status2/4;
// if(k>=11)
// k=0;
// if(status2%4==0)
// {
// flag0=6;
// goto AA;
// }
switch(status2%4)
{ case 0: break;
case 1: cover1=0xff; //按一下调秒位提示信息
cover2=0x7f;
cover3=0x7f;
break;
case 2: cover1=0x7f; //按二下调分位提示信息
cover2=0xff;
cover3=0x7f;
break;
case 3: cover1=0x7f; //按三下调时位提示信息
cover2=0x7f;
cover3=0xff;
break;
break;
}
}
if(key==0x40&flag5==1)
switch(status2%4)
{case 0:break;
case 1:ds=ds+1; //按一下调秒位
if(ds==60)
ds=0;
break;
case 2: dm=dm+1; //按二下调分位
if(dm==60)
dm=0;
break;
case 3: dh=dh+1; //按三下调时位
if(dh==24)
dh=0;
break;
break;
}
//%%%%%%%%%%%%%以上为定时,以下为调整时钟%%%%%%%%%
if(status==2)
{
// TR0=0;
flag3=1; //时钟调整标志
flag0=1;
}
if(key==0x20&flag3==1)
{
status3=status3+1;
if(status3==3)
{
status3=0;
}
switch(status3)
{ case 0: cover1=0x7f; //按三下调时位提示信息
cover2=0x7f;
cover3=0xff;
break;
case 1: cover1=0xff; //按一下调秒位提示信息
cover2=0x7f;
cover3=0x7f;
break;
case 2: cover1=0x7f; //按二下调分位提示信息
cover2=0xff;
cover3=0x7f;
break;
break;
}
}
if(key==0x40&flag3==1)
switch(status3)
{case 0: h=h+1; //按三下调时位
if(h==24)
h=0;
break;
case 1:s=s+1; //按一下调秒位
if(s==60)
s=0;
break;
case 2: m=m+1; //按二下调分位
if(m==60)
m=0;
break;
break;
}
//%%%%%%%%%%%%%%%调整日期%%%%%%%%%%%%%%%
if(status==3)
{
// TR0=0;
flag4=1;
flag0=3;
}
if(key==0x20&flag4==1)
{ status4=status4+1;
if(status4==3)
{
status4=0;
}
switch(status4)
{ case 0: cover1=0x7f; //按一下调星期位提示信息
cover2=0x7f;
cover3=0xff;
break;
case 1: cover1=0xff; //按一下调日期位提示信息
cover2=0x7f;
cover3=0x7f;
break;
case 2: cover1=0x7f; //按一下调月份位提示信息
cover2=0xff;
cover3=0x7f;
break;
break;
}
}
if(key==0x40&flag4==1)
switch(status4)
{case 0: weekday=weekday+1; //按一下调星期位
if(weekday==8)
weekday=1;
break;
case 1: dd=dd+1; //按一下调日期位
if((dd==29&mm==2)|(dd==31&(mm==4|mm==6|mm==9|mm==11))|(dd==32))
dd=1;
break;
case 2: mm=mm+1; //按一下调月份位
if(mm==13)
mm=1;
break;
break;
}
//%%%%%%%%%%%%%%以上为调整时钟,以下为返回%%%%%%%%%
// if(status==6)
// {flag6=1;
// dlms(5);
// t=t/3;
// }
if(status==0)
{
flag0=1;
}
//%%%%%%%%%%%%%%%%%%显示%%%%%%%%%%%%%
if(key==0x20&flag1==0&flag5==0&flag3==0&flag4==0) //只按key6显示日期
flag0=3;
else if(key==0x40&flag1==0&flag5==0&flag3==0&flag4==0) // 只按key7显示定时
flag0=5;
if(key==0x80&flag1==0&flag5==0&flag3==0&flag4==0) //只按key8显示日期
{
flag0=6;
dlms(1);
}
}
}
}
main()
{
TMOD=0x11;
TH0=-9216/256;
TL0=-9216%256;
TH1=-50000/256;
TL1=-50000%256;
IE=0x8a;
status=0; status1=0; status2=0; status3=0; status4=0; //功能进入标志
flag1=0; flag3=0; flag5=0; flag0=1; //功能操作标志
weekday=06;mm=05; dd=25; //日期
h=12;m=00; s=00; //时钟
m0=0; s0=0; //秒表
mo=0; so=0; //暂停秒表计时
ds=00; dm=01; dh=12; //定时
cover1=0x7f;cover2=0x7f; cover3=0x7f; //操作位标志
time=0; time1=0; time0=0; timeo=0;
TCON=0x50;
TR0=1;
while(1)
{ //后三位可显示温度
P3=0x01;
P1=tab[display[3]]&cover1; //显示0.01秒位,或显示秒个位,或显示日期位
dlms(1);
P3=0x02;
P1=tab[display[2]]&cover1; //显示0.1秒位,或显示秒十位,或显示日期位
dlms(1);
P3=0x04;
P1=tab[display[1]]&cover2; //显示秒个位,或显示分个位,或显示月份位
dlms(1);
P3=0x08;
P1=tab[display[0]]&cover2; //显示秒十位,或显示分十位,或显示月份位
dlms(1);
P3=0x10;
P1=tab[display[4]]&cover3; //显示分位,或显示时个位,或显示星期位
dlms(1);
P3=0x20;
P1=tab[display[5]]&cover3; //显示分十位,或显示时十位
dlms(1);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -