DS18B20温度传感器(单线通讯,严格按照时序图)
特点:
1、电压范围:3.0v~5.5V
2、独特的单线接口,仅需一条串口线即可实现微处理器与DS18B20的双向通讯;
3、支持电组网功能,实现组网多点测温
4、不需要任何外围原件
5、范围-55‘C~+125’C,精度0.5
6、高精度测温,分辨率9~12位
7、速度快,抗干扰能力强
8、不易因电源接反而烧坏
有64位光刻只读存储器
温度存储格式
8位低字节+8位高字节
高字节前五位是字符位:“0”;温度大于0;
“1”;温度小于0,只需将测到的数值取反乘0.0625
测到的温度乘以0.0625即实际温度;
内部包括一个高度的暂存器RAM和一个非易失性的可电擦除的EEPROM
最大转换时间750ms
精度和时间有直接关系
RAM指令表
温度变换 44H
读暂存器 beH
写暂存器 4eH
复制暂存器 48H
……
temp.h
#ifndef _TEMP_H
#define _TEMP_H
#include"reg52.h"
#ifndef uint
#define uint unsigned int
#endif
#ifndef uchar
#define uchar unsigned int
#endif
sbit DSPORT = P3^7;
int Ds18b20readtemp();
#endif
temp.c
#include "temp.h"
void delay1ms()
{
unsigned char i, j;
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
uchar Ds18b20Init()
{
uchar i=0;
DSPORT = 0;
i = 70;
while(i--);
DSPORT = 1;
i = 0;
while(DSPORT){
delay1ms();
i++;
if(i>5)
return 0;
}
return 1;
}
void Ds18b20WriteByte(uchar dat)
{
uchar i,j;
for(j=0;i<8;j++){
DSPORT = 0;
i = 0;
DSPORT = dat & 0x01;
i = 6;
while(i--);
DSPORT = 1;
dat >>= 1;
}
}
uchar Ds18b20ReadByte()
{
uchar i,j;
uchar bi,bety;
for(j=0;i<8;j++){
DSPORT = 0;
i = 0;
DSPORT = 1;
i++;
i++;
bi = DSPORT;
byte = (byte>>1)|(bi<<7);
i==5;
while(i--);
}
return byte;
}
void Ds18b20changeTemp()
{
Ds18b20Init();
delay1ms;
Ds18b20WriteTemp(0xcc);
Ds18b20WriteTemp(0x44);
}
void Ds18b20readTempcom()
{
Ds18b20Init();
delay1ms;
Ds18b20WriteTemp(0xcc);
Ds18b20WriteTemp(0xbe);
}
uchar Ds18b20readtemp()
{
int temp=0;
char tml,tmh;
Ds18b20changeTemp();
Ds18b20readTempcom();
tml = Ds18b20ReadByte();
tmh = Ds18b20ReadByte();
temp = tmh;
temp <<=8;
temp|= thl;
return temp;
}
main.c
#include "reg52.h"
#include "temp.h"
sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;
uchar code smgduan[10]={……};
uchar num;
uchar displaydata[6];
void delay(uint i)
{
while(i--);
}
void dataport(uchar temp)
{
float tp;
if(temp < 0){
displaydata[0] = 0x04;
temp = temp -1;
temp = ~temp;
tp = temp;
temp = tp * 0.0625*100 +0.5;
}
else{
displaydata[0] = 0x00;
tp = temp;
temp = tp * 0.0625*100 +0.5;
}
displaydata[1] = smgduan [temp/10000];
displaydata[2] = smgduan [temp%10000/1000];
displaydata[3] = smgduan [temp%10000%1000/100];
displaydata[4] = smgduan [temp%10000%1000%100/10];
displaydata[5] = smgduan [temp%10000%1000%100%10];
}
void display()
{
int i;
for(i=0;i<6;i++){
switch(i){
case 0:
LSA = 0;LSB = 0;LSC = 0;break;
case 1:
LSA = 1;LSB = 0;LSC = 0;break;
case 2:
LSA = 0;LSB = 1;LSC = 0;break;
case 3:
LSA = 1;LSB = 1;LSC = 0;break;
case 4:
LSA = 0;LSB = 0;LSC = 1;break;
case 5:
LSA = 1;LSB = 0;LSC = 1;break;
}
P0 = displaydata[5-i];
delay(100);
P0 = 0x00;
}
}
void main()
{
while(1){
datapros(Ds18b20readtemp());
diaplay();
}
}