ds18b20温度测量程序怎么总是显示85度?

作者&投稿:丘国 (若有异议请与网页底部的电邮联系)
DS18B20测温程序~

895.9,说明温度传感器还没有完成转换,你就读它了,注意时序,最后要有750ms的延时你好像没写

我的led是用74164驱动的!我把程序段给你吧:
#include
typedef unsigned char uchar;
typedef unsigned int uint;
uchar seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; //升级板段码表(共阴极正常)
uchar seg1[]={0XBF,0X86,0XDB,0XCF,/*0. 1. 2. 3.*/
0XE6,0XED,0XFD,0X87,/*4. 5. 6. 7.*/
0XFF,0XEF/* *8.9.*/};//升级板 带小数点的段码
/*****1820的数据口和方向宏定义*******/
#define DQ1 P5OUT |= BIT5
#define DQ0 P5OUT &=~ BIT5
#define DQIN P5DIR &= ~BIT5
#define DQOUT P5DIR |= BIT5

/****数码管数据时钟的宏定义***********/
#define DATA1 P5OUT |= BIT0
#define DATA0 P5OUT &=~ BIT0
#define CLK1 P5OUT |= BIT1
#define CLK0 P5OUT &=~ BIT1
/*******液晶端口初始化*******/
#define out P3DIR|=BIT0+BIT1+BIT2
#define lcd_en1 P3OUT|=BIT2
#define lcd_en0 P3OUT&=~BIT2
#define lcd_rw1 P3OUT|=BIT1
#define lcd_rw0 P3OUT&=~BIT1
#define lcd_rs1 P3OUT|=BIT0
#define lcd_rs0 P3OUT&=~BIT0
unsigned char table1[8]="08:50:16";
unsigned char table2[]="TING TING";
void delay(unsigned int i);
unsigned char Init_DS18B20(void);
unsigned char ReadOneChar(void);
void WriteOneChar(unsigned char dat);
void ReadTemperature(void);
uint t;
float temp;
float Temper=0.0;
unsigned int temperature = 0;
/**********/
/*延时子程序*/
//调用8个时钟周期,返回6个,循环4个
//总周期个数为: 8+6+4*n=14+4*n 个时钟周期
//默认800k时钟,所以周期为1.25us 公式修正:17.5+5*n=定时时间
void delay(unsigned int x)//延时
{
unsigned int i;
i=x;
for(;i>0;i--)
;
}

/*************显示模块部分*********/
void init_port( void )//端口初始化
{ P5SEL=0;
P5DIR=0;
P5DIR|=BIT0+BIT1+BIT5;
return;
}

void clk(void)//时钟子程序
{
CLK1;
delay(10);
CLK0;
delay(10);
return;
}

void led_off( void )//熄灭所有led
{ int i;
for(i=0;i<64;i++)
{ DATA1;
clk();
}
return;
}
void Led_On( void )//点亮所有数显
{ uchar i;
for(i=0;i<64;i++)
{ DATA0;
clk();
}
return;
}

void dataout( int n )//数据输出
{int i;
for(i=0;i<8;i++)
{ if((n&0x80)==0x80)//
DATA1;//输出低电平 显示1
else
DATA0;
clk();//给时钟
n <<=1;//左移一位
}
return;
}
//ds18b20初始化函数
//输入:无
//返回:0表示初始化失败,1表示初始化成功
unsigned char Init_DS18B20(void)
{
unsigned char x=0;
DQOUT;
DQ0;
delay(90);//延时500us
DQ1;
delay(16);//延时90us
DQIN;
x = P5IN & BIT5;
if(x)
{
return 0;//失败
}
else
{
DQ1;
return 1;//应答成功
}
}
unsigned char ReadOneChar(void)
{
unsigned char i;
unsigned char temp=0;
for(i=0;i<8;i++)
{
temp=temp>>1;
DQOUT;//设定为输出
DQ0;
//DQ1;//可有可无的
DQIN;
if((P5IN&BIT5)==0)
{temp=temp&0x7F;}//先读的是低位,高位后渎出来
else
{temp=temp|0x80;}
delay(8);//延时60us
}
return temp;
}


