单片机
返回首页

DS18B20温度传感器示例

2019-05-09 来源:eefocus


/*

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

* 文件名: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;

    }

}


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 红外线探测报警器

  • 短波AM发射器电路设计图

  • 使用ESP8266从NTP服务器获取时间并在OLED显示器上显示

  • 用NE555制作定时器

  • 如何调制IC555振荡器

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章