搜索
bottom↓
回复: 2

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

[复制链接]

出0入0汤圆

发表于 2014-6-29 11:03:48 | 显示全部楼层 |阅读模式
本帖最后由 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:550  300: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

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 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[8];                                //定义显示数组

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

出0入0汤圆

发表于 2014-6-29 11:03:49 | 显示全部楼层
你直接在实物上测试看对不对,仿真不可信的!如果实物不行你就看看你的时序。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 03:41

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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