51单片机DS18B20测温LCD1602显示

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

介绍

通过DS18B20采集温度在LCD1602上显示
第一行显示温度第二行显示精度

Proteus运行仿真图

51单片机DS18B20测温LCD1602显示文章来源地址https://www.toymoban.com/news/detail-508192.html

源程序

主函数

#include<reg51.h>
#include "mine.h"
uchar code WenDu[]={"Tempture:"};
uchar code JingDu[]={"Accuracy:0.0625"};
uchar code Sz[]={"0123456789"};
int Tempture; 
void main()
{ LCD_Init();
	ds18b20Init();
	ds18b20Start();
	delayxms(1000);
	while(1)
	{
	TemptureDisplay();
	}
}
void TemptureDisplay()
{
	uint i,Bai,Ge,Shi;
	Tempture=ds18b20ReadTemperture()*10;
	/*温度是正还是负*/
	if(Tempture<0)
	 {
	   Tempture=-Tempture;
		 DisplayChar(1,9,'-');
	 }
	 else DisplayChar(1,9,'+');
	 /*取出温度每一位*/
	 Bai=Tempture/100;
	 Ge=Tempture%10;
	 Shi=(Tempture%100)/10;
	 /*显示Tempture:*/
	 for(i=0;i<9;i++)
	 DisplayChar(1,i,WenDu[i]);
	 /*显示Accuracy:*/
	 for(i=0;i<15;i++)
	 DisplayChar(2,i,JingDu[i]);
	 /*显示.°C*/
	 DisplayChar(1,12,'.');
	 DisplayChar(1,14,0xdf);
	 DisplayChar(1,15,'C');
	 /*显示温度整数部分*/
	 DisplayChar(1,10,Sz[Bai]);
	 DisplayChar(1,11,Sz[Shi]);
	 /*显示小数部分*/
	 DisplayChar(1,13,Sz[Ge]);
}

自定义头文件

#ifndef _MINE_H          
#define _MINE_H
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
/**************************************ds18b20模块声明*******************************
复位*检查是否存在*读一位*读一个字节*写一个字节*开始读温度*初始*读温度并转换*显示温度*
************************************************************************************/
void ds18b20Rest();
uchar ds18b20Check();
uchar ds18b20ReadBit();
uchar ds18b20ReadByte();
void ds18b20WriteByte(uchar dat);
void ds18b20Start();
uchar ds18b20Init();
float ds18b20ReadTemperture();
void TemptureDisplay();
sbit DQ=P3^3;
/*************************LCD1602模块声明**************************
****************查忙*写数据*写命令*初始化*显示一个字符*************
*******************************************************************/
void Busy();
void W_Data(uchar dat);
void W_Cmd(uchar cmd);
void LCD_Init();
void DisplayChar(uchar y , uchar  x , uchar dat );
sbit rs=P2^0;          
sbit rw=P2^1;  
sbit e=P2^2;
/***********共用模块声明*********
定时器T0初始化*延时10us*延时xms*/
void delay10us(uint us);
void delayxms(uint x);
#endif

LCD1602函数

#include<reg51.h>
#include "mine.h"
/*检查是否忙*/
void Busy()		
{do
  {
		e=0;
		rs=0;
		rw=1;
		P0=0Xff;
		e=1;
  } while (P0^7==1); 
}
/*lcd1602写指令函数*/
void W_Cmd(uchar cmd)
	{
    
    P0=cmd;//要写入的命令
    rs=0; //低电平写指令         
    rw=0; //选择写
		e=0;
	  delayxms(2);
    e=1; 
    delayxms(2);	
    e=0;
}
/*lcd1602写数据函数*/
void W_Data(uchar dat )
{ 
    P0=dat;//要写入的数据
    rs=1;  //高电平写数据         
    rw=0;  //选择写 
    e=0;	
    delayxms(2);  
	  e=1;                
    delayxms(2);  
	  e=0;
}

/*初始化*/
void LCD_Init()
{
  W_Cmd(0x38);//16列两行,8位数据口(指令6)
	W_Cmd(0x0c);//开显示 关光标 不闪烁(指令4)
	W_Cmd(0x06);//写一个数据后,显示位置右移一位(指令3)
	W_Cmd(0x01);//清屏(指令1)
}
/*在指定的位置显示一个字符*/
void DisplayChar(uchar y , uchar  x , uchar dat )
{    
   uchar address;
    if (y==1)                  //等于1使用第一行显示
         address=0x80+x;       //第一行起始地址80H,加x为最终显示字符地址
    else
   address=0xc0+x;             //第二行起始地址c0H,加x为最终显示字符地址
   W_Cmd(address);  //写入地址 
   W_Data(dat);         //写入数据
}

DS18B20

