ds18b20触摸没反应_关于DS18B20无法正常使用的问题

在尝试使用DS18B20传感器时遇到问题,程序显示DS18B20_Init()初始化失败,且DS18B20_Check()返回240。代码中包含了初始化延迟函数、DS18B20的IO口配置、复位、读写操作等。可能的原因包括硬件连接问题、延迟函数设置不准确或DS18B20未正确响应。
摘要由CSDN通过智能技术生成

使用的是PG8,无法正常运行,程序一直显示

DS18B20_Init()初始化失败,uint8_t DS18B20_Check(void)的返回值打印出来显示为240,求高手指教

#include "delay.h"

static u8  fac_us=0;//us延时倍乘数

static u16 fac_ms=0;//ms延时倍乘数,在os下,代表每个节拍的ms数

//初始化延迟函数

//当使用OS的时候,此函数会初始化OS的时钟节拍

//SYSTICK的时钟固定为AHB时钟的1/8

//SYSCLK:系统时钟频率

void delay_init(u8 SYSCLK)

{

#if SYSTEM_SUPPORT_OS //如果需要支持OS.

u32 reload;

#endif

SysTick->CTRL&=~(1<<2);//SYSTICK使用外部时钟源

fac_us=SYSCLK/8;//不论是否使用OS,fac_us都需要使用

#if SYSTEM_SUPPORT_OS //如果需要支持OS.

reload=SYSCLK/8;//每秒钟的计数次数 单位为M

reload*=1000000/delay_ostickspersec;//根据delay_ostickspersec设定溢出时间

//reload为24位寄存器,最大值:16777216,在168M下,约合0.7989s左右

fac_ms=1000/delay_ostickspersec;//代表OS可以延时的最少单位

SysTick->CTRL|=1<<1;   //开启SYSTICK中断

SysTick->LOAD=reload; //每1/delay_ostickspersec秒中断一次

SysTick->CTRL|=1<<0;   //开启SYSTICK

#else

fac_ms=(u16)fac_us*1000;//非OS下,代表每个ms需要的systick时钟数

#endif

}

void delay_us(u32 nus)

