MCU-51:单片机DS18B20温度报警器

这篇具有很好参考价值的文章主要介绍了MCU-51:单片机DS18B20温度报警器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、DS18B20

1.1 DS18B20介绍

DS18B20是一种常见的数字温度传感器,其控制命令和数据都是以数字信号的方式输入输出,相比较于模拟温度传感器,具有功能强大、硬件简单、易扩展、抗干扰性强等特点
测温范围:-55°C 到 +125°C
通信接口:1-Wire(单总线)
其它特征:可形成总线结构、内置温度报警功能、可寄生供电
单片机温度报警器,51单片机学习,单片机,嵌入式硬件,c语言,51单片机

1.2 引脚及应用电路

单片机温度报警器,51单片机学习,单片机,嵌入式硬件,c语言,51单片机

1.3 内部结构框图

单片机温度报警器,51单片机学习,单片机,嵌入式硬件,c语言,51单片机
64-BIT ROM:作为器件地址,用于总线通信的寻址
SCRATCHPAD(暂存器):用于总线的数据交互
EEPROM:用于保存温度触发阈值和配置参数

1.4 存储器结构

单片机温度报警器,51单片机学习,单片机,嵌入式硬件,c语言,51单片机

二、单总线

2.1 单总线介绍

单总线(1-Wire BUS)是由Dallas公司开发的一种通用数据总线
一根通信线:DQ
异步、半双工
单总线只需要一根通信线即可实现数据的双向传输,当采用寄生供电时,还可以省去设备的VDD线路,此时,供电加通信只需要DQ和GND两根线
单片机温度报警器,51单片机学习,单片机,嵌入式硬件,c语言,51单片机

2.2 单总线电路规范

设备的DQ均要配置成开漏输出模式
DQ添加一个上拉电阻,阻值一般为4.7KΩ左右
若此总线的从机采取寄生供电,则主机还应配一个强上拉输出电路

单片机温度报警器,51单片机学习,单片机,嵌入式硬件,c语言,51单片机
单片机温度报警器,51单片机学习,单片机,嵌入式硬件,c语言,51单片机

2.3 单总线时序结构

初始化:主机将总线拉低至少480us,然后释放总线,等待15-60us后,存在的从机会拉低总线60-240us以响应主机,之后从机将释放总线
单片机温度报警器,51单片机学习,单片机,嵌入式硬件,c语言,51单片机
发送一位:主机将总线拉低60-120us,然后释放总线,表示发送0;主机将总线拉低1-15us,然后释放总线,表示发送1。从机将在总线拉低30us后(典型值)读取电平,整个时间片应大于60us
单片机温度报警器,51单片机学习,单片机,嵌入式硬件,c语言,51单片机
接收一位:主机将总线拉低1~15us,然后释放总线,并在拉低后15us内读取总线电平(尽量贴近15us的末尾),读取为低电平则为接收0,读取为高电平则为接收1 ,整个时间片应大于60us
单片机温度报警器,51单片机学习,单片机,嵌入式硬件,c语言,51单片机
发送一个字节:连续调用8次发送一位的时序,依次发送一个字节的8位(低位在前)
单片机温度报警器,51单片机学习,单片机,嵌入式硬件,c语言,51单片机
接收一个字节:连续调用8次接收一位的时序,依次接收一个字节的8位(低位在前)

单片机温度报警器,51单片机学习,单片机,嵌入式硬件,c语言,51单片机

三、DS18B20操作流程

初始化:从机复位,主机判断从机是否响应
ROM操作:ROM指令+本指令需要的读写操作
功能操作:功能指令+本指令需要的读写操作
单片机温度报警器,51单片机学习,单片机,嵌入式硬件,c语言,51单片机

四、DS18B20数据帧

温度变换:初始化→跳过ROM →开始温度变换
单片机温度报警器,51单片机学习,单片机,嵌入式硬件,c语言,51单片机
温度读取:初始化→跳过ROM →读暂存器→连续的读操作
单片机温度报警器,51单片机学习,单片机,嵌入式硬件,c语言,51单片机

五、温度存储格式

单片机温度报警器,51单片机学习,单片机,嵌入式硬件,c语言,51单片机
单片机温度报警器,51单片机学习,单片机,嵌入式硬件,c语言,51单片机

六、代码演示

6.1 温度读取

main.c

#include <REGX52.H>
#include "LCD1602.h"
#include "DS18B20.h"
#include "Delay.h"

float T;

