单片机驱动LM75采集温度
多种型号单片机驱动LM75采集温度
- LM75简介
- 引脚说明
- 寄存器说明
- 测试程序
- arduino程序
- 89c51程序
- STM32程序
原文链接:https://www.yourcee.com/newsinfo/2928873.html
LM75简介
点击图片购买
LM75是一款使用了片上带片上带隙温度传感器和Sigma-delta数模转换技术的温度数字转换器,该器件还是一个热检测器
,可以提供过温检测输出的功能,模块使用I2C总线进行通信,有三个地址选择端口,因此可以最多可以同时有8个设备挂在同一总线上而不产生冲突
对于温度采集,LM75芯片内部以每100ms一次的频率进行温度转化将数据存储至温度寄存器当中,温度寄存器中始终存储这11位的补码数据,并提供了0.125℃的温度分辨率,温度采集之后无需在单片机上进行数据比较来判断温度是否达到阈值,其内置了可编程的阈值寄存器可在每次温度转换后进行比较在OS端口输出报警信号
下面我们将看到更多关于LM75模块的说明以及如果使用它,我们也准备了编写的代码以供测试使用。
引脚说明
引脚名称 | 功能说明 |
---|---|
VCC | 正电源端,2.8~5.5V |
GND | 地 |
SDA | I2C串行数据线 |
SCL | I2C串行时钟线 |
OS | 过热关断输出,开漏 |
A0、A1、A2 | 用户自定义地址引脚 |
寄存器说明
LM75采用IIC通信对内部寄存器进行读和写的操作,其IIC器件地址为1001xxx,xxx分别为 A2 、 A1 、 A0 引脚所连接的电平决定,LM75内部我们主要使用有四大寄存器,分别存储着配置信息(conf)、温度数据(temp)、报警温度(tos)以及迟滞温度值(thyst),如下表所示
配置寄存器中包含8个位。可读可写,地址01H,对应字节功能如下表所示
位7~位5 为保留给供应商使用,用户使用时应注意这几位的值需要保持为000,以便LM75的正常运行位4~位3 存储着故障队列的数据,保持不动就行,一般可以不用管位2 为报警极性选择,有HIGH和LOW,不过需要注意的是HIGH为开漏位1 为OS输出模式的选择,有中断输出和普通输出两种位0 可设置为关断模式,使用的时候配置为0
温度寄存器为只读寄存器,地址00H,存储这两个8位的温度数据,有效数据位为11位,因此有低5位为无效位
采集到的数据为二进制补码数据,有正负之分,因此需要注意温度进行转换计算时如果是负温度高位应为1
并且由于温度分辨率为0.125℃,在最终计算时需要将得到的温度数据x0.125才为实际给人看的温度数值,而非未转换或转换错误的数值,具体分配参照下表
报警寄存器与迟滞寄存器中都包含了两个8位的数据,与温度寄存器类似,这两个寄存器只有9位有效位,其中低7位无效
往其中写温度数据即可设定对应的报警温度或迟滞温度,需要注意的是这两个寄存器仅有9位会与温度寄存器中的数值进行比较,寄存器位分布可参照下表
参考下图手册中的报警温度和输出关系图表可以得知
在输出模式下,默认状态(低于设定的报警和迟滞温度)输出为开漏状态,可通过CONF寄存器设置OS默认的输出状态,这里为默认输出高电平
当温度上升至超过迟滞温度(thyst寄存器中的值),但未超过报警温度时,并不会触发报警信号输出,也就是说当OS引脚有上拉电阻的时候仍然会输出高电平
温度继续上升,直到超过了(tos寄存器中的值),此时触发温度报警,OS引脚输出信号从高电平变成低电平
报警之后开始降温处理,降温到温度低于报警温度报警并未解除,OS引脚仍然处于报警输出状态(这里为低电平)
当温度继续下降至迟滞温度以下时,报警解除
因此,我们设置的迟滞温度(thyst)一般都是需要低于报警温度的(tos)
测试程序
这个模块找了很久也没有找到比较合适的程序,索性自己写了几种单片机的测试程序作为资料供大家参考,有需要可以在下方留言邮箱
目前有写89C51,STM32,arduino,ESP32几种类型单片机的程序
arduino程序
我们先看到arduino的程序主函数代码,程序修改使用引脚以及地址修改LM75 LM75(18,19,0X48);
中的参数即可,库需要自行添加进去
#include "LM75.h"LM75 LM75(18,19,0X48);float temperature; //用来存储温度数据void setup() {// put your setup code here, to run once:Serial.begin(115200);while(LM75.init_LM75()){Serial.println("未检测到LM75,请检查接线!");}Serial.println("检测到LM75!");delay(500);LM75.write_Configuration(Comparator_output|Low_alert);LM75.write_Low_temperature_alarm(30);LM75.write_High_temperature_alarm(33);
}void loop() {// put your main code here, to run repeatedly:Serial.println(LM75.read_temperature()*0.125);delay(100);
}
上面调用的这些函数均可以在LM75.h
文件中看到相关的说明,以及使用的参数也在头部有定义,并且几款单片机使用的程序函数相同通用,直接调用即可,文件内容如下所示
#ifndef _LM75_H_
#define _LM75_H_#include <Arduino.h>
#include <softIIC.h>/*配置寄存器部分参数,寄存器地址0x01,可根据手册自行增加*/
#define Low_alert 0x00 //OS警报端口输出低电平有效
#define High_alert 0x04 //OS警报端口输出高电平有效#define Turn_off 0x01 //LM75进入关断模式
#define Turn_off 0x00 //LM75非关断模式#define Comparator_output 0x00 //比较器输出
#define Interrupt_output 0x02 //中断输出class LM75
{private:uint8_t _LM75SCL,_LM75SDA,_LM75IIC_address;public:/*定义SCL、SDA使用引脚*/LM75(uint8_t SCL,uint8_t SDA,uint8_t I2CAddress);/*初始化,上电判断LM75是否响应来确定LM75是否接入LM75接入返回0,未检测到返回1*/bool init_LM75(void);/*读取16位温度数据并返回温度值按照LM75手册说明获取到的数据需要乘0.125,该函数并未对此进行处理*/int read_temperature(void);/*写配置寄存器*/void write_Configuration(uint8_t Configuration_register);/*写低温报警寄存器,输入温度参数*/void write_Low_temperature_alarm(int Low_temperature_alarm);/*写高温报警寄存器,输入温度参数*/void write_High_temperature_alarm(int High_temperature_alarm);
};#endif
89c51程序
STC89C51单片机程序中的函数功能与上面的LM75.h
文件中相同,引脚定义在文件IIC.c
中,如下所示部分,移植过来的就没有做结构体之类的了
/*此处定义IIC通信使用引脚*/
sbit SCL=P1^0;
sbit SDA=P1^1;
51单片机驱动略有不同的地方是加入了1602显示温度数据,同样也做了串口输出的功能,不同于arduino的115200,这里的波特率使用9600,1602引脚定义如下
#define LCD P2
sbit E=P0^5;
sbit RS=P0^7;
sbit RW=P0^6;
sbit BF=P2^7;
接下来我们直接看到主函数部分
#include<LM75.h>
#include<1602.h>
#include<uart.h>unsigned char zhengshu,xiaoshu;int temperature;void main()
{init1602();delay(5);while(init_LM75()){noLM75();}shuoming();fuhao();xiaoshudian();wendudanwei();write_Configuration(Low_alert|Interrupt_output);write_Low_temperature_alarm(30);write_High_temperature_alarm(32);UsartInit();delay(5);while(1){temperature=read_temperature();xianshizhengshu(temperature/8);xianshixiaoshu(temperature%8);uart_send(temperature);delay(500);}
}
STM32程序
相比较于上面两款单片机程序,STM32程序略微复杂一点,使用STM32F103系列单片机,IIC使用引脚在文件softIIC.h
中,需要修改使用引脚时,程序时钟引脚等参数均需做出修改,不做过多说明,参考下面部分修改
#ifndef _SOFTIIC_H_
#define _SOFTIIC_H_#define SCL_1 GPIO_SetBits(Pin_group,SCL_Pin)
#define SCL_0 GPIO_ResetBits(Pin_group,SCL_Pin)#define SDA_1 GPIO_SetBits(Pin_group,SDA_Pin)
#define SDA_0 GPIO_ResetBits(Pin_group,SDA_Pin)#define read_SDA GPIO_ReadInputDataBit(Pin_group,SDA_Pin)/*定义使用引脚*/
#define SCL_Pin GPIO_Pin_6
#define SDA_Pin GPIO_Pin_7 /*定义引脚所在组*/
#define Pin_group GPIOB/*定义使用的时钟*/#define Pin_RCC RCC_APB2Periph_GPIOB
程序默认使用引脚是在PB6和PB7上面,串口通信使用串口1,波特率9600,main函数代码如下
int main(void)
{RCC_Configuration();GPIO_Configuration();USRAT_Configuration();NVIC_Configuration();while(LM75_init_LM75()){printf("%s","初始化失败,未检测到LM75\r\n");delay_ms(500);}printf("%s","初始化成功,检测到LM75\r\n");LM75_write_Configuration(Low_alert|Comparator_output);LM75_write_Low_temperature_alarm(30);LM75_write_High_temperature_alarm(32);delay_ms(500);while(1){float temperature;temperature=LM75_read_temperature()*0.125;printf("当前温度:%.2f\r\n",temperature);delay_ms(500);}
}
#总结
LM75是一款自带报警功能的芯片,芯片内仅有四个寄存器,配置简单,对于模块地址的修改,在模块背面有三个焊盘,默认是不焊接的,到手时需要根据自己需要的地址进行焊接,下面是接收到的数据,可自行修改代码数据输出格式
另外提供的程序中也有ESP32的驱动代码,有VS code和arduino两种开发环境代码,需要的朋友可留有邮箱,ESP32代码就不做过多说明了,与arduino代码基本一致,本文对于LM75的使用总结到此结束,欢迎小伙帮一键三连!!!
单片机驱动LM75采集温度相关推荐
- 8路巡回检测c语言程序,单片机驱动ds18b20四路温度巡回检测程序
#include "reg52.h"//头文件 #include "intrins.h" #define uchar unsigned char//宏定义 #d ...
- 51单片机驱动DS18B20温度传感器测量温度
51单片机驱动DS18B20温度传感器测量温度 1.DS18B20温度传感器介绍: 2.51单片机驱动DS18B20测量温度 1.DS18B20温度传感器介绍: ①引脚定义 引脚 符号 说明 1 GN ...
- 用STM32单片机ADC+NTC热敏电阻采集温度的设计思路 | 附参考电路
目录 前言 一.热敏电阻NTC 二.参考电路 三.激励电压选择 前言 记录一些我在工作和学习过程中遇到的问题 NTC:在淘宝随便买的 单片机型号:STM32G030C8T6 目的:用单片机采集NTC温 ...
- c语言编程TLC2543AD采集,51单片机驱动12位AD转换TLC2543电路图+程序
51单片机驱动12位AD转换TLC2543电路图+程序 2015-06-18 16:51:15 来源:51hei void resultvolt() { volt=volt*5000.0/4334 ...
- 51单片机驱动——LCD1602
51单片机驱动--LCD1602 1.描述 51单片机控制LCD1602屏幕显示测量数据.固定字符串等,大家复制过去可以直接使用,相关注释我已标明. 2.子文件 LCD1602.c #include ...
- 基于PC与单片机串口通信的温度监控系统程序设计
基于PC与单片机串口通信的温度监控系统程序设计 1.系统介绍 1)本系统主要讲解基于PC与单片机串口通信的温度监控系统程序设计(如图1),上位机采用常用的PC机,下位机使用的是STC89C52单片机, ...
- 基于单片机声音分贝采集和显示控制系统设计(毕业设计资料)
016[毕设课设]基于单片机声音分贝采集和显示控制系统设计,实时检测声音分贝大小,并可以通过手动设定分贝报警范围,当超过设定范围时则发生声光报警.包括的电路有声光报警电路,传感器采集电路,显示电路,温 ...
- 如何用stc单片机内部ad采集多路交流信号
用stc单片机内部ad采集多路交流信号,有两种办法: 一.用两个AD转换芯片,两路模拟量分别接一个.用单片机控制两个AD芯片同时启动转换,这样基本可以实现采集到同一时刻的两路模拟量值. 二.用两个采样 ...
- 51单片机驱动AHT10温湿度传感器
51单片机驱动AHT10温湿度传感器 AHT10温湿度传感器 AHT10参数 工作原理 数据转换 驱动 接线 驱动代码 实验结果 AHT10温湿度传感器 AHT10是新一代温湿度传感器,传感器输出经过 ...
最新文章
- instanceOf,isInstance,Class,isAssignableFrom区别比较
- R语言ggplot2可视化抑制(部分)图例(legend)输出实战:抑制颜色图例输出、保留数据点形状图例输出
- 六项任务、多种数据类型,谷歌、DeepMind提出高效Transformer评估基准
- 为什么java线程池的submit的不抛出异常
- js 判断多个关键词_2020关键词优化,做好这三点效果立现!
- 一篇不错的讲解Java异常的文章(转载)
- C++中引用()基础认识
- 民国大学教授收入有多高?
- Java8的产品周期_java8的时间和`Date`的对比
- React 第十二章 React思想
- NHibernate :何必到处都virtual
- (摘要)100个伟大的商业理念:理念35:引爆流行
- 我今天学习的技术,明天会不会一钱不值
- bert模型使用记录
- ITU-R BT.709
- 【统计学】利用spss正态分布假定检验 S-W检验 K-S检验 直方图 Q-Q图
- python设计报告的前言怎么写_前 言_Python语言程序设计_红黑联盟读书频道
- ZOHO企业邮箱教程(试用30/15天)
- c c++ 信息服务查询服务器
- 【MySQL】测试题02