#include
#include
typedef unsigned char uchar;
typedef unsigned int uint;
uchar wbuf[]={~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F};
uchar tplsb,tpmsb;//温度低位,高位
uint temp=0;//实际温度
uint temp1=30;//报警温度
uint temp2=27;//报警温度
//sbit led=P2^1; //示警发光二极管信号引脚
sbit motor=P1^7; //电机信号输出引脚
sbit reduce=P2^1; //报警温度下减键
sbit plus=P2^0; //报警温度上加键
//bit flag1=0;
//bit flag2=0;
sbit A=P2^6;//数码管位选
sbit C=P2^7;//数码管位选
sbit DQ=P1^0;//DS18B20控制线
void delay1(uint j )
{ int i,k;
for(i=0;i<110;i++)
for(k=0;k
;
}
void delay(uint t) //延时t毫秒
{
uint i;
while(t--);
{
for(i=0;i<250;++i);//延时约1us
{}
}
}
/*产生复位脉冲初始化DS18B20*/
void Init()
{
uint i=100;
DQ=0;
while(i>0)i--;//拉低约900us
DQ=1;//拉高电平,产生上升沿
i=4;
while(i>0)i--;
}
/*等待应答脉冲*/
void Wait()
{
uint i;
while(DQ);
while(~DQ);//检测到应答脉冲
i=4;
while(i>0)i--;
}
/*读数据一位*/
bit Rebit()
{
uint i;
bit b;
DQ=0;
i++;//保持低电平至少1us
DQ=1;
i++;i++;//延时15us以上,读时隙下降沿后15us,DS18B20输出数据才有效
b=DQ;
i=9;
while(i>0)i--;//读时隙不低于60us
return(b);
}
/*读一个字节数据*/
uchar Rebyte()
{
uchar i,j=0,k=0;
for(i=0;i<8;i++)
{
k=Rebit();
j=(k<<7)|(j>>1);
}
return(j);
}
/*写一个字节数据*/
void Wrbyte(uchar b)
{
uint i,j;
bit temp;
for(j=0;j<8;j++)
{
temp=b&0x01;
b>>=1;
if(temp)
{
/*写1*/
DQ=0;
i++;i++;//延时15us
DQ=1;
i=8;
while(i>0)i--;//整个写1时隙不低于60us
}
else
{
/*写0*/
DQ=0;
i=8;
while(i>0)i--;
DQ=1;
i++;i++;
}
}
}
/*启动温度转化*/
void Convert()
{
Init();//初始化DS18B20
Wait();//等待应答
delay(1);//延时
Wrbyte(0xcc);//skip rom命令
Wrbyte(0x44);//convert T命令
}
/*读取温度值*/
void Retemp()
{
Init();//初始化DS18B20
Wait();//等待应答
delay(1);//延时
Wrbyte(0xcc);//skip rom命令
Wrbyte(0xbe);//read scratchpad(读暂存器)命令
tplsb=Rebyte();//温度低位字节(其中第四位为小数部分)
tpmsb=Rebyte();//温度高位字节(其中高五位为符号位)
temp=(tpmsb*256+tplsb)*0.0625;//转换
}
/*LED显示*/
void Display()
{
uint j=0,k=0,n;
for(n=0;n<3;n++)
{ j=temp/10;//取温度十位
k=temp%10;