STM32学习(30)STM32实现18B20温度采集(标准库和HAL库实现)
Posted 书盲
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32学习(30)STM32实现18B20温度采集(标准库和HAL库实现)相关的知识,希望对你有一定的参考价值。
单片机型号:STM32F103
源码下载链接:(2条消息) STM32实现18B20温度采集(标准库和HAL库实现)-电信文档类资源-CSDN下载
现要求完成温度采集并在串口或液晶屏上显示。我们这里使用DS18B20实现,它的一些特性大家可以网上搜搜,资料很多。
18B20的两个时序图很重要,程序的完成就是按照时序图完成的。
复位的时序图:
读写0/1的时序图:
ROM命令
总线上可以挂多个器件,通过不同的器件地址来访问不同的器件。同样, 1-Wire 总线也可以挂多个器件,但是它只有一条线,如何区分不同的器件呢?
在每个 DS18B20 内部都有一个唯一的 64 位长的序列号,这个序列号值就存在 DS18B20内部的 ROM 中。开始的 8 位是产品类型编码(DS18B20 是 0x10),接着的 48 位是每个器件唯一的序号,最后的 8 位是 CRC 校验码。 DS18B20 可以引出去很长的线,最长可以到几十米,测不同位置的温度。单片机可以通过和 DS18B20 之间的通信,获取每个传感器所采集到的温度信息,也可以同时给所有的 DS18B20 发送一些指令。这些指令相对来说比较复杂,而且应用很少。
我们这里只讲一条总线上只接一个器件的指令和程序。
Skip ROM(跳过 ROM): 0xCC。当总线上只有一个器件的时候,可以跳过 ROM,不进行 ROM 检测。
RAM 存储器操作指令
Read Scratchpad(读暂存寄存器): 0xBE
DS18B20 的温度数据是 2 个字节,我们读取数据的时候,先读取到的是低字节的低位,读完了第一个字节后,再读高字节的低位,直到两个字节全部读取完毕。
Convert Temperature(启动温度转换): 0x44
当我们发送一个启动温度转换的指令后, DS18B20 开始进行转换。从转换开始到获取温度, DS18B20 是需要时间的,而这个时间长短取决于 DS18B20 的精度。
电路图设计:
接线表设计:
模块(18B20) | STM32的IO口 | 功能设置 |
GND | GND | - |
VCC | 3.3V | - |
TDQ | PA6 | 输入输出模式需要来回切换 |
- | PA9 | TX PA9 |
- | PA10 | RX PA10 |
标准库实现温度采集:
代码:
/****************************************
函数名称:void mode_output(void)
函数参数:无参
函数返回值:无
函数功能:输出模式
创建作者:王艇
创建时间:2021.5.21
联系方式:
修改作者:
修改时间:
修改说明:
****************************************/
void mode_output(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Configure Ports */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/****************************************
函数名称:void mode_input(void)
函数参数:无参
函数返回值:无
函数功能:输入模式
创建作者:王艇
创建时间:2021.5.21
联系方式:
修改作者:
修改时间:
修改说明:
****************************************/
void mode_input(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Configure Ports */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/****************************************
函数名称:void ds18b20_rst(void)
函数参数:无参
函数返回值:无
函数功能:复位
创建作者:王艇
创建时间:2021.5.21
联系方式:
修改作者:
修改时间:
修改说明:
****************************************/
void ds18b20_rst(void)
{
mode_output(); //输出模式
GPIO_ResetBits(GPIOA,GPIO_Pin_6); //拉低DQ引脚
delay_us(600); //延时480-960us
GPIO_SetBits(GPIOA,GPIO_Pin_6); //拉高DQ引脚
mode_input();
while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6)); //等待器件应答(器件拉低),约15-60us后
while(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6)); //应答脉冲出现后,等待器件拉高,约60-240us后
}
/****************************************
函数名称:void ds18b20_write_zero(void)
函数参数:无参
函数返回值:无
函数功能:写0位
创建作者:王艇
创建时间:2021.5.21
联系方式:
修改作者:
修改时间:
修改说明:
****************************************/
void ds18b20_write_zero(void)
{
mode_output(); //输出模式
GPIO_ResetBits(GPIOA,GPIO_Pin_6); //拉低引脚
delay_us(80); //延时60-120us
GPIO_SetBits(GPIOA,GPIO_Pin_6); //拉高引脚
delay_us(2);
}
/****************************************
函数名称:void ds18b20_write_one(void)
函数参数:无参
函数返回值:无
函数功能:写1位
创建作者:王艇
创建时间:2021.5.21
联系方式:
修改作者:
修改时间:
修改说明:
****************************************/
void ds18b20_write_one(void)
{
mode_output(); //输出模式
GPIO_ResetBits(GPIOA,GPIO_Pin_6);
delay_us(2);
GPIO_SetBits(GPIOA,GPIO_Pin_6);
delay_us(80);
}
/****************************************
函数名称:void ds18b20_read_bit(void)
函数参数:无参
函数返回值:无
函数功能:读1位数据
创建作者:王艇
创建时间:2021.5.21
联系方式:
修改作者:
修改时间:
修改说明:
****************************************/
unsigned char ds18b20_read_bit(void)
{
unsigned char data;
mode_output();
GPIO_ResetBits(GPIOA,GPIO_Pin_6);
delay_us(2);
GPIO_SetBits(GPIOA,GPIO_Pin_6);;
mode_input();
delay_us(5);
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6))
data=1;
else
data=0;
delay_us(500);
return data;
}
/****************************************
函数名称:void ds18b20_write_byte(void)
函数参数:无参
函数返回值:无
函数功能:写一个字节
创建作者:王艇
创建时间:2021.5.21
联系方式:
修改作者:
修改时间:
修改说明:
****************************************/
void ds18b20_write_byte(unsigned char data)
{
unsigned char i,testb;
mode_output();
for(i=0;i<8;i++)
{
testb=data&0x01; //从低位开始写
data>>=1;
if(testb)
ds18b20_write_one();
else
ds18b20_write_zero();
}
}
/****************************************
函数名称:unsigned char ds18b20_read_byte(void)
函数参数:无参
函数返回值:无
函数功能:读一个字节
创建作者:王艇
创建时间:2021.5.21
联系方式:
修改作者:
修改时间:
修改说明:
****************************************/
unsigned char ds18b20_read_byte(void)
{
unsigned char i,j,data=0;
for(i=0;i<8;i++)
{
j=ds18b20_read_bit();
data=(j<<7)|(data>>1); //从低位开始读
}
return data;
}
/****************************************
函数名称:void ds18b20_start(void)
函数参数:无参
函数返回值:无
函数功能:开始转换
创建作者:王艇
创建时间:2021.5.21
联系方式:
修改作者:
修改时间:
修改说明:
****************************************/
void ds18b20_start(void)
{
ds18b20_rst();
ds18b20_write_byte(0xcc); // 跳过ROM
ds18b20_write_byte(0x44); //温度转换
}
/****************************************
函数名称:void ds18b20_init(void)
函数参数:无参
函数返回值:无
函数功能:初始化
创建作者:王艇
创建时间:2021.5.21
联系方式:
修改作者:
修改时间:
修改说明:
****************************************/
void ds18b20_init(void)
{
gpio_init(); //此引脚需根据相应的单片机进行配置
ds18b20_rst();
}
/****************************************
函数名称:short get_tempetature(void)
函数参数:无参
函数返回值:无
函数功能:获取温度
创建作者:王艇
创建时间:2021.5.21
联系方式:
修改作者:
修改时间:
修改说明:
****************************************/
short get_tempetature(void)
{
unsigned char TL,TH;
short tem;
ds18b20_start(); //开始转换
delay_ms(700); //等待转换完成
ds18b20_init();
ds18b20_write_byte(0xcc); //跳过ROM
ds18b20_write_byte(0xbe); //读取暂存寄存器
TL=ds18b20_read_byte(); //低八位
TH=ds18b20_read_byte(); //高八位,注意前五位为符号位只有全为0的时候温度是正的
tem=TH; //获得高八位
tem<<=8;
tem+=TL; //获得底八位
return tem;
}
实现效果:
HAL库实现温度采集:
实现效果:
需要的可以给我留言,我发给大家。
源码下载链接:(2条消息) STM32实现18B20温度采集(标准库和HAL库实现)-电信文档类资源-CSDN下载
以上是关于STM32学习(30)STM32实现18B20温度采集(标准库和HAL库实现)的主要内容,如果未能解决你的问题,请参考以下文章
请问我在stm32上移植了ucos,现在需要使用到DS18B20采集温度
STM32F103ZE+SHT30检测环境温度与湿度(IIC模拟时序)
STM32F103ZE+SHT30检测环境温度与湿度(IIC模拟时序)