STC 单片机 DALLAS 18B20温度采集高位温度错误求解?

作者&投稿:臧东 (若有异议请与网页底部的电邮联系)
单片机求解?ds18b20温度实物采集的时候只出现J5.9度,怎么回事,仿真里是没问题的~

数值超出,检查读取的数据有没有处理好

1:接收数据为双字节--先低位,后高位;先低字节,后高字节;

2:高字节的前5位若为“0”,则将数据乘以0.0625;即 [t=(D*0.0625)].

3:高字节的前5位若为“1”,则将数据先取反,再加一,再乘以0.0625;即

【t=[(~D)+1]*0.0625]】

温度是-55~+125

对应的值是 :

(-55>>FF92)

(-0.5>>FFFF)

(0>>0000)

(0.5>>0001)

(125>>00FA)

用这个程序试。不行的话换一个18b20.

#include <reg52.h>

#define uchar unsigned char
#define uint unsigned int

sbit DQ = P3^3; //定义连接DS18B20的IO口

/******************************* 延时函数 ********************************
* 功能:在11.059MHz的晶振条件下调用本函数需要24μs ,然后每次计数需16μs
**************************************************************************/
void delay1(int useconds) {
int s;
for (s=0; s<useconds;s++);
}

/******************************* 复位函数 *******************************
* 功能:完成单总线的复位操作。
* 复位时间为480μs,因此延时时间为(480-24)/16 = 28.5,取29μs。
* 经过70μs之后检测存在脉冲,因此延时时间为(70-24)/16 = 2.875,取3μs。
**************************************************************************/
unsigned char ow_reset(void) {
unsigned char presence;
DQ = 0; // 将 DQ 线拉低
delay1(29); // 保持 480μs
DQ = 1; // DQ返回高电平
delay1(3); // 等待存在脉冲
presence = DQ; // 获得存在信号
delay1(25); // 等待时间隙结束
return(presence); // 返回存在信号,0 = 器件存在, 1 = 无器件
}

/****************************** 位写入函数 *******************************
* 功能:向单总线写入1位值:bitval
*************************************************************************/
void write_bit(char bitval) {
DQ = 0; // 将DQ 拉低开始写时间隙
if(bitval==1) DQ =1; // 如果写1,DQ 返回高电平
delay1(5); // 在时间隙内保持电平值,
DQ = 1; // Delay函数每次循环延时16μs,因此delay(5) = 104μs
}

/**************************** 字节写入函数 *******************************
* 功能:向单总线写入一个字节值:val
*************************************************************************/
void write_byte(char val) {
unsigned char i;
unsigned char temp;
for (i=0; i<8; i++) { // 写入字节, 每次写入一位
temp = val>>i;
temp &= 0x01;
write_bit(temp);
}
delay1(5);
}

/**************************** 位读取函数 ********************************
* 功能:从单总线上读取一位信号,所需延时时间为15μs,因此无法调用前面定义
* 的delay()函数,而采用一个for()循环来实现延时。
* ***********************************************************************/
unsigned char read_bit(void) {
unsigned char i;
DQ = 0; //将DQ 拉低开始读时间隙
DQ = 1; // then return high
for (i=0; i<3; i++); // 延时15μs
return(DQ); // 返回 DQ 线上的电平值
}

/**************************** 字节读取函数 *******************************
* 功能:从单总线读取一个字节的值
*************************************************************************/
unsigned char read_byte(void) {
unsigned char i;
unsigned char value = 0;
for (i=0;i<8;i++) { // 读取字节,每次读取一个字节
if(read_bit()) value|=0x01<<i; // 然后将其左移
delay1(6);
}
return(value);
}

int ReadTemperature(void)
{
bit flag;
uchar get[2];
uchar lsb,msb;
uint temp,t1;
uchar k;
ow_reset();
write_byte(0xCC); // 跳过 ROM
write_byte(0x44); // 启动温度转换
delay1(5);
ow_reset();
write_byte(0xCC); // 跳过 ROM
write_byte(0xBE); // 读暂存器
for (k=0;k<2;k++)
{get[k]=read_byte();}
msb = get[1]; // Sign byte + lsbit
lsb = get[0]; // Temp data plus lsb
if((msb&0xF0)>0)
{ //判断是否为负温度
flag=1;
}
else
{
flag=0;
}
if(flag)
{ //如果为负温度取反加1
temp=((uint)msb<<8)|lsb;
temp=~temp+1;
msb=temp/256;
lsb=temp%256;
}
t1=msb<<4; //得到温度整数部分
t1|=(lsb>>4);
//t2=(lsb&0x0F)*0.0625*10000; //得到温度小数部分并扩大10000倍
return t1;
}

自己写main,调用ReadTemperature();取返回值。

我给你一个ftp地址,那里有你需要的源代码,你先看看吧。ftp://rf315:rf315@60.12.41.214/

调整时序就可以了,


