3727|7

34

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

DS18B20显示问题 [复制链接]

这个程序用数码管显示,为什么温度个位的值大于5就显示为0,十位的值大于1就显示为0,弄了好久没通明白问题出在哪里,请大家帮忙看看。
#include"reg52.h"
#include"intrins.h"
#include<math.h>
sbit DQ=P1^3;
#define uchar unsigned char
#define uint unsigned int
uchar flag,m[2];
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

/*------------reset-------------*/
bit reset()
{
  uchar i;
    DQ=1;
_nop_();
DQ=0;
for(i=0;i<250;i++);
DQ=1;
for(i=0;i<15;i++);
flag=DQ;
for(i=0;i<100;i++);
return flag;
}
/*-----------写data------------*/
void writedata(uchar dat) //先写D0
{
     uchar tmp,i,j;
 tmp=dat;
for(i=0;i<8;i++)
{
DQ=1; //表示写周期开始。60~120us
for(j=0;j<3;j++);
DQ=0;
_nop_();
DQ=tmp&0x01;
for(j=0;j<10;j++);
DQ=1;
for(j=0;j<3;j++);
tmp>>=1;
}
}
/*-----------读data------------*/
uchar readdata()
{
  uchar j,i,dat=0;
  for(i=0;i<8;i++)
  {
  
DQ=1;
_nop_();
DQ=0;
dat>>=1;
_nop_();
_nop_();
DQ=1;
for(j=0;j<3;j++);
if(DQ)dat|=0x80;
for(j=0;j<3;j++);
}
return dat;
}
/*-----------初始化------------*/
void init()
{
reset();
while(flag);
writedata(0xcc);   //只有一个DS18B20时可以直接跳过rom
writedata(0x4e);   //往ram里写上,下限温度,后面要紧跟温度值
writedata(0x20);
writedata(0x00);
writedata(0x7f);   //配置转换精度 12位

}

void delay1()
{
uchar i,j;
for(i=0;i<10;i++)
  for(j=0;j<10;j++);
}
/*-----------数码管显示------------*/
void dis()
{
    uchar a,b,c,d,temph,templ;
 uint tmp,k;
 a=m[0];
 b=m[1];                                                // float temp;
 tmp=(b<<=8)|a; 
 k=tmp;                                             //temp=(m[1]*256+m[0])*0.0625;
 k&=0xf800;  
if(k==0xf800)
  {
  tmp=~tmp;
tmp+=1;
  }
   temph=tmp>>4;                //取出整数
templ=tmp&0x0f;              //取出小数部分
 a=temph/100;
 b=temph%100/10;
 c=temph%10;
 d=templ*10/16;
 if(k==0xf800)P0=0x40;
  else P0=table[0];
       P2=0;
       delay1();
       P0=table[a];
       P2=1;
       delay1();
       P0=table;
       P2=2;
       delay1();

       P0=table[c];
       P2=3;
       delay1();
   P0=0x80;
       P2=4;
       delay1();
P0=table[d];
       P2=5;
       delay1();
P0=0x39;
       P2=6;
       delay1();  
}  

void main()
{
   uchar i;
init();
while(1)
{
        reset();
writedata(0xcc);
        writedata(0x44);    //温度转换命令
for(i=0;i<100;i++);
reset();
writedata(0xcc);
writedata(0xbe); 
for(i=0;i<2;i++)
{
m=readdata();    //读出来的温度缓冲区,先出低8位
}  
dis();
}
}
此帖出自51单片机论坛

最新回复

程序正常不? 俺溜了一遍咋没见到700mS以上的延时呢  详情 回复 发表于 2012-1-11 09:44
点赞 关注
 

回复
举报

315

帖子

0

TA的资源

五彩晶圆(初级)

沙发
 

如果LZ能给个仿真图就更好了

此帖出自51单片机论坛
 
 
 

回复

90

帖子

0

TA的资源

一粒金砂(高级)

板凳
 
大概看了下  display里变量定义的很混乱 完全没必要的  m=readdata();    //读出来的温度缓冲区,先出低8位
这句有问题  应该是 m[1]=readdata();
还有 dis这个函数里的这一句  tmp=(b<<=8)|a;
你的b定义的是uchar 类型   这个一个字节的数据  你右移八位后不就是零了  b应该定义为 uint型
此帖出自51单片机论坛
 
 
 

回复

90

帖子

0

TA的资源

一粒金砂(高级)

4
 

给你个我以前写的参考参考~

我以前写的 给你参考下~~ 对你会有用的

DS18B20.doc

47.5 KB, 下载次数: 40

此帖出自51单片机论坛
 
 
 

回复

7173

帖子

195

TA的资源

五彩晶圆(高级)

5
 
参考别人18B20程序 改变成自己的
此帖出自51单片机论坛
 
 
 

回复

34

帖子

0

TA的资源

一粒金砂(中级)

6
 

回复 板凳 heeh_only 的帖子

确实是那个地方的变量定义错了,谢谢
此帖出自51单片机论坛
 
 
 

回复

90

帖子

0

TA的资源

一粒金砂(高级)

7
 

回复 6楼 skyman_liu 的帖子

呵呵   客气  不用的啦......
此帖出自51单片机论坛
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(高级)

8
 
程序正常不?
俺溜了一遍咋没见到700mS以上的延时呢
此帖出自51单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表