标题: 基于DS18B20的数显温度计 数码管显示 [打印本页]

作者: 凌净清河    时间: 2018-7-24 08:35
标题: 基于DS18B20的数显温度计 数码管显示
本帖最后由 凌净清河 于 2018-7-24 08:38 编辑

本作品采用STC15F104W单片机和四位共阴极数码管设计

主要亮点:
1.数码管使用74HC595作为段选驱动,为初学者提供了新的思路
次要亮点:
1.使用小巧的STC15F104W单片机

DS18B20的通信要点在于时序的严格对应,相比之下DHT11这一类的单总线通信时序要求更加宽松。
因为DS18B20算是极为常用的学习器件,故不做过多讲解,本次作品不涉及搜索BOM、精度调节等操作,只是单器件读取温度值,数据处理将可以显示的温度值设置为-20℃~80℃。

(事实证明不同器件之间会有差异,读取的值也会不尽相同)

DS18B20数据处理参考普中科技相关例程



#include<STC15.H>
sbit DSPORT=P3^5;//DS18B20管脚定义
#include<intrins.h>
#include"DS18B20.c"
sbit S1=P3^4;
sbit S2=P3^3;//数码管位选管脚定义
sbit SER=P3^0;
sbit RCLK=P3^1;
sbit SRCLK=P3^2;//74HC595管脚定义

//全局变量表
unsigned char code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//给74HC595的段选值
unsigned char Display_Temperature[4]={0x40,0x40,0x40,0x40};
int Data_temperature=0;
unsigned char t0_cnt=0;
/*##############################################################################################
设计名称:基于DS18B20的数显温度计
设计者:清河

平台:STC15F104W
硬件部分
数码管显示:位选使用74HC138改为2-4线译码、段选使用74HC595减少IO口使用
    使用4位共阴极数码管,显示无符号位

注意:由于STC15系列采用Y5内核,所以有关DS18B20精准延时部分在移植时应首先考虑更换
##############################################################################################*/
void delay(unsigned int cnt)//调用该函数进行一段时间的延时
{
    while(cnt--);
}

void hc595send(unsigned char dat)//使用SPI向74HC595发送一个字节的数据                                
{  
    unsigned char a;
    SRCLK=0;
    RCLK=0;
    for(a=0;a<8;a++)
    {
        SER=dat>>7;
        dat<<=1;
        SRCLK=1;
        _nop_();
        _nop_();
        SRCLK=0;   
    }
    RCLK=1;
    _nop_();
    _nop_();
    RCLK=0;
}

void smgdisplay()//数码管显示函数,参数为需要显示的数组
{
    unsigned char i;
    for(i=0;i<4;i++)
    {
        switch(i)//位选,选择点亮的数码管
        {
            case(0):
                S1=0;S2=1; break;
            case(1):
                S1=1;S2=0; break;
            case(2):
                S1=0;S2=0; break;
            case(3):
                S1=1;S2=1; break;   
        }
        hc595send(Display_Temperature);
        delay(10); //间隔一段时间扫描   
        hc595send(0x00);//消隐
    }
}

void Data_processing()
{
    float temperature=0.0;//【03c4】似乎只是一个用于更改值为float类型的中间变量,考虑删去
    int temperature_middle;//为了不更改全局变量中读取出来的Data_temperature设置此中转值
    if(Data_temperature>0xf000)//当温度值为负数
    {
        Display_Temperature[0]=0x40;//显示符号“-”的段码
        //因为读取的温度是实际温度的补码,所以减1,再取反求出原码
        temperature_middle=Data_temperature-1;
        temperature_middle=~temperature_middle;
        temperature=temperature_middle;
        temperature_middle=temperature*0.0625*100+0.5;   
        //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
        //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
        //算加上0.5,还是在小数点后面。
        if(temperature_middle<2000)
        {
            if(temperature_middle>=1000)
            {
                Display_Temperature[1]=smgduan[temperature_middle%10000/1000];
                Display_Temperature[2]=smgduan[temperature_middle%1000/100]|0x80;
                Display_Temperature[3]=smgduan[temperature_middle%100/10];
            }
            else
            {
                Display_Temperature[1]=smgduan[temperature_middle%1000/100]|0x80;
                Display_Temperature[2]=smgduan[temperature_middle%100/10];
                Display_Temperature[3]=smgduan[temperature_middle%10];
            }
        }
        else
        {
            unsigned char i;
            for(i=0;i<4;i++)
            {
                Display_Temperature=0x40;
            }
        }
    }
    else
    {
        temperature=Data_temperature;//因为数据处理有小数点所以将温度赋给一个浮点型变量
        //如果温度是正的那么,那么正数的原码就是补码它本身
        temperature_middle=(int)(temperature*0.0625*100+0.5);   
        //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
        //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
        //算加上0.5,还是在小数点后面。
        if(temperature_middle<8000)
        {
            if(temperature_middle>=1000)
            {
                Display_Temperature[0]=smgduan[temperature_middle%10000/1000];
                Display_Temperature[1]=smgduan[temperature_middle%1000/100]|0x80;
                Display_Temperature[2]=smgduan[temperature_middle%100/10];
                Display_Temperature[3]=smgduan[temperature_middle%10];
            }
            else
            {
                Display_Temperature[0]=0x00;
                Display_Temperature[1]=smgduan[temperature_middle/100]|0x80;
                Display_Temperature[2]=smgduan[temperature_middle%100/10];
                Display_Temperature[3]=smgduan[temperature_middle%10];
            }
        }
        else
        {
            unsigned char i;
            for(i=0;i<4;i++)
            {
                Display_Temperature=0x40;
            }
        }
    }
}

void sys_init()
{
    TH0=0;
    TL0=0;
    ET0=1;
    TR0=1;
    EA=1;
}

void main()
{
    sys_init();
    while(1)
    {
        smgdisplay();
    }
}

void Temperature_Refresh() interrupt 1
{
    TL0 = 0x00;
    TH0 = 0x28;//5ms初值
    if(t0_cnt==10)
    {
        hc595send(0x00);
        Data_temperature=DS18B20_GetTemperature();
        Data_processing();
        t0_cnt=0;
    }
    else
    {
        t0_cnt++;
    }
}
由于中断时的数据读取和处理会占用一部分时间,导致数码管有轻微闪烁感,使用者可以考虑将转换精度调为最低并修改转换等待时间以减少数码管的闪烁感,同时别忘记调一下数据处理函数中对应的精度值。
上述程序仍然臃肿,但由于是普通器件的使用,没有难点,所以也没有进行优化,以完成功能为目的。


新矿城学习基地 凌净清河

作者: 空格键~~    时间: 2018-7-26 10:41
温度读取值怎么转换?
作者: 凌净清河    时间: 2018-7-26 16:57
空格键~~ 发表于 2018-7-26 10:41
温度读取值怎么转换?

温度转换在Data_processing()函数中,分正负数之后,temperature_middle就是转换之后温度值*100
作者: manpingshui    时间: 2018-7-26 19:36
可否有源程序和电路图可以下载
作者: 凌净清河    时间: 2018-7-27 12:57
manpingshui 发表于 2018-7-26 19:36
可否有源程序和电路图可以下载

源程序回复之后就应该可以下载了,原理图没有的,74HC595驱动数码管的典型应用电路在STC单片机的手册上可以找到,138是基本模块也不用解释,单片机一共就6个IO口,定义在程序开头处已经表明出来了,尝试一下,看不明白再问。
作者: qiangcn    时间: 2018-7-28 08:08
这个温度计的硬件设计思路很好。简单实用。
作者: pengyongnet    时间: 2018-7-28 15:59
下载学习下
作者: 龙老大    时间: 2018-8-8 23:02
下载学习下
作者: tigherl    时间: 2018-8-13 14:55
喜欢。。。。。。。。。。。。
作者: huojunan    时间: 2018-8-21 16:19
下载学习下
作者: huojunan    时间: 2018-8-21 16:19
下载学习下
作者: 花开不败111    时间: 2018-8-22 10:05
下载学习下
作者: aking991    时间: 2018-8-22 11:16
我一直有要作这个的方案,结果让你先实现了
作者: 凌净清河    时间: 2018-9-4 21:51
aking991 发表于 2018-8-22 11:16
我一直有要作这个的方案,结果让你先实现了

