标题: 单片机DS18B20的上单复位的85℃在不影响功能的前提下怎么去除? [打印本页]

作者: 菜鸟9    时间: 2023-6-15 21:49
标题: 单片机DS18B20的上单复位的85℃在不影响功能的前提下怎么去除?
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);-------------//显示函数
        }
}      


作者: lkc8210    时间: 2023-6-15 22:10
读到85的时候不显示就可以了
或第一次读到85就不显示
作者: 名字不是重点    时间: 2023-6-15 22:33
连读3次,取平均值显示就OK了
作者: 菜鸟9    时间: 2023-6-15 22:53
lkc8210 发表于 2023-6-15 22:10
读到85的时候不显示就可以了
或第一次读到85就不显示

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

作者: wulin    时间: 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);//-------------//显示函数
        }
}
作者: 君工创    时间: 2023-6-16 07:47
  begin();------------------------//数码管初始化----的函数。这个初始化函数有问题
作者: man1234567    时间: 2023-6-16 08:19
自己做的时候除了读不出时显示85其他正常。
在论坛上找的例程和自己照猫画虎的都一样。
作者: 菜鸟9    时间: 2023-6-16 15:42
wulin 发表于 2023-6-16 06:09
每次读取温度值之前都要发一次转换命令
void main()//------------主函数
{      

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

既然是测温,就要不断获取当前温度值。当然需要转换操作。否则读取的不是当前温度值。
作者: 菜鸟9    时间: 2023-6-16 17:58
wulin 发表于 2023-6-16 16:35
既然是测温,就要不断获取当前温度值。当然需要转换操作。否则读取的不是当前温度值。

好的,谢谢您
作者: coody_sz    时间: 2023-6-16 21:18
上电后多读几次但丢弃结果。




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