打印
[STM8]

STM8驱动DS18B20,无法读取温度。

[复制链接]
2105|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Shaopus|  楼主 | 2013-11-3 16:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "stm8s.h"
#include "ds18b20.h"
#include "delay.h"




//-----复位-----
void resetOnewire(void)
{
        OUT_DQ();
        SET_DQ();
        delay_us(750);
        CLR_DQ();
        delay_us(100);
        IN_DQ();
        //while(GET_DQ());
        while(!(GET_DQ()));
        OUT_DQ();
        SET_DQ();
}

//-----读数据-----
u8 rOnewire(void)
{
        u8 data=0,i=0;
        OUT_DQ();
        SET_DQ();
         for(i=0;i<8;i++)
        {
                data=data>>1;
                OUT_DQ();
                CLR_DQ();
                delay_us(5);
                SET_DQ();
                delay_us(5);
                IN_DQ();
                if(GET_DQ()) data|=0x80;
                else data&=0x7f;
                delay_us(65);
                SET_DQ();
        }
        return(data);
}
//-----写数据-----
void wOnewire(u8 data)
{
        u8 i=0;
        OUT_DQ();
        for(i=0;i<8;i++)
        {
                CLR_DQ();
                delay_us(10);
                if(data&0x01)
                {
                SET_DQ();
                }
                else
                {
                CLR_DQ();
                }
                delay_us(70);  //65
                SET_DQ();
                delay_us(10);
                data=data>>1;
               
        }
}

//-----DS18B20转换温度-----
void convertDs18b20(void)
{
        resetOnewire();
        wOnewire(0xcc);
        wOnewire(0x44);
}
//------------DS18BB0读温度----------
u8 readTemp(void)
{
        u8 temp1,temp2;
        convertDs18b20();
        resetOnewire();
        wOnewire(0xcc);
        wOnewire(0xbe);        
        temp1=rOnewire();
        temp2=rOnewire();
       
        return (((temp2<<8)|temp1)*6.25);
}
这是.C部分
#ifndef __DS18B20_H__
#define __DS18B20_H__


#define SET_DQ()                                                 GPIO_WriteHigh(GPIOD,GPIO_PIN_0) //拉高
#define CLR_DQ()                                                 GPIO_WriteLow(GPIOD,GPIO_PIN_0) //拉低
#define IN_DQ()                                                             GPIO_Init(GPIOD,GPIO_PIN_0,GPIO_MODE_IN_FL_NO_IT)//浮空
#define OUT_DQ()                                                            GPIO_Init(GPIOD,GPIO_PIN_0,GPIO_MODE_OUT_PP_HIGH_FAST)//推挽
#define GET_DQ()                                                GPIO_ReadInputPin(GPIOD, GPIO_PIN_0)//DQ值

u8 readTemp(void);
void resetOnewire(void);
u8 rOnewire(void);
void wOnewire(u8 data);
void convertDs18b20(void) ;

#endif
这是IO的配置。就是无法显示温度,串口一直显示f9。
求各位大神帮忙!!
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

16

帖子

0

粉丝