测温+万年历.docx
《测温+万年历.docx》由会员分享,可在线阅读,更多相关《测温+万年历.docx(27页珍藏版)》请在冰豆网上搜索。
测温+万年历
//本程序实现测温+万年历显示;
#include
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitDS1302_CLK=P3^5;
sbitDS1302_IO=P3^6;
sbitDS1302_RST=P3^7;
sbitxing=P3^4;
sbitshanshuo=P1^0;
sbitjia=P1^1;
sbitjian=P1^2;
sbitDQ=P1^5;
sbitwei1=P1^6;
sbitwei2=P1^7;
sbitnao=P1^4;
sbitxa=P1^3;
ucharshanshuobz,jiabz,jianbz,flag,shanbz,naobz,naozhong;
ucharnum=0,x,t1;
uchartab[13];
ucharnaotab[6];
ucharnaobj[3],naojs,nz;
sbitACC0=ACC^0;
sbitACC7=ACC^7;
floattp;
uchardisptab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c};
uchardispbuf[6];
unsignedcharsecond,minute,hour,week,day,month,year,temp,t,t1,flag,shi,ge;//秒、分、时、星期、日、月、年
unsignedchartime[]={0x22,0x12,0x31,0x06,0x23,0x59,0x45};//初始时间数组11年12月31日23点59分45秒
voiddelay(ucharz)
{
ucharx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidInputByte(unsignedcharbyte1)
{unsignedchari;//向DS1302送一字节数据子程序
ACC=byte1;
for(i=8;i>0;i--)
{
DS1302_IO=ACC0;
DS1302_CLK=1;
DS1302_CLK=0;
ACC=ACC>>1;
}
return;
}
unsignedcharOutputByte()
{//读DS1302一个字节子程序
unsignedchari;
for(i=8;i>0;i--)
{ACC=ACC>>1;
ACC7=DS1302_IO;
DS1302_CLK=1;
DS1302_CLK=0;
}
return(ACC);
}
voidwrite_ds1302(unsignedcharaddr,unsignedcharTDat)
{
DS1302_RST=0;//向DS1302某地址写一字节数据子程序
_nop_();
DS1302_CLK=0;
_nop_();
DS1302_RST=1;
InputByte(addr);
_nop_();
InputByte(TDat);
DS1302_CLK=1;
_nop_();
DS1302_RST=0;
}
unsignedcharread_ds1302(unsignedcharaddr)
{//读DS1302地址子程序
unsignedchartimedata,kk;
DS1302_RST=0;
_nop_();
DS1302_CLK=0;
_nop_();
DS1302_RST=1;
InputByte(addr);
timedata=OutputByte();
DS1302_CLK=1;
_nop_();
DS1302_RST=0;
kk=timedata>>4;
kk=kk*10+(timedata&=0x0f);
return(kk);
}
voidinitial_ds1302()//初始化DS1302子程序
{
write_ds1302(0x8e,0x00);//写保护寄存器,在对时钟或RAM写前WP一定要为0
write_ds1302(0x8c,time[0]);//年
write_ds1302(0x88,time[1]);//月
write_ds1302(0x86,time[2]);//日
write_ds1302(0x8A,time[3]);//星期
write_ds1302(0x84,time[4]);//时
write_ds1302(0x82,time[5]);//分
write_ds1302(0x80,time[6]);//秒
write_ds1302(0x8e,0x80);//写保护寄存器
}
voidread_time()
{//读DS1302时间子程序
second=read_ds1302(0x81);//秒寄存器
minute=read_ds1302(0x83);//分
hour=read_ds1302(0x85);//时
week=read_ds1302(0x8B);//星期
day=read_ds1302(0x87);//日
month=read_ds1302(0x89);//月
year=read_ds1302(0x8d);//年
}
voidfenli(void)
{
if(num==1)
{if(shanshuobz==0)
{tab[0]=0x00;
tab[1]=0x00;
}
else
{
tab[0]=disptab[year/10];
tab[1]=disptab[year%10];
}
}
else
{
tab[0]=disptab[year/10];
tab[1]=disptab[year%10];}
if(num==2)
{if(shanshuobz==0)
{tab[2]=0x00;
tab[3]=0x00;
}
else
{
tab[2]=disptab[month/10];
tab[3]=disptab[month%10];
}
}
else
{
tab[2]=disptab[month/10];
tab[3]=disptab[month%10];}
if(num==3)
{if(shanshuobz==0)
{tab[4]=0x00;
tab[5]=0x00;
}
else
{
tab[4]=disptab[day/10];
tab[5]=disptab[day%10];
}
}
else
{
tab[4]=disptab[day/10];
tab[5]=disptab[day%10];}
if(num==4)
{if(shanshuobz==0)
{tab[6]=0x00;
tab[7]=0x00;
}
else
{
tab[6]=disptab[hour/10];
tab[7]=disptab[hour%10];
}
}
else
{
tab[6]=disptab[hour/10];
tab[7]=disptab[hour%10];}
if(num==5)
{if(shanshuobz==0)
{tab[8]=0x00;
tab[9]=0x00;
}
else
{
tab[8]=disptab[minute/10];
tab[9]=disptab[minute%10];
}
}
else
{
tab[8]=disptab[minute/10];
tab[9]=disptab[minute%10];}
if(num==6)
{if(shanshuobz==0)
{tab[10]=0x00;
tab[11]=0x00;
}
else
{
tab[10]=disptab[second/10];
tab[11]=disptab[second%10];
}
}
else
{
tab[10]=disptab[second/10];
tab[11]=disptab[second%10];}
if(num==7)
{if(shanshuobz==0)
{tab[12]=0x00;
}
else
{
tab[12]=disptab[week];
}
}
else
{
tab[12]=disptab[week];
}
}
voiddisplay()
{uchara,b=0xfe,c=0xfe;
for(a=4;a<12;a++)
{P2=b;
P0=tab[a];
delay(10);
b=_crol_(b,1);
P2=0xff;
P0=0x00;
}
for(a=0;a<4;a++)
{
P3=c;
P0=tab[a];
delay(10);
c=_crol_(c,1);
P3=0xff;
P0=0x00;
}
xing=0;
P0=tab[12];
delay(10);
xing=1;
P0=0x00;
}
voidnumjia(void)
{
switch(num)
{
case0:
{;}break;
case1:
{year++;
if(year==100)
{year=0;}
t1=year/10*16+year%10;
write_ds1302(0x8e,0x00);
write_ds1302(0x8c,0x00|t1);//year数据写入DS1302
write_ds1302(0x8e,0x80);}break;
case2:
{month++;
if(month==13)
{month=1;}
t1=month/10*16+month%10;
write_ds1302(0x8e,0x00);
write_ds1302(0x88,0x00|t1);//month数据写入DS1302
write_ds1302(0x8e,0x80);;}break;
case3:
{day++;
if(day==32)
{day=1;}
t1=day/10*16+day%10;
write_ds1302(0x8e,0x00);
write_ds1302(0x86,0x00|t1);//day数据写入DS1302
write_ds1302(0x8e,0x80);;}break;
case4:
{hour++;
if(hour==24)
{hour=0;}
t1=hour/10*16+hour%10;
write_ds1302(0x8e,0x00);
write_ds1302(0x84,0x00|t1);//hour数据写入DS1302
write_ds1302(0x8e,0x80);;}break;
case5:
{minute++;
if(minute==60)
{minute=0;}
t1=minute/10*16+minute%10;
write_ds1302(0x8e,0x00);
write_ds1302(0x82,0x00|t1);//minute数据写入DS1302
write_ds1302(0x8e,0x80);;}break;
case6:
{second++;
if(second==60)
{second=0;}
t1=second/10*16+second%10;
write_ds1302(0x8e,0x00);
write_ds1302(0x80,0x00|t1);//second数据写入DS1302
write_ds1302(0x8e,0x80);;}break;
case7:
{week++;
if(week==8)
{week=1;}
t1=week/10*16+week%10;
write_ds1302(0x8e,0x00);
write_ds1302(0x8a,0x00|t1);//week数据写入DS1302
write_ds1302(0x8e,0x80);;}break;
default:
break;
}
}
voidnumjian(void)
{
switch(num)
{
case0:
{;}break;
case1:
{year=year-1;
if(year==0)
{year=100;}
t1=year/10*16+year%10;
write_ds1302(0x8e,0x00);
write_ds1302(0x8c,0x00|t1);//year数据写入DS1302
write_ds1302(0x8e,0x80);}break;
case2:
{month--;
if(month==0)
{month=12;}
t1=month/10*16+month%10;
write_ds1302(0x8e,0x00);
write_ds1302(0x88,0x00|t1);//month数据写入DS1302
write_ds1302(0x8e,0x80);;}break;
case3:
{day--;
if(day==0)
{day=31;}
t1=day/10*16+day%10;
write_ds1302(0x8e,0x00);
write_ds1302(0x86,0x00|t1);//day数据写入DS1302
write_ds1302(0x8e,0x80);;}break;
case4:
{hour--;
if(hour==255)
{hour=23;}
t1=hour/10*16+hour%10;
write_ds1302(0x8e,0x00);
write_ds1302(0x84,0x00|t1);//hour数据写入DS1302
write_ds1302(0x8e,0x80);;}break;
case5:
{minute--;
if(minute==255)
{minute=59;}
t1=minute/10*16+minute%10;
write_ds1302(0x8e,0x00);
write_ds1302(0x82,0x00|t1);//minute数据写入DS1302
write_ds1302(0x8e,0x80);;}break;
case6:
{second--;
if(second==255)
{second=59;}
t1=second/10*16+second%10;
write_ds1302(0x8e,0x00);
write_ds1302(0x80,0x00|t1);//second数据写入DS1302
write_ds1302(0x8e,0x80);;}break;
case7:
{week--;
if(week==0)
{week=7;}
t1=week/10*16+week%10;
write_ds1302(0x8e,0x00);
write_ds1302(0x8a,0x00|t1);//week数据写入DS1302
write_ds1302(0x8e,0x80);;}break;
default:
break;
}
}
voidnaojia(void)
{
switch(num)
{
case0:
{;}break;
case1:
{naobj[0]++;
if(naobj[0]==24)
{naobj[0]=0;}
}break;
case2:
{naobj[1]++;
if(naobj[1]==60)
{naobj[1]=0;}
}break;
case3:
{naobj[2]++;
if(naobj[2]==60)
{naobj[2]=0;}
}break;
}
}
voidnaojian(void)
{
switch(num)
{
case0:
{;}break;
case1:
{naobj[0]--;
if(naobj[0]==255)
{naobj[0]=24;}
}break;
case2:
{naobj[1]--;
if(naobj[1]==255)
{naobj[1]=60;}
}break;
case3:
{naobj[2]--;
if(naobj[2]==255)
{naobj[2]=60;}
}break;
}
}
voidkey(void)
{
if(shanshuo==0)
{
if(shanbz==0)
{shanbz=1;
num++;
if(naozhong==0)
{if(num==8)
{num=0;}
}
else
{if(num==4)
{num=0;}
}
}}
if(shanshuo!
=0)
{shanbz=0;}
if(jian==0)
{if(jianbz==0)
{jianbz=1;
if(naozhong==0)
{numjian();}
else
{naojian();}
}
}
if(jian!
=0)
{
jianbz=0;
}
if(jia==0)
{
if(jiabz==0)
{jiabz=1;
if(naozhong==0)
{numjia();}
else
{naojia();}
}
}
if(jia!
=0)
{
jiabz=0;
}
if(nao==0)
{
if(naobz==0)
{
naobz=1;
naozhong=~naozhong;
num=0;
}
}
if(nao!
=0)
{
naobz=0;
}
}
voiddelayx(uinti)
{
while(i--);
}
voidDelayMS(uintms)
{
uchari;
while(ms--)for(i=0;i<120;i++);
}
voiddisplaydq(intk)//数码管显示
{
wei1=0;
P0=disptab[k/10];
DelayMS(5);
wei1=1;
P0=0x00;
wei2=0;
P0=disptab[k%10];
DelayMS(5);
wei2=1;
P0=0x00;
}
voidinit_DS(void)
{
ucharx=0;
DQ=1;
delayx(8);
DQ=0;
delayx(85);
DQ=1;
delayx(14);
x=DQ;
delayx(20);
}
Read(void)
{
uchari=0;
uchardat=0;
for(i=8;i>0;i--)
{
DQ=0;
dat>>=1;
DQ=1;
if(DQ)
dat|=0x80;
delayx(4);
}
return(dat);}
voidwrite(uchardat)
{uchari=0;
for(i=8;i>0;i--)
{DQ=0;
DQ=dat&0x01;
delayx(5);
DQ=1;
dat>>=1;}
delayx(4);}
Readtem(void)
{uchara=0;
ucharb=0;
uchart=0,t1;
init_DS();
write(0xcc);
write(0x44);
delayx(125);
init_DS();
write(0xcc);
write(0xbe);
a=Read();
b=Read();
t1=(a&0x0f)*0.0625;
t=((b<<4)|(a>>4));
if(t>128)
{
t=~t+1;
}
t=t+t1;
return(t);
}
voidfenlinao(void)
{
if(num==1)
{if(shanshuobz==0)
{naotab[0]=0x00;
naotab[1]=0x00;
}
else
{
naotab[0]=disptab[naobj[0]/10];
naotab[1]=disptab[naobj[0]%10];
}
}
else
{
naotab[0]=disptab[naobj[0]/10];
naotab[1]=disptab[naobj[0]%10];}
if(num==2)
{if(shanshuobz==0)
{naotab[2]=0x00;
naotab[3]=0x00;
}
else
{
naotab[2]=dispt