找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2234|回复: 10
打印 上一主题 下一主题
收起左侧

单片机DS18B20的上单复位的85℃在不影响功能的前提下怎么去除?

[复制链接]
跳转到指定楼层
楼主
ID:1084388 发表于 2023-6-15 21:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
PS:如果我将转化函数和读温度函数放在循环里的话(不加上begin的话,可以正常显示,包括按键变化温度值都能读出来,只是第一次运行要跳出85℃),但是加上begin的话就只能放在循环外面,在我的认知里,DS18B20应该是转化一次就可以读温度了吧,所以放在外面应该不影响温度的显示,但是实际的运行结果却是只能显示第一次的结果,如果你按键的话,数码管显示不出来。
求大佬帮帮忙

单片机源程序如下:
#include <REGX51.H>
#include <intrins.h>
#include "display.h"
#include "delay.h"
sbit DQ=P3^7;


void delay_us(unsigned char i)------------//us级延时(进入函数11us运行延时6us)
{
        while(i--);
}


bit DS18B20chushihua()-------------------//初始化
{
        bit n;
        DQ=1;
        _nop_();
        DQ=0;
        delay_us(80);
        DQ=1;
        delay_us(4);
        n=DQ;
        delay_us(20);
        DQ=1;
        _nop_();
        return n;
}


void writeDS18B20(unsigned char xdat)------------写时序
{
        unsigned char j;
        for(j=0;j<8;j++)
        {
                DQ=0;
                _nop_();
                DQ=xdat&0x01;
                delay_us(10);
                DQ=1;
                xdat=xdat>>1;
//                _nop_();
        }
//        _nop_();
}


unsigned char readDS18B20()--------------------------//读时序
{
        unsigned char j,rdat;
        for(j=0;j<8;j++)
        {
                rdat=rdat>>1;
                DQ=0;
                _nop_();
                DQ=1;
                _nop_();
                if(DQ==1)
                rdat=rdat|0x80;
                delay_us(10);
                DQ=1;
                _nop_();
}
        _nop_();
        return rdat;
}


void DS18B20_zhuanhua()----------------温度转化函数
{
                        DS18B20chushihua();
                        writeDS18B20(0xcc);
                        writeDS18B20(0x44);
}


unsigned int DS18B20_duwendu()-------------读温度
{
                unsigned int L;
                unsigned int H;
                unsigned int temp;


                DS18B20chushihua();
                writeDS18B20(0xcc);
                writeDS18B20(0xbe);
                L=readDS18B20();
                H=readDS18B20();
                H=(H<<8)|L;
                if((H&0xf800)==0xf800)
                        H=!H+1;
                temp=H*0.0625;
        return temp;
}


void main()------------主函数
{      
        unsigned int temp;
      
        DS18B20_zhuanhua();
        begin();------------------------//数码管初始化----的函数(已延时800ms)
        while(1)
        {
                temp=DS18B20_duwendu();
                display_s(temp);-------------//显示函数
        }
}      

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:161164 发表于 2023-6-15 22:10 | 只看该作者
读到85的时候不显示就可以了
或第一次读到85就不显示
回复

使用道具 举报

板凳
ID:824490 发表于 2023-6-15 22:33 | 只看该作者
连读3次,取平均值显示就OK了
回复

使用道具 举报

地板
ID:1084388 发表于 2023-6-15 22:53 | 只看该作者
lkc8210 发表于 2023-6-15 22:10
读到85的时候不显示就可以了
或第一次读到85就不显示

你理解错了,上面说的,只是跟你说我的代码没问题而已。我必须要数码管初始化----,转化函数必放在外面,但就是为什么显示不了按键后的温度值,话说while(1)不是一直在读温度吗。
回复

使用道具 举报

5#
ID:213173 发表于 2023-6-16 06:09 | 只看该作者
菜鸟9 发表于 2023-6-15 22:53
你理解错了,上面说的,只是跟你说我的代码没问题而已。我必须要数码管初始化----,转化函数必放在外面, ...

每次读取温度值之前都要发一次转换命令
void main()//------------主函数
{      
        unsigned int temp;
       
        DS18B20_zhuanhua();
        begin();//------------------------//数码管初始化----的函数(已延时800ms)
        while(1)
        {
                DS18B20_zhuanhua();
                temp=DS18B20_duwendu();
                display_s(temp);//-------------//显示函数
        }
}
回复

使用道具 举报

6#
ID:965189 发表于 2023-6-16 07:47 来自手机 | 只看该作者
  begin();------------------------//数码管初始化----的函数。这个初始化函数有问题
回复

使用道具 举报

7#
ID:584814 发表于 2023-6-16 08:19 | 只看该作者
自己做的时候除了读不出时显示85其他正常。
在论坛上找的例程和自己照猫画虎的都一样。
回复

使用道具 举报

8#
ID:1084388 发表于 2023-6-16 15:42 | 只看该作者
wulin 发表于 2023-6-16 06:09
每次读取温度值之前都要发一次转换命令
void main()//------------主函数
{      

效果出来了,但是为什么要每次都转化呢,我们老师也说转化一次就行了呀,能解答一下吗
回复

使用道具 举报

9#
ID:213173 发表于 2023-6-16 16:35 | 只看该作者
菜鸟9 发表于 2023-6-16 15:42
效果出来了,但是为什么要每次都转化呢,我们老师也说转化一次就行了呀,能解答一下吗

既然是测温,就要不断获取当前温度值。当然需要转换操作。否则读取的不是当前温度值。
回复

使用道具 举报

10#
ID:1084388 发表于 2023-6-16 17:58 | 只看该作者
wulin 发表于 2023-6-16 16:35
既然是测温,就要不断获取当前温度值。当然需要转换操作。否则读取的不是当前温度值。

好的,谢谢您
回复

使用道具 举报

11#
ID:1034262 发表于 2023-6-16 21:18 | 只看该作者
上电后多读几次但丢弃结果。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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