STM8单片机读取18B20温度传感器
ds18b20是最常用的数字温度传感器,只需要通过一根线就可取读取温度值,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。温度测量范围 -55°C 到 +125°C。
引脚排列如下
GND为电源地;
DQ为数字信号输入/输出端;
VDD为外接供电电源输入端(在寄生电源接线方式时接地)
内部结构如下:
通过DQ端口按照一定的格式就可以将温度值读取出来。
转换成功后的温度值在寄存器中存放
S为符号位,bit0—bit3为存放小数部分,bit4—bit10存放整数部分。
初始化时序
主机首先发出一个480-960微秒的低电平脉冲,然后释放总线变为高电平,并在随后的480微秒时间内对总线进行检测,如果有低电平出现说明总线上有器件已做出应答。若无低电平出现一直都是高电平说明总线上无器件应答。
从器件的DS18B20在一上电后就一直在检测总线上是否有480-960微秒的低电平出现,如果有,在总线转为高电平后等待15-60微秒后将总线电平拉低60-240微秒做出响应存在脉冲,告诉主机本器件已做好准备。若没有检测到就一直在检测等待。
读写时序
所有的写时隙必须有最少60us的持续时间,相邻两个写时隙必须要有最少1us的恢复时间。写时序分为写0和写1两种。
写”0”时,在拉低总线后主机必须继续拉低总线以满足时隙持续时间的要求(至少60μs),然后释放总线直到写周期结束。
写1时,在拉低总线后主机必须在15μs内释放总线。在总线被释放后,由于上拉电阻将总线恢复为高电平。
所有的写操作必须至少有60us的持续时间,最长不超过120us。相邻两个写时隙必须要有最少1us的恢复时间。所有的写操作(写0和写1)都由拉低总线产生。
当总线控制器把数据线从高电平拉到低电平时,读时序开始,数据线必须至少保持1us,然后总线被释放。然后在包括前面的拉低总线电平1微秒在内的15微秒时间内完成对总线进行采样检测,采样期内总线为低电平则确认为0。采样期内总线为高电平则确认为1。
完成一个读时序过程,至少需要60us才能完成,两个读周期间至少1us的恢复时间。
读写时序是分时完成的,所以在对总线读写时,要阉割按照时序来进行。
对ds18b20进行温度转换必须经过以下 3个步骤 :
(1)每次读写前对ds18b20进行复位初始化。复位要求主 CPU 将数据线下拉 500us ,然后释放, DS18B20 收到信号后等待16us ~ 60us 左右,然后发出60us~240us 的存在低脉冲,主 CPU 收到此信号后表示复位成功。
(2)发送一条 ROM 指令
(3)发送存储器指令
\
比如官方手册中给出了一个操作例子
这个例子是总线上有多个设备,每次操作前都要进行身份对比,如果只有一个设备,那么就可以跳过ROM地址的识别。
接下来就可以用代码操作传感器了:
#include "ds18b20.h"
#include "stm8s103f.h"
#include "delay.h"#define DS18B20_DQ_OUT PA_DDR |= 0x08 //输出
#define DS18B20_DQ_IN PA_DDR &= 0xf7 //输入
#define DS18B20_DQ_HIGH PA_ODR |= 0x08 //拉高
#define DS18B20_DQ_LOW PA_ODR &= 0xf7 //拉低
#define DS18B20_DQ_PULL_UP PA_CR1 |= 0x08 //上拉输入
#define DS18B20_DQ_FLOATING PA_CR1 &= 0xf7 //浮空输入
#define DS18B20_DQ_PUSH_PULL PA_CR1 |= 0x08 //推挽输出
#define DS18B20_DQ_OPEN_DRAIN PA_CR1 &= 0xf7 //开漏输出
#define DS18B20_DQ_VALUE PA_IDR &0x08 //DQ值void DS18B20_Init( void )
{DS18B20_DQ_OUT;DS18B20_DQ_PUSH_PULL;DS18B20_DQ_HIGH;delay_us( 10 );DS18B20_DQ_LOW;delay_us( 600 ); /*复位脉冲 */DS18B20_DQ_IN;DS18B20_DQ_PULL_UP;delay_us( 60 );while ( DS18B20_DQ_VALUE == 1 );delay_us( 400 );
}
void DS18B20_WriteByte(unsigned char _data)
{unsigned char i = 0;DS18B20_DQ_OUT;for ( i = 0; i < 8; i++ ){DS18B20_DQ_LOW;delay_us( 2 );if ( _data & 0x01 ){DS18B20_DQ_HIGH;}_data >>= 1;delay_us( 60 );DS18B20_DQ_HIGH;}
}
unsigned char DS18B20_ReadByte(void)
{unsigned char i = 0, _data = 0;for ( i = 0; i < 8; i++ ){DS18B20_DQ_OUT;DS18B20_DQ_LOW;delay_us( 5 );_data >>= 1;DS18B20_DQ_HIGH;DS18B20_DQ_IN;if ( DS18B20_DQ_VALUE ){_data |= 0x80;}DS18B20_DQ_OUT;DS18B20_DQ_HIGH;delay_us( 60 );}return(_data);
}float DS18B20_ReadTemperature(void)
{unsigned char temp = 0;float t= 0;DS18B20_Init();DS18B20_WriteByte( 0xcc );DS18B20_WriteByte( 0x44 );DS18B20_Init();DS18B20_WriteByte( 0xcc );DS18B20_WriteByte( 0xbe );temp = DS18B20_ReadByte();t = ( ( (temp & 0xf0) >> 4) + (temp & 0x07) * 0.125);temp = DS18B20_ReadByte();t += ( (temp & 0x0f) << 4);return(t);
}
读取温度时,直接在主函数中调用
#include "stm8s103f.h"
#include "ds18b20.h"
#include "delay.h"
/*系统时钟初始化*/
void SysClkInit(void)
{ //默认值为16M 8分频CLK_SWR=0xe1; //HSI为主时钟源 16MHz CPU时钟频率CLK_CKDIVR=0x00; //CPU时钟0分频,系统时钟0分频 16M
}
main()
{float tem;SysClkInit();delay_init(16);tem=DS18B20_ReadTemperature();while (1);
}
在使用ds18b20的时候,关键是要保证时序的正确性,如果编写的代码不能正确读出温度值,就需要通过示波器来分析总线上的波形,看看总线上的时序是否和芯片手册中要求的一样。
STM8单片机读取18B20温度传感器相关推荐
- STM8单片机读取DHT11温湿度传感器
DHT11是一款温湿度传感器,也是使用一根总线来驱动,使用方法和ds18b20温度传感器很类似. 供电电压 3.3~5.5V DC 测量范围 湿度5% ~ 95%RH, 温度-20℃ ~ +60℃ 测 ...
- ds18b20温度传感器 lcd C语言,基于AVR单片机的18B20温度传感器及LCD显示的C语言程序设计...
***************************************************/ #include #include #define uchar unsigned char # ...
- 51单片机读取DS18B20温度传感器
1.首先我们知道DS18B20是单总线协议,只有一根数据线.所以Data数据线即使发送端又是接收端,同时DS18B20内部接了弱上拉电阻(如图一所示),数据线默认为高电平.有了这些概念,我们就能进行下 ...
- 51单片机读取DS18b20温度传感器LCD1602显示例程
很久前测试过没问题,应该绝大部分来源于网络,供大家参考,后面会发简单的可以直接拿来用的自己瞎写的一看就明白的ds18b20库 #include <reg52.h> #include < ...
- stm8单片机例程下载链接
在这篇文章中将自己上传的资源做一个下载链接的目录方便查找下载 STM8单片机编码器使用示例 STM8单片机ADC连续扫描模式并开启模拟看门狗功能 STM8单片机ADC单次扫描模式并开启模拟看门狗功能 ...
- 51单片机驱动DS18B20温度传感器测量温度
51单片机驱动DS18B20温度传感器测量温度 1.DS18B20温度传感器介绍: 2.51单片机驱动DS18B20测量温度 1.DS18B20温度传感器介绍: ①引脚定义 引脚 符号 说明 1 GN ...
- STM8单片机GPIO口的驱动深度解析
上一节给大家介绍了STM8标准库的移植,本节课开始学习我们单片机的外设的驱动,单片机基本的外设资料包括GPIO.外部中断.定时器.串口等,本节先给大家介绍一下STM8单片机的GPIO口. 我们先不介绍 ...
- STM8单片机定时器1编码器功能使用详解
目录 编码器简介 硬件接线图 编码器接口模式介绍 编写代码 寄存器简介 初始化代码 仿真调试 添加实时观察变量 观察变量值变化 编码器用法总结 查询方式读取 中断方式读取 编码器简介 这 ...
- STM8单片机ADC连续扫描模式
当STM8单片机使用ADC功能读取多个通道的值时,可以使用连续模式,但是连续模式一次只能采样一个通道的值,那么如果要采样多个通道时怎么办呢?STM8提供了一个多通道连续采样扫描模式.也就是说多个通 ...
最新文章
- 数据库 'SqlPersistenceService' 的版本为 655,无法打开。此服务器支持 611 版及更低版...
- 读书笔记《单核工作法》:2
- 【学习笔记】左偏树的可持久化(【模板】k短路 / [SDOI2010]魔法猪学院)
- JAVA进阶开发之(数组练习题)
- git pull和push整理和归纳
- openeim 成片的蝴蝶兰盛开在绿树之间
- zemax设计35mm镜头_1650万像素的手机镜头设计
- 称对方攀附使用近似商标 “汽车之家”起诉索赔500万
- php 删除数字索引元素,PHP重置数组为连续数字索引的几种方式
- MCU——矩阵键盘扫描问题记录
- PyTorch(总)---PyTorch遇到令人迷人的BUG与记录
- java json 变量所有的属性
- MCMC采样算法理解
- Origin 2017 给曲线加标记符号
- win7局域网共享教程
- mac使用cjk和ctex宏包
- OSChina 周三乱弹 —— 致力于做一名优秀的女程序员鼓励师
- 固定连接index.php,WP中去掉固定链接中的index.php和category
- 情人节主题的公众号图文排版怎样设计最走心?
- verilog读入txt文件
热门文章
- Howto Dynamically Insert Javascript And CSS
- 项目中会用到的开源项目列表
- IOS解惑(1)之@property(nonatomic,getter=isOn) BOOL on;中的getter解惑
- Asp.Net WebApi swagger使用教程
- 《虚无的十字架》—— 读后总结
- 第三周作业2——效能测试
- java使用内部类的好处及其初始化
- WPF教程尝试(修正部分格式)
- 06-08 Jenkins 自动化测试持续集成
- ymodem传输的终端工具_Serial for Mac(现代化的终端设计软件)