hhh,不好意思啦~不过你可以试试别的模块呀,BMP180、DHT11、这些常用的传感器精度和可用性都不输于DS18B20,配上OLED小屏幕,再加一个无线显示功能,无线方式传输显示多个不同位置传感器的数据。
作者: ywzlq    时间: 2018-9-5 08:19
下载学习下
作者: yanzeyuan333    时间: 2018-9-5 10:07
谢谢分享
作者: wis98    时间: 2018-9-9 08:47
学习数码管显示
作者: rs7cai    时间: 2018-9-9 09:19
可否有源程序和电路图可以下载
作者: rs7cai    时间: 2018-9-9 09:21
学习数码管显示
作者: 文凤轩    时间: 2018-9-9 16:08
这个比较小巧经典
作者: a704625084    时间: 2018-9-10 15:43
谢谢分享
作者: lemon0210    时间: 2018-9-11 10:43
回复了看下,学习了
作者: 凌净清河    时间: 2018-9-11 11:08
rs7cai 发表于 2018-9-9 09:19
可否有源程序和电路图可以下载

这个真没有,这款单片机只有6个IO,DS18B20是单总线通信,再加上一个595驱动的数码管显示电路,当初制作的时候是直接焊接的,根本没画电路图。
作者: dengsg    时间: 2018-9-17 22:53
感谢分享,
作者: q4189513    时间: 2018-9-18 22:06
下载学习一下
作者: map0391    时间: 2018-9-19 17:52
谢谢分享,
作者: 绊脚石13    时间: 2018-9-23 16:33
新手学习学习温度模块
作者: beyonbirth    时间: 2018-10-8 16:26
学习学习
作者: 164652999    时间: 2018-10-8 21:50
做得很漂亮
作者: qq1846079086    时间: 2018-10-15 21:41
下载学习下
作者: FLY581    时间: 2018-10-16 08:40
谢谢分享!
作者: 好又快维修部    时间: 2018-10-18 11:22
楼主厉害啊

作者: middfat    时间: 2018-10-18 14:21
用C语言好几次都不成功(导师说是1T的51单片机定时中断不好控制),改成汇编的就行了。佩服楼主调试的耐性。
作者: puyiming    时间: 2018-10-18 15:14
谢谢作者的分享和制作
作者: chenwg    时间: 2019-4-10 18:34
简单实用!!1
作者: 海潮最可爱    时间: 2019-4-11 01:30
不错,顶一下
作者: lclyjh    时间: 2019-4-11 08:49
学习一下
作者: lin176    时间: 2019-4-11 19:21
学习一下
作者: APHEBC    时间: 2019-4-12 21:46
给您点赞
作者: lucq7896    时间: 2019-4-14 10:32
下来学习
作者: 一群想不出来    时间: 2019-4-14 20:45
!想知道使用的元器件种类和数目
作者: 1653359726    时间: 2019-4-14 20:56
感谢共享资料
作者: 凌净清河    时间: 2019-4-15 12:34
一群想不出来 发表于 2019-4-14 20:45
!想知道使用的元器件种类和数目

四位共阴数码管*1
74HC595*1
74HC138*1
STC15F104W*1
DS18B20*1
microUSB母座*1
10K电阻*1
洞洞板5cm*7cm*1
排针共11针
焊锡若干
16脚芯片座*2
8脚芯片座*1

作者: 1504010502    时间: 2019-5-22 20:54
我要下载程序
作者: bhjyqjs    时间: 2019-5-24 14:27
似乎有些得不偿失,用一个多I/O口的CPU,电路和编程要简单得多。
作者: 芒果不要糖    时间: 2019-5-30 14:49
学习了
作者: TheHellc    时间: 2019-5-30 15:54
18B20小巧,价格相对DTH11更加便宜
作者: wbwcf13e    时间: 2019-5-30 18:12
我要看看他的帖子
作者: 573912308    时间: 2019-5-30 19:47
谢谢楼主
作者: 1162434585    时间: 2019-5-31 18:49
挺好,正需要用的
作者: 关外秀才    时间: 2019-5-31 21:19
学习一下
作者: 811787454    时间: 2019-6-5 05:41
多谢分享!
作者: 墨白    时间: 2019-6-11 17:42
借用下代码
作者: xge0302    时间: 2019-6-12 20:50
正需要
作者: fmboy    时间: 2019-6-16 20:08
谢谢!
作者: qwerfghnm    时间: 2019-6-18 19:00
很实用

