main.c
#include"stc15f2k60s2.h"
#include"ds1302.h"
#include"onewire.h"
#include"iic.h"
unsigned char code smgduan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xc0&0x7f,0xf9&0x7f,0xa4&0x7f,0xb0&0x7f,0x99&0x7f,0x92&0x7f,0x82&0x7f,0xf8&0x7f,0x80&0x7f,0x90&0x7f,0xbf,~0x39,~0x79,~0x73,0xff};
unsigned char smgbuffer[8];
unsigned char smgcom,keytt,ADtt;
unsigned int wendutt;
unsigned int guangttt; bit flag;
bit mode;
unsigned char moshi;
unsigned char guang; bit guangmode;
char shijiancanshu=17,wenducanshu=25,dengcanshu=4;
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 P0_keeper=0,P2_keeper=0;
P0_keeper=P0; P2_keeper=P2; P2=P2&0x1f;
wendutt++;
ADtt++;
keytt++; if(keytt==10) {keyscan(); keytt=0;}
display();
if(guangmode==1) {guangttt++; if(guangttt==3000){guangttt=0; flag=1;}}
else if(guangmode==0) {guangttt=0; flag=0;}
P0=P0_keeper; P2=P2_keeper;
}
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()
{
static unsigned char keystat=0;
unsigned char key_x=0,key_y=0,key_z=0;
P4=0x00; P3=0x0f;
if(!P30) key_x=3;
else if(!P31) key_x=2;
else if(!P32) key_x=1;
else if(!P33) key_x=0;
P4=0xff; P3=0xf0;
if(!P34) key_y=4;
else if(!P35) key_y=3;
else if(!P42) key_y=2;
else if(!P44) key_y=1;
key_z=key_x+key_y*4;
switch(keystat)
{
case 0:if(key_z!=0) keystat=1; break;
case 1:if(key_z==0) keystat=0;
else
{
keystat=2;
switch(key_z)
{
case 5:moshi++;if(moshi==3)moshi=0; break;
case 4:mode=~mode; break;
case 8:
if(mode==1 && moshi==0)
{
shijiancanshu--;
if(shijiancanshu==-1)shijiancanshu=0;
}
else if(mode==1 && moshi==1)
{
wenducanshu--;
if(wenducanshu==-1)wenducanshu=0;
}
else if(mode==1 && moshi==2)
{
dengcanshu--;
if(dengcanshu==3)dengcanshu=4;
}
break;
case 9:
if(mode==1 && moshi==0)
{
shijiancanshu++;
if(shijiancanshu==24)shijiancanshu=23;
}
else if(mode==1 && moshi==1)
{
wenducanshu++;
if(wenducanshu==100)wenducanshu=99;
}
else if(mode==1 && moshi==2)
{
dengcanshu++;
if(dengcanshu==9)dengcanshu=8;
}
break;
}
}break;
case 2:if(key_z==0) keystat=0; break;
}
}
void wenduwengding()
{
unsigned char Ti;
for(Ti=0;Ti<70;Ti++)
{
temp=tempget()*100+0.5;
}
}
void wenduhuoqu()
{
if(wendutt==500)
{
wendutt=0;temp=tempget()*100+0.5;
wendutt=0;
}
}
void ADC()
{
if(ADtt==200)
{
guang=AD_read(0x01);
ADtt=0;
}
if(guang>=120) guangmode=0;
else if(guang<120) guangmode=1;
}
void xianshi()
{
if(mode==0)
{
if(moshi==0)
{
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;
smgbuffer[2]=smgbuffer[5]=20;
}
else if(moshi==1)
{
smgbuffer[0]=21;
smgbuffer[5]=temp/1000;
smgbuffer[6]=temp%1000/100+10;
smgbuffer[7]=temp%1000%100/10;
smgbuffer[1]=smgbuffer[2]=smgbuffer[3]=smgbuffer[4]=24;
}
else if(moshi==2)
{
smgbuffer[0]=22;
smgbuffer[1]=24;
smgbuffer[2]=(unsigned int)(guang*1.96+0.5)/100+10;
smgbuffer[3]=(unsigned int)(guang*1.96+0.5)%100/10;
smgbuffer[4]=(unsigned int)(guang*1.96+0.5)%10;
smgbuffer[7]=guangmode;
smgbuffer[5]=smgbuffer[6]=24;
}
}
else if(mode==1)
{
if(moshi==0)
{
smgbuffer[0]=23;
smgbuffer[1]=1;
smgbuffer[2]=smgbuffer[3]=smgbuffer[4]=smgbuffer[5]=24;
smgbuffer[6]=shijiancanshu/10;
smgbuffer[7]=shijiancanshu%10;
}
else if(moshi==1)
{
smgbuffer[0]=23;
smgbuffer[1]=2;
smgbuffer[2]=smgbuffer[3]=smgbuffer[4]=smgbuffer[5]=24;
smgbuffer[6]=wenducanshu/10;
smgbuffer[7]=wenducanshu%10;
}
else if(moshi==2)
{
smgbuffer[0]=23;
smgbuffer[1]=3;
smgbuffer[2]=smgbuffer[3]=smgbuffer[4]=smgbuffer[5]=smgbuffer[6]=24;
smgbuffer[7]=dengcanshu;
}
}
}
void LED()
{
if(shijiancanshu<8)
{
if(shijiancanshu<=shijian[2]<8) P00=0;
else P00=1;
}
else if(shijiancanshu>=8)
{
if(shijiancanshu<=shijian[2]<=24) P00=0;
else P00=1;
}
if(temp/1000*10+temp%1000/100<wenducanshu) P01=0;
else if(temp/1000*10+temp%1000/100>=wenducanshu) P01=1;
if(flag==1) P02=0;
else if(flag==0) P02=1;
if(guangmode==1 && dengcanshu==4) {P03=0; P04=1; P05=1; P06=1; P07=1;}
else if(guangmode==1 && dengcanshu==5) {P03=1; P04=0; P05=1; P06=1; P07=1;}
else if(guangmode==1 && dengcanshu==6) {P03=1; P04=1; P05=0; P06=1; P07=1;}
else if(guangmode==1 && dengcanshu==7) {P03=1; P04=1; P05=1; P06=0; P07=1;}
else if(guangmode==1 && dengcanshu==8) {P03=1; P04=1; P05=1; P06=1; P07=0;}
else if(guangmode==0) {P03=1; P04=1; P05=1; P06=1; P07=1;}
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;
wenduwengding();
DS_init();
Timer1Init();
while(1)
{
ADC();
wenduhuoqu();
xianshi();
LED();
}
}
onwire.c
#include "reg52.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 <reg52.h>
#include <intrins.h>
sbit SCK=P1^7;
sbit SDA=P2^3;
sbit RST = P1^3;
char shijian[]={50,59,16,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);
}
iic.c
#include "reg52.h"
#include "intrins.h"
#define DELAY_TIME 5
#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1
sbit SDA = P2^1;
sbit SCL = P2^0;
void IIC_Delay(unsigned char i)
{
do{_nop_();}
while(i--);
}
void IIC_Start(void)
{
SDA = 1;
SCL = 1;
IIC_Delay(DELAY_TIME);
SDA = 0;
IIC_Delay(DELAY_TIME);
SCL = 0;
}
void IIC_Stop(void)
{
SDA = 0;
SCL = 1;
IIC_Delay(DELAY_TIME);
SDA = 1;
IIC_Delay(DELAY_TIME);
}
bit IIC_WaitAck(void)
{
bit ackbit;
SCL = 1;
IIC_Delay(DELAY_TIME);
ackbit = SDA;
SCL = 0;
IIC_Delay(DELAY_TIME);
return ackbit;
}
void IIC_SendByte(unsigned char byt)
{
unsigned char i;
for(i=0; i<8; i++)
{
SCL = 0;
IIC_Delay(DELAY_TIME);
if(byt & 0x80) SDA = 1;
else SDA = 0;
IIC_Delay(DELAY_TIME);
SCL = 1;
byt <<= 1;
IIC_Delay(DELAY_TIME);
}
SCL = 0;
IIC_WaitAck();
}
unsigned char IIC_RecByte(void)
{
unsigned char i, da;
for(i=0; i<8; i++)
{
SCL = 1;
IIC_Delay(DELAY_TIME);
da <<= 1;
if(SDA) da |= 1;
SCL = 0;
IIC_Delay(DELAY_TIME);
}
IIC_WaitAck();
return da;
}
unsigned char AD_read(unsigned char add)
{
unsigned char AD_temp;
IIC_Start();
IIC_SendByte(0x90);
IIC_SendByte(add);
IIC_Start();
IIC_SendByte(0x91);
AD_temp=IIC_RecByte();
IIC_Stop();
return AD_temp;
}