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.eeworld.com.cn/mcu/ic479850.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

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

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

推荐阅读

STM8L051F3_02_EXTI应用
本章介绍STM8L051F3的EXTI相关知识,内容分为以下几部分:EXTI简介KEY外部中断检测1、EXTI简介EXTI也是属于GPIO的知识点,应用比较广泛。STM8L051F3每个I/O口在输入模式下都能配置为中断,在这个配置下,一个信号沿或电平输入到I/O口上将产生一个中断请求。外部中断只有在端口的输入模式下才有效。可通过配置寄存器Px_CR2相应的位来独立地使能或禁能某个端口的外部中断功能。另外,可通过ADC_TDRH和ADC_TDRL寄存器来禁用施密特触发器节省功耗。2、KEY外部中断检测2.1 KEY的外部中断配置本小节介绍将GPIO配置为外部中断输入模式,并通过KEY(PC4)来触发一个外部中断信号,然后产生中
发表于 2019-12-14
STM8L051之通过ADC1与DMA读取内部参考电压
stm8L051芯片内部的参考电压与电源电压有一定的关系这在芯片供电电压变化的情况下,测量外部ADC电压输入提供一个确定的参考电压。这里提前厘清下:该内部参考电压VREFINT 并非ADC 的参考电压,ADC 的参考电压依然是VDD。即使VDD 有所波动,这个VREFINT 电压恒定不变,对于ADC 电路而言,它只是个测试点。 对于某固定的ADC 参考电压情况下,所有被测电压点的AD转换值与该点电压值保持同一比例关系,换句话说,对于ADC参考电压固定情况下,各点的电压与ADC值与成线性关系。下面图形是芯片分别在3个不同参考电压的示意图,这里参考电压接VDD。下面三根斜线分别是VDD 为2.8V、3.2V、3.6V 时的
发表于 2019-12-14
STM8L051之通过ADC1与DMA读取内部参考电压
STM8L051F3基础功能:内部时钟;TIM2定时器;串口及printf
STM8L051调试笔记之基础功能:系统时钟、串口、定时器都是基础而且必须的功能,这里放在一起统一记录,之所以用TIM2定时器,是因为想实现STM32的滴答定时器功能这些基础功能没什么好理解的,就直接贴代码了main.c:main.c:  void main(void)  {    enableInterrupts();    Sysclk_Init();    LED_Init();    Uart1_Init();          printf("
发表于 2019-12-14
STM8L051F3基础功能:内部时钟;TIM2定时器;串口及printf
STM8L051 调试体会
芯片很小,坑不少芯片烧写次数,051系列是100次!!!不适合用来做开发板,可以做产品,但是目前烧写了有几百次了还没出问题。151系列可以到10kI2C 引脚是真开漏,需要外部上拉电阻。使用LSE时候,在线调试会断开ADC 多通道采集发现数据错位,我也发现了,但是最后发现主要是在线调试的原因,正常运行没有问题。RTC AWU 唤醒HALT,这个地方要注意一定要仔细看手册,设置计数器的时候先要去写保护,然后清除WUTE,再查询WUTWF位,直到WUTWF=1时,写寄存器,库函数的操作没有等待查询WUTWF位的操作,说问题吧也不是很大,现象就是在线调试的时候发现即使用库函数改了计数器数值,但是没有修改成功,因为芯片一直上电中,RTC 独
发表于 2019-12-14
STM8L051x SPI Master
STM8L051x SPI作为Master 使用在这里我使用STM8L051x SPI作为Master,ads1293作为slave,使两者进行通信。1、查看STM8L051x 的datasheet 中SPI的master模块介绍如下:时钟相位如下:查看ads1293 的datasheet中SPI 介绍如下:由STM8L051x 与ads1293 的SPI 的介绍,我们可以得出ads1293在时钟为低电平时的第一个上升沿传输与获取数据,所以时钟相位都分别设置为SPI_CPOL_Low、SPI_CPHA_1Edge。2、对于STM8L051x 中的SPI 作为 master来说,我们只需要配置好输入引脚(SDI)、输出引脚(SDO
发表于 2019-12-12
STM8L051x SPI Master
STM8L学习笔记-GPIO端口操作(一)
STM8与STM32一样提供了固件库函数, 不过没有STM32的库完善,给的说明文档是chm格式的,名字是stm8l15x_stdperiph_lib_um.chm,这个官网有下载. GPIO寄存器有: 输出寄存器(ODR), 输入寄存器(IDR), 方向寄存器(DDR), 控制寄存器1(CR1), 控制寄存器2(CR2); 后面三个寄存器组和可以配置为8种GPIO的模式. 而固件库函数给出了8种模式,在上面的基础上加入了输出高/输出低电平的状态。GPIO_Mode_In_FL_No_IT浮空输入无中断 
发表于 2019-12-12
小广播
何立民专栏 单片机及嵌入式宝典

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

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved