STM8L 控制温度传感器DS18B20

最新更新时间:2022-04-23来源: eefocus关键字:STM8L  温度传感器  DS18B20 手机看文章 扫描二维码
随时随地手机看文章

#define DS18B20_GPIO_PORT  (GPIOC)

#define DS18B20_GPIO_PIN   (GPIO_Pin_2)



#define DS18B20_PIN_SET_OUT()   GPIO_Init(DS18B20_GPIO_PORT, (GPIO_Pin_TypeDef)DS18B20_GPIO_PIN, GPIO_Mode_Out_PP_High_Fast)

#define DS18B20_PIN_SET_IN()    GPIO_Init(DS18B20_GPIO_PORT, (GPIO_Pin_TypeDef)DS18B20_GPIO_PIN, GPIO_Mode_In_PU_No_IT)

#define DS18B20_WR1()           GPIO_SetBits(DS18B20_GPIO_PORT, (GPIO_Pin_TypeDef)DS18B20_GPIO_PIN)

#define DS18B20_WR0()           GPIO_ResetBits(DS18B20_GPIO_PORT, (GPIO_Pin_TypeDef)DS18B20_GPIO_PIN)

#define R_DS18B20()             GPIO_ReadInputDataBit(DS18B20_GPIO_PORT, (GPIO_Pin_TypeDef)DS18B20_GPIO_PIN)

/* Private macro -------------------------------------------------------------*/

#define READ_ROM              0x33  //读取序列号

#define SKIP_ROM              0xCC  //跳过ROM

#define MATCH_ROM             0x55  //匹配ROM

#define CONVERT_TEM           0x44  //转换温度

#define READ_RAM              0xBE  //读暂存器

#define WRITE_RAM             0x4E  //写暂存器

/* Private variables ---------------------------------------------------------*/

/* Private function prototypes -----------------------------------------------*/

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

    }

}

/* Private functions ---------------------------------------------------------*/

/* Public functions ----------------------------------------------------------*/

void Alarm_for_No_DS18B20(void)

{

    //单总线上没有发现DS18B20则报警,该动作据具体应用具体处理

}

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

unsigned char DS18B20_Start(void) //复位ds18b20芯片

{

    unsigned char i,succ=0xff;

    DS18B20_PIN_SET_OUT(); //置为输出口

    DS18B20_WR0();          //总线产生下降沿,初始化开始

    for(i=0; i<30; i++)_delay_us(25); //总线保持低电平在480 - 960微秒之间  ;i<20;(25us)

    DS18B20_WR1();         //总线拉高

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

    i=0;

    while(R_DS18B20())         //等待DS18B20发出应答脉冲

    {

        _delay_us(5);          //5

        if(++i>12)            //DS18B20检测到总线上升沿后等待15-60us

        {

            succ=0x00;           //如果等待大于约60us,报告复位失败

            break;

        }

    }

    i=0;

    while(!R_DS18B20())       //DS18B20发出存在脉冲,持续60-240us

    {

        _delay_us(5);         //5

        if(++i>48)            //如果等带大于约240us,报告复位失败

        {

            succ=0x00;

            break;

        }

    }

    _delay_us(20);

    return succ;

}

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

void DS18B20_SendU8(unsigned char d8)//向DS18B20写一字节函数

{

    unsigned char i;

    DS18B20_PIN_SET_OUT();   //置为输出口

    for(i=0; i<8; i++)

    {

        DS18B20_WR0();       //总线拉低,启动“写时间片”

        _delay_us(2);            //大于1微妙

        if(d8&0x01)DS18B20_WR1();

        _delay_us (32);      //延时至少60微秒,使写入有效

        _delay_us (30);

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

        d8>>=1;

        _delay_us (1);

    }

    DS18B20_PIN_SET_IN();   //主机释放总线

}

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

unsigned char DS18B20_ReadU8(void)//从DS18B20读1个字节函数

{

    unsigned char i,d8;

    for(i=0; i<8; i++)

    {

        d8>>=1;

        DS18B20_PIN_SET_OUT();//置为输出口

        DS18B20_WR0();        //总线拉低,启动读“时间片”

        _delay_us(2);         //大于1微妙

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

        DS18B20_PIN_SET_IN(); //引脚设定为输入口,准备读取

        _delay_us(2);         //延时2个us后进行读



        if(R_DS18B20())d8|=0x80;//从总线拉低时算起,约15微秒内读取总线数据

        _delay_us(32);       //60us后读完成

        _delay_us(30);

        DS18B20_WR1();       //总线拉高,主机释放总线,准备启动下一个“写时间片”

    }

    DS18B20_PIN_SET_IN();    //主机释放总线

    return(d8);

}

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

void Init_DS18B20(void)           //初始化DS18B20

