#include<reg52.h>
#include<intrins.h>
#include"define.h"
uchar code dis1[]="A:";
uchar code dis2[]="B:";
uchar code dis3[]="C:" ;
uchar code dis4[]="TH:" ;
uchar code dis5[]=" ";
uchar code dis6[]="ALARM!";
uchar code dis7[]="OIL:";
uchar code dis8[]="AVG:";
/*uchar code dis5[]="ERROR!";*/
uchar data ID[3][8]={0x28,0x08,0xfa,0x3b,0x00,0x00,0x00,0x78,0x28,0x43,0xc8,0x34,0x00,0x00,0x00,0x68,0x28,0x0e,0xb7,0x34,0x00,0x00,0x00,0x55};
uchar IRDIS[2];
uchar IRCOM[4];
uint temp,th;
uchar bai,shi,ge,num,count;
float tt;
float a0,a1,b0,b1,c0,c1;
/**************************
延时函数
***************************/
void delayAD(uint n) //延时函数
{
uint x;
while(n--)
{
x=5000;
while(x--);
}
}
/***************************************
延时函数
****************************************/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/**********************************************************************
检测忙状态 ,lcd_busy为0时,闲。为1时,忙
***********************************************************************/
bit lcd_busy()
{
bit result;
lcdrs=0;
lcdrw=1;
lcden=1;
delayNOP();
result=(bit)(P0&0x80);
lcden=0;
return(result);
}
/*****************************************
写指令
*****************************************/
void lcd_wcmd(uchar cmd)
{
while(lcd_busy());
lcdrs=0;
lcdrw=0;
lcden=0;
_nop_();
_nop_();
P0=cmd;
delayNOP();
lcden=1;
delayNOP();
lcden=0;
}
/*******************************************
写数据
*******************************************/
void lcd_wdat(uchar dat)
{
while(lcd_busy());
lcdrs=1;
lcdrw=0;
lcden=0;
_nop_();
_nop_();
P0=dat;
delayNOP();
lcden=1;
delayNOP();
lcden=0;
}
/**********************************
lcd初始化程序
***********************************/
void lcd_init()
{
th=100;
dula=0;
wela=0;
lcd_PSB=1; //并口方式
lcd_wcmd(0x34); //扩充功能设定
delay(5);
lcd_wcmd(0x30); //基本功能设定
delay(5);
lcd_wcmd(0x0c); //开显示 关光标
delay(5);
lcd_wcmd(0x01); //清除显示
}
/********************************
定时器初始化
********************************/
void init_T()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
/*****************************************
显示位置函数
******************************************/
void lcd_pos(uchar X,uchar Y )
{
uchar pos;
if(X==0)
{ X=0x80;}
else if(X==1)
{X=0x90;}
else if(X==2)
{X=0x88;}
else if(X==3)
{X=0x98;}
pos=X+Y;
lcd_wcmd(pos);
}
/*****************************************
显示函数
*****************************************/
void display()
{
uchar i;
i=0;
delay(10);
lcd_pos(0,0);
while(dis1[i]!='\0')
{
lcd_wdat(dis1[i]); //A:
i++;
}
lcd_pos(0,4);
i=0;
while(dis2[i]!='\0') //B:
{
lcd_wdat(dis2[i]);
i++;
}
lcd_pos(1,0);
i=0;
while(dis3[i]!='\0') //C:
{
lcd_wdat(dis3[i]);
i++;
}
lcd_pos(1,4); //TH:
i=0;
while(dis4[i]!='\0')
{
lcd_wdat(dis4[i]);
i++;
}
lcd_pos(2,0); //normal
i=0;
while(dis5[i]!='\0')
{
lcd_wdat(dis5[i]);
i++;
}
lcd_pos(3,0); //oil
i=0;
while(dis7[i]!='\0')
{
lcd_wdat(dis7[i]);
i++ ;
}
lcd_pos(2,3); //avg
i=0;
while(dis8[i]!='\0')
{
lcd_wdat(dis8[i]);
i++ ;
}
bai=th/100 ; //百位
shi=th%100/10 ; //十位
ge=th%10; //个位
lcd_pos(1,6);
lcd_wdat(bai+0x30);
lcd_wdat(shi+0x30);
lcd_wdat(ge+0x30);
}
/*******************************
键盘扫描
*******************************/
void keyscan()
{
uchar s1num;
if(key1==0)
{
delay(5);
if(key1==0)
{
s1num++;
while(!key1);
if(s1num==1) //光标闪烁
{
lcd_pos(1,5);
lcd_wcmd(0x0f);
}
if(s1num==2)
{
lcd_wcmd(0x0c); //停止闪烁
}
}
}
if(s1num!=0)
{
if(key2==0)
{
delay(5);
if(key2==0)
{
while(!key2);
th++;
if(th==126)
th=0;
} //加1
}
if(key3==0)
{
delay(5);
if(key3==0)
{
while(!key3);
th--;
if(th==40)
th=125;
}
}
}
//减1
}
/********************************************
18B20初始化
*********************************************/
bit dsreset()
{
bit flag;
uchar i;
DS = 1 ;
for(i=0;i<2;i++);
DS = 0;
for(i=0;i<200;i++);
DS= 1;
for(i=0;i<10;i++);
flag=DS;
for(i=0;i<200;i++);
return(flag);
}
/********************************
读字节
********************************/
bit tmpreadbit(void)
{
uint i;
bit dat;
DS=0;i++;
DS=1;i++;i++;
dat=DS;
i=8;while(i--);
return (dat);
}
uchar tmpread(void)
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmpreadbit();
dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在DAT里
}
return(dat);
}
/*******************************
写字节
*******************************/
void tmpwritebyte(uchar dat)
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb) //write 1
{
DS=0;
i++;i++;
DS=1;
i=8;while(i>0)i--;
}
else
{
DS=0; //write 0
i=8;while(i>0)i--;
DS=1;
i++;i++;
}
}
}
/*******************************
温度转换
********************************/
void tmpchange() //DS18B20 begin change
{
dsreset();
delay(1);
tmpwritebyte(0xcc); // address all drivers on bus
tmpwritebyte(0x44); // initiates a single temperature conversion
delay(850);
}
/**************************
获取温度
**************************/
uint tmp() //get the temperature
{
uchar a,b;
tmpwritebyte(0xbe); //th.tl
a=tmpread();
b=tmpread();
temp=b;
temp<<=8; //two byte compose a int variable
temp=temp|a;
tt=temp*0.0625;
temp=tt*10+0.5;
return temp;
}
/***********************
温度写入
***********************/
void write_tmp(uchar add1,uchar add2,uint temp)
{
uchar a,b,c,d;
if(tt>=100)
{a=0x31; //bai wei
tt=tt-100;}
else
a=0x20; //百位
b=temp/100 ; //十位
c=temp%100/10; //个位
d=temp%100%10; //小数
lcd_pos(add1,add2);
lcd_wdat(a);
lcd_wdat(0x30+b);
lcd_wdat(0x30+c);
lcd_wdat(0x2E);
lcd_wdat(0x30+d);
}
/*******************************
alarm1
**********************************/
void alarm1()
{
/* beep=~beep;
delay(200);*/
D1=~D1;
delay(200);
}
/**************************
alarm2 maichong
*************************/
void alarm2()
{
uchar i;
if(ala==0)
{
lcd_pos(2,0);
i=0;
while(dis6[i]!='\0')
{
lcd_wdat(dis6[i]);
i++ ;
}
beep=~beep;
delay(200);
D2=~D2;
delay(200); //alarm2
ans=0;
}
}
/**********************
显示温度
*************************/
void display_tmp()
{
uchar x1,x,bai,shi,ge,dot;
uint avg,tmp1,tmp2,tmp3;
for(x1=0;x1<4;x1++)
{
dsreset();
delay(1);
tmpwritebyte(0x55); //rom match
for(x=0;x<8;x++)
tmpwritebyte(ID[x1][x]);
switch(x1)
{
case 0:
{
write_tmp(0,1,tmp());
delay(5);
tmp1=tt*10+0.5;
a0=tt;
if(num==10)
{
num=0;
a1=tt;
if((a1-a0)>0.1)
{
alarm1();
}
beep=1;
D1=1;
}