梁山县19435771630: STC单片机的A/D转换值应该如何计算 -
只裘羚羊: 5V参考电压,8bitAD 0-5v 对应 0-255 一个单位对应的电压 5/255(分辨率).所以转换成实际电压 = AD采样值 * (5/255) 你最大的采样值也就是 255,这采样值不需要计算. 你的公式 应该这样吧 5V * (255/5) 得出 5v对应的采样值.明了?

梁山县19435771630: keil软件中怎样添加STC系列单片机 -
只裘羚羊: KEIL添加STC单片机方法如下: 运行STC_ISP下载软件,点击Keil仿真设置,点击途中椭圆部分即可.

梁山县19435771630: 如何把程序装到单片机里? -
只裘羚羊: 以stc的单片机为例: 1、用keil编程软件写好程序,编译输出为hex和二进制文件 2、用串口电平转换板(常用MAX232芯片来做),把电脑后面的com口和单片机的(Rxd、Dxd引脚)相连,单片机还要接晶振和电源. 3、在电脑运行stc公司提供的STC-ISP软件,把前面编译好的hex文件装到单片机里.提到的软件都可从网上下载获得,电平转换部分可以自己做也可以买编程器.

梁山县19435771630: 我的笔记本电脑在51单片机下载程序时USB端口为18,但我的STC软件端口号最多为16,怎样去把笔记本端口定义 -
只裘羚羊: 你的烧录器应该是USB转串口的,驱动程序和烧录程序安装好后,会安装一个COM口,这个COM口就是烧录的时候要用到的,如果这个COM口不在烧录软件范围内,就要调整,方法如下:1. 右键“管理”→“管理”→“设备管理器”,在右边“端口(COM和LPT)”下找到你的烧录程序安装的那个串口.假定为COM18.2. 右键“COM18”这个端口→“属性”端口设置→“高级”→“COM端口号”中选一个没有使用的并且是你的STC烧录软件识别范围内的端口,如COM16. 之后确定就行了.

梁山县19435771630: stc单片机的复位电路可以省略吗? -
只裘羚羊: 所有 STC单片机的 复位引脚RST可以直接接GND (或通过1K-10K电阻接GND), 就行.STC 有些型号RST与IO是 复用的, 可用作 IO 口,上官网 下些数据手册看看.

梁山县19435771630: STC单片机低压检测例程 -
只裘羚羊: 首先你得有低压检测的电路,然后才能根据电路写程序,你的需求不明如何让人帮你?STC自己内部有低压检测电路,据我所知,外部挂载几个电阻就可以做到,非常简单,建议你仔细阅读数据手册.首先我想知道你接地的方式,其次要看是电平检测还是波形检测,如果是波形检测直接接地肯定是不行的.而且如果是做低压检测怎么能直接接地呢?都0电平了 模块还这么工作.还有,你的蜂鸣器是什么蜂鸣器有源还是无源?不同的蜂鸣器驱动方式也不一样.如果以上都正确,那么请检查你的程序,有没有中断之外操作beep的地方 或者IO的输出模式有没有配置正确,等等等等.

梁山县19435771630: stc 系列单片机没有供电,只在一引脚接入5v电压,其他引脚也出现了电压,怎么回事. -
只裘羚羊: 不单是STC单片机会出现这种情况,很多单片机都有这种情况,甚至其它集成电路也不例外的会出现这种情况.集成电路内部的结构是相当复杂的,只能举一个简单例子说明原因,某芯片引脚(A)的内部有1个二极管,其正极在内部接到A上,负极接到了这个芯片的VCC引脚上,VCC是整个芯片所有电路的电源端,只要你在A这个引脚上加上电压,整个芯片是不是都有了电压.单片机为了保护I/O端口,引脚内部就常有这种情况出现.

梁山县19435771630: STC单片机接收数据之如何判断数据结束 -
只裘羚羊: 单片机接收数据如何判断呢数据结束有两种 办法:1、根据时间来确定,当超过某个设定时间没有继续有数据传来,那么认为是结束.2、根据双方的约定,接收到一个结束符,就认为数据传输结束.

梁山县19435771630: STC单片机疑问 -
只裘羚羊: 合法下载命令流你不用去管,这是宏晶公司已经设定好了的,这是PC和单片机的对话口令,只有对话成功才能下载程序. 1、如果你设置了下次冷启动后“P1.0,P1.1”等于“0,0”才可以下载程序,你必须将P1.0,P1.1短接到地才能下载程序. 2、目标板要彻底断电后才能上电下载程序. 3、降低下载波特率下载. 如果以上依然不行,我估计你自己搭接的电路有问题,主要查看MAX232有没有接错.

梁山县19435771630: STC单片机型号识别不出大家有什么办法 -
只裘羚羊: 是烧录程序时,烧录程序STC-ISP不识别单片机型号吗?首先要检查USB转串口线或USB转TTL模块是否好用,刚开始烧录时可显示在握手,再显示型号不对.仔细核对芯片型号,在烧录程序中认真查找.如果刚下载就显示型号不对,有可能是单片机坏了,换个单片机试一下.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网