main.c
#include<stc15f2k60s2.h>
#include<onewire.h>
unsigned char code smgduan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff,~0x39};
unsigned char smgbuffer[8];
unsigned char smgcom,keytt;
unsigned char mode=1;
bit xianshimode=0;
char shengyu=0;
unsigned char shijianmode=0;
bit wenduflag;
float zhankong;
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_kepper=0,P2_kepper=0;
float ttt;
int wendutt;
P0_kepper=P0; P2_kepper=P2; P2=P2&0x1f;
display();
keytt++; if(keytt==10) {keytt=0; keyscan();}
wendutt++; if(wendutt==500){wendutt=0; wenduflag=1;}
if(shijianmode==0) shengyu=0;
else if(shijianmode==1){ttt++;if(ttt==1000){ttt=0;shengyu--;if(shengyu==-1)shengyu=0;}}
else if(shijianmode==2){ttt++;if(ttt==1000){ttt=0;shengyu--;if(shengyu==-1)shengyu=0;}}
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){xianshimode=~xianshimode;}
else if(trg&0x02){shengyu=0;shijianmode=0;}
else if(trg&0x04)
{
shijianmode++;
if(shijianmode==3){shijianmode=0;}
if(shijianmode==0) shengyu=0;
else if(shijianmode==1) shengyu=60;
else if(shijianmode==2) shengyu=120;
}
else if(trg&0x08){mode++; if(mode==4) mode=1;}
}
void wenduwending()
{
unsigned char Ti;
for(Ti=0;Ti<70;Ti++)
{
temp=tempget()*100+0.5;
}
}
void wenduhuoqu()
{
if(wenduflag==1)
{
wenduflag=0;
temp=tempget()*100+0.5;
}
}
void xianshi()
{
if(xianshimode==0)
{
smgbuffer[0]=smgbuffer[2]=10;
smgbuffer[1]=mode;
smgbuffer[3]=11;smgbuffer[4]=0;
smgbuffer[5]=shengyu/100;
smgbuffer[6]=shengyu%100/10;
smgbuffer[7]=shengyu%10;
}
else if(xianshimode==1)
{
smgbuffer[0]=smgbuffer[2]=10;
smgbuffer[1]=4;
smgbuffer[3]=11;smgbuffer[4]=11;
smgbuffer[5]=temp/1000;
smgbuffer[6]=temp%1000/100;
smgbuffer[7]=12;
}
}
void LED()
{
if(shengyu!=0)
{
if(mode==1) {P0=0xfe; P2=P2&0x1f|0x80; P2=P2&0x1f;}
else if(mode==2) {P0=0xfd; P2=P2&0x1f|0x80; P2=P2&0x1f;}
else if(mode==3) {P0=0xfb; P2=P2&0x1f|0x80; P2=P2&0x1f;}
}
else if(shengyu==0)
{
P0=0xff; P2=P2&0x1f|0x80; P2=P2&0x1f;
}
}
void PWM
{
if(mode==1) zahnkong=0.2;
else if(mode==2) zhankong=0.3;
else if(mode==3) zhankong=0.7;
}
void main()
{
P0=0x00; P2=P2&0x1f|0xa0; P2=P2&0x1f;
P0=0xff; P2=P2&0x1f|0x80; P2=P2&0x1f;
wenduwending();
Timer1Init();
while(1)
{
xianshi();
wenduhuoqu();
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;
}