[51单片机]单总线温度采集

目录

1、单总线温度传感器DS18B20的原理

简介 

工作原理

温度转换的计算方法。        

2、单总线温度传感器DS18B20的通信时序

3、使用51单片机与温度传感器将检测的环境温度读取出来。

A.利用DS18B20和LED数码管实现单总线温度测量系统

实验原理图

c程序

实验结果

B.使用DS18B20温度传感器、数码管显示检测的温度值

c程序

实验结果

C.使用虚拟逻辑分析仪分析上述代码

总结


1、单总线温度传感器DS18B20的原理

简介 

DS18B20是美国DALLAS公司生产的数字温度传感器,体积小、低功耗、抗干扰能力强。可直接将温度转化成数字信号传送给单片机处理,因而可省去传统的信号放大、A/D转换等外围电路。

工作原理

如图10-2(a)所示为单片机与多个带有单总线接口的DS18B20组成的分布式温度测量系统,图中多个DS18B20都挂接在单片机的1根I/O口线(即DQ线)上。单片机对每个DS18B20都通过总线DQ寻址。DQ为漏极开路,须加上拉电阻。DS18B20的一种封装形式如图10-2(b)所示。

DS18B20的一种封装形式见图10-2。除DS18B20外,在该数字温度传感器系列中还有DS1820、DS18S20、DS1822等其他型号,工作原理与特性基本相同。    

图10-2  单总线构成的分布式温度监测系统 

片内有9个字节的高速暂存器RAM单元,9个字节具体分布如下:

   

 第1字节和第2字节是在单片机发给DS18B20温度转换命令发布后,经转换所得的温度值,以两字节补码形式存放其中。一般情况下,用户多使用第1字节和第2字节。单片机通过单总线可读得该数据,读取时低位在前,高位在后。      

 第3、4字节分别是由软件写入用户报警的上下限值TH和TL。        

第5个字节为配置寄存器,可对其更改DS18B20的测温分辨率,高速暂存器的第6、7、8字节未用,为全1。第9字节是前面所有8个字节的CRC码,用来保证正确通信。片内还有1个E2PROM为TH、TL以及配置寄存器的映像。

配置寄存器各位的定义如下:

其中,TM位出厂时已被写入0,用户不能改变;低5位都为1;R1和R0用来设置分辨率。表10-1列出了R1、R0与分辨率和转换时间的关系。用户可通过修改R1、R0位的编码,获得合适的分辨率。

 

由表10-1,DS18B20转换时间与分辨率有关。当设定为9位时,转换时间为93.75ms;设定10位时,转换时间为187.5 ms;当设定11位时,转换时间为375ms;当设定为12位时,转换时间为750ms。              

表10-2列出了DS18B20温度转换后所得到的16位转换结果的典型值。

 

温度转换的计算方法。        

当DS18B20采集的温度为+125℃时,输出为0x07d0,则:  

实际温度=(0x07d0)/16=(0×163+7×162+13×161+0×160)/16=125℃        

当DS18B20采集的温度为-55℃时,输出为0xfc90,由于是补码,则先将11位数据取反加1得0x0370,注意符号位不变,也不参加运算,则    

实际温度=(0x0370)/16=(0×163+3×162+7×161+0×160)/16=55℃    

注意,负号则需对采集的温度进行判断后,再予以显示。 

2、单总线温度传感器DS18B20的通信时序

工作时序要求严格,延时时间需准确,否则容易出错。            

 DS18B20的工作时序包括初始化时序、写时序和读时序。  

(1)初始化时序,单片机将数据线电平拉低480~960µs后释放,等待15~60µs,单总线器件即可输出一持续60~240µs的低电平,单片机收到此应答后即可进行操作。    

(2)写时序,当单片机将数据线电平从高拉到低时,产生写时序,有写“0”和写“1”两种时序。写时序开始后,DS18B20在15~60µs期间从数据线上采样。如果采样到低电平,则向DS18B20写的是“0”;如果采样到高电平,则向DS18B20写的是“1”。这两个独立时序间至少需拉高总线电平1µs时间。

(3)读时序,当单片机从DS18B20读取数据时,产生读时序。此时单片机将数据线电平从高拉到低使读时序被初始化。如果在此后15µs内,单片机在数据线上采样到低电平,则从DS18B20读的是“0”;如果在此后的15µs内,单片机在数据线上采样到高电平,则从DS18B20读的是“1”。

3、使用51单片机与温度传感器将检测的环境温度读取出来。

A.利用DS18B20和LED数码管实现单总线温度测量系统

利用DS18B20和LED数码管实现单总线温度测量系统,原理电路见图11-3。DS18B20测量范围是−55~128℃。本例只显示00~99。通过本例读者应掌握DS18B20特性及单片机I/O实现单总线协议的方法。        

Proteus仿真时,用手动,即用鼠标单击DS18B20图标上的“↑”或“↓”来改变温度,注意手动调节温度同时,LED数码管会显示出与DS18B20窗口相同的2位温度数值。        

电路中74LS47是BCD-7段译码器/驱动器,用于将单片机P0口输出欲显示的BCD码转化成相应的数字显示的段码,并直接驱动LED数码管显示。

实验原理图

c程序

