DS18B20显示问题

2019-03-24 19:27发布

这个程序用数码管显示,为什么温度个位的值大于5就显示为0,十位的值大于1就显示为0,弄了好久没通明白问题出在哪里,请大家帮忙看看。
#include"reg52.h"#include"intrins.h"#include<math.h>sbit DQ=P1^3;#define uchar unsigned char#define uint unsigned intuchar 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(); }} 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
孤獨の快樂
1楼-- · 2019-03-24 21:42

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

heeh_only
2楼-- · 2019-03-25 00:49
大概看了下  display里变量定义的很混乱 完全没必要的  m=readdata();    //读出来的温度缓冲区,先出低8位
这句有问题  应该是 m[1]=readdata();
还有 dis这个函数里的这一句  tmp=(b<<=8)|a;
你的b定义的是uchar 类型   这个一个字节的数据  你右移八位后不就是零了  b应该定义为 uint型
heeh_only
3楼-- · 2019-03-25 01:55
我以前写的 给你参考下~~ 对你会有用的
常见泽1
4楼-- · 2019-03-25 02:56
参考别人18B20程序 改变成自己的
skyman_liu
5楼-- · 2019-03-25 08:42
 精彩回答 2  元偷偷看……
heeh_only
6楼-- · 2019-03-25 10:00
呵呵   客气  不用的啦......

一周热门 更多>