DS18B20温度传感器,将实时温度用数码管显示

2019-04-15 15:10发布

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" //延时1ms void delay1ms() //@11.0592MHz { unsigned char i, j; _nop_(); i = 2; j = 199; do { while (--j); } while (--i); } /* (1).数据线拉到低电平“0”。 (2).延时480微妙(该时间的时间范围可以从480到960微妙)。 (3).数据线拉到高电平“1”。 (4).延时等待80微妙。如果初始化成功则在15到60微妙时间内产生一个由DS18B20所返回的低电平“0”.根据该状态可以来确定它的存在,但是应注意不能无限的进行等待,不然会使程序进入死循环,所以要进行超时判断。 (5).若CPU读到了数据线上的低电平“0”后,还要做延时,其延时的时间从发出的高电平算起(第(3)步的时间算起)最少要480微妙。 */ uchar Ds18b20Init() { uchar i=0; DSPORT = 0; i = 70; while(i--);//延时约642us DSPORT = 1; i = 0;//延时作用 while(DSPORT){ delay1ms(); i++; if(i>5) return 0;//初始化失败 } return 1; } /* (1).数据线先置低电平“0” (2).延时15微妙。 (3).按从低位到高位的顺序发送数据(一次只发送一位)。 (4).延时60微妙。 (5).将数据线拉到高电平。 (6).重复1~5步骤,直到发送完整的字节。 (7).最后将数据线拉高。 */ void Ds18b20WriteByte(uchar dat) { uchar i,j; for(j=0;i<8;j++){ DSPORT = 0; i = 0;//延时 DSPORT = dat & 0x01; i = 6; while(i--);//大概68us DSPORT = 1; dat >>= 1; } } /* 1).将数据线拉低“0”。 (2).延时1微妙。 (3).将数据线拉高“1”,释放总线准备读数据。 (4).延时10微妙。 (5).读数据线的状态得到1个状态位,并进行数据处理。 (6).延时45微妙。 (7).重复1~7步骤,直到读完一个字节。 */ 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; } /* 温度变换 44H */ void Ds18b20changeTemp() { Ds18b20Init(); delay1ms; Ds18b20WriteTemp(0xcc);//rom 指令 cc 跳过rom Ds18b20WriteTemp(0x44); } /*读暂存器 beH*/ void Ds18b20readTempcom() { Ds18b20Init(); delay1ms; Ds18b20WriteTemp(0xcc);//rom 指令 cc 跳过rom 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(); } }