完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
int tmpget()//获取DS18B20温度 {
int temp; float tt;
dsreset();//复位与应答 tmpwritebyte(0xcc);//允许不通过匹配温度计编码直接操作(总线上只有一个DS18B20) tmpwritebyte(0xbe);//从暂存器中读取数据,第一字节为温度低8位,第二字节为温度高8位 tmp_L8=tmpreadbyte();//读取温度低8位 tmp_H8=tmpreadbyte();//读取温度高8位
temp=tmp_H8; temp=temp<<8; temp=temp | tmp_L8;//将高低8位都放入temp中
tt=temp*0.0625;//根据分辨率算出温度 temp=tt*100; return temp;//将高低8位温度处理后 返回从左往右第三位位为个位
}
void display(int temperature)//LCD温度显示函数 { uchar table_temp[4]; LCD_WRITE_COM(0x80);//从初始位开始显示 if(temperature<0) { LCD_WRITE_DATA('-');//负温度显示负 temperature*=-1;//将负温度转为正温度便于显示 } else LCD_WRITE_DATA('+');//负温度显示正
table_temp[0]=temperature/10000%10;//温度百位 table_temp[1]=temperature/1000%10;//温度十位 table_temp[2]=temperature/100%10;//温度个位 table_temp[3]=temperature/10%10;//温度小数点后第一位
if(table_temp[0]==0) { LCD_WRITE_DATA(' '); if(table_temp[1]==0) LCD_WRITE_DATA(' '); else LCD_WRITE_DATA(table_temp[1]+'0'); } else { LCD_WRITE_DATA(table_temp[0]+'0'); LCD_WRITE_DATA(table_temp[1]+'0'); }
LCD_WRITE_DATA(table_temp[2]+'0'); LCD_WRITE_DATA('.'); LCD_WRITE_DATA(table_temp[3]+'0'); LCD_WRITE_DATA(0xdf); LCD_WRITE_DATA('C'); }
|
|
相关推荐
14个回答
|
|
错误的温度是固定的
|
|
|
|
应该是数据计算时出错了,DS18B20的数据应该先区分正负,对于负数要先进行处理,就是取反再加一,然后才能计算温度值,另外可以显示DS18B20读出的原始数据,看看是不是读出来的数据就有变化
|
|
|
|
人中狼 发表于 2018-5-26 08:41 读出来的原始数据应该是对的,毕竟有一半显示是对的 按你说的将负数取反加一,结果之前异常的地方 编程)*+,-./0 8位变动了 if(tmp_H8==0xff) { temp=~temp+1; flag=0; } else flag=1; tt=temp*0.0625; temp=tt*10+0.5; return temp;//将高低8位温度处理后 返回从左往右第二位为个位 |
|
|
|
应该是
temp=tmp_H8; temp=temp<<8; temp=temp | tmp_L8;//将高低8位都放入temp中 if(temp < 0) { temp=~temp+1; flag=0; } else flag=1; tt=temp*0.0625; 是合并后的数值来判断正负 |
|
|
|
最好还是对比一下读出来的原始数据,再看看有没有例如中断程序等干扰了DS8B20的操作时序
|
|
|
|
去我的空间里,下载压缩吧,源代码+proteus。刚整出来,废了好几天功夫
|
|
|
|
去我的空间里,下载压缩吧,源代码+proteus。刚整出来,废了好几天功夫
|
|
|
|
去我的空间里,下载压缩吧,源代码+proteus。刚整出来,废了好几天功夫
|
|
|
|
没有加入中断程序 按你说的 将原始数据读出来 发现也是每8个温度错误 算出来也是错的 |
|
|
|
温度值 读出来合并高低8位 高8位后3位+低8位前5位 为温度整数
36 00000010 01000000 0100100 正确 37 00000010 01010000 0100101 正确 38 00000010 01100000 0100110 正确 39 00000010 01110000 0100111 正确 40 11111111 10000000 1111000 错误 41 11111111 10010000 1111001 错误 42 11111111 10100000 1111010 错误 43 11111111 10110000 1111011 错误 44 11111111 11000000 1111100 错误 45 11111111 11010000 1111101 错误 46 11111111 11100000 1111110 错误 47 11111111 11110000 1111111 错误 48 00000011 00000000 0110000 正确 49 00000011 00010000 0110001 正确 |
|
|
|
试试这样,在两个dsreset();后面加一点延时
int temp; float tt; dsreset(); tmpwritebyte(0xcc); tmpwritebyte(0x44); dsreset();//复位与应答 tmpwritebyte(0xcc);//允许不通过匹配温度计编码直接操作(总线上只有一个DS18B20) tmpwritebyte(0xbe);//从暂存器中读取数据,第一字节为温度低8位,第二字节为温度高8位 |
|
|
|
我看datasheet中有讲 如过用寄生电源 需要在初始化后延时480us 外接电源不用 我在dsrest()中加了800us延时 怕转换时间不够 又在dsrest()后加了100ms延时 发现 加不加对结果不影响 看这读出的高低8位 应该是在读出的时候就错了 40多的时候应该高8位的前5位不应该是1的 |
|
|
|
int temp;
char tmp_H8;//高8位温度 char tmp_L8;//低8位温度 temp=0x00; dsreset();//复位与应答 tmpwritebyte(0xcc);//允许不通过匹配温度计编码直接操作(总线上只有一个DS18B20) tmpwritebyte(0xbe);//从暂存器中读取数据,第一字节为温度低8位,第二字节为温度高8位 tmp_L8=tmpreadbyte();//读取温度低8位 tmp_H8=tmpreadbyte();//读取温度高8位 display_char(tmp_H8,0x80); display_char(tmp_L8,0x80+0x40); temp=tmp_H8; temp<<=8; temp|=tmp_L8;//将高低8位都放入temp中 display_int(temp,0x80); 基本上发现问题了 我在将两个高低位放在一起后 值就变了 display_char 和display_int 出来的两个数不同 |
|
|
|
我找出问题了 出在合并两个char为int那里 将A B合并成整形 char a,b; int num; num=a; num<<=8; num|=b;//错(实际等式 num= num + 0xff00 & b ) num|=(b&0x00ff);//对 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-LCD显示图片编程示例之介绍mmap
238 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第二章 常用的C语言知识点
629 浏览 0 评论
【RA-Eco-RA2E1-48PIN-V1.0开发板试用】(第三篇)ADC采集+PWM输出
552 浏览 0 评论
《DNK210使用指南 -CanMV版 V1.0》第四十五章 人脸识别实验
552 浏览 0 评论
1074 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11764 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-23 06:07 , Processed in 0.823488 second(s), Total 100, Slave 81 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号