void WriteOneChar(unsigned char n)
{
unsigned char i;
DQOUT;
for(i=0;i<8;i++)
{ DQ0;
if((n&0X01)==0X01) DQ1;//先写的也是低位,只是和读的方法正相反
else DQ0;
n=n>>1;
delay(7);//延时45us 以上
DQ1;//?
}
}

void ReadTemp (void)
{
char temp_low,temp_high; //温度值
temp_low = ReadOneChar(); //读低位
temp_high = ReadOneChar(); //读高位
_NOP();
// temperature=(temp_high&0x0f);
temperature=temp_high;
temperature<<=8;
temperature|=temp_low;
Temper=temperature*0.0625;//?
}
void ReadTemperature(void)
{ char i;
while(!(Init_DS18B20()))//初始化不成功时等待
{ led_off();
for(i=0;i<8;i++)
dataout(0);
delay(50000);
delay(50000); }
Init_DS18B20();
WriteOneChar(0xcc);//跳过序列号命令
WriteOneChar(0x44);//转换

delay(50000);//延时1秒以上
delay(50000);
delay(50000);
delay(50000);
Init_DS18B20();
WriteOneChar(0xcc);//跳过序列号命令
WriteOneChar(0xBE);//读暂存存储器
ReadTemp();
}
void transfer(void)
{
table1[0]=t/100+48;//加上0x30即48,转化成ASCII码液晶能够识别
table1[1]=t/10%10+0x30;
table1[2]='.';
table1[3]=t%10+0x30;

}
/******LCD写指令程序***********/
void write_zhiling(unsigned char com)
{ out;
P4DIR=0XFF;
P4OUT=com;
lcd_rw0;
lcd_rs0;
_NOP();
lcd_en0;
delay(10);
lcd_en1;
delay(10);
lcd_en0;
}
/***********LCD写数据**************/
void write_data(unsigned char date)
{ out;
P4DIR=0XFF;
P4OUT=date;
lcd_rw0;
lcd_rs1;
_NOP();
_NOP();
lcd_en0;
delay(10);
lcd_en1;
delay(10);
lcd_en0;
}
/*********lcd初始化,写lcd功能与方式控制********/
void lcd_init()
{ out;
write_zhiling(0x38);
delay(20);
write_zhiling(0x0f);
delay(20);
write_zhiling(0x06);
delay(20);
write_zhiling(0x0c);
delay(20);
write_zhiling(0x01);
delay(20);
}
int main( void )
{ // int t;
uint a;
WDTCTL = WDTPW + WDTHOLD;
init_port();
lcd_init();
delay(50000);
while(1)
{
ReadTemperature();

//P4DIR|=BIT5
if(t>=35)
{ P5OUT|=BIT4;//报警
delay(50000);
delay(50000);
}
else
P5OUT&=~BIT4;
t=Temper*10;//设置的变量,以便看结果
led_off();
dataout(seg[t%10]);
dataout(seg1[(t/10)%10]);//带小数点段码
dataout(seg[t/100]);
dataout(seg[10]);
dataout(seg[10]);
dataout(seg[10]);
dataout(seg[10]);
dataout(seg[10]);
//delay(50000);
transfer();
write_zhiling(0x80+5);
delay(40);
for(a=0;a<4;a++)
{ write_data(table1[a]);
delay(100);
}
write_zhiling(0xc0+3);
delay(50);
for(a=0;a<9;a++)
{ write_data(table2[a]);
delay(60);
}
}
}

硬件电路 如果没问题的话(如果是有电源供电的话,上拉电阻4.7K是必须的)
首先检查复位时间是否是 480us, 保证每个数据位的时隙读或写的时间大于或等于65us

DS18B20温度传感器的使用方法
答:ORG 0000H ;单片机内存分配申明!TEMPER_L EQU 29H;用于保存读出温度的低8位 TEMPER_H EQU 28H;用于保存读出温度的高8位 FLAG1 EQU 38H;是否检测到DS18B20标志位 a_bit equ 20h ;数码管个位数存放内存位置 b_bit equ 21h ;数码管十位数存放内存位置 MAIN:LCALL GET_TEMPER;调用读温度子程序 ;...

