STM8L 温度传感器DS18B20

发布者:WanderlustGaze最新更新时间:2018-08-26 来源: eechina关键字: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 引用地址:STM8L 温度传感器DS18B20

上一篇:STC-ISP下载失败的原因与解决汇总
下一篇:单片机上操作系统的好处

推荐阅读最新更新时间:2024-03-16 16:12

基于单片机的DS18B20温度计设计
上图是Proteus仿真图,数码管为共阳数码管,反相器用74HC14,排阻用10K的,晶振用12MHZ的,电阻R1-R8用200欧的即可。但在实际制作时可以用三极管代替反相器,这样可以节约成本。但代替后无法用Proteus仿真出来,具体如何代替参照本人上篇博文:基于单片机的电子时钟设计,三极管用常用的9012或者9015即可,经本人实际验证效果非常好。 下图为原理图: 下图为PCB设计图 以下为实验源程序 #include reg52.h sbit DQ=P3^3; //定义DS18B20端口DQ sbit BEEP=P3^7 ; unsigned char presence; unsigned
[单片机]
DS18B20构成的多点温度测量系统
引 言 在传统的温度测量系统设计中,往往采用模拟技术进行设计,这样就不可避免地遇到诸如引线误差补偿、多点测量中的切换误差和信号调理电路的误差等问题;而其中某一环节处理不当,就可能造成整个系统性能的下降。随着现代科学技术的飞速发展,特别是大规模集成电路设计技术的发展,微型化、集成化、数字化正成为传感器发展的一个重要方向「1」。美国Dallas半导体公司推出的数字温度传感器DSl8820,具有独特的单总线接口,仅需要占用一个通用I/O端口即可完成与微处理器的通信;在-10~+85℃温度范围内具有±0.5℃精度;用户可编程设定9~12位的分辨率。以上特性使得DSl8820非常适用于构建高精度、多点温度测量系统。 1 DSl8B20简
[测试测量]
STM8L读写EEPROM(24LC64)
使用24LC64(24XX64)是低功耗应用的EEPROM,存储容量 8K byte(64K bit),IIC 最大时钟频率400 KHz(24FC64达到1MHz),低功耗CMOS技术:工作电流 1 mA(典型)、 待机电流 1 μ A(典型),32字节的页写缓冲器,超过100万擦/写周期,数据保存 200年。 24C02只有8字节的页写缓冲器,操作的地址只有8位,而24LC64操作的地址包含高8位和低8位。两者的数据手册去区别如下: 1、AT24C02页写时序: 2、24LC64页写时序: STM8L的程序设计如下: (1)数据的页写操作: (2)数据的连续读取:
[单片机]
<font color='red'>STM8L</font>读写EEPROM(24LC64)
DS18B20温度显示演示程序(6位数码管显示)
#include AT89X51.H sbit DQ = P3^3; //定义DS18B20端口DQ sbit BEEP=P3^7 ; unsigned char presence ; unsigned char code LEDData = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, 0x80,0x90,0xff}; unsigned char data temp_data = {0x00,0x00}; unsigned char data display = {0x00,0x00,0x00,0x00,0x00};
[单片机]
这款袜子可以监测糖尿病患者脚部温度
许多患有糖尿病和糖尿病性神经病的患者容易出现足部溃疡,而这些溃疡都是很难以治疗的。最好的办法是早日发现溃疡现象并尽快接受治疗。 研究人员研究出的一款Siren糖尿病袜子可能就是我们所需要的,因为它们能够监测脚部温度,如果由于受伤而导致脚步温度异常增加,它们会让病人知道。 这种袜子内置温度传感器,能通过蓝牙与患者智能手机上安装的匹配应用进行通信。还有一个选项,可以使用集线器将信息直接传送给医生和护理人员,供那些需要这种高科技传感器袜子但拒绝使用智能手机的人使用。 目前这款高科技产品正在进行预订,而开发该款袜子的旧金山公司Siren希望用户注册使用其订阅服务,并告知用户公司每六个月都会发布的新款袜子。
[医疗电子]
51单片机控制八个DS18B20温度传感器显示
单片机源程序如下: #include reg51.h #include Intrins.h #define DATA P1 //1602驱动端口 //ROM操作命令 #define READ_ROM 0x33 //读ROM #define SKIP_ROM 0xCC //跳过ROM #define MATCH_ROM 0x55 //匹配ROM #define SEARCH_ROM 0xF0
[单片机]
51单片机控制八个<font color='red'>DS18B20</font><font color='red'>温度传感器</font>显示
DS18B20温度传感器+12864液晶串口显示
程序的头文件 #include reg52.h #include intrins.h #include math.h sbit CS=P1^0; sbit SCK=P1^2; sbit SID=P1^1; sbit Key=P1^3; sbit DQ = P2 ^ 7; //定义端口DQ unsigned char code AC_TABLE ={ 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, 0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f, 0x98,0x99,0x9a,0x9b,
[单片机]
温度传感器在笔记本电脑的应用
由于计算机效能不断的推陈出新,愈来愈多的功能被整合到计算机中。因此,计算机的处理量与日俱增,这些资料包含多媒体数据及3D动画资料。为了满足大量的数据处理需求,愈来愈多的芯片组被放入主机中,同时,CPU及芯片组的工作频率也不断提高。更多的芯片组及更快的时钟频率意味着更多热量的产生。 对于笔记本电脑,用户除了要求系统具有更好的效能外,在外观上,还要求轻、薄、小,这是设计人员所面临的另一挑战。在有限的空间内,如何耗散系统所产生的热量是一个棘手问题。如何兼顾系统效能、系统舒适度 (包括笔记本电脑外壳的温度、风扇旋转所产生的噪音)、及系统运行时间,是笔记本电脑设计的一个重要课题。 笔记本电脑中需要监测温度的组件
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

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