stm32 驱动DS18B20温度传感器

2019-11-13来源: eefocus关键字:stm32  驱动DS18B20  温度传感器

#include "temp.h"


#define u8 uint8_t

#define u16 uint16_t

#define u32 uint32_t



#define DS18B20_PORT GPIOA

#define DS18B20_PIN     GPIO_Pin_1                  

#define DS18B20_CLK     RCC_APB2Periph_GPIOA


#define RW1820_DQ_HIGH           GPIO_SetBits(DS18B20_PORT, DS18B20_PIN);

#define RW1820_DQ_LOW           GPIO_ResetBits(DS18B20_PORT, DS18B20_PIN);  

#define RW1820_DQ_VALUE GPIO_ReadInputDataBit(DS18B20_PORT,DS18B20_PIN)




//---------------------------------------------------------------------------//

void _delay_us(uint16_t nCount)

{

    nCount *= 3; 

    while(--nCount);

}

//-----------------------------------------------------------------------------//

static void RW1820_DQ_IN(void)

{

   GPIO_InitTypeDef GPIO_InitStructure;

  RCC_APB2PeriphClockCmd(DS18B20_CLK, ENABLE);

 GPIO_InitStructure.GPIO_Pin = DS18B20_PIN;

 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;

 GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);

}

//--------------------------------------------------------

static void RW1820_DQ_OUT(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(DS18B20_CLK, ENABLE);

GPIO_InitStructure.GPIO_Pin = DS18B20_PIN;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);

}

//--------------------------------------------------------

void RW1820_Init(void)

{

u8 retry=0;

RW1820_DQ_OUT();

RW1820_DQ_HIGH; 

_delay_us(50);

RW1820_DQ_LOW;  


_delay_us(500); //480 - 960

  RW1820_DQ_HIGH; 


_delay_us(40); //15-60

RW1820_DQ_IN(); //

while(RW1820_DQ_VALUE==1&& (retry<100))

{

retry++;

_delay_us(10);

}

RW1820_DQ_OUT();

RW1820_DQ_HIGH;

_delay_us(400);

}

//-------------

void RW1820_WriteByte(unsigned char _data)

{

int i = 0;

RW1820_DQ_OUT();

_delay_us(10);

for (i = 0; i < 8; i++)

{

RW1820_DQ_LOW;          //

_delay_us(2);           //

if (_data & 0x01)

{

RW1820_DQ_HIGH;     //

}

else RW1820_DQ_LOW;

_delay_us(60);          //60

RW1820_DQ_HIGH;

_data = _data >> 1;

}

}

//-------------

unsigned char RW1820_ReadByte(void)

{

int i = 0, _data = 0;

_delay_us(10);

for (i = 0; i < 8; i++)

{

RW1820_DQ_OUT();

RW1820_DQ_LOW;  

_data >>= 1;

_delay_us(2);   

RW1820_DQ_HIGH; 

RW1820_DQ_IN(); 

if(RW1820_DQ_VALUE)

{

_data |= 0x80;

}

_delay_us(60);  //60us

}

return _data;

}


int RW1820_ReadTemperature(void)

{

unsigned char temp;

unsigned int t;


RW1820_Init();         //

RW1820_WriteByte(0xcc); //

RW1820_WriteByte(0x44); //

_delay_us(10);

RW1820_Init();

RW1820_WriteByte(0xcc); //

RW1820_WriteByte(0xbe); //


temp = RW1820_ReadByte();

t = (int)(((temp & 0xf0) >> 4) + (temp & 0x07) * 0.125); 

temp = RW1820_ReadByte();

t += ((temp & 0x0f) << 4);


return t;

}


关键字:stm32  驱动DS18B20  温度传感器 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic479848.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:stm32f103 c6t6 CAN总线的配置
下一篇:stm32单片机进入休眠(STOP)模式后无法下载程序等问题解决

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

ST推出经济好用的STM8 Nucleo-32开发板
内核,集成大容量的片上存储器,包括高达128KB的闪存,并与STM32 MCU系列共享最新的外设接口,例如,定时器、模拟外设、CAN2.0B和数字接口。在设计开发对功耗、空间和成本有严格限制的智能传感器、执行器等产品时,STM8 MCU是人气之选。 STM8 Nucleo-32开发板的首款上市产品NUCLEO-8S207K8集成一个32引脚STM8S207K8 MCU,功能包括12个大电流输出端口和多个捕获比较通道。 
发表于 2019-12-05
ST推出经济好用的STM8 Nucleo-32开发板
STM8S开发环境搭建IAR For STM8
***********************************************************************************************************************************/   本文采用的是STM8S-Discovery开发板,开发板上半部分为ST Link调试器,芯片采用的是STM32F103C8,下半部分是STM8S105C6的开发板。    对于STM8的开发环境,主要采用两种,一种是IAR For STM8,另一种是官方的ST Toolset。ST Toolset中包含了两个工具STVD(ST Visual Develop)和STVP(ST
发表于 2019-12-05
STM8S开发环境搭建IAR For STM8
STM8S内部时钟切换问题解决
/************************************************************************************************************************************ Name    : STM8S内部时钟切换问题解决* Author  : MingMing* Release : 2013/12/28* Update  : 2013/12/29* E-mail  : clint.wang@foxmail.com
发表于 2019-12-05
STM8S内部时钟切换问题解决
STM8S存储器的读写操作
/************************************************************************************************************************************ Name    : STM8S存储器的读写操作* Author  : MingMing* Release : 2014/1/2* Update  : 2014/1/2* E-mail  : clint.wang@foxmail.com
发表于 2019-12-05
stm8l051 halt之后外部中断唤醒问题
最近用到stm8l051 halt,在halt之后开启了外部中断,有时灵,有时不灵,设置下降沿触发,但是按键(低有效)放开了才会从HALT退出,最后发现在进去外部中断的时候一直在外部中断里面不退出。在外部中断程序里面把端口的外部中断和端口使能的外部中断功能关闭,问题解决,可以在下降沿从halt退出。1、开启halt,其他代码省略,只贴halt部分:    /* 禁止TIM3 */    TIM3->SR1 = (uint8_t)(~(uint8_t)TIM3_IT_Update);    CLK_PeripheralClockConfig
发表于 2019-12-05
STM8L052低功耗模式
Stm8L系列单片机的低功耗有五种模式:§ wait模式§ Lowpower run模式§ Lowpower wait模式§ Active-haltwith full RTC模式§ Halt模式最低功耗的就是就是halt模式。这里也主要总结一下如何进入halt模式,进入以后可以通过什么方式唤醒,以及有很多客户会关心的如何自动唤醒。Halt模式进入很简单,执行一条halt指令,调用库函数也就是halt()就行了。但是进入前要注意把所有的中断挂起标志给清除掉。要是不清零又恰巧有中断标志的时候进入该模式也会被立马唤醒。进入这种模式,所有的外设全都关闭了,所有时钟关闭。这时候它自己是醒不过来的,只能靠掐人中(给个外部中断)或者重新复活
发表于 2019-12-05
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved