普中开源电子分享网

 找回密码
 立即注册
搜索
12
返回列表 发新帖
楼主: 林_F

DS18B20温度传感器加数码管显示

[复制链接]

0

主题

2

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2020-7-16 20:40:18 | 显示全部楼层
xuyaqi 发表于 2020-5-22 15:11
如果用给的程序,并且按照要求接线,数码管一直显示00.00,怀疑DS18B20坏了。

怎么接线啊
回复

使用道具 举报

0

主题

2

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2020-7-16 20:42:44 | 显示全部楼层
xuyaqi 发表于 2020-5-22 15:11
如果用给的程序,并且按照要求接线,数码管一直显示00.00,怀疑DS18B20坏了。

接线怎么接啊
回复

使用道具 举报

0

主题

49

帖子

242

积分

中级会员

Rank: 3Rank: 3

积分
242
发表于 2020-7-17 10:01:59 | 显示全部楼层
如果用的是例程,一般出问题是硬件接线问题,要查接线对不对。
回复

使用道具 举报

2

主题

4

帖子

24

积分

新手上路

Rank: 1

积分
24
发表于 2022-6-10 16:52:24 | 显示全部楼层
#include "ds18b20.h"
#include "intrins.h"

void ds18b20_reset(void)
{
        DS18B20_PORT=0;
        delay_10us(75);
        DS18B20_PORT=1;
        delay_10us(2);
}

u8 ds18b20_check(void)
{
        u8 time_temp=0;

        while(DS18B20_PORT&&time_temp<20)
        {
                time_temp++;
                delay_10us(1);
        }
        if(time_temp>=20)return 1;
        else time_temp=0;
        while((!DS18B20_PORT)&&time_temp<20)
        {
                time_temp++;
                delay_10us(1);
        }
        if(time_temp>=20)return 1;
        return 0;
}

u8 ds18b20_read_bit(void)
{
        u8 dat=0;
       
        DS18B20_PORT=0;
        _nop_();_nop_();
        DS18B20_PORT=1;       
        _nop_();_nop_(); //该段时间不能过长,必须在15us内读取数据
        if(DS18B20_PORT)dat=1;        //如果总线上为1则数据dat为1,否则为0
        else dat=0;
        delay_10us(5);
        return dat;
}

u8 ds18b20_read_byte(void)
{
        u8 i=0;
        u8 dat=0;
        u8 temp=0;

        for(i=0;i<8;i++)//循环8次,每次读取一位,且先读低位再读高位
        {
                temp=ds18b20_read_bit();
                dat=(temp<<7)|(dat>>1);
        }
        return dat;       
}

void ds18b20_write_byte(u8 dat)
{
        u8 i=0;
        u8 temp=0;

        for(i=0;i<8;i++)//循环8次,每次写一位,且先写低位再写高位
        {
                temp=dat&0x01;//选择低位准备写入
                dat>>=1;//将次高位移到低位
                if(temp)
                {
                        DS18B20_PORT=0;
                        _nop_();_nop_();
                        DS18B20_PORT=1;       
                        delay_10us(6);
                }
                else
                {
                        DS18B20_PORT=0;
                        delay_10us(6);
                        DS18B20_PORT=1;
                        _nop_();_nop_();       
                }       
        }       
}

void ds18b20_start(void)
{
        ds18b20_reset();
        ds18b20_check();
        ds18b20_write_byte(0xce);
        ds18b20_write_byte(0x44);
}

u8 ds18b20_init(void)
{
        ds18b20_reset();
        return ds18b20_check();       
}

float ds18b20_read_temperture(void)
{
        float temp;
        u8 dath=0;
        u8 datl=0;
        u16 value=0;

        ds18b20_start();
        ds18b20_reset();
        ds18b20_check();
        ds18b20_write_byte(0xcc);
        ds18b20_write_byte(0xbe);

        datl=ds18b20_read_byte();
        dath=ds18b20_read_byte();
        value=(dath<<8)+datl;

        if((value&0xf800)==0xf800)
        {
                value=(~value)+1;
                temp=value*(-0.0625);
        }
        else
        {
                temp=value*0.0625;
        }
        return temp;
}

/**************************************************************************************
深圳市普中科技有限公司(PRECHIN 普中)
技术支持:www.prechin.net

实验名称:DS18B20温度传感器实验
接线说明:       
实验现象:下载程序后,插上DS18B20温度传感器,数码管显示检测的温度值
注意事项:注意温度传感器的方向,在接口处我们已经用丝印画了一个凸起,
                  所以只需要将温度传感器对应插入即可                                                                                                                                                                  
***************************************************************************************/
#include "public.h"
#include "smg.h"
#include "ds18b20.h"


/*******************************************************************************
* 函 数 名       : main
* 函数功能                 : 主函数
* 输    入       : 无
* 输    出             : 无
*******************************************************************************/
void main()
{       
        u8 i=0;
           int temp_value;
        u8 temp_buf[5];

        ds18b20_init();//初始化DS18B20

        while(1)
        {                               
                i++;
                if(i%50==0)//间隔一段时间读取温度值,间隔时间要大于温度传感器转换温度时间
                        temp_value=ds18b20_read_temperture()*10;//保留温度值小数后一位
                if(temp_value<0)//负温度
                {
                        temp_value=-temp_value;
                        temp_buf[0]=0x40;//显示负号       
                }
                else
                        temp_buf[0]=0x00;//不显示
                temp_buf[1]=gsmg_code[temp_value/1000];//百位
                temp_buf[2]=gsmg_code[temp_value%1000/100];//十位
                temp_buf[3]=gsmg_code[temp_value%1000%100/10]|0x80;//个位+小数点
                temp_buf[4]=gsmg_code[temp_value%1000%100%10];//小数点后一位
                smg_display(temp_buf,4);
        }               
}

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|普中开源电子分享网 粤ICP备16123577号-2

GMT+8, 2024-4-20 14:43 , Processed in 0.083348 second(s), 32 queries .

Powered by 论坛搭建 X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表