Stm32-DS18B20的使用
来源:互联网 发布:编程谜题 pdf 编辑:程序博客网 时间:2024/06/07 22:00
库函数版本
端口:PA0
.c文件:
#include "ds18b20.h"#include "SysTick.h"/*PA0-DQ*///复位DS18B20void DS18B20_Rst(void) { DS18B20_IO_OUT(); //SET PA0 OUTPUT DS18B20_DQ_OUT=0; //拉低DQ Delay_us(750); //拉低750us DS18B20_DQ_OUT=1; //DQ=1 Delay_us(15); //15US}//等待DS18B20的回应//返回1:未检测到DS18B20的存在//返回0:存在u8 DS18B20_Check(void) { u8 retry=0;DS18B20_IO_IN();//SET PA0 INPUT while (DS18B20_DQ_IN&&retry<200){retry++;Delay_us(1);}; if(retry>=200)return 1;else retry=0; while (!DS18B20_DQ_IN&&retry<240){retry++;Delay_us(1);};if(retry>=240)return 1; return 0;}//从DS18B20读取一个位//返回值:1/0u8 DS18B20_Read_Bit(void) // read one bit{ u8 data;DS18B20_IO_OUT();//SET PA0 OUTPUT DS18B20_DQ_OUT=0; Delay_us(2); DS18B20_DQ_OUT=1; DS18B20_IO_IN();//SET PA0 INPUTDelay_us(12);if(DS18B20_DQ_IN)data=1; else data=0; Delay_us(50); return data;}//从DS18B20读取一个字节//返回值:读到的数据u8 DS18B20_Read_Byte(void) // read one byte{ u8 i,j,dat; dat=0;for (i=1;i<=8;i++) { j=DS18B20_Read_Bit(); dat=(j<<7)|(dat>>1); } return dat;}//写一个字节到DS18B20//dat:要写入的字节void DS18B20_Write_Byte(u8 dat) { u8 j; u8 testb;DS18B20_IO_OUT();//SET PA0 OUTPUT; for (j=1;j<=8;j++) { testb=dat&0x01; dat=dat>>1; if (testb) { DS18B20_DQ_OUT=0;// Write 1 Delay_us(2); DS18B20_DQ_OUT=1; Delay_us(60); } else { DS18B20_DQ_OUT=0;// Write 0 Delay_us(60); DS18B20_DQ_OUT=1; Delay_us(2); } }}//开始温度转换void DS18B20_Start(void)// ds1820 开始转换{ DS18B20_Rst(); //复位 DS18B20_Check();//检测传感器是否存在 DS18B20_Write_Byte(0xcc);//rom DS18B20_Write_Byte(0x44);// 转换} //初始化DS18B20的IO口 DQ 同时检测DS的存在//返回1:不存在//返回0:存在 u8 DS18B20_Init(void){ GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能PORTA口时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//PORTA0 推挽输出 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_SetBits(GPIOA,GPIO_Pin_0); //输出1DS18B20_Rst();return DS18B20_Check();} //从ds18b20得到温度值//精度:0.1C//返回值:温度值 (-550~1250) float DS18B20_Get_Temp(void){ u8 temp; u8 TL,TH;float Temperature;short tem;DS18B20_Init();//初始化 DS18B20_Start (); // ds1820开始转换 DS18B20_Rst(); DS18B20_Check(); DS18B20_Write_Byte(0xcc);// 写rom DS18B20_Write_Byte(0xbe);// 转换 TL=DS18B20_Read_Byte(); // LSB TH=DS18B20_Read_Byte(); // MSB if(TH>7) { TH=~TH; TL=~TL; temp=0;//温度为负 }else temp=1;//温度为正 tem=TH; //获得高八位 tem<<=8; tem+=TL;//获得低八位 Temperature=(float)((float)tem*0.0625);//转换 /*if(temp)return tem; //返回温度值else return -tem; */return Temperature;}
.h文件
#ifndef __DS18B20_H#define __DS18B20_H #include "stm32f10x.h" #include "sys.h" //#define uchar unsigned char////////////////////////////////////////////////////////////////////////////////// //DS18B20:PA0-DQ////////////////////////////////////////////////////////////////////////////////////IO方向设置#define DS18B20_IO_IN() {GPIOA->CRL&=0XFFFFFFF0;GPIOA->CRL|=8<<0;}#define DS18B20_IO_OUT() {GPIOA->CRL&=0XFFFFFFF0;GPIOA->CRL|=3<<0;}////IO操作函数 #defineDS18B20_DQ_OUT PAout(0) //数据端口PA0#defineDS18B20_DQ_IN PAin(0) //数据端口PA0 u8 DS18B20_Init(void);//初始化DS18B20float DS18B20_Get_Temp(void);//获取温度void DS18B20_Start(void);//开始温度转换void DS18B20_Write_Byte(u8 dat);//写入一个字节u8 DS18B20_Read_Byte(void);//读出一个字节u8 DS18B20_Read_Bit(void);//读出一个位u8 DS18B20_Check(void);//检测是否存在DS18B20void DS18B20_Rst(void);//复位DS18B20 //void Send_temp(void);//发送数据到串口 #endif
0 0
- Stm32-DS18B20的使用
- STM32学习笔记(四)------DS18B20的操作与使用
- STM32下DS18B20的驱动
- STM32下单只DS18B20的驱动
- 基于STM32的DS18B20驱动
- 【转】STM32下DS18B20的驱动
- 基于STM32与DS18B20的温度采集
- 温度传感器--DS18B20的使用
- DS18b20温度传感器的使用
- STM32 DS18B20 程序
- STM32驱动DS18B20
- stm32---DS18B20温度
- stm32 ds18b20 温度传感器
- stm32 驱动DS18B20温度传感器
- ds18b20使用
- stm32 ds18b20 寄存器设置问题!
- STM32单片机学习(11) DS18B20温度传感器实验
- STM32 DS18B20 代码详解 学习总结
- 三十、热部署
- javaweb学习笔记(二)-DTD技术
- HDU-1237 简单计算器(使用栈和不用栈的解法)
- office2010/2013/2016安装过程提示问题Office 16 Click-to-Run Extensibility Component
- [Hibernate]Hibernate的QBC查询
- Stm32-DS18B20的使用
- 剑指offer-旋转数组的最小数字
- shell脚本实现MBR、GPT自动分区及格式化
- Java环境配置及eclipse单元测试
- Egret 性能优化总结
- 多线程实现——新龟兔赛跑
- Java标识符
- 基于色温估计的自动白平衡
- 函数传递