大家好,今天小编来为大家解答以下的问题,关于DS18B20温度传感器的使用方法,温度传感器1820这个很多人还不知道,现在让我们一起来看看吧!
一、DS18B20温度传感器接口设计报告
DS18B20在与微处理器连接时仅需要一孙运条口线即可实现微处理器与DS18B20的双向通讯,这个很多单片机应用的书上都有介绍,学校入门练手用的。给你贴一篇吧。 http://hi.baidu.com/%B7%A2%C9%D5%B4%F3%CF%BA/blog/item/ef2baeecc899f4d72f2e21cf.html摘要:介绍单线数字温度传感器DS1820的特性及工作原理,给出了DS1820与89C51单片机接口的应用实例,以及由DS1820组成温度检测系统的方法,并给出了对DS1820进行各种操作的软件流程图。关键词:单线制(1-Wire)时隙A/D变换美国DALLAS公司生产的单线数字温度传感器DS1820,可把温度信号直接转换成串行数字信号供微机处理。由于每片DS1820含有唯一的硅串行数所以在一条总线上可挂接任意多个DS1820芯片。从DS1820读出的信息或写入DS1820的信息,仅需要一根口线(单线接口)。读写及温度变换功率来源于数据总线,总线本身也可以向所挂接的DS1820供电,而无需额外电源。DS1820提供九位温度读数,构成多点温度检测系统而无需任何外围硬件。本文给出了DS1820与89C51单片机接口的应用实例和DS1820组成温度检测系统的方法,并给出了对DS1820进行各种操作的软件流程则弯梁图。1DS1820的特性·单线接口:仅需一根口线与MCU连接·无需外围元件·由总线提供电源·测温范围为-55℃~75℃,精度为0.5℃·九位温度读数·A/D变换时间为200ms·用户自设定温度报警上下限,其值是非易失性的·报警搜索命令可识别哪片DS1820超温度限2DS1820引脚及功能 DS1820的引脚见图1(PR35封装)。 GND:地; DQ:数据输入/输出脚(单线接口,可作寄生供电); VDD:电源电压。3DS1820的工作原理 DS1820的内部结构如图2所示。由图2可知,DS1820由三个主要数字器件组成:①64bit闪速ROM;②温度传感器;③非易失性温度报警触发器TH和TL。64bit闪速ROM的结构如下:它既可寄生供电也可由外部5V电源供电。在寄生供电情况下,当总线为高电平时,DS1820从总线上获得能量并储存在内部电容上当总线为低电平时,由电容向DS1820供电。 DS1820的测温原理:内部计数器对一个受温度影响的振荡器的脉冲计数,低温时振荡器的脉冲可以通过门电路,而当到达某一设置高温时振荡器的脉冲无法通过门电路。计数器设置为-55℃时的值,如果计数器到达0之前,门电路未关闭,则温度寄存器的值将增加,这表示当前温度高于-55℃。同时,计数器复位在当前温度值上,电路对振荡器的温度系数进行补偿,计数器重新开始计数直到回零。如果门电路仍然未关闭,则重复以上过程。温度表示值为9bit,高位为符号位,其结构如下:对DS1820的使用,多采用单片机实现数据采集。处理时,将DS1820信号线与单片机一位口线相连,单片机可挂接多片DS1820,从而实现多点温度检测系统。系统对DS1820的操作以ROM命令和存储器命令形式出现。 3.1ROM命令代码及其含义·READROM命令代码[33H]:如果只有一片DS1820,可用此命令读出其序列号,若在线DS1820多于一个,将发生冲突。·MATCHROM命令代码[55H]:多个DS1820在线时,可用此命令匹配一个给定序列号的DS1820,此后的命令就针对该DS1820。·SKIPROM命令代码[CCH]:此命令执行后的存储器操作将针对在线的所有DS1820。·SEARCHRDH命令代码[F0H]:用以读出在线的DS1820的序列号。·ALARMSEARCH命令代码[ECH]:当温度值高于TH或低于TL中的数值时,此命令可以读出报警的DS1820。 3.2存储器操作命令代码及其含义·WRITESCRATCHPAD命令代码[4EH]:写两个字节的数据到温度寄存器。·READSCRATCHPAD命令代码[BEH]:读取闹咐温度寄存器的温度值。·COPYSCRATCHPAD命令代码[48H]:将温度寄存器的数值拷贝到EERAM中,保证温度值不丢失。·CONVERT命令代码[44H]:启动在线DS1280做温度A/D转换。·RECALL EE命令代码[B8H]:将EERAM中的数值拷贝到温度寄存器中。·READPOWERSUPPLY命令代码[B4H]:在本命令送到DS1280之后的每一个读数据间隙,指出电源模式:“0”为寄生电源;“1”为外部电源。 DS1820单线通信功能是分时完成的,它有严格的时隙概念。因此系统对DS1820的各种操作必须按协议进行。操作协议为:初始化DS1820(发复位脉冲)→发ROM功能命令→发存储器操作命令→处理数据。各种操作的时序图如图3和图4所示。4温度检测系统原理及程序流程图温度检测系统原理图如图5所示,采用寄生电源供电方式。为保证在有效的DS1820时钟周期内,提供足够的电流,我们用一个MOSFET管和89C51的一个I/O口(P1.0)来完成对DS1820总线的上拉。当DS1820处于写存储器操作和温度A/D变换操作时,总线上必须有强的上拉,上拉开启时间最大为10μs。采用寄生电源供电方式时VDD必须接地。由于单线制只有一根线,因此发送接收口必须是三态的,为了操作方便我们用89C51的P1.1口作发送口Tx,P1.2口作接收口Rx。通过试验我们发现此种方法可挂接DS1820数十片,距离可达到50米,而用一个口时仅能挂接10片DS1820,距离仅为20米。同时由于读写在操作上是分开的故不存在信号竞争问题。无论是单点还是多点温度检测,在系统安装及工作之前,应将主机逐个与DS1820挂接,读出其序列号。其工作过程为:主机Tx发一个脉冲,待“0”电平大于480μs后,复位DS1820,待DS1820所发响应脉冲由主机Rx接收后,主机Tx再发读ROM命令代码33H(低位在前),然后发一个脉冲(15μs)并接着读取DS1820序列号的一位。用同样方法读取序列号的56位。对于图5系统的DS1820操作的总体流程图如图6所示。它分三步完成:①系统通过反复操作,搜索DS1820序列号;②启动所有在线DS1820做温度A/D变换;③逐个读出在线DS1820变换后的温度数据。主机启动温度变换并读取温度值的详细流程图如图7所示;主机写入存储器数据详细流程图如8所示。当有更多的检测点需要测温时,可利用89C51的其它口进行扩展。同时,也可利用89C51的串行通信口(RXD,TXD)与上位计算机进行通信,从而构成微机温度测量系统网。
二、51单片机温度传感器ds18b20、lcd1602液晶C程序
必要操作:连接传感器DS18B20到U6
#define BUSY1(DQ1==0)//定义busy信号
sbit LED_0=P1^0;//定义数码管控制脚为P1口的0-3脚
sbit DQ1=P3^5;//定义18B20单总线引脚
void display(unsigned char d1,unsigned char d2,unsigned char d3,unsigned char d4);//声蠢吵明显示函数
void ds_reset_1(void);//声明18B20复位函数
void wr_ds18_1(char dat);//声明18B20写入函数
void time_delay(unsigned char time);//声明延时函数
int get_temp_1(void);//声明18B20读入温度函数
void delay(unsigned int x);//声明延时函数
void read_ROM(void);//声明18B20读ROM函数
int get_temp_d(void);//声明获取温度函数
void ds_init(void);//声明18B20初始化函数
void ds_getT(void);//声明18B20获得温度显示值函数
/*定义数码管段码=====0-9=====A-G=====*/
unsigned char a[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
//共阳极数码管的段码0 1 2 3 4 5 6 7 8 9 A B C D E F
/****************以下定义各种变量********************/
int ResultTemperatureLH,ResultTemperatureLL,ResultTemperatureH;
unsigned int TemH,TemL;//温度的整数部分和小数部分
unsigned int count;//定义小数计算部分
ds_getT();//使用该函数带碧侍获得温度,整数部分存储到TemH,小数部分存储到count的低8位
display((TemH/10)%10,TemH%10,((count/10)%10),(count%10));
/***************18B20初始化函数***********************/
/***************延时程序,单位us,大于10us*************/
void time_delay(unsigned char time)
/*****************************************************/
/*****************************************************/
for(n=0;n<8;n++){ROM[n]=rd_ds18_1();}
/*****************************************************/
/* Read a bit from 1820位读取*/
/*****************************************************/
/*****************************************************/
/* read a bety from ds18b20字节读取*/
/*****************************************************/
unsigned char idata i,j,dat=0;
/*****************************************************/
/* write a bety from ds18b20写字节*/
/****************************************************/
TMP=((a>>4)|(b<<4));
TMP=((a>>4)|(b<<4));
void display(unsigned char d1,unsigned char d2,unsigned char d3,unsigned char d4)
三、DS18B20温度传感器的使用方法
;这是关于DS18B20的读写程序,数据脚P2.2,晶振11.0592mhz
;温度传感器18B20汇编程序,采用器件默认的12位转化,最大转化时间750微秒
;可以将检测到的温度直接显示到AT89C51的两个数码管上
;显示温度00到99度,很准确无需校正!
TEMPER_L EQU 29H;用于保存读出温度的低8位
TEMPER_H EQU 28H;用于保存读出温度的高8位
FLAG1 EQU 38H;是否检测到DS18B20标志位
a_bit equ 20h;数码管个位数存放内存位置
b_bit equ 21h;数码管十纳兄位数存放内存位置
LCALL GET_TEMPER;调用读温度子程序
;进行温度显示,这里我们考虑用网则茄森站提供的两位数孙亩码管来显示温度
;显示范围00到99度,显示精度为1度
;因为12位转化时每一位的精度为0.0625度,我们不要求显示小数所以可以抛弃29H的低4位
;将28H中的低4位移入29H中的高4位,这样获得一个新字节,这个字节就是实际测量获得的温度
;这个转化温度的方法可是我想出来的哦~~非常简洁无需乘于0.0625系数
MOV C,40H;将28H中的最低位移入C
LCALL DISPLAY;调用数码管显示子程序
;主机发出延时537微秒的复位低脉冲
SETB FLAG1;置标志位,表示DS1820存在
CLR P1.7;检查到DS18B20就点亮P1.7LED
CLR FLAG1;清标志位,表示DS1820不存在
DJNZ R0,TSR6;时序要求延时一段时间
RET;判断DS1820是否存在?若DS18B20不存在则返回
CLR P1.3;DS18B20已经被检测到!!!!!!!!!!!!!!!!!!
;这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12位的话750微秒
LCALL INIT_1820;准备读温度前先复位
LCALL READ_18200;将读出的温度数据保存到35H/36H
;写DS18B20的子程序(有具体的时序要求)
READ_18200:;读DS18B20的程序,从DS18B20中读出两个字节的温度数据
MOV R4,#2;将温度高位和低位从DS18B20中读出
MOV R1,#29H;低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)
display: mov a,29H;将29H中的十六进制数转换成10进制
mov dptr,#numtab;指定查表启始地址
MOVC A,@A+DPTR;查个位数的7段代码
MOVC A,@A+DPTR;查十位数的7段代码
;实验板上的7段数码管0~9数字的共阴显示代码
numtab: DB 0CFH,03H,5DH,5BH,93H,0DAH,0DEH,43H,0DFH,0DBH