51单片机学习--DS18B20温度读取&温度报警器

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

51单片机学习--DS18B20温度读取&温度报警器,51单片机,51单片机,学习,嵌入式硬件,单片机
需要先编写OneWire模块,再在DS18B20模块中调用OneWire模块的函数
51单片机学习--DS18B20温度读取&温度报警器,51单片机,51单片机,学习,嵌入式硬件,单片机
先根据原理图做好端口的声明:

sbit OneWire_DQ = P3^7;

接下来像之前一样把时序结构用代码模拟出来:
51单片机学习--DS18B20温度读取&温度报警器,51单片机,51单片机,学习,嵌入式硬件,单片机

unsigned char OneWire_Init(void)
{
	unsigned char i;
	unsigned char AckBit;
	OneWire_DQ = 1;
	
	OneWire_DQ = 0; //总线拉低
	//延时500us
	i = 227; while (--i);
	
	OneWire_DQ = 1; //释放总线
	//延时70us
	i = 29; while (--i);
	
	AckBit = OneWire_DQ;
	//延时500us
	i = 227; while (--i);
	
	return AckBit;
}

51单片机学习--DS18B20温度读取&温度报警器,51单片机,51单片机,学习,嵌入式硬件,单片机

void OneWire_SendBit(unsigned char Bit)
{
	unsigned char i;
	OneWire_DQ = 0; //总线拉低
	
	//延时10us后直接读电平
	i = 4; while(--i);
	OneWire_DQ = Bit;
	
	//延时50us凑满时间片
	i = 22; while(--i);
	
	OneWire_DQ = 1;
}

51单片机学习--DS18B20温度读取&温度报警器,51单片机,51单片机,学习,嵌入式硬件,单片机

unsigned char OneWire_ReceiveBit(void)
{
	unsigned char i;
	unsigned char Bit;
	OneWire_DQ = 0;
	
	//延时5us
	i = 2; while(--i);
	OneWire_DQ = 1;
	//延时5us
	i = 2; while(--i);
	
	Bit = OneWire_DQ;
	
	//延时50us
	i = 22; while(--i);
	
	return Bit;
}

51单片机学习--DS18B20温度读取&温度报警器,51单片机,51单片机,学习,嵌入式硬件,单片机

void OneWire_SendByte(unsigned char Byte)
{
	unsigned char i;
	for(i = 0; i < 8; i ++) {
		OneWire_SendBit(Byte & (0x01<<i));
	}
}

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;
}

至此,OneWire模块就写好了,接下来在DS18B20模块中模拟数据帧:
51单片机学习--DS18B20温度读取&温度报警器,51单片机,51单片机,学习,嵌入式硬件,单片机

51单片机学习--DS18B20温度读取&温度报警器,51单片机,51单片机,学习,嵌入式硬件,单片机

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

#define DS18B20_SKIP_ROM   0xCC
#define DS18B20_CONVERT_T  0x44
#define DS18B20_READ_SCRATCHPAD  0xBE

void DS18B20_ConvertT(void)
{
	OneWire_Init();
	OneWire_SendByte(DS18B20_SKIP_ROM);
	OneWire_SendByte(DS18B20_CONVERT_T);
}


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;
}

之后只需要在main中调用即可

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

float T;


void main()
{
	LCD_Init();
	LCD_ShowString(1, 1, "Temperature!");
	
	while(1)
	{
		DS18B20_ConvertT();
		T = DS18B20_ReadT();
		
		if(T < 0)
		{
			LCD_ShowChar(2, 1, '-');
			T = -T;
		}
		else
		{
			LCD_ShowChar(2, 1, '+');
		}
		LCD_ShowNum(2, 2, T, 3);//整数部分
		LCD_ShowChar(2, 5, '.');
		LCD_ShowNum(2, 6, (unsigned long)(T *10000) % 10000, 4); //小数部分
	}
}

51单片机学习--DS18B20温度读取&温度报警器,51单片机,51单片机,学习,嵌入式硬件,单片机


接下来进行一些综合的应用:温度报警器,按键可调整报警温度的上下限,且能用AT24C02记录上下限,掉电不丢失(这里默认所有温度不会超过DS18B20的芯片范围)

#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 THigh, TLow;
unsigned char KeyNum;


