论坛» 高校专区» 坤创E-Geek/天科大新电社

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

菜鸟
2019-01-24 14:17 1楼

1548331566430103.jpg1548331566889290.jpg1548331566321317.jpg

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

代码如下

#include #include 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; } }

菜鸟
2019-01-24 16:53 2楼

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

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

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

菜鸟
2019-01-24 17:05 3楼

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

另外提两个建议:

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

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

高工
2019-01-24 17:08 4楼
是显示85吗?
菜鸟
2019-01-24 21:43 5楼

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

直接返回temp1值

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

j/100;

j%100/10;

j%100%10;

去掉小数部分

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


菜鸟
2020-06-15 07:35 6楼
请问你的是哪里出的问题,我现在也是同样的,显示到25之后就变为0.4了
共6条 1/1 1 跳转至

回复

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