基于51单片机及DS18B20温度传感器的数字温度计设计 联系客服

发布时间 : 星期六 文章基于51单片机及DS18B20温度传感器的数字温度计设计更新完毕开始阅读

/***************************ds18b20字节读函数************************/ uchar ds18b20_read() { }

/*************************ds18b20字节写函数**************************/ void ds18b20_write(uchar d) {

uchar i; for(i=8;i>0;i--) { DQ=0; }

/***************************获取温度函数****************************/ void get_temperature(bit f) {

uchar a=0,b=0,c=0,d=0;

//DS18B20初始化

ds18b20_init(); uint i;

_nop_(); _nop_();_nop_(); DQ=d&0x01;

//写数据

ds18b20_delayus(5); DQ=1; d >>= 1;

//一位一位的写

// ds18b20字节写

uchar i; DQ = 1; {

DQ = 0; DQ = 1; if(DQ)

//返回读取的值

//定义一个局部变量i(局部变量只在本函数中有效)

//定义一个局部变量d

//准备读;

//一位一位的读,循环8次

uchar d = 0; for(i=8;i>0;i--)

//DS18B20 字节读取

d >>= 1; //d左移一位,低位先发;

_nop_();_nop_();_nop_();

//必须写1,否则读出来的将是不预期的数据; //在12us处读取数据,送给d的最高位

d |= 0x80;

ds18b20_delayus(10);

} return d;

}

ds18b20_write(0xcc);//向DS18B20发跳过读ROM命令

ds18b20_write(0x44);//写启动DS18B20进行温度转换命令,转换结果存入内部RAM if(f==1)

{ //首次启动DS18B20进行温度转换需要500ms,若转换时间不够就出错,读出的是85度的错 display1(1); } else

//用开机动画耗时

误值。

ds18b20_delayms(1); ds18b20_init();

//DS18B20初始化

//向DS18B20发跳过读ROM命令 //写读内部RAM中9字节的内容命令 //读内部RAM (LSB) //读内部RAM (MSB)

//局部位变量f=1时读上下线报警温度 //读内部RAM (TH) //读内部RAM (Tl)

ds18b20_write(0xcc); ds18b20_write(0xbe); a=ds18b20_read(); b=ds18b20_read(); if(f==1) {

max=ds18b20_read(); min=ds18b20_read(); }

if((max&0x80)==0x80) //若读取的上限温度的最高位(符号位)为‘1’表明是负温度

{f_max=1;max=(max-0x80);} //将上限温度符号标志位置‘1’表示负温度,将上限温度装换成无符号 if((min&0x80)==0x80)//若读取的下限温度的最高位(符号位)为‘1’表明是负温度

{f_min=1;min=(min-0x80);}//将下限温度符号标志位置‘1’表示负温度,将下限温度装换成无符号数。 i=b;i>>=4; if (i==0)

{

//整数部分

//小数部分

数。

f=0; //i为0,表示读取的温度是正温度,设立正温度标记 temp=((a>>4)|(b<<4)); a=(a&0x0f); temp_d=a;

else

{

//i为1,表示读取的温度是负温度,设立负温度标记

//负数的小数部分取反加1 //负数的整数部分取反 //小数部分

}

f=1; a=~a+1; b=~b;

temp=((a>>4)|(b<<4)); a=(a&0x0f); temp_d=a; }

}

//整数部分

/*************************存储极限温度函数***************************/ void store_t() {

if(f_max==1) //若上限温度为负,将上限温度转换成有符号数(最高1是负,0是正) max=max+0x80; if(f_min==1) min=min+0x80;

//若下限温度为负,将上限温度转换成有符号数

ds18b20_init(); //DS18B20初始化

//向DS18B20发跳过读ROM命令

//向暂存器TH(上限温度暂存器)写温度 //向暂存器TL(下限温度暂存器)写温度 //向配置寄存器写命令,进行温度值分辨率设置 //向DS18B20发跳过读ROM命令

ds18b20_write(0xcc); ds18b20_write(max); ds18b20_write(min); ds18b20_write(0xff); ds18b20_init();

ds18b20_write(0x4e); //向DS18B20发写字节至暂存器2和3(TH和TL)命令

//DS18B20初始化

//向DS18B20发将RAM中2、3字节的内容写入EEPROM

ds18b20_write(0xcc); ds18b20_write(0x48);

} //DS18B20上电后会自动将EEPROM中的上下限温度拷贝到TH、TL暂存器

/**************************温度超限报警函数*************************/ void alarm() {

{

if(f_min==0) }

{ }

//若下限值是负值 //若测量值是正值

{ if(f==0) }

{ } if(f==1) }

//若测量值是负值

{ if((temp+temp_d*0.0625)>=min)//当测量值大于最小值时报警

{w=1;TR1=1;}

if((temp+temp_d*0.0625)

if((temp+temp_d*0.0625)>=max)//当测量值大于最大值时报警 {w=1;TR1=1;}

if((temp+temp_d*0.0625)

if((temp+temp_d*0.0625)<=min||(temp+temp_d*0.0625)>=max) {w=1;TR1=1;} {w=0;}

//当测量值小于最小值或大于最大值时报警 //当测量值大于最小值且小于最大值时不报警

if((temp+temp_d*0.0625)min)

//若测量值是正值

//若下限值是正值

//若上限值是正值

if(f_max==0)

} if(f==1){w=1;TR1=1;} //若测量值是负值时报警

if(f_min==1)

}

if(f_max==1)

//若下限值是负值 //若下限值是负值

{ if(f_min==1)

{ if(f==1) }

{ }

//若测量值是负值

if((temp+temp_d*0.0625)<=max||(temp+temp_d*0.0625)>=min) {w=1;TR1=1;} {w=0;}

//当测量值小于最大值或大于最小值时报警 //当测量值小于最小值且大于最大值时不报警

if((temp+temp_d*0.0625)max)

if(f==0){w=1;TR1=1;} //若测量值是正值时报警

}

#endif

/********************************************************************** * 程序名; __keyscan_H__

* 功 能: ds18b20键盘头文件,通过键盘设定设定上下限报警温度 * 编程者:zicreate * 编程时间:2009/10/2

**********************************************************************/ #ifndef __keyscan_H__ #define __keyscan_H__ sbit key1=P2^2; sbit key2=P2^1; sbit key3=P2^0; sbit key4=P3^3; uchar i=0; uchar a=0;

//可位寻址变量定义,用key1表示P2.2口

//用key2表示P2.1口 //用key3表示P2.0口 //用key4表示P3.3口

//定义头文件

//定义全局变量i用于不同功能模式的选择,‘0’正常模式,‘1’

//定义全局变量a用于不同模式下数码管显示的选择

//K4按键双功能选择位,k4=0时K4按键选择消按键音的功能,k4=1时K4按键选择正//K2、K3按键双功能选择位,v=0时选择上下限查看功能,v=1时选择上下限温度加减

//v1=1时定时1250ms时间到自动关闭报警上下限查看功能 //消按键音功能调整位,为‘0’时开按键音,为‘1’时关按键音

//延时1ms左右

上限调节模式,‘2’下限调节模式 bit k4=0; 负温度设定功能 bit v=0; 功能 bit v1=0; bit v2=0;

/***************************读键盘延时子函数**************************/ void keyscan_delay(uint z) { uint i,j; for(i=z;i>0;i--)

for(j=120;j>0;j--);