打印

ds18b20温度显示异常

[复制链接]
2459|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lgl531558674|  楼主 | 2013-9-17 22:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一条总线上最多连接4个ds18b20,也就是说当总线上最多4个ds18b20时温度显示正常,当再多连接一个ds18b20时温度就都显示为55度,正在做毕业设计,还请高手帮忙,期待解决。
程序如下:
#include<reg52.h>
#include<intrins.h>
#include <stdio.h>
#define uchar unsigned char
#define uint  unsigned int

#define jump_ROM 0xCC
#define start 0x44
#define read_EEROM 0xBE

sbit DQ = P3^5;            //DS18B20数据口

unsigned char TMPH,TMPL;
unsigned char T[8];
unsigned char displayT[2];
unsigned char ROM1[8]={0x28,0xb2,0x39,0x35,0x05,0x00,0x00,0xfc};
unsigned char ROM2[8]={0x28,0x07,0xe6,0x34,0x05,0x00,0x00,0xae};
unsigned char ROM3[8]={0x28,0x35,0xf1,0x34,0x05,0x00,0x00,0x00};
unsigned char ROM4[8]={0x28,0xe1,0xc8,0x35,0x05,0x00,0x00,0xe0};
unsigned char ROM5[8]={0x28,0x10,0xa4,0x35,0x05,0x00,0x00,0x95};
unsigned char ROM6[8]={0x28,0x80,0xc2,0x35,0x05,0x00,0x00,0xa9};
unsigned char ROM7[8]={0x28,0x8c,0xc6,0x35,0x05,0x00,0x00,0xcb};
unsigned char ROM8[8]={0x28,0xaa,0x73,0x35,0x05,0x00,0x00,0x52};

/********************************************************************
* 名称 : delay()
* 功能 : 延时,延时时间大概为5US。
* 输入 : 无
* 输出 : 无
***********************************************************************/

void delays()
{
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
}

/********************************************************************
* 名称 : delay()
* 功能 : 延时函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void delay(uint N)
{
        int i;
        for(i=0; i<N; i++)
        ;
}

/********************************************************************
* 名称 : Reset()
* 功能 : 复位DS18B20
* 输入 : 无
* 输出 : 无
***********************************************************************/
uchar Reset(void)
{
        uchar deceive_ready;
        DQ = 0;
        delay(29);
        DQ = 1;
        delay(3);
        deceive_ready = DQ;
        delay(25);
        return(deceive_ready);
}

/********************************************************************
* 名称 : read_bit()
* 功能 : 从DS18B20读一个位值
* 输入 : 无
* 输出 : 从DS18B20读出的一个位值
***********************************************************************/
uchar read_bit(void)
{
        uchar i;
        DQ = 0;
        DQ = 1;
        for(i=0; i<3; i++);
        return(DQ);
}

/********************************************************************
* 名称 : write_bit()
* 功能 : 向DS18B20写一位
* 输入 : bitval(要对DS18B20写入的位值)
* 输出 : 无
***********************************************************************/
void write_bit(uchar bitval)
{
DQ=0;if(bitval==1)
DQ=1;
delay(5);
DQ=1;
}

/********************************************************************
* 名称 : read_byte()
* 功能 : 从DS18B20读一个字节
* 输入 : 无
* 输出 : 从DS18B20读到的值
***********************************************************************/
uchar read_byte(void)
{
        uchar i,m,receive_data;
        m = 1;
        receive_data = 0;
        for(i=0; i<8; i++)
        {
                if(read_bit())
                {
                        receive_data = receive_data + (m << i);
                }
                delay(6);
        }
        return(receive_data);
}

/********************************************************************
* 名称 : write_byte()
* 功能 : 向DS18B20写一个字节
* 输入 : val(要对DS18B20写入的命令值)
* 输出 : 无
***********************************************************************/
void write_byte(uchar val)
{
        uchar i,temp;
        for(i=0; i<8; i++)
        {
                temp = val >> i;
                temp = temp & 0x01;
                write_bit(temp);
                delay(5);
        }
}

