ds18b20linux开发板,DS18B20 函数库版

利用原子哥的寄存器版本的DS18B20的程序修改了函数库版本的程序,可是发现程序死在DS18B20_Check函数中,请各位大神指点一下,谢谢;

#include "ds18b20.h"

#include "SysTick.h"

static GPIO_DS18B20_Input()

{GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA,ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入模式

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA, &GPIO_InitStructure) ;

}

static GPIO_DS18B20_Output()

{GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA,ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//通用推挽输出模式

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA, &GPIO_InitStructure) ;

}

//复位DS18B20

void DS18B20_Rst(void)

{

GPIO_DS18B20_Output(); //设置PA0为输出模式

GPIO_ResetBits(GPIOA,GPIO_Pin_0); //拉低DQ

Delay_us(750);    //拉低750us

GPIO_SetBits(GPIOA,GPIO_Pin_0); //DQ=1

Delay_us(15);     //15US

}

//等待DS18B20的回应

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

//返回0:存在

uint8_t DS18B20_Check(void)

{

u8 retry=0;

GPIO_DS18B20_Input();//设置PA0为输入模式

while (GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_0)&&retry<220)

{

retry++;

Delay_us(1);

};

if(retry>=220)return 1;

else retry=0;

while (!GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_0)&&retry<240)

{

retry++;

Delay_us(1);

};

if(retry>=240)return 1;

return 0;

}

//从DS18B20读取一个位

//返回值:1/0

uint8_t DS18B20_Read_Bit(void) // read one bit

{

u8 data;

GPIO_DS18B20_Output(); //设置PA0为输出模式

GPIO_ResetBits(GPIOA,GPIO_Pin_0);

Delay_us(2);

GPIO_SetBits(GPIOA,GPIO_Pin_0);

GPIO_DS18B20_Input();//设置PA0为输入模式

Delay_us(12);

if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_0))data=1;

else data=0;

Delay_us(50);

return data;

}

//从DS18B20读取一个字节

//返回值:读到的数据

uint8_t 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(uint8_t dat)

{

u8 j;

u8 testb;

GPIO_DS18B20_Output(); //设置PA0为输出模式

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

{

testb=dat&0x01;

dat=dat>>1;

if (testb)

{

GPIO_ResetBits(GPIOA,GPIO_Pin_0);// Write 1

Delay_us(2);

GPIO_SetBits(GPIOA,GPIO_Pin_0);

Delay_us(60);

}

else

{

GPIO_ResetBits(GPIOA,GPIO_Pin_0);// Write 0

Delay_us(60);

GPIO_SetBits(GPIOA,GPIO_Pin_0);

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_DS18B20_Output(); //设置PA0为输出模式

GPIO_SetBits(GPIOA,GPIO_Pin_0);

DS18B20_Rst();

return DS18B20_Check();

}

//从ds18b20得到温度值

//精度:0.1C

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

uint16_t DS18B20_Get_Temp(void)

{

u8 temp;

u8 TL,TH;

uint16_t 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; //获得高八位

tem<<=8;

tem+=TL;//获得底八位

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

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

else return -tem;

}

之前用寄存器版本的在STM32 mini板子上跑没有问题~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值