{

u32 ticks;

u32 told,tnow,tcnt=0;

u32 reload=SysTick->LOAD;

ticks=nus*fac_us;

told=SysTick->VAL;

while(1)

{

tnow=SysTick->VAL;

if(tnow!=told)

{

if(tnow

else tcnt+=reload-tnow+told;

told=tnow;

if(tcnt>=ticks)break;

}

};

}

void delay_ms(u16 nms)

{

u32 i;

for(i=0;i

}

#ifndef __DELAY_H

#define __DELAY_H

#include "stm32f4xx_hal.h"

typedef uint8_t u8;

typedef uint16_t u16;

typedef uint32_t u32;

void delay_init(u8 SYSCLK);

void delay_ms(u16 nms);

void delay_us(u32 nus);

#endif

#include "ds18b20.h"

#include "delay.h"

//配置DQ信号线IO口的输入输出

void DS18B20_PortConfig(uint8_t dir)

{

GPIO_InitTypeDef GPIO_InitStruct;

__HAL_RCC_GPIOG_CLK_ENABLE();

if(dir == 1)

{

GPIO_InitStruct.Pin = DS18B20_BIT;

GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

GPIO_InitStruct.Pull = GPIO_NOPULL;

GPIO_InitStruct.Speed = GPIO_SPEED_FAST;

HAL_GPIO_Init(DS18B20_PORT, &GPIO_InitStruct);

}

else

{

GPIO_InitStruct.Pin = DS18B20_BIT;

GPIO_InitStruct.Mode = GPIO_MODE_INPUT;

GPIO_InitStruct.Pull = GPIO_PULLUP;

HAL_GPIO_Init(DS18B20_PORT, &GPIO_InitStruct);

}

}

//复位DS18B20

void DS18B20_Rst(void)

{

DS18B20_PortConfig(1);

//SET_DS18B20();     //使PA2输出高电平,原子例程无此语句

CLR_DS18B20();    //拉低DQ

delay_us(750);    //拉低750us

SET_DS18B20();;   //DQ=1

delay_us(15);     //15US

}

//等待DS18B20的回应

//返回1:未检测到ds18b20的存在

//返回0:存在

uint8_t DS18B20_Check(void)

{

uint8_t retry=0;

DS18B20_PortConfig(0);

while (DS18B20_DQ_IN&&retry<200)

{

retry++;

delay_us(1);

};

if(retry>=200){printf("retry=:%d",retry);return 1;}

else retry=0;

while (!DS18B20_DQ_IN&&retry<240)

{

retry++;

delay_us(1);

};

if(retry>=240){printf("retry=:%d",retry);return 1;}

return 0;

}

//从DS18B20读取一个位

//返回值:1/0

uint8_t DS18B20_Read_Bit(void) // read one bit

{

uint8_t data;

DS18B20_PortConfig(1);

CLR_DS18B20();   //拉低DQ

delay_us(2);

SET_DS18B20();;  //DQ=1

DS18B20_PortConfig(0);

delay_us(12);

if(DS18B20_DQ_IN)data=1;

else data=0;

delay_us(50);

return data;

}

//从ds18b20读取一个字节

//返回值:读取到的数据

uint8_t DS18B20_Read_Byte(void)    // read one byte

{

uint8_t i,j,dat;

dat=0;

//DS18B20_PortConfig(1);//原子例程无此语句

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

{

j=DS18B20_Read_Bit();

dat=(j<<7)|(dat>>1);

}

return dat;

}

//写一个字节到DS18B20

//dat:要写入的字节

void DS18B20_Write_Byte(uint8_t dat)

{

uint8_t j;

uint8_t testb;

DS18B20_PortConfig(1);//SET PA0 OUTPUT;

for (j=1;j<=8;j++)

{

testb=dat&0x01;

dat=dat>>1;

if (testb)//写1

{

CLR_DS18B20(); //DS18B20_DQ_OUT=0;// Write 1

delay_us(2);

SET_DS18B20(); //DS18B20_DQ_OUT=1;

delay_us(60);

}

else//写0

{

CLR_DS18B20(); //DS18B20_DQ_OUT=0;// Write 0

delay_us(60);

SET_DS18B20(); //DS18B20_DQ_OUT=1;

delay_us(2);

}

}

}

//开始温度转换

void DS18B20_Start(void)// ds1820 start convert

{

DS18B20_Rst();

DS18B20_Check();

DS18B20_Write_Byte(0xcc);// skip rom

DS18B20_Write_Byte(0x44);// convert

}

//初始化DS18B20的IO口DQ同时检查DS的存在

//返回1:不存在

//返回0:存在

uint8_t DS18B20_Init(void)

{

GPIO_InitTypeDef GPIO_Initure;

__HAL_RCC_GPIOG_CLK_ENABLE();

GPIO_Initure.Pin=DS18B20_BIT;

GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;

GPIO_Initure.Pull=GPIO_PULLUP;

GPIO_Initure.Speed=GPIO_SPEED_HIGH;

HAL_GPIO_Init(DS18B20_PORT,&GPIO_Initure);

DS18B20_Rst();

return DS18B20_Check();

}

//从ds18b20得到温度值

//精度:0.1C

//返回值:温度值(-550~1250)

short DS18B20_Get_Temp(void)

{

uint8_t temp;

uint8_t TL,TH;

short tem;

DS18B20_Start();        // ds1820 start convert

DS18B20_Rst();

DS18B20_Check();

DS18B20_Write_Byte(0xcc);// skip rom

DS18B20_Write_Byte(0xbe);// convert

TL=DS18B20_Read_Byte();  // LSB

TH=DS18B20_Read_Byte();  // MSB

if(TH>7)

{

TH=~TH;

TL=~TL;

temp=0;             //温度为负值

}else temp=1;           //温度为正

tem=TH;                 //获得高8位

tem<<=8;

tem+=TL;                //获得低8位

tem=(float)tem*0.625;   //转换

if(temp)return tem;       //返回温度值

else return -tem;

}

#ifndef __DS18B20_H

#define __DS18B20_H

#include "stm32f4xx_hal.h"

#define DS18B20_BITGPIO_PIN_8

#define DS18B20_PORTGPIOG

#define CLR_DS18B20()HAL_GPIO_WritePin (DS18B20_PORT,DS18B20_BIT,GPIO_PIN_RESET )

#define SET_DS18B20()HAL_GPIO_WritePin (DS18B20_PORT,DS18B20_BIT,GPIO_PIN_SET )

#define DS18B20_DQ_IN      HAL_GPIO_ReadPin(DS18B20_PORT, DS18B20_BIT)

uint8_t DS18B20_Init(void);          //初始化DS18B20

short DS18B20_Get_Temp(void);   //获取温度

void DS18B20_Start(void);       //开始温度转换

void DS18B20_Write_Byte(uint8_t dat);//写入一个字节

uint8_t DS18B20_Read_Byte(void);     //读出一个字节

uint8_t DS18B20_Read_Bit(void);      //读出一个位

uint8_t DS18B20_Check(void);         //检测是否存在DS18b20

void DS18B20_Rst(void);         //复位DS18B20

#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值