DS18B20 crc 算法

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是基于C语言的DS18B20 CRC校验代码示例: ```c #include <stdio.h> #include <stdlib.h> #include <wiringPi.h> #define DS18B20_PIN 7 int ds18b20_reset() { int result; pinMode(DS18B20_PIN, OUTPUT); digitalWrite(DS18B20_PIN, LOW); delayMicroseconds(480); pinMode(DS18B20_PIN, INPUT); delayMicroseconds(80); result = digitalRead(DS18B20_PIN); delayMicroseconds(400); return result; } void ds18b20_write_bit(int bit) { pinMode(DS18B20_PIN, OUTPUT); digitalWrite(DS18B20_PIN, LOW); if (bit) delayMicroseconds(6); else delayMicroseconds(60); pinMode(DS18B20_PIN, INPUT); delayMicroseconds(10); } void ds18b20_write_byte(int byte) { int i; for (i = 0; i < 8; i++) { ds18b20_write_bit(byte & 1); byte >>= 1; } } int ds18b20_read_bit() { int result; pinMode(DS18B20_PIN, OUTPUT); digitalWrite(DS18B20_PIN, LOW); delayMicroseconds(2); pinMode(DS18B20_PIN, INPUT); delayMicroseconds(10); result = digitalRead(DS18B20_PIN); delayMicroseconds(48); return result; } int ds18b20_read_byte() { int i, result = 0; for (i = 0; i < 8; i++) { result >>= 1; if (ds18b20_read_bit()) result |= 0x80; } return result; } int ds18b20_crc_check(unsigned char *data, int len) { int i, j, crc = 0; for (i = 0; i < len; i++) { crc ^= data[i]; for (j = 0; j < 8; j++) { if (crc & 0x01) { crc = (crc >> 1) ^ 0x8C; } else { crc >>= 1; } } } return crc; } float ds18b20_read_temperature() { unsigned char data[9]; int temperature_l, temperature_h, crc; float temperature; ds18b20_reset(); ds18b20_write_byte(0xcc); ds18b20_write_byte(0x44); delay(800); ds18b20_reset(); ds18b20_write_byte(0xcc); ds18b20_write_byte(0xbe); data[0] = ds18b20_read_byte(); data[1] = ds18b20_read_byte(); data[2] = ds18b20_read_byte(); data[3] = ds18b20_read_byte(); data[4] = ds18b20_read_byte(); data[5] = ds18b20_read_byte(); data[6] = ds18b20_read_byte(); data[7] = ds18b20_read_byte(); data[8] = ds18b20_read_byte(); temperature_l = data[0]; temperature_h = data[1]; crc = ds18b20_crc_check(data, 8); if (crc != data[8]) { printf("CRC error!\n"); return -1.0; } temperature = (temperature_h << 8) + temperature_l; temperature *= 0.0625; return temperature; } int main(int argc, char **argv) { float temperature; wiringPiSetup(); temperature = ds18b20_read_temperature(); printf("Temperature: %.2f Celsius\n", temperature); return 0; } ``` 其中,ds18b20_crc_check() 函数用于计算CRC校验码,ds18b20_read_temperature() 函数读取温度数据和CRC校验码,并进行校验。在读取完数据和CRC校验码后,使用 ds18b20_crc_check() 函数计算CRC校验码,并与读取到的校验码进行比较,以判断读取的数据是否准确。如果CRC校验码不正确,则说明读取的数据存在错误。 需要注意的是,CRC校验码的计算方法是按位异或运算,具体细节可以参考DS18B20的数据手册。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值