配置时序

读取温度步骤

代码模块

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外部温度传感器相关推荐

  1. 【STM32】内部温度传感器示例

    00. 目录 文章目录 00. 目录 01. 内部温度传感器简介 02. 主要特性和框图 03. 硬件模块 04. 编程步骤 05. 程序示例 06. 附录 07. 声明 01. 内部温度传感器简介 ...

  2. 基于AT89C51/52和DS18B20的温度传感器设计报告(后附代码)

    1 设计的目的 通过理论设计和实物制作解决相应的实际问题,巩固和运用在<微机原理及单片机技术>中所学的理论知识和实验技能,掌握常用模拟电路的一般设计方法,提高设计能力和实践动手能力,为以后 ...

  3. STM32单片机外部中断配置讲解

    2019独角兽企业重金招聘Python工程师标准>>> 单片机外部中断简介 所谓外部中断,就是通过外部信号所引起的中断,如单片机引脚上的电平变化(高电平.低电平).边沿变化(上升沿. ...

  4. STM32 关于外部中断线、中断源和中断服务函数的问题

    STM32 关于外部中断线.中断源和中断服务函数的问题 中断线问题: 上图可以看出,PA0.PB0...PG0共用的EXTI0中断线,PA1.PB1...PG1共用的EXTI1中断线,也就是 编程里面 ...

  5. stm32 内部sram大小_让STM32的外部SRAM操作跟内部SRAM一样

    让 STM32 的外部 SRAM 操作跟内部 SRAM 一样 前几天看到开源电子论坛 (openedv) 有人在问这个问题,我特意去做了这个 实验,这样用外部 SRAM 就跟用内部 SRAM 一样,不 ...

  6. 外部SRAM实验,让STM32的外部SRAM操作跟内部SRAM一样(转)

    源:外部SRAM实验,让STM32的外部SRAM操作跟内部SRAM一样 前几天看到开源电子论坛(openedv.com)有人在问这个问题,我特意去做了这个实验,这样用外部SRAM就跟用内部SRAM一样 ...

  7. STM32 F103 外部晶振8M改为12M

    stm32 实现外部晶振变换有2种方法: 第一种修改系统库函数: 第一步,打开stm32f10x.h,将  #define HSE_VALUE    ((uint32_t)8000000)  修改为: ...

  8. DS18B20高精度温度传感器,使用介绍【400字】【原创】

    文章目录 实物 用途 特点 功能介绍 温度转换规则 配置寄存器 实物 ds18b20高精度温度传感器(小数点后四位) 1=VDO,2=DO,3=GND 用途 单总线通讯,三个引脚,中间是数据总线,发送 ...

  9. STM32的“外部中断”和“事件”区别和理解

    凡从事过ST MCU应用开发的人往往会遇到事件.中断事件 中断三个概念或术语.这三个概念彼此关联,有时会让人有点混淆或犯迷糊. 先拿一件生活中的事情打比方对上述三个概念做个基本的粗略理解,之后再分享一 ...

最新文章

  1. wpf 360软件管家_软件管家对比及推荐,避免全家桶的坑
  2. Data Guard出现gap sequence修复
  3. SpringSecurity分布式整合之认证模块搭建
  4. 操作系统的运行机制和体系机构
  5. CodeForces - 869B The Eternal Immortality
  6. 前端学习(1950)vue之电商管理系统电商系统之渲染添加父类的对话框
  7. 处理后台返回文本带空格和换行页面不显示断句的问题
  8. maven的web工程打包为war并部署到服务器
  9. android系统性能优化---(9)Android 绿色应用公约
  10. prelu()的 tf 代码
  11. clodop控件使用
  12. 使用Jacob将Excel转换PDF问题总结
  13. 2022-2028年中国光电广告产业竞争现状及发展趋势分析报告
  14. 我喜欢这首歌......
  15. 设置Office 365移动设备管理MDM服务——创建APNs证书
  16. 自定义Behavior的艺术探索-仿UC浏览器主页
  17. 【怀旧】80后,难忘童年----100部最经典的电视连续剧
  18. 粒子背景php,html5+canvas圆形粒子移动背景动画特效
  19. 抖音矩阵系统,抖音矩阵系统,抖音矩阵系统。
  20. source ./ 和 . 的区别

热门文章

  1. 思维:分析框架化,模型化
  2. 游戏音乐中那些关于外包的大讲解
  3. 资本寒冬,这样的AI芯片公司2019年危矣
  4. stm32 hal串口中断分析
  5. 不念过往,未来可期。
  6. 如何获取iphone的硬件版本以及系统信息
  7. 非官方的juoyter notebook 扩展包
  8. java小程序增删改查_用java编一个卡拉ok小程序 有增删改查就可以
  9. 在线获取网页源代码 - 在线查看源代码 - 源文件查看工具
  10. 通过注册表更改组策略(禁止安装软件)bat脚本