液晶显示温度(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,一经查实,立即删除!

相关文章

英语字根252

英语字根1,agdo,act 做&#xff0c;动2,agrifield 田地&#xff0c;农田(agri也做agro,agr)3,annyear年4,audihear听5,bellwar战争6,brevshort短7,ced,ceed,cessgo行走8,cepttake拿取9,cid,ciscut,kill切&#xff0c;杀10,circring环&#xff0c;圈11,claim,clamcry,shout喊叫1…

第 5-6 课:Java 并发包中的高级同步工具 + 面试题

Java 中的并发包指的是 java.util.concurrent(简称 JUC)包和其子包下的类和接口,它为 Java 的并发提供了各种功能支持,比如: 提供了线程池的创建类 ThreadPoolExecutor、Executors 等;提供了各种锁,如 Lock、ReentrantLock 等;提供了各种线程安全的数据结构,如 Concur…

python日历模块_Python日历模块| setfirstweekday()方法与示例

python日历模块Python calendar.setfirstweekday()方法 (Python calendar.setfirstweekday() Method) setfirstweekday() method is an inbuilt method of the calendar module in Python. It works on simple text calendars and sets the first weekday from when the week s…

51单片机汇编指令

注: Rn与Ri中n0 ~ 7,i0 ~ 1&#xff0c;另外Cy是进位位&#xff0c;同时也是状态位&#xff0c;标志位 数据传送类指令 内部数据传送指令 助记符作用寻址方式机器周期字节数MOV A,Rn将Rn的内容传送给A寄存器11MOV A,directdirect是一个地址单元&#xff0c;将该地址的内容传…

JavaScript:世界上误解最深的语言

JavaScript:The Worlds Most Misunderstood Programming LanguageJavaScript&#xff1a;世界上误解最深的语言Douglas Crockfordwww.crockford.com翻译&#xff1a;袁晓辉&#xff08;http://blog.csdn.net/uoyevoli/&#xff09;JavaScript, aka Mocha, aka LiveScript, aka …

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

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

MFC中的几个常用类——CFileDialog

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

数组中的filter方法_数组filter()方法以及JavaScript中的示例

数组中的filter方法JavaScript filter()方法 (JavaScript filter() method) filter() method is used to returns an array with the values which pass the given test (condition). filter()方法用于返回具有通过给定测试(条件)的值的数组。 Syntax: 句法&#xff1a; arra…

Oracle内置角色connect与resource的权限

首先用一个命令赋予user用户connect角色和resource角色&#xff1a; grant connect,resource to user; 运行成功后用户包括的权限: CONNECT角色&#xff1a; --是授予最终用户的典型权利&#xff0c;最基本的 ALTER SESSION --修改会话 CREATE CLUSTER --建立聚簇 CREATE DATAB…

第 5-7 课:Java 中的各种锁和 CAS + 面试题

如果说快速理解多线程有什么捷径的话,那本文介绍的各种锁无疑是其中之一,它不但为我们开发多线程程序提供理论支持,还是面试中经常被问到的核心面试题之一。因此下面就让我们一起深入地学习一下这些锁吧。 乐观锁和悲观锁 悲观锁和乐观锁并不是某个具体的“锁”而是一种并…

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 开发中必须要…

Python | 查找字符串中每个字符的频率

Given a string and we have to find the frequency of each character of the string in Python. 给定一个字符串&#xff0c;我们必须在Python中查找该字符串的每个字符的频率。 Example: 例&#xff1a; Input: "hello"Output:{o: 1, h: 1, e: 1, l: 2}Python c…

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。取反就是将该…

oracle 查看用户、权限、角色

查看用户、权限、角色的命令和视图1.查看所有用户&#xff1a; select * from dba_users; select * from all_users; select * from user_users; 2.查看用户系统权限&#xff1a; select * from dba_sys_privs; select * from session_privs; select * from user_sys_privs; 3.…

Java StackTraceElement getClassName()方法与示例

StackTraceElement类的getClassName()方法 (StackTraceElement Class getClassName() method) getClassName() method is available in java.lang package. getClassName()方法在java.lang包中可用。 getClassName() method is used to retrieve the fully qualified name of t…

django post and get?

GET是通过URL传给服务器的,POST是通过HTTP头传给服务器的&#xff0c;post的数据是不跟在请求的url后&#xff0c;而是在http头中&#xff0c;get是在url中 post的安全性比get高&#xff0c;因为有的服务器会缓存get数据&#xff0c;post数据不会被缓存&#xff0c;而且当你再次…

操作系统 测试题

一、单选 1、下面哪项不是常用调度算法 A、FCFS B、SJF C、HRN D、ABC 2、响应比的计算方法是 A、&#xff08;作业等待时间作业执行时间&#xff09;/作业执行时间 B、&#xff08;作业等待时间作业执行时间&#xff09;/作业等待时间 C、&#xff08;作业等待时间&#xf…