#include"reg52.h"
#include"intrins.h"
#include"math.h"
#define uchar unsigned char
#define uint unsigned int
#define Lcd_Data P0
uchar code dispbuf[33]={"Temperature:`CSX: `C XX: `C"};
uchar numcode[10]={'0','1','2','3','4','5','6','7','8','9'};
uint num[30]={0};
uchar count=0;//10秒記次數
sbit RS=P2^0;//lcdrs
sbit RW=P2^1;//lcdrw
sbit E=P2^2;//lcde
sbit Busy=P0^7;//lcd忙
sbit LED=P3^4;
sbit BUZZER=P3^5;
sbit jidianqi=P3^6;
sbit K0=P1^0;
sbit K1=P1^1;
sbit ON=P1^2;
sbit OFF=P1^3;
uchar bdata flag;
sbit DQ =P2^7;
uint temp,shangxian,xiaxian,xianwen;
void delay(void);
void Init_LCD(void);
void Write_Comm(uchar);
void Write_Data(uchar);
void Read_Busy(void);
void Init_18B20(void);
uchar ReadOneChar(void);
void WriteOneChar(uchar dat);
void tessttemp(void);
uint wd(void);
void Delay(uint time);
sbit sta_flag=flag^0;
sbit fuhao=flag^1;
void timer1(void);
void delay1ms(void);
void sys_init(void);
void display(void);
void hextobcd(bit flag,uchar num);
void bm(void);
void delay15(uchar us);
void keyscan(void);
void delay3(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main(void)
{LED=0;
BUZZER=0;
shangxian=99,xiaxian=5;
delay1ms();
sys_init();
delay1ms();
TR0=1;
ET0=1;
testtemp();
while(!ON)
{
if(OFF==0) break;
while(1)
{if(OFF==0)break;
xianwen=temp*0.0625;
keyscan();
if(15==count)
{
temp=wd();
count=0;
testtemp();
display();
}
hextobcd();
if(xianwen<xiaxian)
{
LED=1;
jidianqi=0;
}
if(xianwen>=shangxian)
{LED=0;
jidianqi=1;
BUZZER=1;
delay3(5);
BUZZER=0;
}
}
}
Write_Comm(0x01);
}
void keyscan()
{uchar num;
if(K0=0)
{delay3(150);
if(K0=0)
{
num++;
if(num==5)num=0;
}
}
if(K1==0)
{delay3(150);
if(num==0)
{xiaxian++;
if(xiaxian==50)
xiaxian=5;
}
}
}
void timer0(void)interrupt 1 using 0
{
TH0=0x15;
TL0=0xA0;
TH1=0;
TL1=0;
count++;
_nop_();
_nop_();
_nop_();
_nop_();
}
void sys_init(void)
{
uchar i;
for(i=0;i<29;i++)
{
num[i]=0;}
TMOD=0x11;
TH0=0x15;
TL0=0xA0;
P0=0;
EA=1;
}
void hextobcd(void)
{
float tp;
unsigned long int tmp;
fuhao=0;
if(temp<0x8000)
tp=temp*0.0625;
else
{
bm();
tp=temp*0.0625;
fuhao=1;
}
tp*=10;
tmp=tp;
num[12]=tmp/100;
if(fuhao)
num[12]=num[12]|0x80;
num[13]=tmp/10-(tmp/100)*10;
num[19]=shangxian/10;
num[20]=shangxian%10;
num[28]=xiaxian/10;
num[29]=xiaxian%10;
}
void tessttemp(void)
{
Init_18B20();
if(flag)
{
WriteOneChar(0xCC);
WriteOneChar(0x44);
}
}
uint wd(void)
{
unsigned int a=0,b=0,t=0;
Init_18B20();
WriteOneChar(0xCC);
WriteOneChar(0xBE);
a=ReadOneChar();
b=ReadOneChar();
t=b;
t<<=8;
t=t|a;
return(t);
}
void Init_18B20(void)
{
DQ=1;
Delay(10);
DQ=0;
Delay(80);
DQ=1;
Delay(10);
if(DQ)
flag=0;
else
flag=1;
Delay(20);
}
uchar ReadOneChar(void)
{
uchar i=0;
uchar dat=0;
for(i=8;i>0;i--)
{
DQ=0;
dat>>=1;
DQ=1;
if(DQ)
dat|=0x80;
Delay(15);
}
return(dat);
}
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
Delay(5);
DQ=1;
dat>>=1;
}
}
void bm(void)
{
temp=~temp;
temp+=1;
}
void display(void)
{
{
uchar a,b,d;
Init_LCD();
Write_Comm(0x01);
Write_Comm(0x80);
for(a=0;a<16;a++)
{
d=dispbuf[a];
if((a>11)&&(a<14))
{
d=numcode[num[a]];
}
if(14==a)
{
d=0xdf;
}
Write_Data(d);
}
Write_Comm(0xc0);
for(b=16;b<33;b++)
{
d=dispbuf[b];
if((b>18)&&(b<21))
{
d=numcode[num[b]];
}
if((b>27)&&(b<30))
{
d=numcode[num[b]];
}
if(b==21)
{
d=0xdf;
}
if(30==b)
{
d=0xdf;
}
Write_Data(d);
}
}
}
void Read_Busy(void)
{
do{
Lcd_Data=0xff;
RS=0;
RW=1;
E=0;
delay();
E=1;
}while(Busy);
}
void Write_Comm(uchar lcdcomm)
{
Lcd_Data=lcdcomm;
RS=0;
RW=0;
E=0;
Read_Busy();
E=1;
}
void Write_Data(uchar lcddata)
{
Lcd_Data=lcddata;
RS=1;
RW=0;
E=0;
Read_Busy();
E=1;
}
void Init_LCD(void)
{
delay();
Write_Comm(0x01);
Write_Comm(0x38);
Write_Comm(0x06);
Write_Comm(0x0c);
}
void delay15(uchar us)
{
do
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
us--;
}
while(us);
}
void Delay(uint time)
{
while(time--);
}
void delay1ms(void)
{
uchar i,j;
for(i=0;i<2;i++)
for(j=0;j<255;j++);
}
void delay()
{
uchar y;
for(y=0;y<0xff;y++);
}
|