作者: 鹏博士PBs    时间: 2019-6-21 05:49
好文章
作者: hu2018y    时间: 2019-6-23 21:43
学习数码管显示,可以修改为一个温度调整器?
作者: 兵临天下    时间: 2019-6-24 12:16
谢谢分享!
作者: 李春解决    时间: 2019-9-6 11:45
是的我很想看啊
作者: zhang1314hong    时间: 2019-9-9 14:13
最近在研究学习一下
作者: zhaoyeyun    时间: 2019-9-9 21:52
很好。。。。。
作者: 碎梦    时间: 2019-9-18 09:21
赞一个
作者: angus520    时间: 2019-9-18 11:34
赞一个
作者: mcu_mpu    时间: 2019-9-18 14:24
好东西,学习牛人。
作者: m66221    时间: 2019-9-19 17:03
下载学习下
作者: yfpc2006    时间: 2019-9-20 00:57
学习一下
作者: fgqnh    时间: 2019-9-20 07:11
值得学习,仔细研究一下。
作者: fgqnh    时间: 2019-9-20 07:12
值得学习,好好研究一下。
作者: sxyufu    时间: 2019-9-22 09:22
做的不错,很有启发。谢谢。
作者: chuailiwei    时间: 2019-9-22 15:21
借鉴借鉴!
作者: yinnan128    时间: 2019-9-26 11:46
来看看
作者: 一路开颜2    时间: 2019-9-27 18:24
看看学习一下
作者: HXN1    时间: 2019-10-6 12:43
谢谢分享
作者: ZNXC    时间: 2019-11-4 22:06
下来学习
作者: myaff    时间: 2019-11-7 14:56
感谢楼主

作者: 急急急就    时间: 2019-11-8 15:27
回复有源文件吧
作者: 18477550957    时间: 2019-12-9 16:18
您好 ,可以分享一下数据嘛?跪谢

作者: konamy    时间: 2019-12-21 18:53
学习下          ,郁闷死了我的程序怎么都不对

作者: lijianbin    时间: 2019-12-22 00:14
不错不错,我也做一个
作者: zxule    时间: 2019-12-22 10:58
太好了,谢谢分享
作者: ppp123    时间: 2019-12-25 09:55
图可以
作者: roses1417    时间: 2019-12-25 20:19
下载学习下
作者: 473353    时间: 2019-12-26 09:08
可以设置温度报警吗?
作者: 凌净清河    时间: 2019-12-26 11:42
473353 发表于 2019-12-26 09:08
可以设置温度报警吗?

这个版本不能,可以自己添加报警功能,但是本设计中使用的是6个IO的单片机,已经没有多余的引脚了,所以报警要么使用数码管显示其它数字,要么就得换单片机。
作者: zxule    时间: 2020-2-3 21:11
太棒了!就是能不能简单说一下连接方法,新手还不会通过源程序接线,谢谢
作者: 凌净清河    时间: 2020-2-4 08:43
周栩乐 发表于 2020-2-3 21:11
太棒了!就是能不能简单说一下连接方法,新手还不会通过源程序接线,谢谢

嗯。。。大概就是595驱动数码管的段选,程序中的段选表根据595和数码管的连接方式确定;138驱动位选,把地址线的A2接到固定电平当成2-4译码来用;这样控制138的有两个IO,控制595的有3个IO,这5个显示用IO连到单片机,用程序中的sbit定义,单片机剩下的那个IO连到单总线的18B20上。
作者: zxule    时间: 2020-2-4 17:11
谢谢,大概知道了!下次试试哈
作者: 碎碎念    时间: 2020-2-21 20:36
谢谢大哥,非常有用

作者: 710253949    时间: 2020-2-27 18:35
大佬能观摩一下代码不

作者: tt1365750914    时间: 2020-3-9 17:21
学习 感谢博主
作者: imjoe88    时间: 2020-4-26 00:04
可否有源程序和电路图可以下载
作者: cjb1234    时间: 2020-4-26 09:31
谢谢分享!
作者: zv1185    时间: 2020-5-1 16:35
学习数码管显示
作者: lon7085    时间: 2020-5-1 17:24
谢谢分享
作者: 逍遥落叶    时间: 2020-5-2 08:50
下来学习
作者: A142989    时间: 2020-5-5 16:28
资料不错
作者: Honeylulu1    时间: 2020-5-15 11:16
学习mark
作者: mengchen12    时间: 2020-5-15 11:59
谢谢分享
作者: heen1964    时间: 2020-5-17 22:33
下载学习下,谢谢分享!




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1