用ds18b20检测温度,我写的程序总是静止显示271.数码管是三极管驱动。请大侠们指点

#include <reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//不带点
uchar code table1[]={0xbf,0x86,0xd8,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//带点
sbit DQ=P3^3;
uchar TL,TH,temp,time;

void delay1ms()
{
uint i,j;
for(i=0;i<4;i++)
for(j=0;j<33;j++)
;
}
void delaynms(uchar n)
{
uchar i;
for(i=0;i<n;i++)
delay1ms();
}
/*初始化DS18B20*/
void init_DS18B20()
{
DQ = 1;
for(time=0;time<2;time++)
;
DQ = 0;
for(time=0;time<200;time++) //保持480~960us
;
DQ = 1;
for(time=0;time<220;time++) //延时足够长时间,等待存在脉冲输出完毕
;
}
/*读一个字节*/
uchar read_one()
{
uchar i;
uchar dat;
for (i=0;i<8;i++)
{
DQ =1;
_nop_();
DQ = 0;
_nop_();
DQ = 1;
for(time=0;time<2;time++)
; //延时约6us,使主机在15us内采样
dat>>=1;
for(time=0;time<8;time++)
; //延时3us,两个读时序之间必须有大于1us的恢复期
}
return dat;
}
/*写一个字节*/
write_one(uchar dat)
{
uchar i;
for (i=0; i<8; i++)
{
DQ =1;
_nop_();
DQ=0;
DQ=dat&0x01; //利用与运算取出要写的某位二进制数据,

for(time=0;time<10;time++)
;//延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样
DQ=1;
for(time=0;time<1;time++)
;//延时3us,两个写时序间至少需要1us的恢复期
dat>>=1;
}
for(time=0;time<4;time++)
;
}
/*获取温度数值*/
uint get_temp()
{
init_DS18B20();
write_one(0xCC); // 跳过读序号列号的操作
write_one(0x44); // 启动温度转换
delaynms(200); //转换一次需要延时一段时间

init_DS18B20();
write_one(0xCC); //跳过读序号列号的操作
write_one(0xBE); //读取温度寄存器,前两个分别是温度的低位和高位

TL=read_one();
TH=read_one();
temp=TH;
temp<<=8;
temp=temp|TL;
temp=temp*0.0625;

temp=temp*10+0.5;

return temp;
}
/*数码管显示,三极管驱动*/
display(uchar temp)
{
uchar j,k,l;
j=temp/100;
k=temp%100/10;
l=temp%10;

P2=0xfe;
P0=table[j];
P0=0xff;

P2=0xfd;
P0=table1[k];
P0=0xff;

P2=0xfb;
P0=table[l];
P0=0xff;
}

void main()
{
while(1)
{
display(get_temp);
}
}

第1个回答  2012-05-21
分段调试,先确定数码管显示程序没问题后,再确定DS18B20读取计算的部分有没有问题。
我发现一个问题:
temp <<=8 ;
这个temp 你定义的是8bit 的变量,如果左移8位,会变为0,
应该定义为16位的变量。追问

谢谢你!是的,我改成int型了,加了小数显示。这个程序是延时太长,所以显示有问题。现在我的程序已经能正常用了。衷心感谢

追答

问题解决我也高兴啊,不用谢。

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

请教关于DS18B20温度传感器的温度读取
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程序为什么读不到温度。大侠们指导下
试试这个吧!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 传感器 AT89C51 串行显示 温度上限报警 仿真 PROTEUS_百度...
只是看了程序的一小部分,开头就有问题:用"EQU"来定义变量??EQU是等价赋值指令,例如 AAA EQU 88H 表示AAA的值就是88H。这样指令:MOV AX,AAA就相当于MOV AX,88H,即AX=88H,而不是取地址88H中的值。如果要定义变量,用DB、DW、DATA都可以.建议你再仔细检查,如果还有问题,再把代码...

...DS18B20哪位大侠帮我看看,为什么液晶上一直显示15.9C呢,数据根本...
模块名:DS1820驱动(430)创建人:Iceflame 日期:2008-5-1 6:17 功能:数据读取控制 版本:1.0 修改日期:\/ include "msp430x24x.h"include "DS18B20.h"define DQDIRIN P1DIR &= 0xFE define DQDIROUT P1DIR |= 0x01 define DQIN (P1IN & 0x01)define DQOUT_L P1OUT &= 0xFE de...

相似回答
大家正在搜