void main()
{
	DS18B20_ConvertT();		//上电先转换一次温度,防止第一次读数据错误
	Delay(1000);			//等待转换完成
	LCD_Init();
	LCD_ShowString(1,1,"Temperature:");
	while(1)
	{
		DS18B20_ConvertT();	//转换温度
		T=DS18B20_ReadT();	//读取温度
		if(T<0)				//如果温度小于0
		{
			LCD_ShowChar(2,1,'-');	//显示负号
			T=-T;			//将温度变为正数
		}
		else				//如果温度大于等于0
		{
			LCD_ShowChar(2,1,'+');	//显示正号
		}
		LCD_ShowNum(2,2,T,3);		//显示温度整数部分
		LCD_ShowChar(2,5,'.');		//显示小数点
		LCD_ShowNum(2,6,(unsigned long)(T*10000)%10000,4);//显示温度小数部分
	}
}

DS18B20.c

#include <REGX52.H>
#include "OneWire.h"

//DS18B20指令
#define DS18B20_SKIP_ROM			0xCC
#define DS18B20_CONVERT_T			0x44
#define DS18B20_READ_SCRATCHPAD 	0xBE

/**
  * @brief  DS18B20开始温度变换
  * @param  无
  * @retval 无
  */
void DS18B20_ConvertT(void)
{
	OneWire_Init();
	OneWire_SendByte(DS18B20_SKIP_ROM);
	OneWire_SendByte(DS18B20_CONVERT_T);
}

/**
  * @brief  DS18B20读取温度
  * @param  无
  * @retval 温度数值
  */
float DS18B20_ReadT(void)
{
	unsigned char TLSB,TMSB;
	int Temp;
	float T;
	OneWire_Init();
	OneWire_SendByte(DS18B20_SKIP_ROM);
	OneWire_SendByte(DS18B20_READ_SCRATCHPAD);
	TLSB=OneWire_ReceiveByte();
	TMSB=OneWire_ReceiveByte();
	Temp=(TMSB<<8)|TLSB;
	T=Temp/16.0;
	return T;
}

OneWire.c

#include <REGX52.H>

//引脚定义
sbit OneWire_DQ=P3^7;

/**
  * @brief  单总线初始化
  * @param  无
  * @retval 从机响应位,0为响应,1为未响应
  */
unsigned char OneWire_Init(void)
{
	unsigned char i;
	unsigned char AckBit;
	EA=0;
	OneWire_DQ=1;
	OneWire_DQ=0;
	i = 247;while (--i);		//Delay 500us
	OneWire_DQ=1;
	i = 32;while (--i);			//Delay 70us
	AckBit=OneWire_DQ;
	i = 247;while (--i);		//Delay 500us
	EA=1;
	return AckBit;
}

/**
  * @brief  单总线发送一位
  * @param  Bit 要发送的位
  * @retval 无
  */
void OneWire_SendBit(unsigned char Bit)
{
	unsigned char i;
	EA=0;
	OneWire_DQ=0;
	i = 4;while (--i);			//Delay 10us
	OneWire_DQ=Bit;
	i = 24;while (--i);			//Delay 50us
	OneWire_DQ=1;
	EA=1;
}

/**
  * @brief  单总线接收一位
  * @param  无
  * @retval 读取的位
  */
unsigned char OneWire_ReceiveBit(void)
{
	unsigned char i;
	unsigned char Bit;
	EA=0;
	OneWire_DQ=0;
	i = 2;while (--i);			//Delay 5us
	OneWire_DQ=1;
	i = 2;while (--i);			//Delay 5us
	Bit=OneWire_DQ;
	i = 24;while (--i);			//Delay 50us
	EA=1;
	return Bit;
}

/**
  * @brief  单总线发送一个字节
  * @param  Byte 要发送的字节
  * @retval 无
  */
void OneWire_SendByte(unsigned char Byte)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		OneWire_SendBit(Byte&(0x01<<i));
	}
}

/**
  * @brief  单总线接收一个字节
  * @param  无
  * @retval 接收的一个字节
  */
unsigned char OneWire_ReceiveByte(void)
{
	unsigned char i;
	unsigned char Byte=0x00;
	for(i=0;i<8;i++)
	{
		if(OneWire_ReceiveBit()){Byte|=(0x01<<i);}
	}
	return Byte;
}

6.2 温度报警器

main.c

#include <REGX52.H>
#include "LCD1602.h"
#include "DS18B20.h"
#include "Delay.h"
#include "AT24C02.h"
#include "Key.h"
#include "Timer0.h"

float T,TShow;
char TLow,THigh;
unsigned char KeyNum;