void main()
{
	THigh = AT24C02_ReadByte(0);
	TLow = AT24C02_ReadByte(1);
	//第一次读可能是非法值,所以要特判一下
	if(THigh > 125 || TLow < - 55 || THigh <= TLow)
	{
		THigh = 20;
		TLow = 15;
	}
	
	Timer0_Init();
	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);
	
	while(1)
	{
		KeyNum = Key();
		
		
		/*温度读取及显示*/
		DS18B20_ConvertT();
		T = DS18B20_ReadT();
		
		if(T < 0)
		{
			LCD_ShowChar(1, 3, '-');
			TShow = -T;
		}
		else
		{
			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) THigh ++;
			if(KeyNum == 2) THigh --;
			if(KeyNum == 3) TLow ++;
			if(KeyNum == 4) TLow --;
			
			LCD_ShowSignedNum(2, 4, THigh, 3);
			LCD_ShowSignedNum(2, 12, TLow, 3);
			AT24C02_WriteByte(0, THigh);
			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 = 0x66;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
	T0Count ++;
	if(T0Count >= 20) //20ms执行一次
	{
		T0Count = 0;
		
    Key_Loop();
	}
}

51单片机学习--DS18B20温度读取&温度报警器,51单片机,51单片机,学习,嵌入式硬件,单片机

这还没完,在与定时器的结合中,定时器的中断会影响OneWire的延时,从而影响其中的时序结构进而影响温度实时获取,所以在时序结构编写的代码中需要加上屏蔽定时器中断的代码:开始时加上EA = 0,最后加上EA = 1,改版后的OneWire模块如下:

#include <REGX52.H>

sbit OneWire_DQ = P3^7;

unsigned char OneWire_Init(void)
{
	unsigned char i;
	unsigned char AckBit;
	EA = 0;  //屏蔽中断
	OneWire_DQ = 1;
	
	OneWire_DQ = 0; //总线拉低
	//延时500us
	i = 227; while (--i);
	
	OneWire_DQ = 1; //释放总线
	//延时70us
	i = 29; while (--i);
	
	AckBit = OneWire_DQ;
	//延时500us
	i = 227; while (--i);
	
	EA = 1;
	return AckBit;
}

void OneWire_SendBit(unsigned char Bit)
{
	unsigned char i;
	EA = 0;  //屏蔽中断
	OneWire_DQ = 0; //总线拉低
	
	//延时10us后直接读电平
	i = 4; while(--i);
	OneWire_DQ = Bit;
	
	//延时50us凑满时间片
	i = 22; while(--i);
	
	OneWire_DQ = 1;
	EA = 1;
}

unsigned char OneWire_ReceiveBit(void)
{
	unsigned char i;
	unsigned char Bit;
	EA = 0;  //屏蔽中断
	OneWire_DQ = 0;
	
	//延时5us
	i = 2; while(--i);
	OneWire_DQ = 1;
	//延时5us
	i = 2; while(--i);
	
	Bit = OneWire_DQ;
	
	//延时50us
	i = 22; while(--i);
	
	EA = 1;
	return Bit;
}


void OneWire_SendByte(unsigned char Byte)
{
	unsigned char i;
	for(i = 0; i < 8; i ++) {
		OneWire_SendBit(Byte & (0x01<<i));
	}
}

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;
}

但是这样虽然能维护好单总线的通信,但这样直接屏蔽中断却会影响定时器的计时准确度,从而对定时器控制的其他模块造成影响,这也就是单总线的一大缺点,不过在这个实例中,按键的定时器准度要求并不高,所以这样控制影响不大文章来源地址https://www.toymoban.com/news/detail-632577.html

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

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

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

相关文章

  • 基于51单片机的DS18B20温度显示

    本讲内容:       了解温度传感器DS18B20的使用,并通过一个例程展示温度传感器DS18B20测温过程。 DS18B20简介:       DS18B20 是单线数字温度传感器,即“一线器件”,其具有独特的优点:     (1)采用单总线的接口方式 与微处理器连接时 仅需要一条口线即可实现微处理器

    2024年02月12日
    浏览(50)
  • 51单片机(十三)DS18B20温度传感器

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月11日
    浏览(40)
  • MCU-51:单片机DS18B20温度报警器

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

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

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

    2024年02月12日
    浏览(46)
  • 【小实验】C51单片机 DS18B20温度显示实验

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

    2024年02月12日
    浏览(39)
  • 基于51单片机数字温度报警器_DS18B20可调上下限

    (仿真+程序+原理图) 原理图:Altium Designer 仿真版本:proteus 7.8 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0009 1、实时温度测量及显示,超出温度范围声光报警,上下限温度可通过按键设定等功能; 2、温度测量范围0到99.9摄氏度,精度为0.1摄氏度; 3、可设置上下

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

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

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

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

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

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

    2024年02月12日
    浏览(50)
  • 【TB作品】MSP430单片机 Proteus仿真 DS18B20温度 LCD1602显示器 温度读取与显示

    效果图如下: 首先,让我们先来说说DS18B20集成电路。 • DS18B20是一款采用OneWire通讯协议的集成电路,因此只需要一条线就可以与微控制器通讯。它不需要额外的电源,但是也有外部电源输入端口。 • OneWire设备具有64位的ROM代码。如我们之前所说,这64位的前8位是家族代码,中间

    2024年02月08日
    浏览(65)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包