为了方便移值,把ds18b20驱动用ds18b20.c 和ds18b20.h封装起来
ds18b20.c代码如下

#include "ds18b20.h"unsigned char wendubuf1[2];//wendubuf[0]存扩大10倍的温度高8位   wendubuf[0]存扩大10倍的温度低8位   比如326 为32.6void DS18B20Init(void)
{GPIO_InitTypeDef  GPIO_InitStructure;RCC_APB2PeriphClockCmd(DS_GPIO_CLK, ENABLE);   //使能时钟 GPIO_InitStructure.GPIO_Pin = DS_GPIO_PIN;             GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(DS_GPIO_PORT, &GPIO_InitStructure);DS_OUT=1;    //输出1} /* 复位总线,获取存在脉冲,以启动一次读写操作 */
unsigned char Get18B20Ack(void)
{u8 retry=0;DS18B20_IO_OUT(); //SET PA0 OUTPUTDS_OUT = 0;     //产生500us复位脉冲delay_us(750);DS_OUT = 1;delay_us(15);    //延时15usDS18B20_IO_IN();//SET PA0 INPUT while (DS_IN&&retry<200){retry++;delay_us(1);};     if(retry>=200)return 1;else retry=0;while (!DS_IN&&retry<240){retry++;delay_us(1);};if(retry>=240)return 1;      return 0;
}//从DS18B20读取一个位
//返回值:1/0
u8 DS18B20_Read_Bit(void)            // read one bit
{u8 data;DS18B20_IO_OUT();//SET OUTPUTDS_OUT=0; delay_us(2);DS_OUT=1; DS18B20_IO_IN();//SET INPUTdelay_us(12);if(DS_IN)data=1;else data=0;   delay_us(50);           return data;
}
//从DS18B20读取一个字节
//返回值:读到的数据//写一个字节到DS18B20
//dat:要写入的字节/* 向DS18B20写入一个字节,dat-待写入字节 */
void Write18B20(unsigned char dat)
{u8 j;u8 testb;DS18B20_IO_OUT();//SET  OUTPUT;for (j=1;j<=8;j++) {testb=dat&0x01;dat=dat>>1;if (testb) {DS_OUT=0;// Write 1delay_us(2);                            DS_OUT=1;delay_us(60);             }else {DS_OUT=0;// Write 0delay_us(60);             DS_OUT=1;delay_us(2);                          }}
}/* 从DS18B20读取一个字节,返回值-读到的字节 */
unsigned char Read18B20(void)
{u8 i,j,dat;dat=0;for (i=1;i<=8;i++) {j=DS18B20_Read_Bit();dat=(j<<7)|(dat>>1);}                          return dat;
}/* 启动一次18B20温度转换,返回值-表示是否启动成功 */
void Start18B20()
{unsigned char ack=1;ack = Get18B20Ack();   //执行总线复位,并获取18B20应答if (ack == 0)          //如18B20正确应答,则启动一次转换{Write18B20(0xCC);  //跳过ROM操作Write18B20(0x44);  //启动一次温度转换}}/* 读取DS18B20转换的温度值,返回值-表示是否读取成功 */
unsigned char Get18B20Temp(int *temp)
{unsigned char ack=1;unsigned char LSB, MSB; //16bit温度值的低字节和高字节ack = Get18B20Ack();    //执行总线复位,并获取18B20应答if (ack == 0)           //如18B20正确应答,则读取温度值{Write18B20(0xCC);   //跳过ROM操作Write18B20(0xBE);   //发送读命令LSB = Read18B20();  //读温度值的低字节MSB = Read18B20();  //读温度值的高字节*temp = ((int)MSB << 8) + LSB;  //合成为16bit整型数}return ack;  //ack==0表示操作应答,所以返回值为其取反值
}void Get_Temp()//获取温度
{unsigned char res=1;int temp;        //读取到的当前温度值int intT, decT;  //温度值的整数和小数部分//unsigned char wenduzs,wenduxs;//整数  小数res = Get18B20Temp(&temp);  //读取当前温度if (res==0)                    //读取成功时,刷新当前温度显示{if(temp<0)//把负数变正数{temp=~(temp-1);//把负数变为正数intT = temp >> 4;             //右移后16进制转换为十进制值刚好等于温度整数值,分离出温度值整数部分0.0625}else{intT = temp >> 4;             //右移后16进制转换为十进制值刚好等于温度整数值,分离出温度值整数部分0.0625}decT = temp & 0x000F;            //分离出温度值小数部分decT = (decT*10) / 16;        //1/16=0.0625,除以16等于乘以0.0625,乘以10就保留了1位小数了。二进制的小数部分转换为1位十进制位//wenduzs=(unsigned char)intT;//整除//wenduxs=(unsigned char)decT;//小数//wendubuf[0]=wenduzs;//把整数存入暂存数组0//wendubuf[1]=wenduxs;//把小数存入暂存数组1  注意  小数是*10后的值wendubuf1[0]=(intT*10+decT)>>8;//高8位wendubuf1[1]=(unsigned char)(intT*10+decT);//低8位}Start18B20();               //重新启动下一次转换}

ds18b20.h代码如下

#ifndef _DS18B20_H
#define _DS18B20_H
#include "config.h"//IO方向设置
#define DS18B20_IO_IN()  {GPIOB->CRH&=0XFFFFFFF0;GPIOB->CRH|=8<<0;}
#define DS18B20_IO_OUT() {GPIOB->CRH&=0XFFFFFFF0;GPIOB->CRH|=3<<0;}#define DS_GPIO_PIN                         GPIO_Pin_8
#define DS_GPIO_PORT                   GPIOB
#define DS_GPIO_CLK                    RCC_APB2Periph_GPIOB#define DS_IN   PBin(8)
#define DS_OUT  PBout(8)extern unsigned char wendubuf1[2];//wendubuf[0]存扩大10倍的温度高8位   wendubuf[1]存扩大10倍的温度低8位   比如326 为32.6void Start18B20(void);// 启动一次18B20温度转换,返回值-表示是否启动成功 */  初始化值调用1次
void Get_Temp(void);//温度处理函数,包括把温度值存入数组    获取温度值调用
void DS18B20Init(void);//温度传感器#endif

STM32单片机驱动DS18B20相关推荐

  1. K_A11_002 基于STM32等单片机驱动DS18B20串口与OLED0.96双显示

    K_A11_002 基于STM32等单片机驱动DS18B20 串口与OLED0.96双显示 一.资源说明 二.基本参数 1.参数 2.引脚说明 三.驱动说明 时序 对应程序: 四.部分代码说明 1.接 ...

  2. 51单片机驱动DS18B20温度传感器测量温度

    51单片机驱动DS18B20温度传感器测量温度 1.DS18B20温度传感器介绍: 2.51单片机驱动DS18B20测量温度 1.DS18B20温度传感器介绍: ①引脚定义 引脚 符号 说明 1 GN ...

  3. 关于51单片机驱动DS18B20代码的感想

    首先使用单总线驱动DS18B20有三个步骤 DS18B20 器件的初始化 ROM commond Function Command 这里我们经常使用的是初始化和功能命令字,对于第二项,是为了区分多个单 ...

  4. STM32单片机驱动全彩LED模块遍历百万种颜色

    一.使用硬件 分享一个趣味的实验,单片机PWM驱动全彩LED模块,快速遍历100万种颜色. 单片机为STM32F103C8T6,三色LED模块如下图(图片来源于网络) 二.STM32CubeMx配置 ...

  5. STM32单片机驱动LCD12864(型号:OCM J4X8C)

    0.内容简介 软件:Keil uVision5.Image2LCD 2.9 硬件:STM32F103C8T6.LCD12864(金鹏OCM J4X8C,控制芯片ST7920) 描述:STM32F103 ...

  6. ds18b20温度转换指令_51单片机驱动DS18B20温度传感器程序及心得

    关于DS18B20温度传感器,在没有硬件设备的辅助下,写内部程序有些困难,因为看不到实际信号波形.对于单片机,我...渐渐的有些心灰意冷..虽然掌握了1_WIRE总线,却少了很多喜悦,下雨了...它是 ...

  7. 8路巡回检测c语言程序,单片机驱动ds18b20四路温度巡回检测程序

    #include "reg52.h"//头文件 #include "intrins.h" #define uchar unsigned char//宏定义 #d ...

  8. 基于STM32单片机驱动HX711的代码分享,仅供参考

    最近在搞一个需要加入称重模块的项目,在调试的时候也是遇到了很够狗血的问题,也参考了别的工程师的设计.所以,闲话少叙,上代码 /************************************ ...

  9. STM32单片机LED显示屏驱动原理与实现

    STM32单片机驱动LED显示屏的原理与实现方法与Arduino类似,但涉及到的具体硬件资源和库函数可能会有所不同.下面是一个详细的介绍: 原理: STM32单片机驱动LED显示屏的原理是通过控制GP ...

最新文章

  1. MySQL FEDERATED引擎使用示例, 类似Oracle DBLINK.
  2. 三分钟掌握PHP操作数据库
  3. cast函数_关闭RTTI后dynamic_cast和typeid报异常
  4. 网络安全工程考试大纲
  5. OneDrive 挂载为本地磁盘Ubuntu
  6. 小,大:使用CSS fit-content
  7. 如何做好DevOps Secrets管理
  8. class07:Express框架、中间件
  9. python 文件格式转换_数据分析:基于Python的自定义文件格式转换系统
  10. 兴趣题:猴子吃桃问题
  11. 各种破解软件方法汇总
  12. movidius 神经计算棒 ncsdk windows 平台 支持 配置 教程
  13. Unsupervised Hyperspectral Mixed Noise Removal Via Spatial-Spectral Constrained Deep Image Prior
  14. 算法导论------递归算法的时间复杂度求解
  15. SSM学习笔记4(Spring整合Mybatis,P26-P28,真吉尔难)
  16. python 实战2 斜边上的高
  17. getattr()函数详解
  18. input框不能输入的几种方式
  19. 计算机弹奏音乐最好用哪个声调,音乐降调软件哪个好?好用的音乐降调软件推荐...
  20. 在谷歌浏览器chrome上安装tampermonkey插件

热门文章

  1. 快速了解双通道CAN转以太网和四通道CAN转以太网搭配在一起使用的实际应用案例
  2. 蔡徐坤成为Jo Malone London祖玛珑全新品牌代言人
  3. oppofindx6pro参数配置 oppo findx6pro 评测
  4. Arduino Uno 滑动电位器 调音台控制
  5. 幸福生活离我们到底有多远
  6. 量子计算遇见深度学习(下篇)
  7. vue-router的hash模式
  8. html 取消settimeout,vue中setTimeout无法通过clearTimeout清除问题
  9. javascript实现简单购物车功能(有图)
  10. SpringBoot集成腾讯云对象储存