×
嵌入式 > 技术百科 > 详情

STM8L 151G6U6 驱动RW1820温度传感器

发布时间:2022-02-24 发布时间:
|

兼容DS18B20以及RW1820(VDD=2.8V)版本



#define RW1820_DQ_OUT  GPIO_Init(GPIOC, GPIO_PIN_2,GPIO_Mode_Out_OD_HiZ_Slow); //输出

#define RW1820_DQ_IN   GPIO_Init(GPIOC, GPIO_PIN_2, GPIO_Mode_In_PU_No_IT);     //输入

#define RW1820_DQ_HIGH          GPIO_SetBits(GPIOC, GPIO_PIN_2); //拉高

#define RW1820_DQ_LOW           GPIO_ResetBits(GPIOC, GPIO_PIN_2);  //拉低

#define RW1820_DQ_PULL_UP

          GPIO_Init(GPIOC, GPIO_PIN_2, GPIO_Mode_In_PU_No_IT);     //上拉

#define RW1820_DQ_FLOATING

        GPIO_Init(GPIOC, GPIO_PIN_2, GPIO_Mode_In_FL_No_IT);       //浮空

#define RW1820_DQ_PUSH_PULL

          GPIO_Init(GPIOC, GPIO_PIN_2, GPIO_Mode_Out_PP_Low_Fast); //推挽



#define RW1820_DQ_VALUE        GPIO_ReadInputDataBit(GPIOC, GPIO_PIN_2) //DQ值

 

void _delay_us(uint16_t nCount)

{

    nCount *= 3; 

    while(--nCount);

}

/**

  * @brief _delay_ms

  * @param nCount

  * @retval None

  */

void _delay_ms(uint16_t nCount)

{

    while(nCount--)

    {

        _delay_us(1000);

    }

}

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



void RW1820_Init(void)

{

    uint8_t retry=0;    

RW1820_DQ_OUT;   //置为输出口    

RW1820_DQ_HIGH;  //总线拉高

_delay_us(1);

RW1820_DQ_LOW;   //总线产生下降沿,初始化开始

_delay_us(700);  //复位脉冲 总线保持低电平在480 - 960微秒之间

RW1820_DQ_HIGH;  //总线拉高

_delay_us(100);          //100 

        RW1820_DQ_IN;    //置为输入,主机释放总线,准备接收DS18B20的应答脉冲



while(RW1820_DQ_VALUE==1&& (retry<100) )//等待DS18B20发出应答脉冲

        {

          retry++;

          _delay_us(1);

        }

        RW1820_DQ_HIGH;  //总线拉高

_delay_us(400);  //持续60-400us

}

//-------------从DS18B20写1个字节函数

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);           //大于1微妙

if (_data & 0x01)

{

                    RW1820_DQ_HIGH;     //总线拉高

}

                else RW1820_DQ_LOW;    //总线拉低

                _delay_us(60);          //60

                RW1820_DQ_HIGH;         //总线拉高,释放总线,准备启动下一个“写时间片”

_data = _data >> 1;

}

}

//-------------从DS18B20读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);   //大于1微妙

                RW1820_DQ_HIGH; //主机释放总线,接下来(2~15)us内读有效 

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);//命令Ds18b20开始转换温度

         _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;

}

 


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
洪荒之力+无比专注=国内首款机器人离线编程软件