完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
|
void tmrtemp (void) //读取温度
{ unsigned char a,b; tmreset (); //复位 dmsec (1); //延时 tmwbyte (0xcc); //跳过序列号命令 tmwbyte (0xbe); //发送读取命令 a = tmrbyte (); //读取低位温度 b = tmrbyte (); //读取高位温度 if(b>0x7f) //最高位为1 时温度是负 { a=~a; b=~b+1; //补码转换,取反加一 fg=0; //读取温度为负时fg=0 } sdata = a/16+b*16; //整数部分 求解 这部分转换原理? xiaoshu1 = (a&0x0f)*10/16; //小数第一位 xiaoshu2 = (a&0x0f)*100/16%10;//小数 xiaoshu=xiaoshu1*10+xiaoshu2; //小数 |
|
相关推荐
5个回答
|
|
|
怎么了,这代码没有问题啊
|
|
|
|
|
|
datasheet 说的是读取的数据乘以它的精度 为什么这里这么算?是不是元器件匹配的算法 sdata = a/16+b*16; //整数部分 xiaoshu1 = (a&0x0f)*10/16; //小数第一位 xiaoshu2 = (a&0x0f)*100/16%10;//小数 xiaoshu=xiaoshu1*10+xiaoshu2; //小数 |
|
|
|
|
|
本帖最后由 me860 于 2014-5-24 01:03 编辑
现学现卖下,为啥他要 除16 或 乘16 而不是直接乘以他的精度(真正需要乘以0.0625的只有后4位二进制数),这样做是为了提高计算速度(为啥慢可以百度 单片机 浮点运算),这个0.0625=1/16 ,在这里a为低8位,b为高八位,对于整数的求解,举个例子 0000 0101(b) 0101 1000(a) 根据datasheet可知a的低4位为小数部分,a的高4位和b的低4位为整数部分,对于a的低4位对于这次求解没有用处,可以用a/16的方法来去低4位(a >>= 4 右移4位 等效于a/16) a=5,b*16=80 sdata = a/16+b*16 即85(主要用的二进制转十六进制的算法) 小数部分,a&0xf = 0000 1000 同上(1000 )*0.0625等效于(1000 )/16 1000转成10进制为8 即结果为0.5 xiaoshu1 = (a&0x0f)*10/16; 结果就是5 这个if(b>0x7f) //最高位为1 时温度是负 { a=~a; b=~b+1; //补码转换,取反加一(楼主自己查一下补码转原码的方法,会发现这是错的(应该是~ba +1),当温度为零下时就会出错) fg=0; //读取温度为负时fg=0 } 给LZ个地址,里面最后有18B20的程序,写的很好(我就是参考的里面 作者)http://wenku.baidu.com/link?url= ... gpn5jtsEGXvIEi1pwOG |
|
|
|
|
|
我来学习的 支持了
|
|
|
|
|
|
你先看一下它的数据是怎样保存的就知道知道他是怎样操作的了。
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
265 浏览 0 评论
【原创】【RA4M2-SENSOR开发板评测】低功耗+USB综合测试
789 浏览 0 评论
1306 浏览 2 评论
787 浏览 0 评论
【RA4M2-SENSOR开发板评测】Analogue+Timers综合测试
1587 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
16901 浏览 31 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 04:01 , Processed in 0.644509 second(s), Total 46, Slave 39 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
1493