单总线(也称1-Wire bus)由美国DALLAS公司推出的外围串行扩展总线。只有一条数据输入/输出线DQ,总线上所有器件都挂在DQ上,电源也通过这条信号线供给。
单总线系统中配置的各种器件,由DALLAS公司提供的专用芯片实现。每个芯片都有64位ROM,厂家对每一芯片都用激光烧写编码,其中存有16位十进制编码序列号,它是器件的地址编号,确保它挂在总线上后,可以唯一被确定。除了器件的地址编码外,芯片内还包含收发控制和电源存储电路。这些芯片耗电量都很小(空闲时几µW,工作时几mW),工作时从总线上馈送电能到大电容中就可以工作,故一般不需另加电。
DS18B20是美国DALLAS公司生产的数字温度传感器,体积小、低功耗、抗干扰能力强。可直接将温度转化成数字信号传送给单片机处理,因而可省去传统的信号放大、A/D转换等外围电路。
DS18B20转换时间与分辨率有关。当设定为9位时,转换时间为93.75ms;设定10位时,转换时间为187.5 ms;当设定11位时,转换时间为375ms;当设定为12位时,转换时间为750ms。
当设定为9位时,转换时间为93.75ms;设定10位时,转换时间为187.5 ms;当设定11位时,转换时间为375ms;当设定为12位时,转换时间为750ms。下表列出了DS18B20温度转换后所得到的16位转换结果的典型值。
当DS18B20采集的温度为+125℃时,输出为0x07d0,则:
实际温度=(0x07d0)/16=(0×163+7×162+13×161+0×160)/16=125℃
当DS18B20采集的温度为-55℃时,输出为0xfc90,由于是补码,则先将11位数据取反加1得0x0370,注意符号位不变,也不参加运算,则
实际温度=(0x0370)/16=(0×163+3×162+7×161+0×160)/16=55℃
注意,负号则需对采集的温度进行判断后,再予以显示。
DS18B20的工作时序包括初始化时序、写时序和读时序。
(1)初始化时序,单片机将数据线电平拉低480960µs后释放,等待1560µs,单总线器件即可输出一持续60~240µs的低电平,单片机收到此应答后即可进行操作。
(2)写时序,当单片机将数据线电平从高拉到低时,产生写时序,有写“0”和写“1”两种时序。写时序开始后,DS18B20在15~60µs期间从数据线上采样。如果采样到低电平,则向DS18B20写的是“0”;如果采样到高电平,则向DS18B20写的是“1”。这两个独立时序间至少需拉高总线电平1µs时间。
(3)读时序,当单片机从DS18B20读取数据时,产生读时序。此时单片机将数据线电平从高拉到低使读时序被初始化。如果在此后15µs内,单片机在数据线上采样到低电平,则从DS18B20读的是“0”;如果在此后的15µs内,单片机在数据线上采样到高电平,则从DS18B20读的是“1”。
DS18B20片内都有唯一的64位光刻ROM编码,出厂时已刻好。它是DS18B20的地址序列码,目的是使每个DS18B20的地址都不相同,这样就可实现在一根总线上挂接多个DS18B20的目的。64位光刻ROM的各位定义如下:
DS18B20所有命令均为8位长,常用的命令代码见下表:
当主机需要对多个单总线上的某一DS18B20进行操作时,首先应将主机逐个与DS18B20挂接,读出其序列号(33H);然后再将所有的DS18B20挂接到总线上,单片机发出匹配ROM命令(55H),紧接着主机提供的64位序列号之后的操作就是针对该DS18B20的。 如果主机只对一个DS18B20进行操作,就不需要读取ROM编码以及匹配ROM编码,只要用跳过ROM(CCH)命令,就可按表10-4执行如下温度转换和读取命令。
利用DS18B20和LED数码管实现单总线温度测量系统,原理电路见图11-3。DS18B20测量范围是−55~128℃。本例只显示00~99。通过本例读者应掌握DS18B20特性及单片机I/O实现单总线协议的方法。
Proteus仿真时,用手动,即用鼠标单击DS18B20图标上的“↑”或“↓”来改变温度,注意手动调节温度同时,LED数码管会显示出与DS18B20窗口相同的2位温度数值。
电路中74LS47是BCD-7段译码器/驱动器,用于将单片机P0口输出欲显示的BCD码转化成相应的数字显示的段码,并直接驱动LED数码管显示。
#include "reg51.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
#define out P0
sbit smg1=out^4;
sbit smg2=out^5;
sbit DQ=P3^7;
void delay5(uchar);
void init_ds18b20(void);
uchar readbyte(void);
void writebyte(uchar);
uchar retemp(void);
void main(void) //主函数
{
uchar i,temp;
delay5(1000);
while(1)
{
temp=retemp();
for(i=0;i<10;i++) //连续扫描数码管10次
{
out=(temp/10)&0x0f;
smg1=0;
smg2=1;
delay5(1000); //延时5ms
out=(temp%10)&0x0f;
smg1=1;
smg2=0;
delay5(1000); //延时5ms
}
}
}
void delay5(uchar n) //函数功能:延时5μs
{
do
{
_nop_();
_nop_();
_nop_();
n--;
}
while(n);
}
void init_ds18b20(void) //函数功能:18B20初始化
{
uchar x=0;
DQ =0;
delay5(120);
DQ =1;
delay5(16);
delay5(80);
}
uchar readbyte(void) //函数功能:读取1字节数据
{
uchar i=0;
uchar date=0;
for (i=8;i>0;i--)
{
DQ =0;
delay5(1);
DQ =1; //15μs内拉释放总线
date>>=1;
if(DQ)
date|=0x80;
delay5(11);
}
return(date);
}
void writebyte(uchar dat) //函数功能:写1字节
{
uchar i=0;
for(i=8;i>0;i--)
{
DQ =0;
DQ =dat&0x01; //写"1" 在15μs内拉低
delay5(12); //写"0" 拉低60μs
DQ = 1;
dat>>=1;
delay5(5);
}
}
uchar retemp(void) //函数功能:读取温度
{
uchar a,b,tt;
uint t;
init_ds18b20();
writebyte(0xCC);
writebyte(0x44);
init_ds18b20();
writebyte(0xCC);
writebyte(0xBE);
a=readbyte();
b=readbyte();
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
return(tt);
}
/**************************************************************************************
深圳市普中科技有限公司(PRECHIN 普中)
技术支持:www.prechin.net
PRECHIN
普中
实验名称:DS18B20温度传感器实验
接线说明:
实验现象:下载程序后,插上DS18B20温度传感器,数码管显示检测的温度值
注意事项:注意温度传感器的方向,在接口处我们已经用丝印画了一个凸起,
所以只需要将温度传感器对应插入即可
***************************************************************************************/
#include "public.h"
#include "smg.h"
#include "ds18b20.h"
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
u8 i=0;
int temp_value;
u8 temp_buf[5];
ds18b20_init();//初始化DS18B20
while(1)
{
i++;
if(i%50==0)//间隔一段时间读取温度值,间隔时间要大于温度传感器转换温度时间
temp_value=ds18b20_read_temperture()*10;//保留温度值小数后一位
if(temp_value<0)//负温度
{
temp_value=-temp_value;
temp_buf[0]=0x40;//显示负号
}
else
temp_buf[0]=0x00;//不显示
temp_buf[1]=gsmg_code[temp_value/1000];//百位
temp_buf[2]=gsmg_code[temp_value%1000/100];//十位
temp_buf[3]=gsmg_code[temp_value%1000%100/10]|0x80;//个位+小数点
temp_buf[4]=gsmg_code[temp_value%1000%100%10];//小数点后一位
smg_display(temp_buf,4);
}
}
DS18B20升温视频
DS18B20降温视频
将上述实验成功的代码在Keil中进行仿真运行,使用虚拟逻辑分析仪显示单片机与DS18B20的DQ数据线连接引脚的波形,分析其“初始化-->写--->读”总线时序,与原理进行对比分析:
通过这次学习,我掌握了:
1.学习单总线温度传感器DB18B20的原理和通信时序;
2.使用51单片机的一个 IO 口模拟单总线时序与温度传感器DS18B20通信,将检测的环境温度读取出来。
文章浏览阅读677次。前端开发中常用布局命名和类名命名_前端页面分区名称
文章浏览阅读1.3w次。参考https://post.smzdm.com/p/avv4/补充:1.后盖拆的时候用硬卡片慢慢的别就行,要小心翼翼的一点一点的把卡口撬开,当时手边没有专业的撬棒,就用饭卡撬开了2.硬盘不能超过9.5mm,本人用的如下参数硬盘,感觉刚刚好3.在装硬盘时要把电池右边的橡胶条拔掉,不然硬盘装不进去4.软排线的蓝色面朝上5.在磁盘管理里面对磁盘进行初始化..._magicbookpro 2019能拆硬盘吗
文章浏览阅读2.1k次。踩坑记录echarts图显示隐藏后不显示echarts图显示隐藏后不显示因为大部分项目的需求都存在图的缺省内容,当后端返回空数据时,需要给用户反馈一个缺省提醒,所以一般把echarts图作了显示隐藏的功能那么问题来了,当返回空数据时,先把图隐藏起来,当再次请求到数据并把图进行实例化时,图怎么都显示不出来,控制台上也不报错Markdown将文本转换为 HTML。..._vue3 echarts 地图 数据视图隐藏
文章浏览阅读7.4k次,点赞7次,收藏7次。Lua中and和or的用法和记忆方法_lua and or 顺序
文章浏览阅读100次。用impdp导入dmp文件出现如下错误 [oracle@localhost~]$ impdp zebra/zebra directory=back dumpfile=zebra20120420.dmp ..._expdp修改字符集
文章浏览阅读6.2k次。经常听到有做应用的朋友抱怨数据库的性能问题,比如非常低的并发,令人崩溃的响应时间,长时间的锁等待,锁升级,甚至是死锁,等等。本文针对应用开发人员经常接触的性能问题,推荐几本书,请大家关注。 一、《 oracle 9i/10g 编程艺术》内容简介 本书是一本关于Oracle 9j az& 10g数据库体系结构的权威图书,涵盖了所有最重要的Oracle体系结构特性,_oracle sql优化书籍推荐
文章浏览阅读1k次,点赞19次,收藏14次。① Python所有方向的学习路线图,清楚各个方向要学什么东西② 600多节Python课程视频,涵盖必备基础、爬虫和数据分析③ 100多个Python实战案例,含50个超大型项目详解,学习不再是只会理论④ 20款主流手游迫解 爬虫手游逆行迫解教程包⑤ 爬虫与反爬虫攻防教程包,含15个大型网站迫解⑥ 爬虫APP逆向实战教程包,含45项绝密技术详解⑦ 超300本Python电子好书,从入门到高阶应有尽有⑧ 华为出品独家Python漫画教程,手机也能学习。
文章浏览阅读705次。引用些经典分析,抛玉引玉吧rlei分析了Android的设计哲学:理解好Intent,就可以理解Android哲学(“所有应用生来平等”)的一部分。举个简单的例子,iOS里面应用要集成SNS如facebook/twitter/sina weibo等,都需要应用自己实现(iOS5也只是集成twitter一家);Android上只需要广播一个share内容的intent。从理解Inte_什么是权衡折中
文章浏览阅读8k次,点赞29次,收藏103次。使用vuepress-theme-reco搭建自己的博客vuepress-theme-reco是VuePress的一个主题,大家可以参考VuePress和其他主题,搭建你自己风格的主题,这篇主要讲解vuepress-theme-reco主题的博客。VuePress是静态网页生成器,通过它,可以迅速的将我们的Markdown笔记变成网页,方便我们翻阅,查找。一、初始化项目1、引入vuepress-theme-reco主题npm install vuepress-theme-reco --save-d_vuepress-theme-reco
文章浏览阅读220次。LeetCode: 42. 接雨水又成功忘记一题我记得我之前好像是做过这题的, 接雨水 >> 双指针解法, 说实话不记得怎么做了。。。而且博客、题目的提交记录也没相关记录, 太神奇了。。只找到了这题的记录, 博客指路: 11. 盛最多水的容器题目概述: 能接到多少雨水, 数组表示高度暴力法O(N2)O(N^2)O(N2)思路:枚举每根柱子, 之后从该柱子起, 从左从右找到最大值。比较左最大值 与 右最大值, 取较小的一个减去当前柱子, 结果累加到 ans返回 a_l42接雨水_双指针方法
文章浏览阅读2.1k次。排序算法:插入排序(python写法)_python插入排序代码
文章浏览阅读3.9k次,点赞3次,收藏42次。本文是I2C知识大全系列文章的第六篇,介绍了Linux下的I2C应用。_linux控制i2c应用编程