当前位置: 首页 > java >正文

C51:用DS18B20传感器读取温度

工作原理:51单片机是通过DS18B20温度传感器,并且基于onewire协议来读取温度数据的

下面是onewire协议的原理图:


在onewire.c文件中,已经包含了init_DS18B20(DS18B20设备初始化),Write_DS18B20(向DS18B20写一个字节)和,Read_DS18B20(从DS18B20读取一个字节)函数了,我们要做的就是根据这些函数,编写一个读取温度的函数。

程序流程:

1.初始化(init_DS18B20)——>跳过ROM(0xcc)——>转换温度(0x44)

2.初始化(init_DS18B20)——>跳过ROM(0xcc)——>读取暂存器(0xbe)——>调用两次Read_DS18B20(先读低位,再读高位)

注意:

官方提供的延时函数不太准确,需要扩大延时12倍,否则无法读到准确的温度


以下是修改过后的onewire.c源文件源码:

sbit DQ = P1^4;  //修改过后的延时函数
void Delay_OneWire(unsigned int t)  
{t = t * 12;while(t--);
}void Write_DS18B20(unsigned char dat)
{unsigned char i;for(i=0;i<8;i++){DQ = 0;DQ = dat&0x01;Delay_OneWire(5);DQ = 1;dat >>= 1;}Delay_OneWire(5);
}unsigned char Read_DS18B20(void)
{unsigned char i;unsigned char dat;for(i=0;i<8;i++){DQ = 0;dat >>= 1;DQ = 1;if(DQ){dat |= 0x80;}	    Delay_OneWire(5);}return dat;
}bit init_ds18b20(void)
{bit initflag = 0;DQ = 1;Delay_OneWire(12);DQ = 0;Delay_OneWire(80);DQ = 1;Delay_OneWire(10); initflag = DQ;     Delay_OneWire(5);return initflag;
}

读取温度函数原型如下,注意:需要把Read_Temperature()函数放在onewire.c文件中

float Read_Temperature(void)
{float temp_return;unsigned char low,high; //用于储存温度值init_ds18b20();Write_DS18B20(0xcc); 		Write_DS18B20(0x44); 		//不加上Delay软件延时,防止阻塞程序。等待温度转换完成,直接去读取暂存器	init_ds18b20();Write_DS18B20(0xcc); 		Write_DS18B20(0xbe); 		low = Read_DS18B20();		//读取温度低8位数据high = Read_DS18B20();		//读取温度高8位数据temp_return = (high<<8|low)*0.0625;return temp_return;
}

 程序示例:

unsigned char temperature;
unsigned char cnt_temp;
void Read_DS18B20(void)
{if(cnt_temp>=100)  //每0.1s读取一次温度{cnt_temp=0;temperature=(unsigned char)Read_Temperature(); //这里使用强制类型转换,使读到的温度是整数}
}void Timer2_ISR(void) interrupt 12
{cnt_temp++;
}

这里可以根据读到的温度,进行各种操作,比如在数码管上显示温度等等。

http://www.xdnf.cn/news/16151.html

相关文章:

  • 如何将拥有的域名自定义链接到我的世界服务器(Minecraft服务器)
  • 【Rust线程】Rust高并发编程之线程原理解析与应用实战
  • 【unity游戏开发入门到精通——组件篇】unity的粒子系统力场 (Particle System Force Field)实现如旋风、吸引力、风吹效果等
  • 数据库垂直拆分和水平拆分
  • 【​I2S:芯片设计中的“音频桥梁”​】
  • Android Service 全解析:从基础原理到实战优化
  • Windows11 本地安装docker Desktop 部署dify 拉取镜像报错
  • 【DataWhale】快乐学习大模型 | 202507,Task06笔记
  • 游戏装备被盗,运营商赔不赔
  • Petalinux的常用指令
  • 【Linux | 网络】应用层(HTTPS)
  • Python 程序设计讲义(7):Python 的基本数据类型——整数类型
  • Linux 或者 Ubuntu 离线安装 ollama
  • Paimon的部分更新以及DeleteVector实现
  • 使用阿里云 ESA 边缘函数转发代理 docker registry
  • Vue TodoList案例
  • day060-zabbix监控各种客户端
  • Android网络请求,Retrofit,OKHttp学习
  • 在AI深度嵌入企业业务的当下——AI时代的融合数据库
  • 【Vue3】ECharts图表案例
  • 跟著Qcadoo MES系统学习产品设计001
  • [CH582M入门第十步]蓝牙从机
  • Redis的key过期策略
  • 基于多种机器学习的水质污染及安全预测分析系统的设计与实现【随机森林、XGBoost、LightGBM、SMOTE、贝叶斯优化】
  • 【前沿技术动态】【AI总结】RustFS:从 0 到 1 打造下一代分布式对象存储
  • Linux网络-------1.socket编程基础---(UDP-socket)
  • 基于Tornado的WebSocket实时聊天系统:从零到一构建与解析
  • Zookeeper学习专栏(八):使用高级客户端库Apache Curator
  • 《计算机网络》实验报告七 HTTP协议分析与测量
  • Qwen3-Code-480B-A35B-instruct模型开源当天“舆情分析”