ds18b20显示温度不正确#include#includesbit DQ=P1^7;sbit led=P1^0;#de

唯美ss2022-10-04 11:39:541条回答

ds18b20显示温度不正确
#include
#include
sbit DQ=P1^7;
sbit led=P1^0;
#define uchar unsigned char
#define uint unsigned char
uchar code table[]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
uchar data sex[3];
uchar num;
void delayus(uchar gaq)
{
while(gaq--);
}
void ds18b20rest() //复位
{
uchar x;
DQ=1;
delayus(2);
DQ=0;
delayus(80);
DQ=1;
delayus(5);
x=DQ;
delayus(18);
if(x) //判断初始化成功了么
led=0;
}
void ds18b20write(uchar date) //写函数
{
uchar i;
for(i=0;i>=1;
}
}
uchar ds18b20read() //读函数
{
uchar i,date;
for(i=0;i>=1;
DQ=1;
if(DQ)
date=date|0x80;
delayus(7);
}
return(date) ;
}

void main()
{
uchar a,b;
uint temp,temp_i;
float temp_f;
TMOD=0x10;
TH0=0xfb;
TL0=0xe0;
EA=1;
ET0=1;
TR0=1;
while(1)
{
ds18b20rest();
ds18b20write(0xcc);
ds18b20write(0x44);
delayus(255);
ds18b20rest();
ds18b20write(0xcc);
ds18b20write(0xbe);
a=ds18b20read();
b=ds18b20read();
temp=b;
temp

已提交,审核后显示!提交回复

共1条回复
longplayer 共回答了19个问题 | 采纳率94.7%
只能测试0---15.9度,说明你只读取温度的低八位,也就是a=ds18b20read();
从程序上看,你的定义的uint.#define uint unsigned char
定义错误,更改成#define uint unsigned int
所以在你temp
1年前

相关推荐

DS18B20温度转换00000000 11111010=多少摄氏度?11111111 11001110=?
小重山令1年前1
wullyz 共回答了16个问题 | 采纳率81.3%
高五位S为符号位,分辨率为0.0625.正温度把16进制数转成10进制即可;负温度把16进制数取反后加1再转成10进制数,第一个是00FA是(15*16+10)*0.0625=15.62度,第二个是0032是(3*16+2)*0.0625=3.125度(负的)
请问,热敏电阻(10k,25度)和温度传感器(ds18b20)哪个对温度比较敏感?
解码长史公1年前1
biaobiaolmanman 共回答了20个问题 | 采纳率100%
1820,热敏电阻只是个廉价的方式,实现起来需要用AD转换器,1820是一块芯片,灵敏度高,进度高.热敏电阻一般做出来的进度是1度,1820是0.0625度.热敏电阻的温度曲线不是直线,是一条弧线,所以近似后会有假温度的情况发生.
DS18B20温度传感器实现实时温度测量
DS18B20温度传感器实现实时温度测量
单机片机用AT89S52
显示用四个共阳极的数码显示管
晶振12MHz
温度精确到0.5度

好好过慢慢来1年前1
阿包的小舌头 共回答了12个问题 | 采纳率100%
//
void Delayus(uchar us);
//void Dog(void);
bit Ds18b20_Init(void); //DS18B20初始化,存在返0,否则返1
void Ds18b20_WriteBit(bit bitdata); //写bit2DS18B20
void Ds18b20_WriteByte(uchar chrdata); //写Byte DS18B20
void Ds18b20_Write(uchar *p_readdata, uchar bytes); //写 DS18B20
bit Ds18b20_ReadBit(void); //读bit From DS18B20
uchar Ds18b20_ReadByte(void); //读Byte DS18B20
bit Ds18b20_ReadRom(uchar *p_readdata); //读 DS18B20 ROM:成功返0,失败返1
bit Ds18b20_ReadEE(uchar *p_readdata); //读 DS18B20 EE :成功返0,失败返1
bit TempCal(float *p_wendu); //成功返0,失败返1 (温度范围-55 --- +128)
ds18b20电路中5伏电源下电阻的作用
1982822axq1年前4
李承鹏海角说事 共回答了13个问题 | 采纳率92.3%
因为DS18B20是单总线温度传感器,数据线是漏极开路,如果DS18B20没接电源,则需要数据线强上拉,给DS18B20供电;如果DS18B20接有电源,则需要一个上拉即可稳定的工作.
如何用51单片机读取ds18b20的取负温度?求教.
如何用51单片机读取ds18b20的取负温度?求教.
18b20的ram中,前两个字节放的是温度信息.其中第二个字节的高五位是符号位,当温度为正的时候,高五位的字节是0,当温度为负的时候,高五位字节为一.当温度为正的时候,只需要将两个字节的数合到一个字节,然后乘以0.0625就是实际的温度.
那么,当温度为负的时候,该怎么读取温度呢?是将两个字节合为一个字节,然后先取反,再加一,最后再和0.0625相乘吗?这样得出的结果就是实际的负温度值吗?
如果我说的问题一中的答案是对的,那么如果用液晶或者数码管显示负号.
是不是要自己在程序里判断18b20的第二个字节的高五位是不是为一.然后再
写出一个显示符号的程序啊?上面那个最后得出的结果,应该没有符号吧?
图个误乐1年前1
warcraft8283 共回答了18个问题 | 采纳率100%
判断是否是负,就是取高几位的读取值采用与的方式判断,比如(000) 11111 00001000,那么高5位可以这样弄,tempH&0x1f,如果这个值=1;说明是负的,否则就是正的啊,不过有一点,取反是对的,还要加1啊,记得哦.
至于在LCD中显示的,确实是按你说的那样,直接写上一个符号即可.
英语翻译本设计是基于单片机AT89S51的数字温度计的设计,采用温度传感器DS18B20作为检测元件,可以同时测量3个不
英语翻译
本设计是基于单片机AT89S51的数字温度计的设计,采用温度传感器DS18B20作为检测元件,可以同时测量3个不同位置的温度且分别设置报警温度,当温度不在设置范围内时,可以报警.配有LED数码管显示,可以方便的检测温度.与传统的温度计相比,与传统的温度计相比,具有读数方便准确,测量范围,使用寿命长,对使用地点没有苛刻要求,方便操作在实际运用中发挥重要的作用.
麻烦不要直接用在线翻译软件OK?这个我会。英语自己翻译的高手请帮忙
zzzzzii1年前1
kangker 共回答了18个问题 | 采纳率88.9%
The present design is based on the number of single-chip AT89S51 thermometer in the design,used as a temperature sensor DS18B20 detection devices,at the same time can be measured 3 different locations in the temperature and the temperature alarm settings,respectively,when the temperature is not set up the framework,it could be reported.With LED digital display,can easily detect the temperature.Compared with traditional thermometers,compared with the traditional thermometer with a convenient and accurate readings,measuring range,long service life,no place on the use of harsh requirements for operational use in practice play an important role.
在运行数字温度计仿真(proteus)时,怎样初始化温度? 为什么只显示0,我的DS18B20读取温度程序应该没问题
在运行数字温度计仿真(proteus)时,怎样初始化温度? 为什么只显示0,我的DS18B20读取温度程序应该没问题
就是调整proteus上的+-号,也改变不了温度.
续接上面
unsigned int Readtemp()//读取温度
{
unsigned char a=0;
unsigned char b=0;
unsigned int temp=0;
float tt=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器
a=ReadOneChar(); //连续读两个字节数据 //读低8位
b=ReadOneChar(); //读高8位
temp=b;
temp
ostrich_11年前1
aliao166 共回答了25个问题 | 采纳率96%
估计你的显示程序有错,你这里没给出,简单测试一下,把最后的
return(temp);
换为
return(25);
看看是不是还是0,是0的画就是你显示的错了
DS18B20温度传感器读出数据的转化问题?
DS18B20温度传感器读出数据的转化问题?
a=read_byte();x05 //读取温度低八位的数据
x05 b=read_byte();x05 //读取温度高八位的数据
t =(b*256+a)*25;x05
x05return(t>>2);
很多人是这样写的,那后面的转换过程到底是什么意思,为什么高八位数据要乘256,最后乘25是什么意思,还有返回t>>2?不懂,而且不是说还要判断正负吗,为什么也没有?
vokilis1年前1
USA龙 共回答了19个问题 | 采纳率84.2%
乘以256是为了将读过来的数据转换成十进制数,再乘以25,然后在返回值里又左移了2,相当于(b*256+a)*0.0625*100!这段程序应该没有判断正负的语句!你多看看DS18B20的手册就会明白了!那里面说的很明白的!
ds18b20温度寄存器怎么就达到被测温度值
ds18b20温度寄存器怎么就达到被测温度值
下面这段话是ds18b20的测温.我的问题是:"如此循环直到减法计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度."这句话不解啊.计数器2怎么就会计数到0呢?谁在对他起作用?
原理里面低温度系数晶振的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器1,高温度系数晶振随温度变化其震荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入,图中还隐含着计数门,当计数门打开时,DS18B20就对低温低温度系数振荡器产生的时钟脉冲进行计数,进而完成温度测量.计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55 ℃所对应的基数分别置入减法计数器1和温度寄存器中,减法计数器1和温度寄存器被预置在-55℃所对应的一个基数值.减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时温度寄存器的值将加1,减法计数器1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度.图2中的斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正减法计数器的预置值,只要计数门仍未关闭就重复上述过程,直至温度寄存器值达到被测温度值.
zzzyb1年前1
xiaobuxi 共回答了18个问题 | 采纳率88.9%
减法计数器1对减法计数器2起作用.
ds18b20负温度显示问题void wendu_decimal(uint dat) //温度转换后送显示{float
ds18b20负温度显示问题
void wendu_decimal(uint dat) //温度转换后送显示
{
float temp;
if(temp=dat*0.625)
{
wendu_shi=temp/100; //取十位 temp除不用定义类型
wendu_ge =((uint)temp)%100/10; //取个位 temp求模要定义类型,为16位,故定义uint
wendu_shu=((uint)temp)%100%10; //取小数
wendu_fu=0;
}
else //负温度时
{
temp=(~temp+1)*0.0625*10;
wendu_shi=temp/100; //取十位 temp除不用定义类型
wendu_ge =((uint)temp)%100/10; //取个位 temp求模要定义类型,为16位,故定义uint
wendu_shu=((uint)temp)%100%10; //取小数
wendu_fu=-3;
}
lcd_write_com(0x80+0x40+10); //送显示
lcd_write_date(0x30+wendu_fu);
lcd_write_date(0x30+wendu_shi);
lcd_write_date(0x30+wendu_ge);
lcd_write_date(0x2e);
lcd_write_date(0x30+wendu_shu);
lcd_write_date(0xdf); //温度符号
lcd_write_date(0x43);
}
这样一段程序其实负温度我不会编写,请大家帮忙改一下让能正确显示负温度,好像就差了temp定义的一句话,
还有在正温度的时候,最前端显示的不是0,而是什么都不显示,到负温度的时候才显示-号
zhouzirou1年前1
cc的凝思 共回答了28个问题 | 采纳率89.3%
这有问题.
if(temp=dat*0.625)
{
应该改为
temp=dat*0.625;
if(temp>=32)//
{
华氏度与摄氏度的换算:
华氏度比摄影氏度小.一华氏度等于5/9摄氏度.从华氏度变成摄氏度的公式是:
(华氏度-32)× 摄氏度
也可以这样算:
(华氏度-32)×5÷9=摄氏度
将摄氏度换算为华氏度的公式是:摄氏度÷5/9 +32=华氏度
或者:摄氏度×9÷5+32=华氏度
32是个什么数字呢?
水的冰点是0摄氏度(0℃),是32华氏度(32℉),也就是说,用摄氏温度表测量,水到0°结冰;如果用华氏温度测量,水的结冰点是32°.
ds18b20分辨率为什么是0.0625?
ds18b20分辨率为什么是0.0625?
(125+55)/2的12次方=0.0027465
hrx12341年前1
lonely8248 共回答了21个问题 | 采纳率95.2%
不能这么算的,虽然从寄存上看是这样的,
但是实际上,寄存器中的数值已经经过处理并校正,
这个过程导致adc(或者频率计数器等)不可能达到满量程的精度,
举个例子理解一下,仅仅是比如:
假设把-55度标记成电压0,也就是adc值最小,这个也许可以做到.
但是生产具有随机性,某一批产品,-50度就对应了电压0,这个时候就已经无法校正,导致量程减小.
所以要在两边留出一定的富余空间才行.
况且,在数字较小的那一边,往往是adc(或计数器等)精度较差的位置.
求热敏电阻温度、热电偶测温的缺点和ds18b20的优点.从电路设计等方面说都行.
xiaoke02081年前1
mckey 共回答了18个问题 | 采纳率77.8%
热敏电阻价格高,不线性,需要复杂的恒流源伺服电路.数据处理复杂.热电偶要加上补偿电路且材料价高.以上两种方案还都须要A/D转换器.DS18B20只需三根导线和一个电阻.不需要其他任何外围电路即可测得温度数据.故电路非常简单.
英语翻译本课题使用51单片机,DS1302时钟芯片,DS18B20温度芯片,LCD显示模块构成一个多功能电子日子,具有年
英语翻译
本课题使用51单片机,DS1302时钟芯片,DS18B20温度芯片,LCD显示模块构成一个多功能电子日子,具有年、月、日、星期、时、分、秒等功能,具有温度计功能,具备年、月、日、星期、时、分、秒校准功能.
淡若移情1年前3
aplo水 共回答了19个问题 | 采纳率84.2%
This project is to use 51 Single-Chip Microcomputer,DS1302 clock CMOS chip,DS18B20 temperature CMOS chip and LCD display module to make a multifunctional electronic calendar.It will have the following 3 functions:the 1st function is to display time,including Year,Month,Day,Week,Hour,Minute and Second; The 2nd one is to be a thermometer;The last one is the calibration of Year,Month,Day,Week,Hour,Minute and Second.
ds18b20温度计算书上程序:(T是读取的16位温度)T=T*0.625 a[0]=T/1000 (百位)a[1]=T
ds18b20温度计算
书上程序:
(T是读取的16位温度)
T=T*0.625
a[0]=T/1000 (百位)
a[1]=T/100%10(十位)
a[2]=T/10%10 (个位)
a[3]=T%10
T不是2进制数么,怎么除以1000,比如125度为0000 0111 1101 0000,它怎么除1000啊?
T=T*0.625 书上说是保留1位小数,扩大10倍 .真心不懂
碎叶舞斜阳1年前1
guilanlan 共回答了18个问题 | 采纳率88.9%
这个要看程序是怎么读温度的,用的应该是C语言吧?T应该是声明为整型或者长整型数据,也有可能是浮点型,读的时候应该是每读一位数据一些移位、或之类的运算.所以T就是读出来的数值的10进制表示.DS18B20的温度是用12位表示的,最高位表示正负.但一般8位的单片机只能读两次,共16位,也就是T中有4位是多余的.怎么从读到的数值中得到真实的温度值,你可以尝试一下位运算.
DS18B20的分辨率是0.0625,读到的温度数值要乘以0.0625才能得到真实的温度值.但你的百位、十位、个位都是整数,你计算的过程中必有强制数据类型转换.所以要保留一位小数就要乘以10,也就是把小数点后一位的数值提到个位中,这样在计算中才不至于把小数点后一位的数值丢掉.相应地在计算中也要把分子放大10倍,所以得到百位数要除以1000.
DS18B20的精度?我想制作一个温度控制箱,实现0.1的精度,比如要40.1度,就不能是40.3度.但DS18B20说
DS18B20的精度?我想制作一个温度控制箱,实现0.1的精度,比如要40.1度,就不能是40.3度.但DS18B20说是
温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃. (6)可编程的分辨率为9~12位,对应的可分辨温度0.0625,精度那么低,分辨率比较高,这是什么意思呢,这个元件能达到我的要求吗?外带温度控制的DHT21能达到吗?
顾下经1年前1
wyy606623 共回答了16个问题 | 采纳率93.8%
分辨率意思就是最小步长.测量出来的都是最小步长的倍数.18B20不能满足你的要求
英语翻译本文主要介绍了电子日历的原理,阐述了基于DS12C887,DS18B20等芯片组成的电子日历的主要设计过程.
唐伯虎洗澡1年前3
love18709 共回答了20个问题 | 采纳率90%
This paper mainly introduces the principle of electronic calendar and describes the main process of designing electronic calendar based on DS12C887 and DS18B20 chips.
ds18b20数据转换成对应温度函数-55~+125
零点去流浪1年前1
o_daisy 共回答了26个问题 | 采纳率88.5%
#include
uchar displaytemp[16]
temp=ReadTemperature();
temperature=temp*0.0625;
sprintf(displaytemp,"Temp %6.2f ",temperature);//打印温度值这样就可以显示-55~+125了
关于 51单片机 和ds18b20 led显示问题:18b20采用12位温度转换,结果只使用十位个位和小数点后一位
关于 51单片机 和ds18b20 led显示问题:18b20采用12位温度转换,结果只使用十位个位和小数点后一位
18b20采用12位温度转换,结果只使用十位个位和小数点后一位,用4个led显示,第一个显示温度正负.现在的问题是温度显示超过15.0摄氏度左右,个位和十位回突然变成00.0度.部分代码如下
last=tmrtemp();
last=last*10*0.0625; //精确到小数点后一位(不四舍五入)
y[1]=last/100;//十位
y[2]=last%100/10;//个位
y[3]=last%10;//小数位
y[0]=flag;//符号位
mtjmey1年前1
土豆七片 共回答了19个问题 | 采纳率89.5%
符号位如果是负数的时候要去补码.
百位,个位,十位 除以十取余数.
小数部分设置一个变量累加起来就行了