void main()
{
	DS18B20_ConvertT();		//上电先转换一次温度,防止第一次读数据错误
	Delay(1000);			//等待转换完成
	THigh=AT24C02_ReadByte(0);	//读取温度阈值数据
	TLow=AT24C02_ReadByte(1);
	if(THigh>125 || TLow<-55 || THigh<=TLow)
	{
		THigh=20;			//如果阈值非法,则设为默认值
		TLow=15;
	}
	LCD_Init();
	LCD_ShowString(1,1,"T:");
	LCD_ShowString(2,1,"TH:");
	LCD_ShowString(2,9,"TL:");
	LCD_ShowSignedNum(2,4,THigh,3);
	LCD_ShowSignedNum(2,12,TLow,3);
	Timer0_Init();
	
	while(1)
	{
		KeyNum=Key();
		
		/*温度读取及显示*/
		DS18B20_ConvertT();	//转换温度
		T=DS18B20_ReadT();	//读取温度
		if(T<0)				//如果温度小于0
		{
			LCD_ShowChar(1,3,'-');	//显示负号
			TShow=-T;		//将温度变为正数
		}
		else				//如果温度大于等于0
		{
			LCD_ShowChar(1,3,'+');	//显示正号
			TShow=T;
		}
		LCD_ShowNum(1,4,TShow,3);		//显示温度整数部分
		LCD_ShowChar(1,7,'.');		//显示小数点
		LCD_ShowNum(1,8,(unsigned long)(TShow*100)%100,2);//显示温度小数部分
		
		/*阈值判断及显示*/
		if(KeyNum)
		{
			if(KeyNum==1)	//K1按键,THigh自增
			{
				THigh++;
				if(THigh>125){THigh=125;}
			}
			if(KeyNum==2)	//K2按键,THigh自减
			{
				THigh--;
				if(THigh<=TLow){THigh++;}
			}
			if(KeyNum==3)	//K3按键,TLow自增
			{
				TLow++;
				if(TLow>=THigh){TLow--;}
			}
			if(KeyNum==4)	//K4按键,TLow自减
			{
				TLow--;
				if(TLow<-55){TLow=-55;}
			}
			LCD_ShowSignedNum(2,4,THigh,3);	//显示阈值数据
			LCD_ShowSignedNum(2,12,TLow,3);
			AT24C02_WriteByte(0,THigh);		//写入到At24C02中保存
			Delay(5);
			AT24C02_WriteByte(1,TLow);
			Delay(5);
		}
		if(T>THigh)			//越界判断
		{
			LCD_ShowString(1,13,"OV:H");
		}
		else if(T<TLow)
		{
			LCD_ShowString(1,13,"OV:L");
		}
		else
		{
			LCD_ShowString(1,13,"    ");
		}
	}
}

void Timer0_Routine() interrupt 1
{
	static unsigned int T0Count;
	TL0 = 0x18;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
	T0Count++;
	if(T0Count>=20)
	{
		T0Count=0;
		Key_Loop();	//每20ms调用一次按键驱动函数
	}
}

AT24C02.c

#include <REGX52.H>
#include "I2C.h"

#define AT24C02_ADDRESS		0xA0

/**
  * @brief  AT24C02写入一个字节
  * @param  WordAddress 要写入字节的地址
  * @param  Data 要写入的数据
  * @retval 无
  */
void AT24C02_WriteByte(unsigned char WordAddress,Data)
{
	I2C_Start();
	I2C_SendByte(AT24C02_ADDRESS);
	I2C_ReceiveAck();
	I2C_SendByte(WordAddress);
	I2C_ReceiveAck();
	I2C_SendByte(Data);
	I2C_ReceiveAck();
	I2C_Stop();
}

/**
  * @brief  AT24C02读取一个字节
  * @param  WordAddress 要读出字节的地址
  * @retval 读出的数据
  */
unsigned char AT24C02_ReadByte(unsigned char WordAddress)
{
	unsigned char Data;
	I2C_Start();
	I2C_SendByte(AT24C02_ADDRESS);
	I2C_ReceiveAck();
	I2C_SendByte(WordAddress);
	I2C_ReceiveAck();
	I2C_Start();
	I2C_SendByte(AT24C02_ADDRESS|0x01);
	I2C_ReceiveAck();
	Data=I2C_ReceiveByte();
	I2C_SendAck(1);
	I2C_Stop();
	return Data;
}

注意:一定要看

千万不要直接复制代码,因为是模块化编写,模块的代码没有往上复制(模块的代码在以往的文章中可以找到),大家一定要自己动手!!!!!文章来源地址https://www.toymoban.com/news/detail-784332.html

