|
本帖最后由 靳涛5128121 于 2016-8-18 11:06 编辑
#include "ds18b20.h"
//#include "delay.h"
#include "bsp.h"
#include "stm32f4xx.h"
#include "max6675.h"
#include <rtthread.h>
#include "rtdef.h"
//////////////////////////////////////////////////////////////////////////////////
static struct rt_device DS18B20;
//复位DS18B20
void DS18B20_Rst(void)
{
DS18B20_IO_OUT(); //SET PG11 OUTPUT
DS18B20_DQ_OUT=0; //拉低DQ
// delay_us(750); //拉低750us
DelayXus(250); //750=3*250
DelayXus(250);
DelayXus(250);
DS18B20_DQ_OUT=1; //DQ=1
// delay_us(15); //15US
DelayXus(15);
}
//等待DS18B20的回应
//返回1:未检测到DS18B20的存在
//返回0:存在
int DS18B20_Check(void)
{
u8 retry=0;
DS18B20_IO_IN();//SET PB4 INPUT
while (DS18B20_DQ_IN&&retry<200)
{
retry++;
// delay_us(1);
DelayXus(1);
};
if(retry>=200)return 1;
else retry=0;
while (!DS18B20_DQ_IN&&retry<240)
{
retry++;
// delay_us(1);
DelayXus(1);
};
if(retry>=240)return 1;
return 0;
}
//从DS18B20读取一个位
//返回值:1/0
rt_uint8_t DS18B20_Read_Bit(void) // read one bit
{
u8 data;
DS18B20_IO_OUT();//SET PB4 OUTPUT
DS18B20_DQ_OUT=0;
// delay_us(2);
DelayXus(2);
DS18B20_DQ_OUT=1;
DS18B20_IO_IN();//SET PB4 INPUT
// delay_us(12);
DelayXus(12);
if(DS18B20_DQ_IN)data=1;
else data=0;
// delay_us(50);
DelayXus(50);
return data;
}
//从DS18B20读取一个字节
//返回值:读到的数据
rt_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:要写入的字节
rt_uint8_t DS18B20_Write_Byte(u8 dat)
{
u8 j;
u8 testb;
DS18B20_IO_OUT();//SET PB4 OUTPUT;
for (j=1;j<=8;j++)
{
testb=(dat)&0x01;
dat=dat>>1;
if (testb)
{
DS18B20_DQ_OUT=0;// Write 1
//delay_us(2);
DelayXus(2);
DS18B20_DQ_OUT=1;
// delay_us(60);
DelayXus(60);
}
else
{
DS18B20_DQ_OUT=0;// Write 0
// delay_us(60);
DelayXus(60);
DS18B20_DQ_OUT=1;
// delay_us(2);
DelayXus(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:存在
int DS18B20_Init()
{
//rt_spi_device_init(&DS18B20,&cs,"DS18B20",spi_bus);
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//使能GPIOG时钟
//GPIOB4
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//50MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化
DS18B20_Rst();
return DS18B20_Check(); //检测18B20的应答信号,为1说明没有检测到18B20,返回0则说明检测到18B20的信号
}
//从ds18b20得到温度值
//精度:0.1C
//返回值:温度值 (-550~1250)
short DS18B20_Get_Temp(void)
{
u8 temp;
u8 TL,TH;
short tem;
DS18B20_Start (); // ds1820 start convert
DS18B20_Rst();
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=(double)tem*0.625;//转换
if(temp)return tem; //返回温度值
else return -tem;
}
static void DelayXus(unsigned char n) //延时基准1us
{
unsigned char i;
while (n--)
{
i = 2;
while (--i);
}
}
//device
static rt_err_t _18B20init(rt_device_t dev)
{
return RT_EOK;
}
static rt_err_t _18B20open(rt_device_t dev, rt_uint16_t oflag)
{
return RT_EOK;
}
static rt_err_t _18B20close(rt_device_t dev)
{
return RT_EOK;
}
static rt_err_t _18B20control(rt_device_t dev, rt_uint8_t cmd, void *args)
{
return RT_EOK;
}
static rt_size_t _18B20wrte(rt_device_t dev, rt_off_t pos, const void* buffer,rt_size_t size)
{
rt_uint8_t *buf;
buf=(rt_uint8_t *)buffer;
while(size)
{
DS18B20_Write_Byte(*buf);
buf++;
size--;
}
return RT_EOK;
}
static rt_size_t _18B20read(rt_device_t dev, rt_off_t pos, const void* buffer,rt_size_t size)
{
rt_uint8_t *buf;
buf=(rt_uint8_t *)buffer;
while(size)
{
*buf=DS18B20_Read_Byte();
buf++;
size--;
}
return RT_EOK;
}
int DS18B20_DeviceInit(void) //device
{
int t;
DS18B20.init=_18B20init;
DS18B20.open=_18B20open;
DS18B20.close=_18B20close;
DS18B20.control=_18B20control;
DS18B20.read=_18B20read;
DS18B20.write=_18B20wrte;
t=DS18B20_Init();
rt_device_register(&DS18B20, "DS18B20",
RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_STANDALONE);
return t;
}
INIT_DEVICE_EXPORT(DS18B20_DeviceInit);
大神们,遇到问题DS18B20怎么和RTT连接,小弟初学,以上是我写的,请问有错么,还有就是有没有相关例程参考下,在线等 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|