qqwwzzxx 发表于 2014-6-29 11:03:48

用proteus仿真51单片机读18b20。在0度时读出的数据是0x80 0x80

本帖最后由 qqwwzzxx 于 2014-6-29 17:03 编辑

用proteus仿真51单片机读18b20。在0度时读出的数据是0x80 0x80。

上传不了附件,不知道咋回事。

//====================18B20.C=========================
#include"18b20.h"
/******************************************************************/
/*                  延时函数                                    */
/******************************************************************/
void delay(unsigned int i)//延时函数 1:5 5:60 10:110 25:250 50:480 60:550300:2.5ms
{
while(i--);
}
/******************************************************************/
/*                  初始化                                    */
/******************************************************************/
void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1;    //DQ复位
delay(20);//稍做延时
DQ = 0;    //单片机将DQ拉低
delay(60); //精确延时 大于 480us
DQ = 1;    //拉高总线
delay(5);
x=DQ;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay(25);
}
/******************************************************************/
/*                  读一个字节                                  */
/******************************************************************/
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
_nop_();//XXXXXXXXXXXXXXXXXXXXXXXX
dat>>=1;
DQ = 1; // 给脉冲信号
   _nop_();//XXXXXXXXXXXXXXXXXXXXXXXX
if(DQ)
   dat|=0x80;
delay(5);   //约60us
}
return(dat);
}
/******************************************************************/
/*               写一个字节                                     */
/******************************************************************/
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
_nop_();//XXXXXXXXXXXXXXXXXXXXXXXX
   _nop_();//XXXXXXXXXXXXXXXXXXXXXXXX
DQ = dat&0x01;
delay(5);//65us
DQ = 1;
dat>>=1;
}
delay(3);
}
//=================18B20.H===============
#ifndef __18B82_H__
#define __18B82_H__

#include"reg52.h"
#include <intrins.h>
/******************************************************************/
/*                  定义端口                                    */
/******************************************************************/
sbit DQ=P2^7;//ds18b20 端口

void delay(unsigned int i);   
void Init_DS18B20(void);                                        //初始化
unsigned char ReadOneChar(void);                        //读
void WriteOneChar(unsigned char dat);                //写

#endif

qqwwzzxx 发表于 2014-6-29 12:58:13

//==============MAIN.C==================
#include"config.h"

bit flag_get,keyflag;                           //定义采集温度标志位和按键标志位
sbit PWM=P3^4;                                           //定义脉冲端口

unsigned char UpT,DoT,NowT;                        //上限温度,下限温度,目前温度
unsigned int temp;                                        //定义中间变量
unsigned char dat;                                //定义显示数组

unsigned int ReadTemperature(void);                                                       //读当前温度
void deplay_50us(unsigned char t);                                                       //50us延时函数

main()                                                                                                               //主函数
{
//        ct107_init();                                                                                       //初始化板(关蜂鸣器,继电器,LED等)
                                                                                               //开定时器T0
        EA=1;                                                                                                       //开总中断

        while(1)
        {
//               key();
                  temp=ReadTemperature();                               
                  NowT=temp>>4;                                   //读温度整数部分
                  flag_get=0;
                  
        }

}





/*------------------------------------------------------
                       读取温度                                    
-------------------------------------------------------*/
unsigned int ReadTemperature(void)
{
unsigned char a=0;
unsigned int b=0;
unsigned int t=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
delay(50);
Init_DS18B20();
EA=0;
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar();   //低位
b=ReadOneChar();   //高位
b<<=8;                                                          
t=a+b;qc
EA=1;
return(t);

}


/*-----------------------------------------------------------
                   定时器中断                                 
------------------------------------------------------------*/

/*-----------------------------------------------------------
                                大约50us的延时函数
-----------------------------------------------------------*/
void deplay_50us(unsigned char t)
{
        unsigned char j;
        for(;t>0;t--)
                for(j=19;j>0;j--);
}
#ifndef config_h_
#define config_h_

//==================CONFIG.H================       
#include "reg52.h"

#include "18b20.h"

#include <reg52.h>
#include <intrins.h>
sbit IO_18B20 = P3^2; //DS18B20 通信引脚
/*软件延时函数,延时时间(t*10)us */
void DelayX10us(unsigned char t)
{
do {
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
} while (--t);
}
#endif

simahacker 发表于 2014-6-29 11:03:49

你直接在实物上测试看对不对,仿真不可信的!如果实物不行你就看看你的时序。
页: [1]
查看完整版本: 用proteus仿真51单片机读18b20。在0度时读出的数据是0x80 0x80