{

    unsigned char i;

    i=DS18B20_Start();             //复位

    if(!i)                          //单总线上没有发现DS18B20则报警

    {

        Alarm_for_No_DS18B20();

        return;

    }

    DS18B20_SendU8 (SKIP_ROM);  //跳过rom匹配

    DS18B20_SendU8 (WRITE_RAM); //设置写模式

    DS18B20_SendU8 (0x64);        //设置温度上限100摄氏度

    DS18B20_SendU8 (0x8a);        //设置温度下线-10摄氏度

    DS18B20_SendU8 (0x7f);        //12bit(默认)

}



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



unsigned int Read_DS18B20(void)  //读取并计算要输出的温度

{

    unsigned char i;

    unsigned char tl;

    unsigned int  th;

    i=DS18B20_Start();           //复位

    if(!i)                        //单总线上没有发现DS18B20则报警

    {

        Alarm_for_No_DS18B20();

        return 0;

    }

    _delay_ms(1);

    DS18B20_SendU8(SKIP_ROM);     //发跳过序列号检测命令

    DS18B20_SendU8(CONVERT_TEM); //命令Ds18b20开始转换温度

    i=0;

    _delay_ms(1);

    while(!R_DS18B20())       //当温度转换正在进行时,主机读总线将收到0,转换结束为1

    {

        _delay_ms(3);

        if(++i>250) break;              //至多转换时间为750ms

    }

    DS18B20_Start();                 //初始化

    _delay_ms(1);

    DS18B20_SendU8(SKIP_ROM);    //发跳过序列号检测命令

    DS18B20_SendU8(READ_RAM);  //发读取温度数据命令

    tl=DS18B20_ReadU8();           //先读低8位温度数据

    th=DS18B20_ReadU8()<<8;        //再读高8位温度数据

    return (th|tl)*10>>4;              //温度放大了10倍,*0.0625=1/16=>>4

}


关键字:STM8L  温度传感器  DS18B20 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic567797.html

上一篇:STVD/COSMIC如何分配变量到指定的地址
下一篇:STM8使用问题总结2----STVD(COSMIC)定义变量指定其类型和位定义

推荐阅读

STM8L RTC总结初始化和配置
配置RTC时钟源配置RTC时钟源为LSE,1分频,即32768Hz。等待CLK_CRTCR:RTCSWBSY位复位,然后设置CLK_CRTCR值为0x10;等待CLK_ECKCR:LSERDY位置位,标识LSE时钟源已稳定可用;等待CLK_ECKCR:LSEON位置位,标识LSE时钟源已启用。解除RTC寄存器保护执行以下操作顺序:写0xCA到寄存器RTC_WPR;写0x53到寄存器RTC_WPR。写其它值到RTC_WPR,则自动激活RTC寄存器保护功能。配置日历功能配置步骤如下:进入初始化模式,置位RTC_ISR中INIT位;并等待初始化标志位(INITF)置位;配置ck_spre时钟,即1Hz时钟;装载初始时间到Shadow寄存器
发表于 2022-03-31
stm8L的rtc代码
CLK_LSEConfig(CLK_LSE_ON);while (CLK_GetFlagStatus(CLK_FLAG_LSERDY) == RESET);CLK_RTCClockConfig(CLK_RTCCLKSource_LSE, CLK_RTCCLKDiv_1);CLK_PeripheralClockConfig(CLK_Peripheral_RTC, ENABLE);
发表于 2022-02-16
STM8L的TIM4定时功能详解
TIM4是STM8最简单的定时器,忽略掉级联同步的功能,TIM4就只具有定时功能.非常适合刚刚接触STM8定时器的初学者学习.从上图可以看到,TIM4由一个分频器,自动重装寄存器和计数器组成,结构非常简单.系统主时钟fsysclk经TIM4分频器分频后,提供给TIM4作为计数时钟.TIM4是一个向上计数的定时器.从0开始计数,当计数到与自动重载寄存器的值相等时,产生溢出,重新从0开始计数.定时器溢出时,如果TIM4_CR1中的UDIS位为0,则产生一个更新事件,若此时打开了TIM4的中断,则进入中断.如果溢出时,UDIS为1,则不会进入中断.本文利用TIM4的定时功能,实现LED闪烁.TIM4周期性的进入中断,翻转LED控制IO,控
发表于 2021-11-10
<font color='red'>STM8L</font>的TIM4定时功能详解
stvd+stm8l051F3(1):stvd一步一步建立stm8l工程项目
stvd版本信息:ST Visual Develop Version 4.3.9单片机型号: stm8l051F3stvd建立stm8l工程项目步骤:1、打开stvd,File->New Workspace...选择Create workspace and projectWorkspace filename中输入工程名,Workspace location输入工程存放路径Project filename输入项目名称;Project location输入项目存放路径,Toolchain选择所用编译器,这里选择STM8 Cosmic;Toolchain root会根据Toolchain的选择自动获取编译器所在路径选中IC型号,双
发表于 2021-10-21
stvd+stm8l051F3(1):stvd一步一步建立<font color='red'>stm8l</font>工程项目
stm8l+sx1278: 1278发送完成中断TxDone处理
1278发送完成中断TxDone处理问题:问题描述:SX1278 RaLo扩频模式下,当数据发送完成后,进行sleep模式,在开发过程发现一个问题,DIO0初始状态低电平,中断上升沿触发,数据发送完成后,用示波器显示DIO0电平被拉高,TxDone中断触发,但触发后DIO0一直处于高电平状态,当下一次发送完成后,DIO0处于高电平,无法再次触发TxDone中断;问题解决:在每次发送完成后,DIO0被拉高时,需要将DIO0重新初始化为0;#define GPIO_VARE_1 0X00/* 设置为待机模式,向REG_LR_DIOMAPPING1寄存器写入0x00,将DIO0电平拉低 */SX1276Lo
发表于 2021-10-20
三星Galaxy Watch 5系列可能配备传闻已久的温度传感器
三星健康应用最近的测试版更新几乎证实了Galaxy Watch 5将有两个版本可供选择,一个是普通的Galaxy Watch 5,另一个是Galaxy Watch 5 Pro。有趣的是,测试版更新还暗示,即将推出的三星手表系列可能会配备传闻已久的温度传感器。根据分享的一张截图,三星健康应用在测试版更新后,开始显示“睡眠时的皮肤温度”开关。顾名思义,这项功能可以用来跟踪睡眠周期中的皮肤温度。另外,健康应用的测试版更新也确认了Galaxy Watch 5和Pro的名字,并暗示今年不会有“Classic”。Galaxy Watch 5可能会有40mm和42mm两种尺寸,而Pro预计只有一种尺寸。
发表于 2022-06-05

