液晶显示温度(DS18B20)

DS18B20测温范围-55——125度,在-10——85度之间精度为0.5度,其测温精度还是较高的,DS18B20常见封装为3个引脚,VCC(电源正),DQ(信号线),GND(电源负),如图:
在这里插入图片描述
DS18B20相关指令,如下表:

指令功能
33H读ROM,即DS18B20传感器中ROM的编码
55H匹配ROM,为下一步读或写做准备
F0H搜索ROM,确定挂接在同一总线上DS18B20的个数
CCH跳过ROM,直接向DS18B20发温度转换命令,适用于只有一个DS18B20
ECH告警搜索,执行后只有温度超过上限或下限的传感器作出相应
44H温度转换,将结果存在内部9字节的RAM中
BEH读RAM,即读内部RAM中9字节的温度数据
4EH写RAM,向内部RAM的第2,3字节处写上、下限温度数据,紧跟该命令后传送两字节的数据,即上下限温度
48H复制RAM,将RAM中第2,3字节的内容复制到EEPROM中
B8H数据恢复,即将EEPROM中的内容恢复到RAM中的第3,4字节
B4H读供电方式,寄生供电时DS18B20发送0,外接电源供电时DS18B20发送1

DS18B20时序图如下
(1)初始化
在这里插入图片描述
(2)DS18B20写数据
在这里插入图片描述
(3)DS18B20读数据
在这里插入图片描述
例程
DS18B20.h

#ifndef __DS18B20_H_
#define __DS18B20_H_#include <reg52.h>#define uchar unsigned char
#define uint unsigned intsbit DS18B20=P3^7;extern uchar ShowData[6];void  Delay1ms(uint );
uchar Ds18b20Init();
void  Ds18b20WriteByte(uchar com);
uchar Ds18b20ReadByte();
void  Ds18b20ChangeTemp();
void  Ds18b20ReadTempCom();
int   Ds18b20ReadTemp();
void  Datapros();
#endif

DS18B20.c