/**********************************************************************
functionName: void Read_ROM(void)
description :ROM 匹配
**********************************************************************/
void Matching_ROM(unsigned char mux)
{
unsigned char i,*P;
if(mux==1) P=ROM1;
if(mux==2) P=ROM2;
if(mux==3) P=ROM3;
if(mux==4) P=ROM4;
if(mux==5) P=ROM5;
if(mux==6) P=ROM6;
if(mux==7) P=ROM7;
if(mux==8) P=ROM8;
write_byte(0x55);
for(i=0;i<8;i++)
{
write_byte(*(P+i));
}
}
/**********************************************************************
functionName: unsigned int readTempDS18B20(void)
description :读 DS18B20 温度
**********************************************************************/
void readTempDS18B20(void)
{ unsigned char i;
uchar tempL,tempH,temp;
for(i=1;i<9;i++)
{
Reset();
Matching_ROM(i);
write_byte(0x44); //启动温度转换
delay(10); //转换延时
Reset();
Matching_ROM(i);
write_byte(0xbe); //读数据
tempL=read_byte();
tempH=read_byte();
temp = tempL / 16 + tempH* 16;
T[i]=temp;
}
}
/********************************************************************
* 名称 : Com_Init()
* 功能 : 初始化串口程序,晶振11.0592, 波特率9600
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Com_Init(void)
{
     TMOD = 0x20;                       
     TH1 = 0xFd;
     TR1 = 1;
     SCON = 0x50;                       
}


void Delay_10ms(uint del)
{
        uint i,j;
        for(i=0; i<del; i++)
        for(j=0; j<1827; j++)   
        ;
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void main()
{
        uchar i,j;
       
        Com_Init();
        Reset();
        readTempDS18B20();
       

            for (i=1;i<9;i++)
         {
             displayT[1]=T[i]/10%10+48;
             displayT[2]=T[i]%10+48;
           for(j=1;j<3;j++)
                        {
                            
                                SBUF = displayT[j];
                                while(!TI)        
                                {
                                        _nop_();       
                                }
                                TI = 0;       
                        }
                  
                  }
                  Delay_10ms(200);
                         
}

相关帖子

沙发
ayb_ice| | 2013-9-18 07:53 | 只看该作者
是不是硬件问题呢,IO驱动不够

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
lgl531558674 + 1 很给力!
板凳
lgl531558674|  楼主 | 2013-9-19 17:43 | 只看该作者
恩 还真是的 谢谢!

使用特权

评论回复
地板
wangch_sh| | 2013-9-19 21:38 | 只看该作者
学习了。

使用特权

评论回复
5
mcu5i51| | 2013-9-21 14:29 | 只看该作者
供电不足吗

使用特权

评论回复
6
王1123| | 2013-11-8 22:51 | 只看该作者
请问!是怎么把序列号读出来的?

使用特权

评论回复
7
王1123| | 2013-11-8 22:52 | 只看该作者
我把你的程序移植到12单片机上死活不通!序列号是我之前读出来的!

使用特权

评论回复
8
王1123| | 2013-11-8 22:55 | 只看该作者
我不知道自己的序列号对不对!之前自己写的代码!死活没办法读出温度数据来!想借鉴一下你的!可是还是不行!瞬间要疯了!最近在比赛考试时间比较紧张!没辙了!能帮一下忙吗》?

使用特权

评论回复
9
ningling_21| | 2013-11-15 12:05 | 只看该作者
王1123 发表于 2013-11-8 22:51
请问!是怎么把序列号读出来的?

发送读ROM指令,再读8字节就可以了...

使用特权

评论回复
10
hxjlm| | 2013-11-15 12:25 | 只看该作者
我用过几种单片机,试了N回都读不出温度,最后发现是延时时间不准确造成的,不同的单片机延时函数得到的结果不同,有的能读出有的单片机移植成功的程序也不能正常,DS18B20对延时要求高。

使用特权

评论回复
11
ayb_ice| | 2013-11-15 14:31 | 只看该作者
hxjlm 发表于 2013-11-15 12:25
我用过几种单片机,试了N回都读不出温度,最后发现是延时时间不准确造成的,不同的单片机延时函数得到的结 ...

你用之前没有仔细看手册吧

使用特权

评论回复
12
zjxcml| | 2013-11-15 16:33 | 只看该作者
ayb_ice 发表于 2013-11-15 14:31
你用之前没有仔细看手册吧

呵呵,:victory:

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

2

帖子

0

粉丝