STM32 DS18B20外部温度传感器
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
配置时序
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
读取温度步骤
![](/assets/blank.gif)
代码模块
ds18b20.h+ds18b20.c
#ifndef _ds18b20_H
#define _ds18b20_H#include "system.h"
#define DS18B20_PORT GPIOG
#define DS18B20_PIN GPIO_Pin_11
#define DS18B20_PORT_RCC RCC_APB2Periph_GPIOG#define DS18B20_DQ_OUT PGout(11)
#define DS18B20_DQ_IN PGin(11)
u8 DS18B20_Init();//初始化
void DS18B20_Write_Byte(u8 dat);
u8 DS18B20_Read_Byte();
float DS18B20_GetTemperture();//得到温度
#endif
#include "ds18b20.h"
#include "SysTick.h"void DS18B20_IO_IN()//输入模式
{GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin=DS18B20_PIN;GPIO_Init(DS18B20_PORT,&GPIO_InitStructure);
}
void DS18B20_IO_OUT()//输出模式
{GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin=DS18B20_PIN;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(DS18B20_PORT,&GPIO_InitStructure);}
void DS18B20_Reset()//复位
{DS18B20_IO_OUT();//mcu是输出模式DS18B20_DQ_OUT=0;delay_us(500);//480us到960us之间DS18B20_DQ_OUT=1;delay_us(20);}
u8 DS18B20_Check()//,检测ds18b20存不存在 0正常, 1不正常
{u8 k=0;DS18B20_IO_IN();//此时控制器是输入模式,检测应答while(DS18B20_DQ_IN&&k<200)//检测是否应答,k是防卡死{k++;delay_us(1); }if(k>=200)return 1;elsek=0;while(!DS18B20_DQ_IN&&k<240)//检测最后是否拉高电平,具体看时序图{k++;delay_us(1);}if(k>=240)return 1;return 0;}
u8 DS18B20_Init()//初始化
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(DS18B20_PORT_RCC, ENABLE);GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin=DS18B20_PIN;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(DS18B20_PORT,&GPIO_InitStructure);DS18B20_Reset();return DS18B20_Check();
}
void DS18B20_Write_Byte(u8 dat)//写字节
{u8 i=0;u8 testb=0;DS18B20_IO_OUT();//配置为输出模式for(i=0;i<8;i++){testb=dat&0x01;dat>>=1;//从最低位开始传输if(testb)//写1时序{DS18B20_DQ_OUT=0;delay_us(2);DS18B20_DQ_OUT=1;delay_us(60);}else//写0时序{DS18B20_DQ_OUT=0;delay_us(60);DS18B20_DQ_OUT=1;delay_us(2);}}}
u8 DS18B20_Read_bit()//读一个位,在读字节函数中循环8次为一个字节
{u8 temp=0;DS18B20_IO_OUT();DS18B20_DQ_OUT=0;delay_us(2);DS18B20_DQ_OUT=1;DS18B20_IO_IN();delay_us(8);//在13个us之内就可以if(DS18B20_DQ_IN)temp=1;else temp=0;delay_us(50);return temp;
}
u8 DS18B20_Read_Byte()//读字节,dat为传输的命令
{u8 i=0;u8 j=0;u8 dat=0;for(i=0;i<8;i++){j=DS18B20_Read_bit();dat=(j<<7)|(dat>>1);//或运算是为了保存之前的值,有1为1,无1则0//即dat=j<<7; dat|=dat>>1}return dat;}
float DS18B20_GetTemperture()//得到温度
{//复位→发 SKIP ROM 命令(0XCC)→发开始转//换命令(0X44)→延时→复位→发送 SKIP ROM 命令(0XCC)→发读存储器命令(0XBE)//→连续读出两个字节数据(即温度)→结束。u8 l,h;u16 temp;float temperture;DS18B20_Reset();DS18B20_Check();//这两步是复位DS18B20_Write_Byte(0xcc);DS18B20_Write_Byte(0x44);delay_us(10);DS18B20_Reset();DS18B20_Check();//这两步是复位DS18B20_Write_Byte(0xcc);DS18B20_Write_Byte(0XBE);l=DS18B20_Read_Byte();//低8位h=DS18B20_Read_Byte();//高8位temp=h;temp<<=8;temp+=l;if((temp&0xf800)==0xf800){temp=(~temp)+1;//单位取反用!,多位取反用~temperture=temp*(-0.0625);}else{temperture=temp*(0.0625);}return temperture;
}
main.c
#include "stm32f10x.h"
#include "led.h"
#include "system.h"
#include "SysTick.h"
#include "beep.h"
#include "key.h"
#include "exti.h"
#include "time.h"
#include "pwm.h"
#include "usart.h"
#include "stdio.h"
#include "iwdg.h"
#include "wwdg.h"
#include "input.h"
#include "touch_key.h"
#include "wkup.h"
#include "adc.h"
#include "adc_temp.h"
#include "lsens.h"
#include "dac.h"
#include "dma.h"
#include "rtc.h"
#include "at24cxx.h"
#include "i2c.h"
#include "ds18b20.h"
int main()
{u8 i=0;u8 key=0;u8 k=0;KEY_Init();NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置优先级分组SysTick_Init(72);LED_Init();USART1_Init(115200);//波特率115200while(DS18B20_Init()){printf("初始化失败,请插好温度传感器\r\n");}printf("初始化成功\r\n");float T;while(1){i++;if(i%20==0)LED1=!LED1;if(i%50==0){T=DS18B20_GetTemperture();if(T<0){printf("温度: -%.2f℃\r\n",T);}elseprintf("温度: %.2f℃\r\n",T);}delay_ms(10);}}
STM32 DS18B20外部温度传感器相关推荐
- 【STM32】内部温度传感器示例
00. 目录 文章目录 00. 目录 01. 内部温度传感器简介 02. 主要特性和框图 03. 硬件模块 04. 编程步骤 05. 程序示例 06. 附录 07. 声明 01. 内部温度传感器简介 ...
- 基于AT89C51/52和DS18B20的温度传感器设计报告(后附代码)
1 设计的目的 通过理论设计和实物制作解决相应的实际问题,巩固和运用在<微机原理及单片机技术>中所学的理论知识和实验技能,掌握常用模拟电路的一般设计方法,提高设计能力和实践动手能力,为以后 ...
- STM32单片机外部中断配置讲解
2019独角兽企业重金招聘Python工程师标准>>> 单片机外部中断简介 所谓外部中断,就是通过外部信号所引起的中断,如单片机引脚上的电平变化(高电平.低电平).边沿变化(上升沿. ...
- STM32 关于外部中断线、中断源和中断服务函数的问题
STM32 关于外部中断线.中断源和中断服务函数的问题 中断线问题: 上图可以看出,PA0.PB0...PG0共用的EXTI0中断线,PA1.PB1...PG1共用的EXTI1中断线,也就是 编程里面 ...
- stm32 内部sram大小_让STM32的外部SRAM操作跟内部SRAM一样
让 STM32 的外部 SRAM 操作跟内部 SRAM 一样 前几天看到开源电子论坛 (openedv) 有人在问这个问题,我特意去做了这个 实验,这样用外部 SRAM 就跟用内部 SRAM 一样,不 ...
- 外部SRAM实验,让STM32的外部SRAM操作跟内部SRAM一样(转)
源:外部SRAM实验,让STM32的外部SRAM操作跟内部SRAM一样 前几天看到开源电子论坛(openedv.com)有人在问这个问题,我特意去做了这个实验,这样用外部SRAM就跟用内部SRAM一样 ...
- STM32 F103 外部晶振8M改为12M
stm32 实现外部晶振变换有2种方法: 第一种修改系统库函数: 第一步,打开stm32f10x.h,将 #define HSE_VALUE ((uint32_t)8000000) 修改为: ...
- DS18B20高精度温度传感器,使用介绍【400字】【原创】
文章目录 实物 用途 特点 功能介绍 温度转换规则 配置寄存器 实物 ds18b20高精度温度传感器(小数点后四位) 1=VDO,2=DO,3=GND 用途 单总线通讯,三个引脚,中间是数据总线,发送 ...
- STM32的“外部中断”和“事件”区别和理解
凡从事过ST MCU应用开发的人往往会遇到事件.中断事件 中断三个概念或术语.这三个概念彼此关联,有时会让人有点混淆或犯迷糊. 先拿一件生活中的事情打比方对上述三个概念做个基本的粗略理解,之后再分享一 ...
最新文章
- wpf 360软件管家_软件管家对比及推荐,避免全家桶的坑
- Data Guard出现gap sequence修复
- SpringSecurity分布式整合之认证模块搭建
- 操作系统的运行机制和体系机构
- CodeForces - 869B The Eternal Immortality
- 前端学习(1950)vue之电商管理系统电商系统之渲染添加父类的对话框
- 处理后台返回文本带空格和换行页面不显示断句的问题
- maven的web工程打包为war并部署到服务器
- android系统性能优化---(9)Android 绿色应用公约
- prelu()的 tf 代码
- clodop控件使用
- 使用Jacob将Excel转换PDF问题总结
- 2022-2028年中国光电广告产业竞争现状及发展趋势分析报告
- 我喜欢这首歌......
- 设置Office 365移动设备管理MDM服务——创建APNs证书
- 自定义Behavior的艺术探索-仿UC浏览器主页
- 【怀旧】80后,难忘童年----100部最经典的电视连续剧
- 粒子背景php,html5+canvas圆形粒子移动背景动画特效
- 抖音矩阵系统,抖音矩阵系统,抖音矩阵系统。
- source ./ 和 . 的区别