main.c
#include<stc15f2k60s2.h>
#include<ds1302.h>
#include<onewire.h>
unsigned char code smgduan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};
unsigned char smgbuffer[8];
unsigned char smgcom;
unsigned char keytt;
unsigned int wendutt;
unsigned int smgshantt;
unsigned char mode;
unsigned char gap=1;
unsigned long gaptt=0;
bit shanflag,gapflag;
unsigned char wendu;
unsigned char shuju[10]; unsigned char i;
unsigned char cishu;
bit LEDkaishi,LEDflag;
void display();
void keyscan();
void Timer1Init(void)
{
AUXR |= 0x40;
TMOD &= 0x0F;
TL1 = 0x20;
TH1 = 0xD1;
TF1 = 0;
TR1 = 1;
ET1=1;
EA=1;
}
void Timer1() interrupt 3
{
unsigned char LEDtt;
unsigned char P0_kepper=0,P2_kepper=0;
P0_kepper=P0; P2_kepper=P2; P2=P2&0x1f;
display();
keytt++; if(keytt==10) {keytt=0; keyscan();}
smgshantt++; if(smgshantt==1000) {smgshantt=0; shanflag=~shanflag;}
if(mode==1)
{
gaptt++;
if(gaptt==gap*1000){gaptt=0; gapflag=1;}
}
if(LEDkaishi==1)
{
LEDtt++; if(LEDtt==100){LEDtt=0; LEDflag=~LEDflag;}
}
P0=P0_kepper; P2=P2_kepper;
}
void display()
{
P0=0xff; P2=P2&0x1f|0xc0; P2=P2&0x1f;
P0=0xff; P2=P2&0x1f|0xe0; P2=P2&0x1f;
P0=1<<smgcom; P2=P2&0x1f|0xc0; P2=P2&0x1f;
P0=smgduan[smgbuffer[smgcom++]]; P2=P2&0x1f|0xe0; P2=P2&0x1f;
if(smgcom==8) smgcom=0;
}
void keyscan()
{
unsigned char dat,trg,cnt;
dat=P3^0xff;
trg=dat&(dat^cnt);
cnt=dat;
if(trg&0x01){mode=0;}
else if(trg&0x02){LEDflag=0; LEDkaishi=0; cishu++; if(cishu==10) cishu=9;}
else if(trg&0x04) mode=1;
else if(trg&0x08 && mode==0)
{
if(gap==1) gap=5;
else if(gap==5) gap=30;
else if(gap==30) gap=60;
else if(gap==60) gap=1;
}
}
void wenduwending()
{
unsigned char Ti;
for(Ti=0;Ti<70;Ti++)
{
temp=tempget()*100+0.5;
}
}
void wenduxianshi()
{
if(gapflag==1)
{
temp=tempget()*100+0.5;
wendu=(temp/1000)*10+(temp/1000%100);
gapflag=0;
shuju[i]=wendu;
i++; if(i==10) mode=2;
LEDkaishi=1;
}
}
void xianshi()
{
if(mode==0)
{
smgbuffer[0]=smgbuffer[1]=smgbuffer[2]=smgbuffer[3]=smgbuffer[4]=11;
smgbuffer[5]=10;
smgbuffer[6]=gap/10; smgbuffer[7]=gap%10;
}
else if(mode==1)
{
DS_get();
smgbuffer[0]=shijian[2]/10; smgbuffer[1]=shijian[2]%10;
smgbuffer[3]=shijian[1]/10; smgbuffer[4]=shijian[1]%10;
smgbuffer[6]=shijian[0]/10; smgbuffer[7]=shijian[0]%10;
if(shanflag==0) smgbuffer[2]=smgbuffer[5]=10;
else if(shanflag==1) smgbuffer[2]=smgbuffer[5]=11;
}
else if(mode==2)
{
smgbuffer[0]=smgbuffer[5]=10;
smgbuffer[3]=smgbuffer[4]=11;
smgbuffer[1]=cishu/10; smgbuffer[2]=cishu%10;
smgbuffer[6]=shuju[cishu]/10;
smgbuffer[7]=shuju[cishu]%10;
}
}
void LED()
{
if(mode==2)
{
if(LEDflag==0) {P00=1; P2=P2&0x1f|0x80; P2=P2&0x1f;}
else if(LEDflag==1) {P00=0; P2=P2&0x1f|0x80; P2=P2&0x1f;}
}
}
void main()
{
P0=0x00; P2=P2&0x1f|0xa0; P2=P2&0x1f;
P0=0xff; P2=P2&0x1f|0x80; P2=P2&0x1f;
DS_init();
wenduwending();
Timer1Init();
while(1)
{
wenduxianshi();
xianshi();
LED();
}
}
onewire.c
#include "stc15f2k60s2.h"
sbit DQ = P1^4;
void Delay_OneWire(unsigned int t);
void Write_DS18B20(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
DQ = 0;
DQ = dat&0x01;
Delay_OneWire(5);
DQ = 1;
dat >>= 1;
}
Delay_OneWire(5);
}
unsigned char Read_DS18B20(void)
{
unsigned char i;
unsigned char dat;
for(i=0;i<8;i++)
{
DQ = 0;
dat >>= 1;
DQ = 1;
if(DQ)
{
dat |= 0x80;
}
Delay_OneWire(5);
}
return dat;
}
bit init_ds18b20(void)
{
bit initflag = 0;
DQ = 1;
Delay_OneWire(12);
DQ = 0;
Delay_OneWire(80);
DQ = 1;
Delay_OneWire(10);
initflag = DQ;
Delay_OneWire(5);
return initflag;
}
void Delay_OneWire(unsigned int t)
{
t=t*12;
while(t--);
}
float tempget()
{
float temp;
unsigned char low,high;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
Delay_OneWire(200);
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
low=Read_DS18B20();
high=Read_DS18B20();
temp=(high<<8|low)*0.0625;
return temp;
}
ds1302.c
#include <stc15f2k60s2.h>
#include <intrins.h>
sbit SCK=P1^7;
sbit SDA=P2^3;
sbit RST = P1^3;
unsigned char shijian[]={50,59,23,0,0,0,0};
void Write_Ds1302(unsigned char temp)
{
unsigned char i;
for (i=0;i<8;i++)
{
SCK=0;
SDA=temp&0x01;
temp>>=1;
SCK=1;
}
}
void Write_Ds1302_Byte( unsigned char address,unsigned char dat )
{
RST=0; _nop_();
SCK=0; _nop_();
RST=1; _nop_();
Write_Ds1302(address);
Write_Ds1302((dat/10<<4)|(dat%10));
RST=0;
}
unsigned char Read_Ds1302_Byte ( unsigned char address )
{
unsigned char i,temp=0x00;
unsigned char dat1,dat2;
RST=0; _nop_();
SCK=0; _nop_();
RST=1; _nop_();
Write_Ds1302(address);
for (i=0;i<8;i++)
{
SCK=0;
temp>>=1;
if(SDA)
temp|=0x80;
SCK=1;
}
RST=0; _nop_();
SCK=0; _nop_();
SCK=1; _nop_();
SDA=0; _nop_();
SDA=1; _nop_();
dat1=temp/16;
dat2=temp%16;
temp=dat1*10+dat2;
return (temp);
}
void DS_init()
{
unsigned char i,add;
add=0x80;
Write_Ds1302_Byte(0x8e,0x00);
for(i=0;i<7;i++)
{
Write_Ds1302_Byte(add,shijian[i]);
add=add+2;
}
Write_Ds1302_Byte(0x8e,0x80);
}
void DS_get()
{
unsigned char i,add;
add=0x81;
Write_Ds1302_Byte(0x8e,0x00);
for(i=0;i<7;i++)
{
shijian[i]=Read_Ds1302_Byte(add);
add=add+2;
}
Write_Ds1302_Byte(0x8e,0x80);
}