#include<intrins.h>
#include "mine.h"
/***************复位**********/
void ds18b20Reset()
{
 DQ=0;
 delay10us(75);//拉低DQ,750us(480~960)
 DQ=1;
 delay10us(2);//DQ=1,20US(15~60)
}
/*******检测18b20是否存在**********/
uchar ds18b20Check()
{
	uchar time_temp=0;
	while(DQ&&time_temp<20)	//等待DQ为低电平,如果一直高电平且超过200us退出,
	{
		time_temp++;
		delay10us(1);	
	}
	if(time_temp>=20)return 1;//ds18b20没有响应
	else time_temp=0;//检测到ds18b20
	while((!DQ)&&time_temp<20)
	{
	time_temp++;
	delay10us(1);
	}
	if(time_temp>=20)return 1;	//如果超时则强制返回1
	return 0;//检测到响应
}
/*********温度读取(一位)**********/
uchar ds18b20ReadBit()
{
	uchar dat=0;
	DQ=0;
	_nop_();_nop_();
	DQ=1;	
	_nop_();_nop_(); //该段时间不能过长,必须在15us内读取数据
	if(DQ)dat=1;	//读1
	else dat=0;//读0
	delay10us(6);
	return dat;
} 
/*******温度读取(一个字节)**********/
uchar ds18b20ReadByte()
{
	uchar i=0;
	uchar dat=0;
	uchar temp=0;
	for(i=0;i<8;i++)//循环8次,每次读取一位,且先读低位再读高位
	{
		temp=ds18b20ReadBit();
		dat=(temp<<7)|(dat>>1);//temp左移7位或上dat右移1位
	}
	return dat;	
}
/*******温度写入(一个字节)**********/
void ds18b20WriteByte(uchar dat)
{
	uchar i=0;
	uchar temp=0;
	for(i=0;i<8;i++)//循环8次,每次写一位,且先写低位再写高位
	{
		temp=dat&0x01;//取出低位,选择低位准备写入
		dat>>=1;//将次高位移到低位右移
		if(temp)
		{
			DQ=0;
			_nop_();_nop_();//延时2us(>1us)
			DQ=1;//释放总线
			delay10us(6);//至少60us
		}
		else
		{
		DQ=0;//写0与写1延时相反
		delay10us(6);
		DQ=1;
		_nop_();_nop_();	
		}	
	}	
}
void ds18b20Start()
{
  ds18b20Reset();//复位
	ds18b20Check();//检查DS18B20
	ds18b20WriteByte(0xcc);//SKIP ROM
  ds18b20WriteByte(0x44);//转换命令	
}
uchar ds18b20Init()
{
	ds18b20Reset();
	return ds18b20Check();	
}
/***********温度读取*********/
float ds18b20ReadTemperture()
{
	float temp;
	uchar datH=0;
	uchar datL=0;
	uint value=0;
	ds18b20Start();//开始转换
	ds18b20Reset();//复位
	ds18b20Check();
	ds18b20WriteByte(0xcc);//SKIP ROM
  ds18b20WriteByte(0xbe);//读存储器
	datL=ds18b20ReadByte();//低字节
	datH=ds18b20ReadByte();//高字节
	value=(datH<<8)+datL;//合并为16位数据
	if((value&0xf800)==0xf800)//0xf800(1111 1000 0000 0000)判断符号位,负温度(前五位正负后五位温度)
	{
	value=(~value)+1; //数据取反再加1
	temp=value*(-0.0625);//乘以精度	
	}
	else //正温度
	{
	temp=value*0.0625;	
	}
	return temp;
}

共用函数

#include<reg51.h>
#include "mine.h"
void T0_init()
{
	TMOD=0x01;//设置定时器0
	TH0=0x3c;//装初值
	TL0=0xb0;
	EA=1;//开总中断
	ET0=1;//开定时器0中断
	TR0=1;//启动定时器0
}
void delay10us(uint us)
{
	while(us--);	
}
void delayxms(uint x)
{
	uint i,j;
	for(i=0;i<x;i++)
	for(j=0;j<110;j++);
}
显示负数的时候小数位会有偏差但不知道原因

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

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

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

相关文章

  • 51单片机读取DS18B20温度传感器

    1 .首先我们知道DS18B20是 单总线协议 ,只有一根数据线。所以Data数据线即使发送端又是接收端,同时DS18B20内部接了弱上拉电阻(如图一所示),数据线默认为高电平。有了这些概念,我们就能进行下一步。                                                图一 (截取

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    2024年02月08日
    浏览(57)
  • 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日
    浏览(36)
  • 单片机驱动多个ds18b20

    目录 1设计内容 2ds18b20介绍 2.1传感器引脚及原理图 2.2寄存器配置 3程序实现 3.1配置初始化 3.2配置寄存器 3.3ROM读取 3.4温度读取 通过51单片机,读取总线上挂载的多个ds18b20的温度信息。 如下图,成功读取到3路温度数据。 DS18B20传感器的引脚及封装图如下: DS18B20一共有三个引脚

    2024年02月21日
    浏览(28)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包