#include "reg51.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
#define out P0
sbit smg1=out^4;
sbit smg2=out^5;
sbit DQ=P3^7;
void delay5(uchar);
void init_ds18b20(void);
uchar readbyte(void);
void writebyte(uchar);
uchar retemp(void);
int main()
{
uchar i,temp;
	delay5(1000);
	while(1)
	{
	temp=retemp();
		for(i=0;i<10;i++)
		{
		out=(temp/10)&0x0f;
			smg1=0;
			smg2=1;
			delay5(1000);
			out=(temp%10)&0x0f;
			smg1=1;
			smg2=0;
			delay5(1000);
		}
	}
	return 0;
}
void delay5(uchar n)
{
do
{
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	n--;
}
while(n);
}
void init_ds18b20(void)
{
uchar x=0;
	DQ=0;
	delay5(120);
	DQ=1;
	delay5(16);
	delay5(80);
}
uchar readbyte(void)
{
uchar i=0;
	uchar date=0;
	for(i=8;i>0;i--)
	{
	DQ=0;
		delay5(1);
		DQ=1;
		date>>=1;
		if(DQ)
			date|=0x80;
		delay5(11);
	}
	return (date);
}
void writebyte(uchar dat)
{
uchar i=0;
	for(i=8;i>0;i--)
	{
	DQ = 0;
		DQ = dat&0x01;
		delay5(12);
		DQ=1;
		dat >>= 1;
		delay5(5);
	}
}
uchar retemp(void)
{
uchar a,b,tt;
	uint t;
	init_ds18b20();
	writebyte(0xcc);
	writebyte(0x44);
	init_ds18b20();
	writebyte(0xcc);
	writebyte(0xbe);
	a=readbyte();
	b=readbyte();
	t = b;
	t <<= 8;
	t = t|a;
	tt = t * 0.0625;
	return(tt);
}

实验结果

 

B.使用DS18B20温度传感器、数码管显示检测的温度值

实现插上 DS18B20 温度传感器,数码管显示检测的温度值

实验原理图同上

c程序

链接:https://pan.baidu.com/s/1N1fcxvrg150VHVAjz2nfQg 
提取码:0102

实验结果

 

 

C.使用虚拟逻辑分析仪分析上述代码

将上述实验成功的代码在Keil中进行仿真运行,使用虚拟逻辑分析仪显示单片机与DS18B20的DQ数据线连接引脚的波形,分析其“初始化-->写--->读”总线时序,与原理进行对比分析,判断其是否符合技术要求.

其符合技术要求. 

总结

通过此次学习51单片机单总线温度采集的相关内容,掌握了单总线温度采集的使用方法,了解了如何利用单总线进行温度采集,掌握了如何利用单总线来实现温度采集,提高了系统的时间管理能力。

通过实际的应用案例,如利用DS18B20和LED数码管实现单总线温度测量系统、使用DS18B20温度传感器、数码管显示检测的温度值等,将理论知识与实际操作相结合,加深了对单总线温度采集的理解和掌握。

  • 22
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是ds18b20和lcd1602多路温度采集的c语言编程示例: #include <reg51.h> #define DS18B20_PORT P1 sbit DS18B20_PIN = P1^2; void delay_us(unsigned int us) { while(us--) { _nop_(); _nop_(); _nop_(); _nop_(); } } void send_ds18b20(unsigned char dat) { unsigned char i; for(i = 0; i < 8; i++) { DS18B20_PIN = 0; _nop_(); _nop_(); DS18B20_PORT = dat & 0x01; delay_us(5); DS18B20_PIN = 1; dat >>= 1; } } unsigned char read_ds18b20() { unsigned char i, dat = 0; for(i = 0; i < 8; i++) { DS18B20_PIN = 0; _nop_(); _nop_(); DS18B20_PIN = 1; _nop_(); _nop_(); dat >>= 1; if(DS18B20_PIN) dat |= 0x80; delay_us(5); } return dat; } void start_ds18b20() { DS18B20_PIN = 0; delay_us(500); DS18B20_PIN = 1; delay_us(60); DS18B20_PIN = 0; delay_us(500); } void lcd_send_cmd(unsigned char cmd) { P2 = cmd; P0 = 0x04; delay_us(5); P0 = 0x00; delay_us(100); } void lcd_send_data(unsigned char dat) { P2 = dat; P0 = 0x05; delay_us(5); P0 = 0x01; delay_us(100); } void lcd_init() { lcd_send_cmd(0x38); lcd_send_cmd(0x0c); lcd_send_cmd(0x06); lcd_send_cmd(0x01); } void lcd_display_temp(unsigned char temp) { lcd_send_cmd(0x80); lcd_send_data('T'); lcd_send_data('e'); lcd_send_data('m'); lcd_send_data('p'); lcd_send_data(':'); lcd_send_data(' '); lcd_send_data(temp / 10 + '0'); lcd_send_data(temp % 10 + '0'); lcd_send_data(0xdf); lcd_send_data('C'); } void main() { unsigned char i, j, temp, temp_array[5]; lcd_init(); while(1) { start_ds18b20(); send_ds18b20(0xcc); // skip ROM send_ds18b20(0x44); // start conversion delay_us(1000); start_ds18b20(); send_ds18b20(0xcc); // skip ROM send_ds18b20(0xbe); // read scratchpad for(i = 0; i < 9; i++) { temp_array[i] = read_ds18b20(); } temp = temp_array[0] >> 4; lcd_display_temp(temp); delay_us(500); } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值