/** * @ Author: Yifan Chen * @ Create Time: 2024-06-13 09:04:07 * @ Modified by: Yifan Chen * @ Modified time: 2024-06-13 15:03:03 * @ Description: */ #include "ds18b20.h" #include extern void ds18b20_io_out(unsigned char ch); extern void ds18b20_write(unsigned char ch, unsigned char value); extern unsigned char ds18b20_read(unsigned char ch); __attribute__((weak)) void delay_us(unsigned int us) { for (volatile int i = 0; i < us; i++) { for (volatile int j = 0; j < 13; j++) { ; } } } /* 向DS18B20写入数据 */ void ds18b20_write_data(unsigned char ch, unsigned char byte) { unsigned char tempIndex, tempData; // ds18b20_io_out(ch); for (tempIndex = 1; tempIndex <= 8; tempIndex++) { tempData = (byte & 0x01); byte >>= 1; if (tempData == 1) { ds18b20_write(ch, 0); // 低电平 delay_us(2); ds18b20_write(ch, 1); // 高电平 delay_us(60); // 延时60us } else { ds18b20_write(ch, 0); // 低电平 delay_us(60); // 延时60us ds18b20_write(ch, 1); // 高电平 delay_us(2); } } } /* 读取DS18B20一位数据 */ unsigned char ds18b20_read_bit(unsigned char ch) { unsigned char data = 0; ds18b20_write(ch, 0); // 低电平 delay_us(2); ds18b20_write(ch, 1); // 高电平 delay_us(15); data = ds18b20_read(ch); // ds18b20_io_out(ch); // 设置为输出 ds18b20_write(ch, 1); // 高电平 delay_us(45); return data; } /* 读取DS18B20的数据 */ unsigned char ds18b20_read_data(unsigned char ch) { unsigned char i, j, data = 0; for (i = 1; i <= 8; i++) { j = ds18b20_read_bit(ch); data = (j << 7) | (data >> 1); } return data; } /** * return 0 : rst success return 1 : rst failure */ char ds18b20_rst(unsigned char io) { // ds18b20_io_out(io); ds18b20_write(io, 0); delay_us(480); ds18b20_write(io, 1); delay_us(120); unsigned char val = ds18b20_read(io); // ds18b20_io_out(io); ds18b20_write(io, 1); delay_us(360); return val; } float ds18b20_read_temp(unsigned char ch) { unsigned short temp = 0; ds18b20_rst(ch); ds18b20_write_data(ch, 0xcc); ds18b20_write_data(ch, 0xbe); delay_us(1000); temp = ds18b20_read_data(ch); temp |= (ds18b20_read_data(ch) << 8); float temp_f = 0.0625 * (float)temp; return temp_f; } void ds18b20_start_convert(unsigned char ch) { ds18b20_rst(ch); ds18b20_write_data(ch, 0xcc); ds18b20_write_data(ch, 0x44); } void ds18b20_io_init(unsigned char ch) { ds18b20_io_out(ch); ds18b20_write(ch, 1); }