我的ds18b20程序为什么读不到温度。大侠们指导下

//温度传感器初始化
uchar tplsb,tpmsb; //读取数据的低8位和高8位
int ds_cmd=0;//温度开关

int
ds18B20_init()
{
DS_PORT &= ~DQ_18B20; //输出锁存器写0,以后不再更改
DS_DDR &= ~DQ_18B20; //输入模式(上电时为高电平)
return TRUE;

}
//温度传感器是否在线或者存在true 表示存在,false不存在

char
ds18b20_reset(void)
{
char bus_flag;

DQ_0(); //设置1-wire总线为低电平(占领总线)

/*现在延迟480us~960us, 与硬件密切相关,但应尽可能选小值(480us),
把抖动留给系统(比如在延迟期间发生中断导致延迟变长)。
*/
delay_us(490); //490us
printf("67===");

cli(); //下面这段时间要求比较严格,为保险起见,关闭中断
DQ_1(); //设置1-wire总线为高电平(释放总线)

delay_us(67.5); //60us+7.5us!(忙延时,一种策略)

//探测总线上是否有器件
if(DQ_status())

bus_flag=FALSE; //复位单总线但没有发现有器件在线

else
bus_flag=TRUE; //复位单总线并发现有器件在线

sei(); //退出临界代码区(开中断)
printf("82===");

/*保证Master释放总线的时间(不是说总线处于高电平的时间)不小于
480us即可,这一时间从读总线状态之前就开始了,所以这里把这个
时间计算在内。在Master释放总线的前半段,也是被动器件声明它
们在线之时。
*/
delay_us(490-67.5); //490-67.5us
printf("发现器件没%c",bus_flag);

return(bus_flag);
}

试试这个吧!
#include<pic.h>
#define uchar unsigned char
#define uint unsigned int
#define DQ RC1
#define DQ_HIGH() TRISC1=1
#define DQ_LOW() TRISC1=0;DQ=0
__CONFIG(0x3B31);
const uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f};
const uchar table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,
0x87,0xff,0xef};
uint temper;
uchar a1,a2,a3,a4;
void delay(uint x);
void delayus(uint,uchar);
void init();
void disp(uchar num1,uchar num2,uchar num3,uchar num4);
void write_byte(uchar date);
uchar read_byte();
void get_tem();
void main()
{
init();
while(1)
{
/* delayus(0,0);//20
delayus(1,1);//30
delayus(2,2);//45
delayus(4,4);//70
delayus(70,30);//750
delayus(50,10);//500*/
// uchar num;
get_tem();
// for(num=20;num>0;num--)
// disp(a1,a2,a3,a4);
}
}
void reset()
{
uchar st=1;
DQ_HIGH();
NOP();NOP();
while(st)
{
DQ_LOW();
delayus(70,30);
DQ_HIGH();
delayus(4,4);
if(DQ==1)
st=1;
else
st=0;
delayus(50,10);
}
}
void write_byte(uchar date)
{
uchar i,temp;
DQ_HIGH();
NOP();NOP();
for(i=8;i>0;i--)
{
temp=date&0x01;//01010101
DQ_LOW();
delayus(0,0);
if(temp==1)
DQ_HIGH();
delayus(2,2);
DQ_HIGH();
date=date>>1;//00101010
}
}
uchar read_byte()
{
uchar i,date;
static bit j;
for(i=8;i>0;i--)
{
date=date>>1;
DQ_HIGH();
NOP();NOP();
DQ_LOW();
NOP();NOP();NOP();NOP();NOP();NOP();
DQ_HIGH();
NOP();NOP();NOP();NOP();
j=DQ;
if(j==1)
date=date|0x80;//1000 0000
delayus(1,1);
}
return (date);
}

