DS18B20测温8位LEDC程序:数码管显示不随温度变化,老是显示0.1“c,且不正确,求高手解答,万分感谢!

/*************** writer:shopping.w ******************/
#include <reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit DQ = P3^6;

uchar code DSY_CODE[] =
{ 0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X00};
uchar code df_Table[] = {0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};

uchar CurrentT = 0;
uchar Temp_Value[]={0x11,0x22};
uchar Display_Digit[]={0,0,0,0};
bit DS18B20_IS_OK = 1;
void Delay(uint x)
{
while(--x);
}

uchar Init_DS18B20()
{
uchar status;
DQ = 1;
Delay(8);
DQ = 0;
Delay(90);
DQ = 1;
Delay(8);
DQ = 1;
return status;
}

uchar ReadOneByte()
{
uchar i,dat=0;
DQ = 1;
_nop_();
for(i=0;i<8;i++)
{
DQ = 0;
dat >>= 1;
DQ = 1;
_nop_();
_nop_();
if(DQ)
dat |= 0X80;
Delay(30);
DQ = 1;
}
return dat;
}

void WriteOneByte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DQ = 0;
DQ = dat& 0x01;
Delay(5);
DQ = 1;
dat >>= 1;
}
}

void Read_Temperature()
{
if(Init_DS18B20() ==1 )
DS18B20_IS_OK = 0;
else
{
WriteOneByte(0xcc);
WriteOneByte(0x44);
Init_DS18B20();
WriteOneByte(0xcc);
WriteOneByte(0xbe);
Temp_Value[0] = ReadOneByte();
Temp_Value[1] = ReadOneByte();
DS18B20_IS_OK=1;
}
}

void Display_Temperature()
{
uchar i;
uchar t=150;
uchar ng=0, np=0;

if ( (Temp_Value[1] & 0xf8) == 0xf8)
{
Temp_Value[1] = ~Temp_Value[1];
Temp_Value[0] = ~Temp_Value[0]+1;
if (Temp_Value[0] == 0x00) Temp_Value[1]++;
ng=1;np=0xfd;
}
Display_Digit[0] = df_Table[ Temp_Value[0] & 0x0f ];
CurrentT = ((Temp_Value[0] & 0xf0)>>4) | ((Temp_Value[1] & 0x07)<<4);
Display_Digit[3] = CurrentT / 100;
Display_Digit[2] = CurrentT % 100 / 10;
Display_Digit[1] = CurrentT % 10;
if (Display_Digit[3] == 0)
{
Display_Digit[3] = 10;
np = 0xfb;
if (Display_Digit[2] == 0)
{
Display_Digit[2] = 10;
np = 0xf7;
}
}
for (i=0;i<30;i++)
{
P0=0x39;P2=0x7f;Delay(t);P2=0xFF;
P0=0x63;P2=0xbf;Delay(t);P2=0xff;
P0=DSY_CODE[Display_Digit[0]];
P2=0xDF;Delay(t);P2=0xff;
P0=(DSY_CODE[Display_Digit[1]]) | 0x80;
P2=0xef;Delay(t);P2=0xff;
P0=DSY_CODE[Display_Digit[2]];
P2=0xf7;Delay(t);P2=0xff;
P0=DSY_CODE[Display_Digit[3]];
P2=0xfb; Delay(t); P2=0xff;
if (ng)
{
P0 = 0x40; P2 = np; Delay(t); P2=0xff;
}
}
}
void main()
{
Read_Temperature();
Delay(50000);
Delay(50000);
while(1)
{
Read_Temperature();
if(DS18B20_IS_OK)
Display_Temperature();

}

}

这个问题我也曾经出现过,显示的温度不变,我的是因为取了温度以后对温度×100的算法不对,比如28度,算的时候先×100变成2800,然后再通过取余什么的得到十位、个位等数。就是在计算实际温度的那个地方错了,你看看温度换算那里吧,一般取温程序不会有错。
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-11-29
程序这个东西还是自己慢慢调吧,注意模块化调试。。呵呵 你可以的

...老是显示0.1“c,且不正确,求高手解答,万分感谢!
这个问题我也曾经出现过,显示的温度不变,我的是因为取了温度以后对温度×100的算法不对,比如28度,算的时候先×100变成2800,然后再通过取余什么的得到十位、个位等数。就是在计算实际温度的那个地方错了,你看看温度换算那里吧,一般取温程序不会有错。

DS18B20测温C程序:数码管显示不随温度变化,且不正确,求高手解答,万分感 ...
在mian函数while(reset())的下一行加上DQ=1;(拉高电平)。

DS18B20温度传感器测温程序 示数显示一直为001C,不知道哪出问题了,希...
(T_data[1]<<4)|(T_data[0]>>4)合并

为什么我做的DS18B20数码管显示的温度不准确?
首先,要检查你的程序读出的DS18B20的温度值有没有问题,比如仿真中设定26°C,在程序中判断是不是26°C,若是,编一个简单的程序,让数码管输出1,这样就可以判定你的测温程序有没有问题。其次,最怀疑的地方就是你这个数码管的程序有问题,若你可以保证没有问题,可以排除这一块。最后,注意各个模...

DS18B20 温控系统 数码管不显示
你可以试着用软件调试下,如果没问题,再硬件一步一步调试,电路是不是自己焊的?自己焊的话就好好从头检查下,不是自己焊的话就看下接线有没有问题,可以用万能表测下每一步的输出看看是不是和程序里面的一样,如果有问题的话那肯定就是软件里面有没写好的啦。最主要是懂得一步一步找问题。这...

...ds18b20用数码管显示温度,没加键盘时数码管温度显示不稳定_百度知 ...
电路很简单,应该不会有问题!把程序贴出来看看。 估计是显示模块的问题。TABLE[]是怎么定义的。 把shi ge 改成字符型试试。

单片机DS18B20测温的问题,程序好像没问题,但是用protues仿真就是没...
看一下晶振对了没有,这个很关键 对了,你怎么这样写程序啊,这样显示的时间会不均衡的,即每位数码管显示的时间不一样,会带来一个暗一个亮,特别是当你想加点其它功能,比如说按键,采AD等等时,你会发现显示的不正常

我现在写了DS18B20的c程序还有用定时器输出的PWM波程序,用数码管显示...
无论程序执行到何处都会被暂停,优先去执行中断服务程序。 DS18B20这种对时序有严格要求的单总线通讯,在发送和接收数据时被定时器中断扰乱了时序,所以无法通讯。要解决此问题建议你采用带硬件PWM的MCU,或者将18B20通讯代码放在中断服务程序内部,如果采用后一种方式,PWM计时时间请算上18B20通讯的时间。

DS18b20用数码管显示可正确测量环境温度。LCD时显示时,温度不变化,且...
是不是刷新时间太短?1820单总线的方式,用时比较长的,刷新的慢一点可能就好了,一般来说尽量便刷新时间在2S左右为佳,谢谢!

ds18b20显示温度不正确
只能测试0---15.9度,说明你只读取温度的低八位,也就是a=ds18b20read();从程序上看,你的定义的uint。。。#define uint unsigned char 定义错误,更改成#define uint unsigned int 所以在你temp<<=8; 之后,温度的th位是为0的。temp=temp|a; \/\/合并成一个字节 合成的温度就是温度的低...

相似回答