DS18B20的数字温度传感器DS18B20介绍
由于每个DS18B20在温度转换期间工作电流达到1mA,当几个温度传感器挂在同一根I/O线上进行多点测温时,只靠7K上拉电阻就无法提供足够的能量,会造成无法转换温度或温度误差极大。
ds18b20温度传感器工作原理DS18B20温度传感器是一种数字温度传感器,它采用1-Wire协议,可以提供9位到12位的温度测量精度。
DS18BDS1822“一线总线”数字化温度传感器同DS1820一样,DS18B20也支持“一线总线”接口,测量温度范围为-55°C~+125°C,在-10~+85°C范围内,精度为±0.5°C。谈贺游DS1822的精度较差为±2°C。
DS18B20是常用的数字温度传感器,其输出的是数字信号,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。
DS18B20的外形和内部结构DS18B20内部结构主要由4部分组成:64位ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
DS18B20是美国DALLAS半导体公司继DS1820之后最新推出的一种改进型智能温度传感器。与传统的热敏电阻相比,拍历他能含销够直接读出被测温度并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。
求用8051单片机,ds18s20做温度传感器的温度控制系统
代码先给你,我今晚回家找找看电路图在不在。 我用的是DS18B20做的, 显示是用LED,单片机用AT89S52. #include #include #include #include #include #define uchar unsigned char #define uint unsigned int typedef unsigned char byte; typedef unsigned int word; //***********************************************// sbit DQ=P0^0; //温度信号输入,根据实际情况定义端口 sbit da=P2^0; sbit clk=P2^1; sbit adra=P2^2; sbit adrb=P2^3; bit compare; uchar value; uchar data DD[4]; //*********函数声明****************// void delay(word useconds); void sdelay(); void disp(uint value); chage1(uint temp); chage2(uint temp); display(uchar val); //****************ds18b20延时***********************// void delay(word useconds) { for(;useconds>0;useconds--); } //********DS18B20初始化子程序***********************// byte ow_reset(void) { byte presence; DQ = 0; //pull DQ line low delay(29); // leave it low for 480us DQ = 1; // allow line to return high delay(3); // wait for presence presence = DQ; // get presence signal delay(25); // wait for end of timeslot return(presence); // presence signal returned } // 0=presence, 1 = no part //从 1-wire 总线上读取一个字节 byte read_byte(void) { byte i; byte value = 0; for (i=8;i>0;i--) { value>>=1; DQ = 0; // pull DQ low to start timeslot DQ = 1; // then return high delay(1); //for (i=0; i<3; i++); if(DQ)value|=0x80; delay(6); // wait for rest of timeslot } return(value); } //向 1-WIRE 总线上写一个字节 void write_byte(char val) { byte i; for (i=8; i>0; i--) // writes byte, one bit at a time { DQ = 0; // pull DQ low to start timeslot DQ = val&0x01; delay(5); // hold value for remainder of timeslot DQ = 1; val=val/2; } delay(5); } /***读取温度 char Read_Temperature(void) { union{ byte c[2]; int x; }temp; ow_reset(); write_byte(0xCC); // Skip ROM write_byte(0xBE); // Read Scratch Pad temp.c[1]=read_byte(); temp.c[0]=read_byte(); ow_reset(); write_byte(0xCC); //Skip ROM write_byte(0x44); // Start Conversion return(temp.x/2); } //*********读取温度*************/ char Read_Temperature(void) { uchar a=0; uchar b=0; uint t=0; //float tt=0; ow_reset(); write_byte(0xCC); //跳过读序号列号的操作 write_byte(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度 a=read_byte(); b=read_byte(); t=b; t<<=8; t=t|a; //tt=t*0.0625; ow_reset(); write_byte(0xCC); // 跳过读序号列号的操作 write_byte(0x44); // 启动温度转换 return(t); } //****led显示程序*****// char code seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0x77,0x7f,0x35,0x3f,0x75,0x71}; void disp(uint value) {uint temp; temp=value; if(temp>0x270f)compare=1; else compare=0; if(compare==0){ chage1(temp); DD[0]=seg[DD[0]]; DD[1]=seg[DD[1]]; DD[2]=seg[DD[2]]; DD[3]=seg[DD[3]]; adra=0,adrb=0; display(DD[0]); adra=1,adrb=0; display(DD[1]); adra=0,adrb=1; display(DD[2]); adra=1,adrb=1; display(DD[3]); } if(compare==1){chage2(temp); adra=1,adrb=1; display(DD[3]); adra=0,adrb=1; display(DD[2]); adra=1,adrb=0; display(DD[1]); adra=0,adrb=0; display(DD[0]);} } //***********LED延时子程序****************************// void sdelay(void) {uint t; t=0x180; while(t--); } //***************************************// chage1(uint temp) { DD[0]=(int)(temp/1000); DD[1]=(int)((temp-DD[0]*1000)/100); DD[2]=(int)((temp-DD[0]*1000-DD[1]*100)/10); DD[3]=(int)(temp-DD[0]*1000-DD[1]*100-DD[2]*10); } //****************************************// chage2(uint temp) { temp=0; DD[0]=0x71; DD[1]=0x3E; DD[2]=0x38; DD[3]=0x38; } //****************************************// display(uchar val) {uchar i; bit bin; for(i=8;i>0;i--) {bin=val&0x80; val = val<<1; da=bin; clk=0; clk=1; } sdelay(); } //**************************// main() { uint temper; ow_reset(); while(1){ temper=Read_Temperature(); (uint)temper=temper/16; disp(temper); } }