推荐帖子

EDK调用ISE模块含有ISE软核(如fifo)时该怎么解决
我在用EDK的microblaze调用ISE中自己写的一个模块,此模块含有一个FIFO的软核。如果EDK调用不含有ISE软核的操作,我会做。在EDK工程里的pcore下添加ISE源文件,然后修改各个配置文件就行了。现在要调用含有ISE软核的,但是EDK好像只能添加源文件(vhdl或者v)如果只添加FIFO这些软核的HDL模版会报错。不知道能不能在EDK添加FIFO的网表,我不知道怎么操作,求大神指教啊。。。。EDK调用ISE模块含有ISE软核(如fifo)时该怎么解决
sealorzh FPGA/CPLD
问一个验证性问题,知道的就可以马上拿分
三星2440A,的ARM9芯片,里面有GSTATUS2和GSTATUS4等寄存器。说明里是说GSTATUS4只会在电源复位的时候才会丢失数据。否者一直保存数据。 下面就是我主要要问的问题了: 使用2440内部看门狗复位,会不会导致GSTATUS4的数据丢失呢? 请验证过的朋友回答一下,本人做的实验结果会在结贴的时候给出。问一个验证性问题,知道的就可以马上拿分
cindydai 嵌入式系统
谁有mini SD卡座的PCB图库
我没有实物也没有样图,如果谁有,就发个pcb图给我就好了谁有miniSD卡座的PCB图库
shicong PCB设计
有谁用过索尼的SNC-RZ30P网络摄像机做过二次开发啊?
最近买了几台索尼的SNC-RZ30P网络摄像机做目标跟踪用,但苦于一直找不到SDK或API,那位大虾用过,SDK或者自己开发的代码,都行。麻烦发一下,或者正在做的可以讨论一下。在下的qq:158331504,e-mail:zry0213@163.com。 有谁用过索尼的SNC-RZ30P网络摄像机做过二次开发啊?
dym77314029 嵌入式系统
关于ixp425问题
学校有一块STAREAST开发板。完全按照光盘所付说明编译出内核后(其中有若干BUG,查网上已排除),通过REDBOOT(网上下载的redbootprebuiltimageforixp425,因为光盘所付PATCH有错)烧录进FLASH后启动无反应: load-r-v-b0x01600000zImage load-r-v-b0x00800000ramdisk.gz fiscreate-b0x01600000-l0xc0000zimage
ustc2005 嵌入式系统
【2022得捷创新设计大赛】物料开箱STM32H7B3-DK
本帖最后由eew_02EYVp于2022-6-1911:37编辑 本人有幸第一批入围捷创新设计大赛,感谢EEWORLD网站与得捷电子的支持,下单22天后终于等到了我心心念念的开发板。本人此次申请的开发板是STM32H7B3I-DK探索套件,基于STMicroelectronicsArm®Cortex®-M7内核的STM32H7B3LIH6QU微控制器而设计的一个完整的演示和开发平台,具有4.3寸电容触摸屏,WiFi模块,microSD™卡,板上集成的
eew_02EYVp 2022得捷电子创新设计大赛
小广播
实战 培训 开发板 精华推荐

何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2022 EEWORLD.com.cn, Inc. All rights reserved