DS18B20温度传感器示例

2019-05-09来源: eefocus关键字:DS18B20  温度传感器  液晶


/*

*******************************************************************************

* 文件名:main.c

* 描  述:温度传感器DS18B20示例

* 备  注:控制DS18B20测量温度并将温度值显示到液晶上

*******************************************************************************

*/

#include

#include "stdint.h"

 

extern bit startDs18b20();

extern bit getDs18b20Temperature(int * temp);

extern void initLcd1602();

extern void lcd1602ShowStr(uint8_t x, uint8_t y, uint8_t * str);

extern uint8_t getIntPart(int16_t temp);

extern uint8_t getDecPart(int16_t temp);

 

bit flag1s = 0;          //1s定时标志

uint8_t T0RH = 0, T0RL = 0; 

 

void ConfigTimer0(uint16_t ms);

uint8_t IntToString(uint8_t * str, int16_t dat);

 

void main() {

    bit res;

int16_t temp; //读取到的当前温度值

uint8_t intT, decT; //温度值的整数和小数部分

    uint8_t len;

    uint8_t str[12];

 

    EA = 1;            //开总中断

    ConfigTimer0(10);  //T0定时10ms

    startDs18b20();      //启动DS18B20

    initLcd1602();     //初始化液晶

    

    while (1) {

        if (flag1s) { //每秒更新一次温度(软实时)

            flag1s = 0;

            res = getDs18b20Temperature(&temp);  //启动转换后至少要再等750ms之后读取当前温度

            if (res) { //读取成功时,刷新当前温度显示          

intT = getIntPart(temp); //分离出温度值整数部分

decT = getDecPart(temp);     //分离出温度值小数部分

                len = IntToString(str, intT); //整数部分转换为字符串

                str[len++] = '.';              //添加小数点

                str[len++] = decT + '0';      //十进制小数位再转换为ASCII字符

                while (len < 6) { //用空格补齐到6个字符长度

                    str[len++] = ' ';

                }

                str[len] = '';              //添加字符串结束符

                lcd1602ShowStr(0, 0, str);        //显示到液晶屏上

            } else { //读取失败时,提示错误信息

                lcd1602ShowStr(0, 0, "error!");

            }

            startDs18b20();               //重新启动下一次转换

        }

    }

}

/* 整型数转换为字符串,str-字符串指针,dat-待转换数,返回值-字符串长度 */

uint8_t IntToString(uint8_t * str, int16_t dat) 

{

    char i = 0;

    unsigned char len = 0;

    unsigned char buf[6];

    

    if (dat < 0)  //如果为负数,首先取绝对值,并在指针上添加负号

    {

        dat = -dat;

        *str++ = '-';

        len++;

    }

    do {          //先转换为低位在前的十进制数组

        buf[i++] = dat % 10;

        dat /= 10;

    } while (dat > 0);

    len += i;     //i最后的值就是有效字符的个数

    while (i-- > 0)   //将数组值转换为ASCII码反向拷贝到接收指针上

    {

        *str++ = buf[i] + '0';

    }

    *str = '';  //添加字符串结束符

    

    return len;   //返回字符串长度

}

/* 配置并启动T0,ms-T0定时时间 */

void ConfigTimer0(unsigned int ms)

{

    unsigned long tmp;  //临时变量

    

    tmp = 11059200 / 12;      //定时器计数频率

    tmp = (tmp * ms) / 1000;  //计算所需的计数值

    tmp = 65536 - tmp;        //计算定时器重载值

    tmp = tmp + 12;           //补偿中断响应延时造成的误差

    T0RH = (unsigned char)(tmp>>8);  //定时器重载值拆分为高低字节

    T0RL = (unsigned char)tmp;

    TMOD &= 0xF0;   //清零T0的控制位

    TMOD |= 0x01;   //配置T0为模式1

    TH0 = T0RH;     //加载T0重载值

    TL0 = T0RL;

    ET0 = 1;        //使能T0中断

    TR0 = 1;        //启动T0

}

/* T0中断服务函数,完成1秒定时 */

void InterruptTimer0() interrupt 1

{

    static unsigned char tmr1s = 0;

    

    TH0 = T0RH;  //重新加载重载值

    TL0 = T0RL;

    tmr1s++;

    if (tmr1s >= 100)  //定时1s

    {

        tmr1s = 0;

        flag1s = 1;

    }

}


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

上一篇:位置式PID控制算法模型(数字)
下一篇:CT107D digitalTube.c

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

推荐阅读

ds18b20 温度模块串口显示简单代码
今天晚上没事干编了一个极简的一个小程序,虽然简单但是还是很稳定的,连接也很简单,用最小系统板p0.0口接上ds18b20模块就可以了#include <reg51.h>#include <intrins.h>#include <stdio.h>#include "DS18B20.h"#define OSC 11059200            //晶振频率#define BAUDRATE 9600    //波特率void main(void){   
发表于 2019-11-14
ds18b20 温度模块串口显示简单代码
stm32 驱动DS18B20温度传感器
#include "temp.h"#define u8 uint8_t#define u16 uint16_t#define u32 uint32_t#define DS18B20_PORT GPIOA#define DS18B20_PIN     GPIO_Pin_1                  #define DS18B20_CLK     RCC_APB2Periph_GPIOA#define RW1820_DQ_HIGH       &nbs
发表于 2019-11-13
51单片机DS18B20温度传感四位数码管显示报警
;       //定义DS18B20总线I/O        bit shanshuo_st;                            //闪烁间隔标志bit beep_st;                                  
发表于 2019-11-12
51单片机DS18B20温度传感四位数码管显示报警
基于51单片机的DS18B20温控系统设计
数字温度传感器DS18B20,因其内部集成了A/D转换器,使得电路结构更加简单,而且减少了温度测量转换时的精度损失,使得测量温度更加精确。数字温度传感器DS18B20只用一个引脚即可与单片机进行通信,大大减少了接线的麻烦,使得单片机更加具有扩展性。由于DS18B20芯片的小型化,更加可以通过单跳数据线就可以和主电路连接,故可以把数字温度传感器DS18B20做成探头,探入到狭小的地方,增加了实用性。更能串接多个数字温度传感器DS18B20进行范围的温度检测。1.2 温度控制系统的目的温度控制在日常生活及工业领域应用相当广泛,比如温室、水池、发酵缸、电源等场所的温度控制。而以往温度控制是由人工完成的而且不够重视,其实在很多场所
发表于 2019-11-11
基于51单片机的DS18B20温控系统设计
dsPIC30F6014 CAN总线发送功能+DS18B20温度采集
1。DS18B20定时采集温度2。温度采集时间间隔用T1定时器控制3。采集到的温度通过CAN总线送另一主机处理#include <p30f6014.h>             //dsPIC30F6014标准头文件  _FOSC(0x0ffe5);                 //4倍频晶振,Failsafe 时钟关闭  _FWDT(WDT_OFF);              
发表于 2019-11-09
AVR16 AVR128的DS18B20温度传感器protues仿真与源码
单片机温度计设计仿真原理图如下 有AVR16芯片和AVR128芯片2个版本单片机源程序如下:/*-------------------------------作者:小新email:xuxing1261207@126.com--------------------------------*/#include <iom16v.h>#include <macros.h>#include "lcd.h"#include "ds18b20.h"unsigned int  temp1=20,temp2=35;void main(void){ 
发表于 2019-11-07
AVR16 AVR128的DS18B20温度传感器protues仿真与源码
小广播
何立民专栏 单片机及嵌入式宝典

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

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