微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 一个ds18b20程序问题求教

一个ds18b20程序问题求教

时间:10-02 整理:3721RD 点击:
       写完了一个ds18b20的程序,可以使数码管上一直显示的是 30 ,可是明明这里的温度才20多点度··· 我又下了例程进去 果然是24度···可是我看了好久自己的程序 也不知道哪里出了问题  也对照了一些网上的程序看 也没有找出原因  程序主要是看天狼星教学视频学着写的  大神们帮忙看看吧  叩谢! (数码管显示是没有问题的 主要问题应该在ds18b20里)       程序见下:
      main.c 如下:
#include<reg52.h>
#include"fz.h"
uchar num=0;
void smg_scan(void);
int main(void)
{
          while(1)
          {
              num=read_temp();
                  smg_scan();
          }             
}
void smg_scan(void)                                        //数码管显示  数码管程序被封装好了
{
         smg_dis(1,disp_tab[num%10]);
         smg_dis(2,disp_tab[num%100/10]);
         smg_dis(3,disp_tab[num%1000/100]);
         smg_dis(4,disp_tab[num/1000]);
}  


       fz.h 如下:
#ifndef __FZ_H
#define __FZ_H
#include"delay.h"
//#include"lcd1602.h"
#include"iic.h"
#include"adda.h"
#include"smg.h"
//#include"ds1302.h"
#include"ds18b20.h"
#endif


       ds18b20.c 如下 :
#include<reg52.h>
#include"delay.h"
#include"ds18b20.h"
sbit DQ=P3^7;
void delayds18b20(uchar t)        //延时us
{
    while(t--);
}
void ds18b20_init(void)                //ds18b20初始化
{
    uchar n;
    DQ=1;
        delayds18b20(8);
        DQ=0;
        delayds18b20(80);
        DQ=1;
        delayds18b20(8);
        n=DQ;                                //这里可以换成标志位,并且可以在延时完之后把传输线拉高诶
        delayds18b20(4);
}
void ds18b20wr_byte(uchar a)                 //ds18b20写一个字节
{
    uchar i;
        for(i=0;i<8;i++)
        {
            DQ=0;
                DQ=a&0x01;
                delayds18b20(4);
                DQ=1;
                a>>=1;
        }
        delayds18b20(4);
}
uchar ds18b20re_byte(void)                                //ds18b29读一个字节
{
    uchar i,r=0;
        for(i=0;i<8;i++)
        {
            DQ=0;
                r>>=1;
                DQ=1;
                if(DQ)
                r|=0x80;
                delayds18b20(4);
        }
        return r;
}
uchar read_temp(void)                                          //ds18b20配置 并读出温度值
{
    uchar a=0,b=0;
    ds18b20_init();
        ds18b20wr_byte(0xcc);
        ds18b20wr_byte(0x44);
        delayds18b20(300);
        ds18b20_init();
        ds18b20wr_byte(0xcc);
        ds18b20wr_byte(0xbe);
        a=ds18b20re_byte();
        b=ds18b20re_byte();
        b<<=4;                                                       
        b=b+(a&0xf0)>>4;                                //屏蔽掉小数点。暂时不考虑小数点  因为连连没有小数点的都读温度都不对  
        return b;
}


     ds18b20.h 如下:
#ifndef __DS18B20_H
#define __DS18B20_H
#include"delay.h"
extern void delayds18b20(uchar t);
extern void ds18b20_init(void);
extern void ds18b20wr_byte(uchar a);
extern uchar ds18b20re_byte(void);
extern uchar read_temp(void);
#endif


     smg.c 如下:
#include<reg52.h>
#include"delay.h"
#include"smg.h"
sbit LS138A=P2^2;
sbit LS138B=P2^3;
sbit LS138C=P2^4;
unsigned char code disp_tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};  //阴极数码管
void smg_dis(uchar i,uchar a)
{
    P0=0;
    switch(i)
        {
            case 1:LS138C=1;LS138B=1;LS138A=1;break;
                case 2:LS138C=1;LS138B=1;LS138A=0;break;
                case 3:LS138C=1;LS138B=0;LS138A=1;break;
                case 4:LS138C=1;LS138B=0;LS138A=0;break;
                case 5:LS138C=0;LS138B=1;LS138A=1;break;
                case 6:LS138C=0;LS138B=1;LS138A=0;break;
                case 7:LS138C=0;LS138B=0;LS138A=1;break;
                case 8:LS138C=0;LS138B=0;LS138A=0;break;
        }
        P0=a;
        delay_ms(1);
}


    smg.h 如下:
#ifndef __SMG_H
#define __SMG_H
#include"delay.h"
extern unsigned char code disp_tab[];
extern void smg_dis(uchar i,uchar a);
#endif

又是一个被DS18B20困扰的人。可惜我的帖子沉下去了,关于DS18B20的一点建议~

恩恩 看到你的帖子了··

有兴趣加QQ  306 226 714

"b=b+(a&0xf0)>>4; //屏蔽掉小数点。暂时不考虑小数点  因为连连没有小数点的都读温度都不对"
貌似你在读出温度值的时候有问题,这里的a应该是低八位,b是高八位,此时进行运算的思路应该是去掉高八位的四个“S”正负标志位,然后去掉低八位中表示小数点的四位,剩下的并成一个字节做温度运算,按照这个思路回去检查检查……

对头  确实是这里有问题 谢谢··

嗯嗯  加了哈·  可以多交流。最近红外遥控也没调出来

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top