STM8L 151G6U6 驱动RW1820温度传感器

2019-11-13来源: eefocus关键字:STM8L  151G6U6  驱动RW1820  温度传感器

兼容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;

}


关键字:STM8L  151G6U6  驱动RW1820  温度传感器 编辑:什么鱼 引用地址:http://news.2689mr.com/mcu/ic479850.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:PCF8563 时钟芯片驱动程序 (STM8S/STM8L)
下一篇:STM8L EXITB一个端口两个中断的实现

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

stm8l151低功耗程序架构,调试心得
最近帮医院做了一款体温记录仪,整个硬件方案资源是:stm8L151 + NTC*2 + EEPROM + 锂电池充电保护电路 + 18mAh纽扣电池;软件逻辑是,每隔一分钟,采样两路温度并保存在EEP里;通过USB转TTL,上位机能够读取,展示温度曲线,最大最小平均值等简单的运算;整个方案很简单,但也走了不少弯路......单片机程序框架之伪代码:void main(void){    CLK_Config();    GPIO_Config();    ADC_Config();    USART_Config();   
发表于 2020-04-27
STM8L151 DAC
最近在做一个关于ADC采集的,同时使用DAC输出的项目,对于DAC输出0V电压做一下总结。STM8L151中内嵌1个 Output Buffer其作用可以用来降低输出阻抗,可以在不添加外部运算放大器时直接驱动外部负载,通过 DAC_CHxCR1来控制其使能或失能。我使用的是PB4 具体的配置代码如下:/********************************RI_IOSwitch_13 ---> PB6RI_IOSwitch_14 ---> PB5RI_IOSwitch_15 ---> PB4配置DAC1 通道1 PB4 ********************************/void
发表于 2020-04-21
STM8L编程问题之segment .text size overflow
#error clnk Debugsolar_charger.lkf:1 segment .text size overflow,提示代码段溢出,此时因为使用STM8L的固件库,造成一些不必要的函数被编译,可以尝试注释掉一些不必要的函数;如果已经没有可以注释的函数,可以尝试在project setting中,选择代码优化,压缩代码。 遇到最多的莫过于使用库的时候,提示代码超过内存范围。代码量并不多,但是编译器却明明白白的提示代码超过内存范围,为什么会这样?主要原因,在于库文件中为了做好错误处理,中间添加了assert代码。同时也由于为了将所有功能函数都提供出来,中间有很多用不到的函数,但是在STM8L中,这些没有用的函数
发表于 2020-04-14
STM8L151C8T6切换时钟信号
先说重点:切换时钟源后,需要重新初始化时钟相关的外设。项目需求,单片机在A状态下使用外部12MHz的晶振作为时钟信号,B状态下使用内部时钟HSI。代码如下://初始化时钟信号//形参:UINT8 Clk_Flg:时钟源,可以选为HSE或HSIvoid InitClock(UINT8 Clk_Flg) { UINT16 Clk_Cnt = 0; if(HSE == Clk_Flg){ //时钟源选为HSE CLK_DeInit(); CLK_HSEConfig(CLK_HSE_ON);  while(!CLK_GetFlagStatus(CLK_FLAG_HSERDY)){ if
发表于 2020-04-03
STM8L151系列 (OTA) Bootloader功能的开启 和 关闭
/PLX_Extends/blob/master/main.c    optbl = ((uint16_t)FLASH_ReadByte(OPT_BL_ADDR_L) << 8) | FLASH_ReadByte(OPT_BL_ADDR_H);    if (optbl != 0x0000)    {        printf("[OPTBL] dis: 0x%Xrn", optbl);        // OPTBL:  Option Byte 可选的字节 
发表于 2020-04-01
STM8L152C6T6通过IIC接口操作M24LR64的正确波形
1.观察一下,M24LR04中0x0000~0x001F地址中的数据,这是一条ISO15693协议的报文。2.3.第1个字节,设备选择码0xA64.第2个和第3个字节,地址0x0000。
发表于 2020-03-31
STM8L152C6T6通过IIC接口操作M24LR64的正确波形
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 2689mr.com, Inc. All rights reserved
博彩送彩金18元 送彩金棋牌网站 澳客彩票 彩票大赢家 彩票大赢家 百家乐送彩金 手机彩票送彩金 广发公众号 彩票大赢家 澳客彩票