完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 gtbestom 于 2014-5-1 23:34 编辑
最近闲来把18B20手册再继续读了一遍,发现原来没有完全发挥18B20的功能,以前都是直接装换读取12位精度温度值,今天好好研究了时序,把各个功能都调试出来。 这些都是对着时序一个一个写出来的,原创~ 首先是单个18B20读64位ROM序列号(读回8字节序列号): void DS18B20_ReadRom(u8 *t_rom) //单个18b20读64位ROM { if(!OneWire_Start()) { OneWire_Tx1B(DS18B20_READROM); t_rom[0] = OneWire_Rx1B(); t_rom[1] = OneWire_Rx1B(); t_rom[2] = OneWire_Rx1B(); t_rom[3] = OneWire_Rx1B(); t_rom[4] = OneWire_Rx1B(); t_rom[5] = OneWire_Rx1B(); t_rom[6] = OneWire_Rx1B(); t_rom[7] = OneWire_Rx1B(); } } 然后就是读全部寄存器的值(返回9字节数据): void DS18B20_ReadAll(u8 *dat) { if(!OneWire_Start()) { OneWire_Tx1B(DS18B20_SKIPROM); // 忽略ROM OneWire_Tx1B(DS18B20_READSCRATCHPAD); // 读寄存器 dat[0] = OneWire_Rx1B(); dat[1] = OneWire_Rx1B(); dat[2] = OneWire_Rx1B(); dat[3] = OneWire_Rx1B(); dat[4] = OneWire_Rx1B(); dat[5] = OneWire_Rx1B(); //Always 0xFF dat[6] = OneWire_Rx1B(); //Always 0x0C dat[7] = OneWire_Rx1B(); //Always 0x10 dat[8] = OneWire_Rx1B(); } } 对报警上下限值的设置以及设置转换精度: void DS18B20_Set(u8 t_TH,u8 t_TL,u8 accuracy) { u8 config_tem = 0; config_tem = accuracy << 5; if(!OneWire_Start()) { OneWire_Tx1B(DS18B20_SKIPROM); // 忽略ROM OneWire_Tx1B(DS18B20_WRITESCRATCHPAD); // 写寄存器 OneWire_Tx1B(t_TH); OneWire_Tx1B(t_TL); OneWire_Tx1B(config_tem); } } 开始转换温度: void DS18B20_Convert(void) { if(!OneWire_Start()) { OneWire_Tx1B(DS18B20_SKIPROM); // 忽略ROM OneWire_Tx1B(DS18B20_CONVERTT); // 读取寄存器 } } 计算读取的温度值(采用独特滴方法避免浮点数运算): s8 DS18B20_GetTemperature(u8 *Tem_Deci) { u8 Tem_L, Tem_H; s8 Tem_Int; s16 tem; if(!OneWire_Start()) { OneWire_Tx1B(DS18B20_SKIPROM); // 忽略ROM OneWire_Tx1B(DS18B20_READSCRATCHPAD); // 读取寄存器 Tem_L = OneWire_Rx1B(); // LSB Tem_H = OneWire_Rx1B(); // MSB tem = (Tem_H << 8) | Tem_L; } if(Tem_H & 0xF8) // ssss s654 前五位为符号位 { tem = -tem; //温度为负,取绝对值 Tem_Int = (u8)(tem >> 4); //取正整数部分 Tem_Int = -Tem_Int; //负温度值 *Tem_Deci= (u8)(((tem & 0x000F) * 25) >> 2); //取小数部分的100倍 (*16*25/4) } else { Tem_Int = (u8)(tem >> 4); //取整数部分 *Tem_Deci= (u8)(((tem & 0x000F) * 25) >> 2); //取小数部分的100倍 (*16*25/4) } return Tem_Int; } 先写到这里,先休息去啦,还有一些搜索算法和读温度报警,可能对大家也没什么用,有时间再贴咯... |
|
相关推荐
1 个讨论
|
|
只有小组成员才能发言,加入小组>>
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-23 15:59 , Processed in 0.642110 second(s), Total 46, Slave 35 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号