到了这里,关于MCU-51:单片机DS18B20温度报警器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【小实验】C51单片机 DS18B20温度显示实验

         利用单总线技术和数码管动态显示的原理,要求实现DS18B20温度采集并显示,能够设定温度值上限值27.5度,当超出上限值LED灯闪烁。    实验前可先用protues绘制出原理图:   代码仅供参考,希望大家能够在此基础上优化代码,而不是ctrl+c,ctrl+v。 谢谢!!!        

    2024年02月12日
    浏览(44)
  • 基于51单片机多路温度检测proteus仿真 ds18b20

    本设计是基于51单片机多路温度检测proteus仿真_ds18b20(仿真+程序+原理图) 仿真图proteus 7.8 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:C0042 功能说明: 通过对多路DS18B20温度传感器的数据采集,实现8路/4路温度采集并将数值显示在LCD显示屏上; 通过按键设置温度报警

    2024年02月12日
    浏览(49)
  • 基于51单片机的DS18B20温度控制加热降温系统设计

    仿真图:proteus8.9以上 程序代码:KEIL4/KEIL5 原理图:AD 设计编号:A0007 结合实际情况,基于51单片机设计一个排队叫号系统设计。该系统应满足的功能要求为: 系统由51单片机、DS18B20温度传感器、LCD1602液晶显示屏、继电器、风扇、加热膜、按键、蜂鸣器组成。 可实现以下基本功能

    2023年04月09日
    浏览(79)
  • 51单片机DS18B20温度报警器proteus仿真设计_可调上下限

    (仿真+源码+原理图+报告+讲解视频) 原理图:Altium Designer 仿真版本:proteus 7.8 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0008 本设计系统是18b20温度报警系统数码管显示,可设置温度上限高温报警和下限低温报警,报警温度可精确到0.1度,并具有掉电保存功能,数

    2024年02月11日
    浏览(44)
  • 51单片机DS18B20温度传感器使用及数码管温度计、LCD1602温度显示代码详解

    温馨提示:读者若要彻底理解并会灵活使用DS18B20温度传感器,请详细阅读中文手册,并且对照代码注释充分分析代码。请不要觉得中文手册内容繁多!如能静心分析,定能深有体会,获益匪浅! 主函数操作顺序(执行序列) 功能指令 最后希望我的分享对你有所帮助!敬请关

    2024年02月12日
    浏览(53)
  • DS18B20与单片机的通信、DS18B20采集温度、MODBUS协议、练习框架

    单总线数字温度计 异步的半双工的串行通信 测量范围从-55℃ ~ +125℃,增量值为0.5℃ 要用DS18B20采集温度,就要实现与单片机之间的通信,因此有两个问题 Bus master active low:主机执行低电平 DS1820 active low:DS18B20执行低电平 Both bus master and DS1820 active low:全都释放低电平 Resis

    2024年04月16日
    浏览(46)
  • 【单片机】17-温度传感器DS18B20

    (1)测温度的方式:物理(汞柱,气压),电子(金属电性能随温度变化) (2)早期:热敏电阻(模拟接口---》 A/D转换 ) (3)现代:专用sensor(数字接口,如I2C,DS18B20单总线接口等) DS18B20 可编程分辨率单总线 温度传感器 (1)内置集成ADC,外部数字接口 (2) 单总线

    2024年02月04日
    浏览(52)
  • 单片机第二季:温度传感器DS18B20

    目录 1,DS18B20介绍 2,DS18B20数据手册  2.1,初始化时序  2.2,读写时序  3,DS18B20工作流程 4,代码   DS18B20的基本特征: (1)内置集成ADC,外部数字接口,也就是可以直接与单片机的数字接口连接,DS18B20 在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只

    2024年02月10日
    浏览(54)
  • 【蓝桥杯-单片机学习笔记(十三)】DS18B20温度传感器

    一、温度传感器-DS18B20介绍 DS18B20是单总线数字化温度传感器,测量温度范围是-55℃~+125℃,在-10℃~+85℃范围内,精度为±0.5℃。支持3V~5.5V的供电电压范围。DS18B20可以程序设定9~12位的分辨率,精度为±0.5℃。 1.DS18B20内部结构 DS18B20内部结构主要由四部分组成:64位光刻ROM、温度

    2023年04月09日
    浏览(63)
  • 51单片机DS18B20测温LCD1602显示

    主函数 自定义头文件 LCD1602函数 DS18B20 共用函数

    2024年02月11日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包