||
//本程序實現測溫+萬年歷顯示;
#include <reg51.h>
#include <intrins.h>
#include<absacc.H>
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
sbit DS1302_CLK = P3^5;
sbit DS1302_IO = P3^6;
sbit DS1302_RST = P3^7;
sbit xing = P3^4;
sbit shanshuo = P1^0;
sbit jia = P1^1;
sbit jian = P1^2;
sbit DQ=P1^5;
sbit wei1=P1^6;
sbit wei2=P1^7;
sbit nao=P1^4;
sbit xa=P1^3;
uchar shanshuobz,jiabz, jianbz,flag,shanbz,naobz,naozhong;
uchar num=0,x,t1;
uchar tab[13];
uchar naotab[6];
uchar naobj[3],naojs,nz;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
float tp;
uchar disptab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c};
uchar dispbuf[6];
unsigned char second,minute,hour,week,day,month,year,temp,t,t1,flag,shi,ge; //秒、分、時、星期、日、月、年
unsigned char time[]={0x22,0x12,0x31,0x06,0x23,0x59,0x45}; //初始時間數組11年12月31日23點59分45秒
void delay(uchar z)
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void InputByte(unsigned char byte1)
{ unsigned char i; // 向DS1302送一字節數據子程序
ACC=byte1;
for(i=8;i>0;i--)
{
DS1302_IO=ACC0;
DS1302_CLK=1;
DS1302_CLK=0;
ACC=ACC>>1;
}
return;
}
unsigned char OutputByte()
{ // 讀DS1302一個字節子程序
unsigned char i;
for(i=8;i>0;i--)
{ ACC=ACC>>1;
ACC7=DS1302_IO;
DS1302_CLK=1;
DS1302_CLK=0;
}
return(ACC);
}
void write_ds1302(unsigned char addr,unsigned char TDat)
{
DS1302_RST=0; // 向DS1302某地址寫一字節數據子程序
_nop_();
DS1302_CLK=0;
_nop_();
DS1302_RST=1;
InputByte(addr);
_nop_();
InputByte(TDat);
DS1302_CLK=1;
_nop_();
DS1302_RST=0;
}
unsigned char read_ds1302(unsigned char addr)
{ // 讀DS1302地址子程序
unsigned char timedata,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);
}
void initial_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); //寫保護寄存器
}
void read_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); //年
}
void fenli(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];
}
}
void display()
{ uchar a,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;
}
void numjia(void)
{
switch(num)
{
case 0:
{;}break;
case 1:
{ 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;
case 2:
{ 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;
case 3:
{ 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;
case 4:
{ 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;
case 5:
{ 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;
case 6:
{ 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;
case 7:
{ 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;
}
}
void numjian(void)
{
switch(num)
{
case 0:
{;}break;
case 1:
{ 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;
case 2:
{ 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;
case 3:
{ 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;
case 4:
{ 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;
case 5:
{ 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;
case 6:
{ 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;
case 7:
{ 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;
}
}
void naojia(void)
{
switch(num)
{
case 0:
{;}break;
case 1:
{ naobj[0]++;
if(naobj[0]==24)
{ naobj[0]=0;}
}break;
case 2:
{ naobj[1]++;
if(naobj[1]==60)
{ naobj[1]=0;}
}break;
case 3:
{ naobj[2]++;
if(naobj[2]==60)
{ naobj[2]=0;}
}break;
}
}
void naojian(void)
{
switch(num)
{
case 0:
{;}break;
case 1:
{ naobj[0]--;
if(naobj[0]==255)
{ naobj[0]=24;}
}break;
case 2:
{ naobj[1]--;
if(naobj[1]==255)
{ naobj[1]=60;}
}break;
case 3:
{ naobj[2]--;
if(naobj[2]==255)
{ naobj[2]=60;}
}break;
}
}
void key(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;
}
}
void delayx(uint i)
{
while(i--);
}
void DelayMS(uint ms)
{
uchar i;
while(ms--) for(i=0;i<120;i++);
}
void displaydq(int k)//數碼管顯示
{
wei1=0;
P0=disptab[k/10];
DelayMS(5);
wei1=1;
P0=0x00;
wei2=0;
P0=disptab[k%10];
DelayMS(5);
wei2=1;
P0=0x00;
}
void init_DS(void)
{
uchar x=0;
DQ=1;
delayx(8);
DQ=0;
delayx(85);
DQ=1;
delayx(14);
x=DQ;
delayx(20);
}
Read(void)
{
uchar i=0;
uchar dat=0;
for(i=8;i>0;i--)
{
DQ=0;
dat>>=1;
DQ=1;
if(DQ)
dat|=0x80;
delayx(4);
}
return(dat); }
void write(uchar dat)
{ uchar i=0;
for(i=8;i>0;i--)
{ DQ=0;
DQ=dat&0x01;
delayx(5);
DQ=1;
dat>>=1;}
delayx(4);}
Readtem(void)
{ uchar a=0;
uchar b=0;
uchar t=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);
}
void fenlinao(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]=disptab[naobj[1]/10];
naotab[3]=disptab[naobj[1]%10];
}
}
else
{
naotab[2]=disptab[naobj[1]/10];
naotab[3]=disptab[naobj[1]%10]; }
if(num==3)
{if(shanshuobz==0)
{naotab[4]=0x00;
naotab[5]=0x00;
}
else
{
naotab[4]=disptab[naobj[2]/10];
naotab[5]=disptab[naobj[2]%10];
}
}
else
{
naotab[4]=disptab[naobj[2]/10];
naotab[5]=disptab[naobj[2]%10]; }
}
void naodisp(void)
{
uchar a,b=0xfb;
for(a=0;a<6;a++)
{ P2=b;
P0=naotab[a];
delay(10);
b=_crol_(b,1);
P2=0xff;
P0=0x00;
} }
void naozhongsz(void)
{
if(naobj[0]==hour)
{ if(naobj[1]==minute)
{ if(naobj[2]==second)
{ xa=0;
nz=1;}
} }
if(minute==0)
{ if(second<=2)
{ xa=0;
}
else
{xa=1;}
}
else
{xa=1;} }
void panshi(void)
{
if(nz==1)
{ naojs++;
if(naojs==100)
{ naojs=0;
xa=1;
nz=0; }
} }
void main() //主程序
{ uchar dat=0;
num=0;
temp=0;
x=0;
nz=0;
xa=1;
naozhong=0;
shanshuobz=0;
initial_ds1302(); //時鐘芯片初始化 DS1302
while(1)
{ dat++;
key();
read_time();
panshi();
naozhongsz();
if(naozhong==0)
{fenli();
display();}
else
{fenlinao();
naodisp();}
displaydq(tp);
if(dat==10)
{dat=0;
tp=Readtem();
shanshuobz=~shanshuobz;
} }
}