做网站的费用如何入账系统app定制开发
2026/5/21 10:27:13 网站建设 项目流程
做网站的费用如何入账,系统app定制开发,win10 网站建设软件,建站做网站DS18B20单线数字温度采集 一、DS18B20核心特性与硬件基础 1. 关键参数#xff08;必记#xff01;#xff09;参数规格细节测量量程-55℃ ~ 125℃#xff08;工业级场景全覆盖#xff09;测量精度-10℃~85℃范围内0.5℃#xff0c;全量程误差≤2℃分辨率9~12位可调#…DS18B20单线数字温度采集一、DS18B20核心特性与硬件基础1. 关键参数必记参数规格细节测量量程-55℃ ~ 125℃工业级场景全覆盖测量精度-10℃~85℃范围内±0.5℃全量程误差≤±2℃分辨率9~12位可调默认12位9位0.5℃、10位0.25℃、11位0.125℃、12位0.0625℃工作电压3V~5.5V兼容51单片机3.3V/5V供电无需额外稳压通信接口GPIO单线总线仅需1根I/O引脚GND硬件成本极低核心优势无需外部元件、抗干扰强、支持多传感器组网、掉电保留配置2. 引脚定义与接线方式DS18B20采用TO-92封装共3个引脚51单片机接线如下DS18B20引脚功能51单片机连接方式VDD电源引脚接3.3V/5V外部电源模式或悬空寄生电源模式DQ数据I/O接任意GPIO引脚本文代码用P3.7 4.7KΩ上拉电阻GND地接单片机GND必须共地否则信号干扰关键提醒单线总线必须串联4.7KΩ上拉电阻确保总线空闲时为高电平通信稳定。二、DS18B20核心时序原理通信关键DS18B20的通信依赖严格的时序协议所有操作复位、写数据、读数据都需遵循单线总线的时序规则这是采集成功的核心。1. 复位时序初始化所有通信必须从复位开始流程如下主机51单片机拉低总线≥480μs复位脉冲主机释放总线拉高后切换为输入模式DS18B20检测到上升沿后延迟15~60μs拉低总线60~240μs存在脉冲告知主机“已就绪”DS18B20释放总线恢复高电平进入空闲状态。代码对应ds18b20_reset()函数中通过Delay10us(70)实现700μs复位拉低Delay10us(6)等待存在脉冲。2. 写时序主机→DS18B20主机通过不同的低电平时长传递“0”或“1”每次仅发送1位8位为1字节LSB优先写0拉低总线≥60μs→ 释放总线拉高DS18B20在60μs内采样低电平视为“0”写1拉低总线1~15μs→ 释放总线拉高DS18B20采样到高电平视为“1”两次写操作间隔 ≥1μs恢复时间。代码对应write_ds18b20()函数中dat1判断当前位短延时对应写1长延时对应写0。3. 读时序DS18B20→主机主机先拉低总线触发读操作再释放总线由DS18B20控制总线电平流程如下主机拉低总线≥1μs→ 立即释放总线拉高主机在拉低后15μs内采样总线电平高1低0单次读操作时长 ≥60μs两次读间隔 ≥1μs。代码对应read_ds18b20()函数中拉低后快速释放通过DQ_CHECK检测电平存入dat对应位。三、核心命令解析DS18B20操作灵魂DS18B20通过主机发送的8位命令执行对应操作本文代码用到3个核心命令命令字节命令名称功能说明0xCCSkip ROM跳过ROM无需读取DS18B20的唯一64位ROM编码直接进入功能操作单传感器场景首选节省时间0x44Convert T温度转换启动一次温度测量转换时间与分辨率相关12位约750ms转换期间总线需保持高电平0xBERead Scratchpad读暂存器读取DS18B20内部暂存器数据共9字节前2字节为温度数据扩展多传感器组网时需用0x55Match ROM命令64位ROM编码定位目标传感器。四、51单片机代码完整解析代码基于P3.7引脚实现分“复位→测温→读数→数据解析”四大步骤可直接编译下载使用。1. 头文件与宏定义ds18b20.h#ifndef__DS18B20_H__#define__DS18B20_H__#includereg51.h// 函数声明intds18b20_reset(void);// 复位DS18B20voidwrite_ds18b20(unsignedchardat);// 写1字节到DS18B20unsignedcharread_ds18b20(void);// 从DS18B20读1字节floatget_temp(void);// 获取温度值返回浮点型#endif2. 核心功能实现ds18b20.c#includereg51.h#includeintrins.h#includeds18b20.h#includedelay.h// 宏定义P3.7作为DQ引脚#defineDQ_DOWN(P3~(17))// 拉低DQ#defineDQ_HIGH(P3|(17))// 拉高DQ#defineDQ_CHECK((P3(17))!0)// 检测DQ电平/** * brief DS18B20复位初始化 * retval 1-复位成功0-复位失败 */intds18b20_reset(void){intt0;// 1. 发送复位脉冲拉低≥480μsDQ_DOWN;Delay10us(70);// 70×10μs700μs满足≥480μs要求DQ_HIGH;// 释放总线Delay10us(6);// 等待60μs准备接收存在脉冲// 2. 检测存在脉冲DS18B20拉低总线while(DQ_CHECKt30)// 超时300μs未检测到低电平→失败{Delay10us(1);t;}if(t30)return0;// 复位失败// 3. 等待存在脉冲结束DS18B20拉高总线t0;while(!DQ_CHECKt30)// 超时300μs未拉高→失败{Delay10us(1);t;}if(t30)return0;// 复位失败return1;// 复位成功}/** * brief 向DS18B20写1字节数据LSB优先 * param dat要发送的字节 */voidwrite_ds18b20(unsignedchardat){inti0;for(i0;i8;i)// 循环8次每次写1位{if(dat1)// 写1拉低1~15μs{DQ_DOWN;_nop_();// 短延时约1μs_nop_();DQ_HIGH;// 释放总线Delay10us(5);// 等待45μs确保DS18B20采样}else// 写0拉低≥60μs{DQ_DOWN;Delay10us(6);// 60μsDQ_HIGH;// 释放总线}dat1;// 右移1位准备写下一位LSB优先}}/** * brief 从DS18B20读1字节数据LSB优先 * retval 读取到的字节 */unsignedcharread_ds18b20(void){unsignedchardat0;inti0;for(i0;i8;i)// 循环8次每次读1位{DQ_DOWN;// 拉低≥1μs触发读操作_nop_();_nop_();DQ_HIGH;// 释放总线由DS18B20控制电平_nop_();_nop_();_nop_();// 延时约3μs准备采样if(DQ_CHECK)// 采样电平高1低0{dat|(1i);// 存入对应位LSB优先}Delay10us(6);// 单次读操作≥60μs}returndat;}/** * brief 获取温度值 * retval 浮点型温度精度0.0625℃ */floatget_temp(void){unsignedchartl0;// 温度低字节LSBunsignedcharth0;// 温度高字节MSB含符号位shortt0;// 组合后的16位温度数据// 1. 复位→跳过ROM→启动温度转换if(ds18b20_reset()0)return-99.9;// 复位失败返回错误值write_ds18b20(0xCC);// 跳过ROM单传感器write_ds18b20(0x44);// 启动温度转换Delay1ms(1000);// 等待转换完成12位分辨率需750ms以上// 2. 复位→跳过ROM→读暂存器ds18b20_reset();write_ds18b20(0xCC);// 跳过ROMwrite_ds18b20(0xBE);// 读暂存器// 3. 读取温度数据前2字节为温度值LSB先读tlread_ds18b20();// 低字节thread_ds18b20();// 高字节// 4. 组合温度数据16位带符号补码tth8;// 高字节左移8位t|tl;// 拼接低字节// 5. 温度换算12位分辨率→1LSB0.0625℃returnt*0.0625;}3. 延时函数支持delay.c/hDS18B20时序对延时精度要求高需实现10μs、1ms级延时11.0592MHz晶振// delay.h#ifndef__DELAY_H__#define__DELAY_H__voidDelay10us(unsignedintn);voidDelay1ms(unsignedintn);#endif// delay.c#includereg51.hvoidDelay10us(unsignedintn){unsignedinti,j;for(in;i0;i--)for(j2;j0;j--);// 11.0592MHz下≈10μs}voidDelay1ms(unsignedintn){unsignedinti,j;for(in;i0;i--)for(j110;j0;j--);// 11.0592MHz下≈1ms}4. 主函数调用示例main.c#includereg51.h#includeds18b20.h#includeuart.h// 假设已实现串口发送函数voidmain(void){floattemp;uart_init();// 初始化串口用于打印温度while(1){tempget_temp();// 获取温度if(temp!-99.9)// 采集成功{// 串口打印温度需实现浮点型转字符串函数此处省略uart_sendstr(当前温度);// 示例打印整数部分小数部分}Delay1ms(2000);// 每2秒采集一次}}五、实战关键注意事项上拉电阻不可少4.7KΩ上拉电阻是单线总线稳定通信的核心缺少会导致复位失败、数据传输错误延时精度要达标时序中的时间参数如复位480μs、写0 60μs需严格匹配延时误差过大会导致采集失败温度转换需等待启动转换0x44命令后必须等待足够时间12位分辨率≥750ms否则读取到的是旧数据寄生电源模式注意若DS18B20采用寄生电源VDD悬空转换期间总线需保持高电平不能进行其他操作多传感器组网需使用0x55Match ROM命令传感器唯一64位ROM编码避免数据冲突。六、温度数据解析原理DS18B20的温度数据以16位带符号补码形式存储格式如下位15MSB位14-11位10-4位3-0LSB符号位0正1负整数部分小数部分小数部分12位分辨率正数直接按“整数部分×1 小数部分×0.0625”换算负数按补码规则转换取反1后再换算符号为负示例温度25.5℃→二进制00000000 00011001.1000→十六进制0x00198→换算为25 8×0.062525.5℃。总结DS18B20的核心优势在于“单线通信极简硬件”学习重点集中在时序协议和命令解析复位是通信前提写/读时序是数据传输基础温度转换和读暂存器命令是核心操作。掌握本文代码和原理后可轻松扩展多传感器组网、温度报警利用TH/TL寄存器、串口上传温度等功能适用于环境监测、设备温控等嵌入式场景。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询