STM32单片机驱动DS18B20
为了方便移值,把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相关推荐
- K_A11_002 基于STM32等单片机驱动DS18B20串口与OLED0.96双显示
K_A11_002 基于STM32等单片机驱动DS18B20 串口与OLED0.96双显示 一.资源说明 二.基本参数 1.参数 2.引脚说明 三.驱动说明 时序 对应程序: 四.部分代码说明 1.接 ...
- 51单片机驱动DS18B20温度传感器测量温度
51单片机驱动DS18B20温度传感器测量温度 1.DS18B20温度传感器介绍: 2.51单片机驱动DS18B20测量温度 1.DS18B20温度传感器介绍: ①引脚定义 引脚 符号 说明 1 GN ...
- 关于51单片机驱动DS18B20代码的感想
首先使用单总线驱动DS18B20有三个步骤 DS18B20 器件的初始化 ROM commond Function Command 这里我们经常使用的是初始化和功能命令字,对于第二项,是为了区分多个单 ...
- STM32单片机驱动全彩LED模块遍历百万种颜色
一.使用硬件 分享一个趣味的实验,单片机PWM驱动全彩LED模块,快速遍历100万种颜色. 单片机为STM32F103C8T6,三色LED模块如下图(图片来源于网络) 二.STM32CubeMx配置 ...
- STM32单片机驱动LCD12864(型号:OCM J4X8C)
0.内容简介 软件:Keil uVision5.Image2LCD 2.9 硬件:STM32F103C8T6.LCD12864(金鹏OCM J4X8C,控制芯片ST7920) 描述:STM32F103 ...
- ds18b20温度转换指令_51单片机驱动DS18B20温度传感器程序及心得
关于DS18B20温度传感器,在没有硬件设备的辅助下,写内部程序有些困难,因为看不到实际信号波形.对于单片机,我...渐渐的有些心灰意冷..虽然掌握了1_WIRE总线,却少了很多喜悦,下雨了...它是 ...
- 8路巡回检测c语言程序,单片机驱动ds18b20四路温度巡回检测程序
#include "reg52.h"//头文件 #include "intrins.h" #define uchar unsigned char//宏定义 #d ...
- 基于STM32单片机驱动HX711的代码分享,仅供参考
最近在搞一个需要加入称重模块的项目,在调试的时候也是遇到了很够狗血的问题,也参考了别的工程师的设计.所以,闲话少叙,上代码 /************************************ ...
- STM32单片机LED显示屏驱动原理与实现
STM32单片机驱动LED显示屏的原理与实现方法与Arduino类似,但涉及到的具体硬件资源和库函数可能会有所不同.下面是一个详细的介绍: 原理: STM32单片机驱动LED显示屏的原理是通过控制GP ...
最新文章
- MySQL FEDERATED引擎使用示例, 类似Oracle DBLINK.
- 三分钟掌握PHP操作数据库
- cast函数_关闭RTTI后dynamic_cast和typeid报异常
- 网络安全工程考试大纲
- OneDrive 挂载为本地磁盘Ubuntu
- 小,大:使用CSS fit-content
- 如何做好DevOps Secrets管理
- class07:Express框架、中间件
- python 文件格式转换_数据分析:基于Python的自定义文件格式转换系统
- 兴趣题:猴子吃桃问题
- 各种破解软件方法汇总
- movidius 神经计算棒 ncsdk windows 平台 支持 配置 教程
- Unsupervised Hyperspectral Mixed Noise Removal Via Spatial-Spectral Constrained Deep Image Prior
- 算法导论------递归算法的时间复杂度求解
- SSM学习笔记4(Spring整合Mybatis,P26-P28,真吉尔难)
- python 实战2 斜边上的高
- getattr()函数详解
- input框不能输入的几种方式
- 计算机弹奏音乐最好用哪个声调,音乐降调软件哪个好?好用的音乐降调软件推荐...
- 在谷歌浏览器chrome上安装tampermonkey插件