#include "DS18B20.h"uchar ShowData[6]={0};void Delay1ms(uint y)
{uint x;for( ; y>0; y--){for(x=110; x>0; x--);}
}uchar Ds18b20Init()
{uchar i;DS18B20 = 0;			 //将总线拉低480us~960usi = 70;	while(i--);//延时642usDS18B20 = 1;			//然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低i = 0;while(DS18B20)	//等待DS18B20拉低总线{Delay1ms(1);i++;if(i>5)//等待>5MS{return 0;//初始化失败}}return 1;//初始化成功
}void Ds18b20WriteByte(uchar data)
{uint i, j;for(j=0; j<8; j++){DS18B20 = 0;	     	  //每写入一位数据之前先把总线拉低1usi++;DS18B20 = data & 0x01;  //然后写入一个数据,从最低位开始i=6;while(i--); //延时68us,持续时间最少60usDS18B20 = 1;	//然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值data >>= 1;}
}uchar Ds18b20ReadByte()
{uchar byte, bi;uint i, j;	for(j=8; j>0; j--){DS18B20 = 0;//先将总线拉低1usi++;DS18B20 = 1;//然后释放总线i++;i++;//延时6us等待数据稳定bi = DS18B20;	 //读取数据,从最低位开始读取/*将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0。*/byte = (byte >> 1) | (bi << 7);						  i = 4;		//读取完之后等待48us再接着读取下一个数while(i--);}				return byte;
}void  Ds18b20ChangeTemp()
{Ds18b20Init();Delay1ms(1);Ds18b20WriteByte(0xcc);		//跳过ROM操作命令		 Ds18b20WriteByte(0x44);	    //温度转换命令   
}void  Ds18b20ReadTempCom()
{	Ds18b20Init();Delay1ms(1);Ds18b20WriteByte(0xcc);	 //跳过ROM操作命令Ds18b20WriteByte(0xbe);	 //发送读取温度命令
}int Ds18b20ReadTemp()
{int temp = 0;uchar tmh, tml;Ds18b20ChangeTemp();			 	//先写入转换命令Ds18b20ReadTempCom();			//然后等待转换完后发送读取温度命令tml = Ds18b20ReadByte();		//读取温度值共16位,先读低字节tmh = Ds18b20ReadByte();		//再读高字节temp = tmh;temp <<= 8;temp |= tml;return temp;
}void Datapros() 	 
{float tp; int temp=Ds18b20ReadTemp(); if(temp< 0)				//当温度值为负数{//因为读取的温度是实际温度的补码,所以减1,再取反求出原码temp=temp-1;temp=~temp;tp=temp;temp=tp*0.0625*100+0.5;	//留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就//算加上0.5,还是在小数点后面。}else{			tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量//如果温度是正的那么,那么正数的原码就是补码它本身temp=tp*0.0625*100+0.5;	}ShowData[0] = temp % 10000 / 1000;ShowData[0] = '0'+ShowData[0];ShowData[1] = temp % 1000 / 100;ShowData[1] = '0'+ShowData[1];ShowData[2] = '.';ShowData[3] = temp % 100 / 10;ShowData[3] = '0'+ShowData[3];ShowData[4] = temp % 10;ShowData[4] = '0'+ShowData[4];ShowData[5] = 'C';
}

LCD1602.h

#ifndef _LCD1602_H
#define _LCD1602_H#include <reg52.h>
#include <stdio.h>
#include <string.h>#define  uchar unsigned  char
#define  uint unsigned  int
#define  LCD1602_DATAPINS  P0sbit  RW=P2^5;                   //读写选择端
sbit  RS=P2^6;                   //数据命令选择端
sbit  E=P2^7;                    //使能端void  Delay_1ms(uint i);
void  LcdWriteCom(uchar com);
void  LcdWriteData(uchar dat);
void  LcdInit();
void  LcdShow(uchar ShowData[],int ShowSize);
#endif

LCD1602.c

#include "LCD1602.h"void Delay_1ms(uint i)           //延时,误差 0us
{uchar j;for (; i>0; i--)for (j=200;j>0;j--);   
}void  LcdWriteCom(uchar com)   //写入命令
{E = 0;       //使能RS = 0;    //选择发送命令RW = 0;    //选择写入LCD1602_DATAPINS = com;     //放入命令Delay_1ms(1);       //等待数据稳定E = 1;            //写入时序Delay_1ms(5);      //保持时间E = 0;
}   void  LcdWriteData(uchar dat)            //写入数据
{E = 0;  //使能清零RS = 1; //选择输入数据RW = 0; //选择写   LCD1602_DATAPINS = dat; //写入数Delay_1ms(1);E = 1;  //写入时序Delay_1ms(5);   //保持时间E = 0;
}void LcdInit()                       //LCD初始化子程序
{LcdWriteCom(0x38);  //开显示LcdWriteCom(0x0f);  //开显示不显示光标LcdWriteCom(0x06);  //写一个指针加1LcdWriteCom(0x01);  //清屏LcdWriteCom(0x80);  //设置数据指针起点
}void LcdShow(uchar ShowData[],int ShowSize)
{uchar i=0;for(;i<ShowSize;i++){LcdWriteData(ShowData[i]);	}
}

main.c

#include "DS18B20.h"	
#include "LCD1602.h"void main()
{	LcdInit();LcdWriteCom(0x0C);			 //不显示光标while(1){Datapros();LcdWriteCom(0x80);  //设置数据指针起点LcdShow(ShowData,sizeof(ShowData));		}		
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/545637.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第 5-5 课:线程安全——synchronized 和 ReentrantLock + 面试题

前面我们介绍了很多关于多线程的内容,在多线程中有一个很重要的课题需要我们攻克,那就是线程安全问题。线程安全问题指的是在多线程中,各线程之间因为同时操作所产生的数据污染或其他非预期的程序运行结果。 线程安全 1)非线程安全事例 比如 A 和 B 同时给 C 转账的问题…

MFC中的几个常用类——CFileDialog

2019独角兽企业重金招聘Python工程师标准>>> 1 简介 CFileDialog类封装了Windows常用的文件对话框。常用的文件对话框提供了一种简单的与Windows标准相一致的文件打开和文件存盘对话框功能。 可以用 构造函数提供的方式使用CFileDialog&#xff0c;也可以从CFileDi…

Exchange Server2010部署完后的配置:CA、Outlook Anywhere、OWA域名简写

Exchange Server 2010邮件系统安装完成后&#xff0c;必须经过相应的配置后&#xff0c;才能使Exchange Server 2010邮件系统提供基本的访问、邮件收发等基本功能。下面我们逐一看看如何让Exchanger Server跑起来。Exchange Server2010产品授权&#xff1a;我们目前所安装的Exc…

STM32——PID恒温控制

原理 元件 stm32f103核心板、L298N模块(当然用MOS管更好)、led一个、NPN三极管一个、蜂鸣器一个、DHT11一个、LCD1602一个、电阻200欧两个、可调电阻10K一个、加热丝一个 功能描述 用DHT11检测当前环境温湿度&#xff0c;并将数据显示在LCD1602上&#xff0c;在用设定温度与当…

第 6-2 课:SpringMVC 核心 + 面试题

Spring MVC 介绍 Spring MVC(Spring Web MVC)是 Spring Framework 提供的 Web 组件,它的实现基于 MVC 的设计模式:Controller(控制层)、Model(模型层)、View(视图层),提供了前端路由映射、视图解析等功能,让 Java Web 开发变得更加简单,也属于 Java 开发中必须要…

Lync2013 升级错误总结8 Lync2013 日志总是提示进程 RtcHost(5724) 收到了一个无效的客户端证书...

错误提示&#xff1a;解决方法&#xff1a;1打开注册表引导到&#xff1a;HKLM\System\CurrentControlSet\Control\SecurityProviders\Schannel2 新建一个DWORD键值&#xff1a;值的名称&#xff1a;EnableSessionTicket3 右键这个值点编辑讲数值数据修改成&#xff1a;24 重新…

简易的遍历文件加密解密

功能描述 将生成的可执行程序放在指定的文件夹内&#xff0c;双击后将该目录下所有文件包括子文件夹内文件全部加密&#xff0c;再次双击运行后将进行解密。 加密解密实现 主要运用了异或与取反操作&#xff0c;异或&#xff1a;两个值不同为1&#xff0c;相同为0。取反就是将该…

安卓手机使用linux(含图形界面)——Aid Learning

以前再安卓手机上使用linux系统都是使用Termux&#xff0c;安装上很麻烦&#xff0c;而且还是黑乎乎的窗口&#xff0c;没有图形界面&#xff0c;对于初学linux者来说并不友好&#xff0c;而Aid Learning就更人性化了&#xff0c;他是一种模拟的linux,其安装十分简易&#xff0…

简易花式流水灯

先看看效果 具体思路 实现流水灯的效果其实就是控制相应的I/O口&#xff0c;以P2为例&#xff0c;通过有规律的改变P2各I/O口的状态就可实现相应规律的流水灯效果&#xff0c;这其中需要用到与、或、异或、左移、右移等操作。   流水灯向左闪烁点亮就是将P2最低位的1不断左移…

STM32——直流电机PI调速

所需元件 STM32F103开发板、L298N一个、带编码器的直流电机一个&#xff08;如下图所示&#xff0c;淘宝上有很多&#xff09; 系统框图 通过系统框图&#xff0c;我们需要做两件事&#xff0c;一是要测速&#xff0c;二是要调节。测速目前流行的就是通过编码器测速&#xff…

JAVA设计模式--简单介绍

2019独角兽企业重金招聘Python工程师标准>>> &#xfeff;一、简介 Design pattern 是众多软件开发人员经过漫长的试验和错误总结出来的在软件开发过程中面临一般问题的解决方案&#xff0c;代表着最佳实践。使用设计模式是为了重用代码、让代码更容易被他人理解、保…

为什么是PID控制

在进入正式话题之前需要引入四个概念&#xff1a;稳态误差、终值定理、幅角条件和系统稳定的充要条件。 稳态误差&#xff1a;系统达到稳定状态后&#xff0c;系统的实际输出量与系统希望的输出量之间的偏差。 终值定理&#xff1a;设有连续函数f(t)f(t)f(t)&#xff0c;当t趋于…

卡尔曼滤波器推导

注&#xff1a;受控制领域大牛CAN博士启发&#xff0c;受益匪浅&#xff0c;作此文以为笔记。 简介 设 卡尔曼滤波器是从测量值ZZZk的平均数开始的。开始推导&#xff1a; 由上式可知   也就是说随着kkk的增大&#xff0c;测量结果Zk不在重要&#xff0c;因为已经获得了足…

cocos2dx3.2文件结构和代码结构

既然选定了cocos2dxlua的原生方式来开发&#xff0c;首先要确定的是使用哪个版本的cocos2dx&#xff0c;先看看github上的changelog和releasenote&#xff0c;然后在google里搜索一下&#xff0c;参考了jacky的博客http://zengrong.net/post/2100.htm&#xff0c;最终选择了coc…

改进的PID算法

位置式PID算法 位置式PIDPIDPID算法是一种比较直观的的PIDPIDPID算法&#xff0c;如系统框图中所示&#xff0c;ininin表示设定值&#xff0c;errorerrorerror表示差值&#xff0c;uuu表示控制器输出值&#xff0c;outoutout表示被控量。算法表达式如下&#xff1a; 增量式PI…

几种简单电路知识汇总

这篇文章用于记录平时设计电路或者在书中遇到的一些电路方面的知识&#xff0c;会不定期更新。就先从运算放大器开始&#xff0c;对此做个简单的介绍。 运算放大器 说到运算放大器就不得不说两个概念&#xff0c;虚短与虚断。 虚短&#xff1a; 在理想情况下&#xff0c;运算…

51单片机——交通灯

原理图 功能描述 1、基本功能就是如同红绿灯一般&#xff0c;不做赘述。   2、红灯时长和绿灯时长可通过按键设置&#xff0c;即按键列中的上面4个&#xff0c;当这4个按键有一个按下后便进入时长设置功能&#xff0c;设置完成后按最下面两个按键&#xff08;紧急控制按钮&am…

设置TextField内文字距左边框的距离

2019独角兽企业重金招聘Python工程师标准>>> //设置文本框左边的viewUITextField *textField [[UITextField alloc]init];textField.frame CGRectMake(10, 30, 300, 30);[self.view addSubview:textField];textField.leftView [[UIView alloc]initWithFrame:CGRe…

类的三大特性

类有三大特性&#xff1a;继承&#xff0c;封装&#xff0c;多态&#xff0c;这个也是介绍类的时候&#xff0c;必须提到的话题&#xff0c;那么今天就来看一下OC中类的三大特性&#xff1a; 一、封装 学习过Java中类的同学可能都知道了&#xff0c;封装就是对类中的一些字段&a…

操作系统抢占式优先级调度_操作系统中的优先级调度(非抢先)

操作系统抢占式优先级调度Priority scheduling is a type of scheduling algorithm used by the operating system to schedule the processes for execution. The priority scheduling has both the preemptive mode of scheduling and the non-preemptive mode of scheduling…