我在使用ds18b20检测温度,温度>20时,是正常的,温度<20时,返回值是0xff,0xff,请教高手为什么?

2024-12-13 22:54:41
推荐回答(4个)
回答1:

近期通过DS18B20再加LCD1602加串行输出调试成功,的LCDDATA端口P0

#包括

#包括

#“ STC12C5A.H“

#定义XTAL 11059200 / /杯晶振频率

#定义波特率9600 / /通信波特率

#定义UCHAR无符号字符型

#定义的UINT无符号整数 BR p> SBIT DQ = P2 ^ 3; / / DS18B20的数据脚

SBIT E = P2 ^ 7 / / 1602,使

SBIT RW = P2 ^ 6 / / 1602读取和写入

SBIT RS = P2 ^ 5 / / 1602数据/命令选择

UCHAR数据temp_data的[2] = {0X00,0X00} / / 8 - 位的数据高速缓存> UCHAR代码编号[] = {'0','1','2','3','4','5','6','7','8', '9'}; / / LCD1602数字ASCII表,用来显示数字

UINT DS [4]; / /温度显示4个显着的数字

UINT DH;

UINT升

UINT PIC16F684; / /十六进制转十进制数据缓存

无效延迟(无符号整型数){/ / DS18B20和主延时功能1 = 3US

unsigned int类型;

就(i = NUM I> 0; - );}

的无效InitUART(无效)/ /串口初始化

{ TMOD = 0X20;

SCON = 0x50的;

TH1 =是0xFD;

TL1 = TH1;

PCON = 0X00;

EA = 1;

ES =;

TR1 = 1;

}

无效SendOneByte(无符号字符)/ /串口发送1字节

{

SBUF = C;

(TI);

TI = 0;

}

无效的delay()/ / LCD1602延迟

{ INT I,J;

(I = 0; <= 50; + +)

(J = 0; J <= 2; J + +)

;

}

无效WCMD(UCHAR德尔)/ /写命令程序

{

P0 =德尔

RS = 0; RW = 0;

E = 0;

延迟();

E = 1;

延迟();

}

>无效写(UCHAR德尔)/ /写入数据

{

P0 =德尔

RS = 1;

RW = 0;

é = 0;

延迟的() E = 1;

延迟的();

}

无效L1602_init(无效)/ / LCD1602初始化 {

WCMD(0X01);

WCMD(0X38);

WCMD(0X0C);

WCMD(0X06);

WCMD( 0xd0);

}

:无效L1602_char(UCHAR挂起,的UCHAR李,烧焦的迹象)/ /写一个字符

UCHAR;

(挂起== 2)一个= 0XC0;

= A +谎言 - 1

WCMD(一)写(标志);}

无效L1602_string(UCHAR UCHAR李挂起,,UCHAR * P),/ /写字符串

UCHAR A,B = 0;

(挂起== 1)= 0x80的;

(挂起== 2)= 0XC0;

= A +谎言 - 1; 而(1)

{

WCMD(+ +);

B + +;

((* P =='\ 0')| |(B == 16))休息;

写(* P);

+ +;

}

}

UCHAR Init_DS18B20(无效){/ /初始化DS1820

DQ = 1; / / DQ复位

延迟(22); / /轻微的延迟

DQ = 0; / /微控制器DQ拉低
>延迟(160)/ /精确延时大于480us

DQ = 1; / /总线拉

延迟(22);

(DQ);

L1602_string (1,15,“OK”); / /初始化LCD1602显示OK

延迟(166);

DQ = 1;

回报(1)/ /回报信号,0 =存在,1 =不存在

}

:UCHAR ReadOneChar(无效){/ /读取一个字节

UCHAR;

UCHAR值= 0;

(I = 8> 0; - ){

DQ = 1; _nop_(); _nop_();

值>> = 1;

DQ = 0; _nop_()_nop_(); _nop_(); _nop_(); / / 4

DQ = 1; _nop_(,_nop_)(); _nop_(); _nop_()/ / 4我们

(DQ)值| = 0X80;

延迟(22)/ / 66

}

DQ = 1;

回报率(值); BR />}

,无效WriteOneChar(无符号字符型DAT){/ /写入一个字节

无符号的char i = 0;

(I = 8> 0; - ){ DQ = 0;,

DQ = DAT &0x01;

延迟(18);

DQ = 1;

DAT> > = 1;

}

}

无效Read_Temperature的(无效){/ /读取温度

Init_DS18B20();

WriteOneChar(0XCC)/ /跳过读序号列数运算

WriteOneChar(0×44)/ /启动温度转换

Init_DS18B20();

WriteOneChar(0XCC )/ /跳过读序号列号的操作

WriteOneChar(从0xBE)/ /读取温度寄存器

temp_data [0] = ReadOneChar(); / /低温度8,

temp_data [1] = ReadOneChar(); / /高温8

}

无效的主要()

{

L1602_init()/ /初始化LCD1602

Init_DS18B20(); / /初始化DS18B20

InitUART(); / /初始化串行通信

L1602_string(1,1,“DS18B20”) / / LCD1602测试

L1602_string(2,15,“`C”);

(1)

{

Read_Temperature()/ /读取8位数据

的延迟(800000); DL = temp_data [0];

DH = temp_data [1];

SendOneByte(DH); / /串行端口发送8位数据

DStemp的=(DH + DL)/ 10 * 256 * 625/10 / / 16进制的10水平除了10否则会溢出

DS [0] = PIC16F684%10 / /提取温度每个数字

DS [1]的= DStemp/10%10; DS [2]的= DStemp/100%10;

DS [3] = PIC16F684 / 1000;

L1602_char(1,3,''); / /显示每个数字

L1602_char(1,5,NUM [DS [0]);

L1602_char(1,4,NUM [DS [1]);

L1602_char(1,2 NUM [DS [2]);

L1602_char(1,1,NUM [DS [3]);

}

}
居然把ascii码只要38就够了,当我没想到

回答2:

如果ds18b20坏了会一直显示85的,

回答3:

应该是程序的问题

回答4:

应该是你的程序上出来还存在小问题。