DS18b20温度显示问题

2019-03-24 19:35发布

#include<reg52.h>
sbit ds=P3^7;
//0-F数码管显示(共阴)
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//0-9数码管的显示,共阴带小数点
unsigned char code tabledot[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,
0xfd,0x87,0xff,0xef};
void delay(unsigned char i)//延时函数,I=10,延时10ms
{
   unsigned char j,k;
   for(j=i;j>0;j--)
   {
   for(k=125;k>0;k--);
   }
}
void dsinit()//初始化ds1820
{
unsigned int i;
ds=0;
i=103;
while(i>0)i--;        //延时大于480us
ds=1;
i=4;
while(i>0)i--;
}

void dswait()
{
unsigned int i;
while(ds);
while(~ds);
i=4;
while(i>0)i--;

}

bit readbit()//读取一位数据
{
unsigned int i;
bit b;
ds=0;
i++;
ds=1;
i++;i++;
b=ds;
i=8;
while(i>0)i--;
return b;
}
//读取一字节数据
unsigned char readbyte()
{
unsigned int i;
unsigned char j,dat;
dat=0;
for(i=0;i<8;i++)
{
j=readbit();
//最新读出的是最低位
dat=(j<<7)|(dat>>1);
}
return dat;
}
//向ds1820写入一字节数据
void writebyte(unsigned char dat)
{
    unsigned int i;
        unsigned char j;
        bit b;
        for(j=0;j<8;j++)
        {
         b=dat&0x01;
         dat>>=1;
         //写1,让低电平持续两个小延时,高电平持续8个小延时
         if(b)
         {
         ds=0;
         i++;i++;
         ds=1;
         i=8;while(i>0)i--;
         }
         else//写0,相反
         {
           ds=0;
           i=8;while(i>0)i--;
           ds=1;
           i++;i++;
         }
         
         }
        }
  //向DS18B20发送温度转换命令
  void sendchangecmd()
  {
    dsinit();//初始化ds1820
        dswait();
        delay(1);
        writebyte(0xcc);//写ROM
        writebyte(0x44);//写RAM
  }
  //向ds1820发送读取数据命令
  void sendreadcmd()
  {
     dsinit();
         dswait();
         delay(1);
         writebyte(0xcc);
         writebyte(0xbe);//写入读取数据命令
  }
  //获取当前温度值
  unsigned int gettmpvalue()
  {
   unsigned int value;//存放温度值
   float t;
   unsigned char low,high;
   sendreadcmd();
   //连续读取两个字节数据;
   low=readbyte();
   high=readbyte();
   //将高低字节合成一个整型变量
   value=high;
   value<<=8;
   value|=low;
   //ds1820精确度为0.0625
   t=value*0.0625;
   value=t*10+0.5;//如t=11.0625,结果为111,即11.1
   return value;
  }


  //显示当前温度值,精确到小数点后一位
  void display(unsigned int v)
  {
   unsigned char count;
   unsigned char datas[]={0,0,0};
   datas[0]=v/100; //百位
        datas[1]=(v%100)/10;//十位
         datas[2]=v%10;        //个位
         for(count=0;count<3;count++)
         {
         //片选
         P2=((0xfe<<count)|(0xfe>>(8-count)));//选择第(count+1)数码管
         //段选
         if(count!=1)
         {
         P0=table[datas[count]];//显示数字
         delay(1); //延时1ms
         P2=0xff;
         }
         else
         {
         P0=tabledot[datas[count]];//显示带小数点数字
         delay(1);
          P2=0xff;
         }
          
         }
  
  }


        void main()
   {       
        unsigned char i;
        unsigned int value;
        while(1)
        {
        //启动温度转换
        sendchangecmd();
        value=gettmpvalue();
        //显示3次       
        for(i=0;i<3;i++)
        {
        display(value);
        }
       
        }
       
       
        }


   










温度值大于26就显示正确,小于26就闪烁,什么问题啊 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
1条回答
xzwstudy
1楼-- · 2019-03-25 00:47
哪位高手看看啊,初学者很多东西都不懂,一个人琢磨不透

一周热门 更多>