中国(深圳)国际机器视觉展览会暨机器视觉技术及工业应用研讨会→ 立即报名 ←
电子产品世界 » 论坛首页 » 高校专区 » 坤创E-Geek/天科大新电社 » 求助!DS18b20测温度 数码管显示 温度跳动不正常

共5条 1/1 1 跳转至

求助!DS18b20测温度 数码管显示 温度跳动不正常

菜鸟
2019-01-24 14:17:26    评分

1548331566430103.jpg1548331566889290.jpg1548331566321317.jpg

如图,在测试ds18b20时 ,温度跳到25.0以后自动变成00.4,然后01.4,02.4,03.4

代码如下

#include<reg52.h>

#include<intrins.h>

typedef unsigned char u8;

typedef unsigned int u16;

sbit ds=P2^2;

sbit ser=P2^7;

sbit srclk=P2^6;

sbit rclk=P2^5;

bit flag;

unsigned char code smgduan[]={0x3f,

  0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,

  0x77,0x7c,0x39,0x5e,0x79,0x71};

   unsigned char code smgwei[]={0xfe,

  0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

void delayms(u16 n);

void TempDelay(u16 us);

  void send_595(u8 dat);

void ds_reset()

{

 ds=1;

 _nop_();

 ds=0;

 TempDelay(80);//520us

 ds=1;

 TempDelay(5);

 if(ds==0)

  flag=1;

 else

  flag=0;

 TempDelay(20);

 ds=1;

}

bit ds_read_bit()

{

 bit dat;

 ds=0;

 _nop_();

 _nop_();

 ds=1;

 _nop_();

 dat=ds;

 TempDelay(12);

 return dat;

}

u8 ds_read_byte()

{

 u8 i,j,value;

 for(i=0;i<8;i++)

 {

  j=ds_read_bit();

  value=(j<<7)|(value>>1);

 }

 return value;

}

void ds_write_byte(u8 dat)

{

 u8 i,onebit;

 for(i=0;i<8;i++)

 {

  onebit=dat&0x01;

  if(onebit)    //?1

  {

   ds=0;

   TempDelay(1);

   ds=1;

   _nop_();

  }

  else  //?0

  {

   ds=0;

   TempDelay(11);

   ds=1;

   _nop_();

  }

  dat>>=1;

 }

}

u8 get_temperature()

{

 u16 temp,temp1;

 u8 a,b;

  ds_reset();

 ds_write_byte(0xcc);

 ds_write_byte(0x44);

 ds_reset();

 ds_write_byte(0xcc);

 ds_write_byte(0xbe);

 a=ds_read_byte();

 b=ds_read_byte();

 temp=b;

 temp<<=8;

 temp|=a;

 temp1 = temp*0.0625;

 temp=temp1*10+0.5;

 return temp ;

}

void main()

  {   u16 j;  

   while(1){ 

   j=get_temperature();

     send_595(smgwei[0]);

   send_595(smgduan[j/1000]);    

   rclk=0;

   rclk=1;

   delayms(1);

      send_595(smgwei[1]);

   send_595(smgduan[j%1000/100]);    

   rclk=0;

   rclk=1;

   delayms(1);

      send_595(smgwei[2]);

   send_595(smgduan[j%100/10]);    

   rclk=0;

   rclk=1; 

      delayms(1);   

    send_595(smgwei[3]);

   send_595(0X80);    

   rclk=0;

   rclk=1;

   delayms(1);

    send_595(smgwei[4]);

   send_595(smgduan[j%10]);    

   rclk=0;

   rclk=1;

   delayms(1);

    send_595(smgwei[5]);

   send_595(smgduan[12]);    

   rclk=0;

   rclk=1;

   delayms(1);

      }

  }

  void delayms(u16 n)

  {

    u8 i;

 while(n--)

 for(i=0;i<113;i++);

    }

  void TempDelay(u8 us)

  {

   while(us--);

    }

  void send_595(u8 dat)

 {

    u8 i;

  for(i=0;i<8;i++)

  {

    if(dat&0x80)

    ser=1;

   else

    ser=0;

   srclk=0;

      srclk=1;

   dat=dat<<1;

  }

 }

 

 

 

 




关键词: DS18b20    

菜鸟
2019-01-24 16:53:41    评分
2楼

首先,你的1602的init()函数写在while大循环里面是不合理的,不然每次循环都要对1602初始化;

其次,get_temperature()函数里面的delay(1000)没有必要写;

再者,请具体描述您的问题,越详细越好,有图最好,请在下方回复...


菜鸟
2019-01-24 17:05:42    评分
3楼

  你的温度传感器程序并没有任何问题,那么我想问:你的硬件方面是不是有问题,你温度传感器接好了吗,你要根据原理图接好硬件。如果硬件有问题,数值不动是很正常的。

  另外提两个建议:

  1、蓝桥杯不需要LCD1602,着重点在数码管上。

  2、养成模块化编程的好习惯,不然代码多了之后就会很乱


助工
2019-01-24 17:08:16    评分
4楼
是显示85吗?

菜鸟
2019-01-24 21:43:31    评分
5楼

你的数据处理有问题,这一句: temp=temp1*10+0.5;  不需要。

直接返回temp1值

在主函数里面赋值分别为:

j/100;

j%100/10;

j%100%10;

去掉小数部分

蓝桥杯不需要温度小数处理,况且你这小数处理是不对的,若想用小数,那就去网上看看人家怎么数值转换的



共5条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]