用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 //==============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 你直接在实物上测试看对不对,仿真不可信的!如果实物不行你就看看你的时序。
页:
[1]