...单片机结合来测量温度。利字温度传感器DS18B20测量温度
答:程序比较长:include <reg52.h> define uchar unsigned char define uint unsigned int sbit DS=P2^2; //define interface uint temp; // variable of temperature uchar flag1; // sign of the result positive or negative sbit dula=P2^6;sbit wela=P2^7;unsigned char code table[...

单片机和DS18B20做数字温度计,求正确程序!!!
答:注意:单总线协议对延时要求比较严格,此程序中采用的是11.0592M的晶振,如果使用其他的晶振请跟据DS18B20的资料修改延时参数 //#include"reg51.h"sbit DQ =P1^4; //定义通信端口 //延时函数 / void delay(unsigned int i){ while(i--);} / //初始化函数 Init_DS18B20(void){ unsigned ...

温度传感器DS18B20的读写一个字节的子程序
答:extern uchar8 sig; //sig判定温度符号 /*延时函数*/ void delay (int us) //DELAY-11.0592MHZ 调用程序大约为24us,每次循环为16us { int s;for(s=0;s<us;s++);} void delayms(int z) //z为毫秒数 { int x,y;for(x=z;x>0;x--)for(y=125;y>0;y--);} /*复位...

用DS18B20采集温度,有段程序不太理解,求大神指教。
答:temp*0.0625 就是实际温度值 但为了传输方便,又要转成整型,还想保留一位小数,那就乘10,因为temp是整型的,temp=f_temp*10+0.5的时候,会发生强制类型转换,等号后面的数据的小数会直接被砍掉,不管是.1还是.9都会别忽略掉,+0.5是为了将≥0.5的小数部分进位到整数部分,实现四舍五入。例...

基于AT89C51单片机和DS18B20温度传感器、LCD1602液晶显示的高精度数字温...
答:;XRF多功能51单片机开发板 ;DS18B20测温程序(液晶显示,可测量0-99度);;TEMPER_L EQU 36H ;从DS18B20中读回高位,低位暂存区 TEMPER_H EQU 35H ;TEMPER_NUM EQU 60H;温度值存储 TEMPER_GE EQU 61H TEMPER_SHI EQU 62H TEMPER_SAVE EQU 63H FLAG1 BIT 00H FLAG2 BIT 01H RS...

基于AT89C51单片机和DS18B20温度传感器、LCD1602液晶显示的高精度数字温...
答:a=ReadOneChar(); //读取温度值低位 b=ReadOneChar(); //读取温度值高位 temp_value=b<<4;temp_value+=(a&0xf0)>>4;value=a&0x0f;val=temp_value+value;return(val);} 以上是DS18B20的驱动程序。然后在主程序中直接调用函数就可以了。以上是在主程序中的调用,你看关于温度的那个...

DS18B20温度传感器实现实时温度测量
答:/ DS18B20温度传感器 C51 yajou 2008-06-28 无CRC / include "reg51.h"include "intrins.h"include "DS18B20.h"/ us延时程序 / void Delayus(uchar us){ while(us--); //12M,一次6us,加进入退出14us(8M晶振,一次9us)} / DS18B20初始化 / bit Ds18b20_Init(void) //存在返0,否...

基于51单片机的液晶显示温度计原理图和程序(采用18b20,高分答谢...
答:unsigned char code Error[]={"Error!Check!"}; //说明没有检测到DS18B20 unsigned char code Temp[]={"Temp:"}; //说明显示的是温度 unsigned char code Cent[]={"Cent"}; //温度单位 / 以下是对液晶模块的操作程序 / sbit RS=P2^7; //寄存器选择位,将RS位定义为P2.0...

求AT89S52数字温度计{用DS18B20温度传感器}程序
答:52单片机 18b20温度传感器程序2009-11-05 18:20 include<reg52.h> include<math.h> include<INTRINS.H> define uchar unsigned char define uint unsigned int sbit DQ=P1^3; //ds18b20 端口 uchar Temp_Integer=0;uchar Temp_Decimal=0;uchar fg=0;void delay2(uint us){ while(us--);}...