void get_tem()
{
uchar tem1,tem2,num;
float aaa;
reset(); //复位
write_byte(0xCC);//跳过ROM
write_byte(0x44);//温度转换
for(num=100;num>0;num--)
disp(a1,a2,a3,a4);
reset();
write_byte(0xCC);
write_byte(0xBE);//读取暂存内容(9字节)
tem1=read_byte();
tem2=read_byte();
aaa=(tem2*256+tem1)*6.25;
temper=(int)aaa;
a1=temper/1000;
a2=temper%1000/100;
a3=temper%100/10;
a4=temper%10;
}
void delayus(uint x,uchar y)
{
uint i;
uchar j;
for(i=x;i>0;i--);
for(j=y;j>0;j--);
}
void delay(uint x)
{
uint a,b;
for(a=x;a>0;a--)
for(b=110;b>0;b--);
}
void init()
{
TRISD=0;
TRISA=0;
PORTD=0;
PORTA=0;
}
void disp(uchar num1,uchar num2,uchar num3,uchar num4)
{
PORTD=table[num1];//显示第一个数码管
PORTA=0x20;//0010 0000
delay(2);
PORTD=table1[num2];//显示第二个数码管
PORTA=0x10;//0001 0000
delay(2);
PORTD=table[num3];//显示第三个数码管
PORTA=0x08;//0000 1000
delay(2);
PORTD=table[num4];//显示第四个数码管
PORTA=0x04;//0000 0100
delay(2);
/* PORTD=table[num5];//显示第五个数码管
PORTA=0x02;//0000 0010
delay(2);
PORTD=table[num6];//显示第六个数码管
PORTA=0x01;//0000 0001
delay(2);*/
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-12-01
我这里有。

18b20 在 proteus 中为何 读不出温度数值
很有可能是主机发出温度转换命令(0x44)后,由于程序设定的延迟时间不够长,温度转换没有完成就开始读取数据了

我的ds18b20程序为什么读不到温度。大侠们指导下
试试这个吧!include<pic.h> define uchar unsigned char define uint unsigned int define DQ RC1 define DQ_HIGH() TRISC1=1 define DQ_LOW() TRISC1=0;DQ=0 __CONFIG(0x3B31);const uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};const uchar table1[]...

单片机接DS18B20温度飘移问题
你LCD刷新时间长一点,就不会飘了。

请教关于DS18B20温度传感器的温度读取
三通道18B20温度测量数码管显示。-55-+125℃,用1位数码管显示当前通道号,4位数码管显示18B20当前通道温度值(一位小数),负号位与正温度百位1用同一位数码管显示,该位为0不显示,如:0 27.9、1 123.1、2 -35.6。连接方法:三个18B20均接P3.7,P0口(JP10)接8位数码管段码口(J12...

各位大侠,我是单片机新手,做个DS18B20的温测小系统,数码管老显示“00...
1.先不考虑检测值,单显示测试正常否。2.温度检测值应该是没检测到

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

MSP430 DS18B20哪位大侠帮我看看,为什么液晶上一直显示15.9C呢,数据...
void DS18B20_delay_us(unsigned int n);unsigned char Bus_1820_reset(void);unsigned char Read_1820_word(void);void Write_1820_word(unsigned char m);\/ 函数名:延时函数 功能:延时 输入:无 输出:无 调用函数:无 版本:1.0 \/ void DS18B20_delay_us(unsigned int n)\/\/16MHz { unsi...

18B20测温时读取到的温度数据怎么转换!
RET ; 判断DS1820是否存在?若DS18B20不存在则返回 TSS2: MOV A,#0CCH ; 跳过ROM匹配 LCALL WRITE_1820 MOV A,#44H ; 发出温度转换命令 LCALL WRITE_1820 LCALL DISPLAY ;这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12位的话750微秒 LCALL INIT_1820;准备读温度前先复位 MOV ...

关于DS18B20的精度问题
DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃;可编程 的分辨率为9~12位,对应的可分辨...

请问DS18B20和DS1820有什么区别
回答:DALLAS最新单线数字温度传感器DS18B20简介新的“一线器件”体积更小、适用电压更宽、更经济 Dallas 半导体公司的数字化温度传感器DS1820是世界上第一片支持 “一线总线”接口的温度传感器。一线总线独特而且经济的特点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。DS18B20、 DS1822 “一...

相似回答