STM32使用红外测温

news2024/9/27 21:26:07

红外测温

文章目录

  • 红外测温
  • 前言
  • 一、原理
  • 二、STM32代码
    • 1.MLX90614.c
    • 2.MLX90614.h
  • 总结


前言

一、原理

红外测温的原理可以直接去看卖家的手册,手册多余的话太多了,知道他是IIC通信的就行了,
在这里插入图片描述
下面直接给出代码

二、STM32代码

1.MLX90614.c

#include "MLX90614.h"
#include "sys.h"
#include "delay.h"

u8 bit_in=0;
u8 bit_out=0;
u8 DataL;
u8 DataH;
u8 Pecreg;
/******************************************************************************
*                          Mlx90614_Init()
*
*Description : STM32外设以及传感器初始化
*Arguments   : none
*Returns     : none
*Notes       : PA5--MLX90614_SCL
               PA6--MLX90614_SDA
*******************************************************************************/
void Mlx90614_Init(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;	
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	 //使能PORTA口时钟 
	
 	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;				//PORTA5 推挽输出,速度50MHz
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		  
 	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 	GPIO_Init(GPIOA, &GPIO_InitStructure);
	GPIO_SetBits(GPIOA, GPIO_Pin_5);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;				//PORTA6 推挽输出,速度50MHz
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		  
 	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
}
/******************************************************************************
*                          start_bit()
*
*Description : STM32外设以及传感器初始化
*Arguments   : none
*Returns     : none
*Notes       : 开始位
*******************************************************************************/
void start_bit()
{
	GPIOA6_High; 
	delay_us(1); 
	GPIOA5_High; 
	delay_us(1); 
	GPIOA6_Low; 
    delay_us(1); 
    GPIOA5_Low; 
    delay_us(1); 
}
/******************************************************************************
*                          stop_bit()
*
*Description : STM32外设以及传感器初始化
*Arguments   : none
*Returns     : none
*Notes       : 开始位
*******************************************************************************/
void stop_bit()
{
   GPIOA5_Low; 
   delay_us(1); 
   GPIOA6_Low; 
   delay_us(1); 
   GPIOA5_High; 
   delay_us(1); 
   GPIOA6_High; 
}
/******************************************************************************
*                          send_bit()
*
*Description : STM32外设以及传感器初始化
*Arguments   : none
*Returns     : none
*Notes       : 发送一个字节
*******************************************************************************/
void send_bit(void) 
{ 
  if(bit_out==0) 
     GPIOA6_Low; 
  else 
     GPIOA6_High; 
  delay_us(1); 
  GPIOA5_High; 
  delay_us(1); 
  GPIOA5_Low; 
  delay_us(1);
} 
/******************************************************************************
*                          receive_bit()
*
*Description : STM32外设以及传感器初始化
*Arguments   : none
*Returns     : none
*Notes       : 接收一个位
*******************************************************************************/
void receive_bit(void) 
{ 
	GPIO_InitTypeDef  GPIO_InitStructure;
	
	 GPIOA6_High;
	 bit_in=1;
	 GPIOA5_High; 
	 delay_us(1);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 	//PORTA6 浮动输入,速度50MHz	  
 	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 	GPIO_Init(GPIOA, &GPIO_InitStructure);
	 
	  bit_in=SDA; 
	  delay_us(1);
	  GPIOA5_Low; 
	  delay_us(1); 
	
	//PORTA6 推挽输出,速度50MHz
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 	
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	
 	GPIO_Init(GPIOA, &GPIO_InitStructure);
} 
/******************************************************************************
*                          rx_byte()
*
*Description : STM32外设以及传感器初始化
*Arguments   : none
*Returns     : none
*Notes       : 接收一个字节
*******************************************************************************/
u8 rx_byte(void) 
{ 
  u8 i,dat; 
  dat=0; 
  for(i=0;i<8;i++) 
  { 
    dat=dat<<1; 
    receive_bit(); 
    if(bit_in==1)
	{
		dat=dat+1; 
	}		 
  } 
  send_bit(); 
  return dat; 
} 
/******************************************************************************
*                          tx_byte()
*
*Description : STM32外设以及传感器初始化
*Arguments   : none
*Returns     : none
*Notes       : 发送一个字节
*******************************************************************************/
void  tx_byte(u8 dat_byte) 
{ 
   char i,n,dat; 
   n=10; 
TX_again: 
   dat=dat_byte; 
   for(i=0;i<8;i++) 
   { 
     if(dat&0x80) 
      bit_out=1; 
     else 
      bit_out=0; 
     send_bit(); 
     dat=dat<<1; 
   } 
   
      receive_bit(); 
   if(bit_in==1) 
   { 
    stop_bit(); 
    if(n!=0) 
    {n--;goto Repeat;} 
    else 
     goto exit; 
   } 
   else 
    goto exit; 
Repeat: 
    start_bit(); 
    goto TX_again; 
exit: ; 
} 
/******************************************************************************
*                          memread()
*
*Description : STM32外设以及传感器初始化
*Arguments   : none
*Returns     : 温度
*Notes       : 读取温度
*******************************************************************************/
u16 memread(void) 
{ 
  start_bit(); 
 // tx_byte(0xB4);  //Send SlaveAddress ==============================
  tx_byte(0x00); 
  tx_byte(0x07);  //Send Command 
  //------------ 
  start_bit(); 
  tx_byte(0x01); 
  bit_out=0; 
  DataL=rx_byte(); 
  bit_out=0; 
  DataH=rx_byte(); 
  bit_out=1; 
  Pecreg=rx_byte(); 
  stop_bit(); 
  return(DataH*256+DataL); 
}

2.MLX90614.h

#ifndef __MLX90614_H
#define __MLX90614_H	 
#include "sys.h"

#define GPIOA5_High GPIO_SetBits(GPIOA, GPIO_Pin_5)
#define GPIOA5_Low  GPIO_ResetBits(GPIOA, GPIO_Pin_5)
#define GPIOA6_High GPIO_SetBits(GPIOA, GPIO_Pin_6)
#define GPIOA6_Low  GPIO_ResetBits(GPIOA, GPIO_Pin_6)

#define SDA GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_6)

//************ 函数声明*****************************************
void Mlx90614_Init(void);
void start_bit();
void stop_bit();
void send_bit(void);
void receive_bit(void);
u8 rx_byte(void);
void  tx_byte(u8 dat_byte);
u16 memread(void);
		 				    
#endif

主函数

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "MLX90614.h"
 int main(void)
 {
	u16 Tem;
	delay_init();	    	 //延时函数初始化	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
	uart_init(9600);	 //串口初始化为9600
	Mlx90614_Init();
 
	GPIOA5_High;
	GPIOA6_High;
	delay_us(1);
	GPIOA5_Low; 
	delay_ms(1000); 
	GPIOA5_High; 
	while(1)
	{
		Tem=memread(); 
		printf("温度是:"); 
		printf("%d",Tem); 
		printf("/n");
		delay_ms(1000);
	}
		 
}

这三段代码放到工程里然后可以通过串口打印温度,我是用显示屏显示的温度。
在这里插入图片描述

总结

其实搞懂了IIC对于这种IIC通信的模块写代码很容易。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/139796.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

synchronzied

synchronzied的作用 原子性&#xff1a;所谓原子性就是一个操作或者多个操作&#xff0c;要么全部执行并且执行的过程不会被任何因素打断&#xff0c;要么都不执行。被synchronzied修饰的类或对象的所有操作都是原子的&#xff0c;因为在执行之前必须先获得类或对象的锁、直到…

直播运营|如何打造可复制的直播增长闭环?

作为当下最热门的营销模式&#xff0c;直播带货对人员、场地及流程的把控等都提出了严格要求。而要提升直播运营、促成更高转化&#xff0c;直播复盘是关键的一环。 那么&#xff0c;直播后到底该如何高效复盘&#xff0c;为带货提效呢&#xff1f; 「帷幄开播 Whale Cast」新功…

_Linux 进程信号-基础篇

文章目录信号入门1. 生活角度2. Linux技术应用角度3. 知识小点4. 信号概念5. kill -l命令6. 信号处理常见方式产生信号1. 通过终端按键产生信号Core Dump2. 调用系统函数向进程发信号系统调用接口概述3. 由软件条件产生信号软件条件给进程发送信号概述4. 硬件异常产生信号理解除…

VS2012编译libjson库过程

下载libjson库 https://sourceforge.net/projects/libjson/ 最新版是2012-06-25的libjson_7.6.1.zip,大小为759.5 kB 解压缩包 由于是旧版本VS创建的项目,无法用新版VS直接打开项目编译了 使用VS2012新建一个Win32项目libjson 选择静态库,点完成 创建完成后项目列表 将l…

【Linux】-- 操作系统进程的状态

目录 描述进程-PCB 状态理论 Linux内核源代码的描述 R运行状态与S睡眠状态&#xff1a; 前台进程与后台进程 D磁盘休眠状态&#xff1a; T停止状态 X死亡状态 Z(zombie)-僵尸进程 僵尸进程的危害 进程状态总结 孤儿进程 进程优先级 Linux具体的优先级做法 PRI …

driftingblues6靶机(脏牛漏洞)

环境准备 靶机链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;463a 虚拟机网络链接模式&#xff1a;桥接模式 攻击机系统&#xff1a;kali linux 2021.1 信息收集 1.arp-scan -l 探测目标靶机 2.nmap -p- -A -T4 192.168.1.107 探测目标靶机开放端口和服务 …

Internet Download Manager2023稳定版下载器

Internet Download Manager&#xff08;简称IDM&#xff09; 是Windows平台老牌而功能强大的下载工具&#xff0c;一种将下载速度提高多达5倍。那如果想要使用这款软件&#xff0c;那就需要安装这款软件&#xff0c;如何正确的下载和安装呢&#xff1f;今天&#xff0c;小编就教…

【ES】 es | Elasticsearch 教程 | DSL命令 | 命令操作es

一、说明 1、通过kibana操作es 2、使用dsl命令操作es 3、需要已经安装es&#xff0c;必须 4、需要已经安装kibana&#xff0c;非必须 5、若是没有装kibana&#xff0c;可以用PostMan之类的请求工具 二、基础知识 1、Elasticsearch和RDBMS比较 说明1&#xff1a; es与传统关系数…

树莓派串口通信

文章目录一、树莓派串口介绍二、串口通信配置1.打开USART串口2.串口映射配置3.安装mini串口调试助手4. 解决打开ttyAMA0 时没有权限5.解决打开minicom串口助手的时候&#xff0c;键盘失灵一、树莓派串口介绍 树莓派4B一共包含两个串口&#xff0c;一个是硬件串口&#xff08;/…

LVGL学习笔记13 - 圆弧Arc

目录 1. Parts 2. 样式 2.1 旋转 2.3 设置角度范围 2.4 设置值范围 2.5 清除Knob显示 2.6 禁止点击调整值 2.7 修改圆环前景色 2.8 修改圆环背景色 2.9 修改圆弧末端形态 2.10 修改圆弧宽度 2.11 修改圆弧透明度 3. 事件 圆弧由背景和前景弧组成&#xff0c;通过lv_ar…

密码学_SHA-1

SHA-1&#xff08;Secure Hash Algorithm 1&#xff0c;安全散列算法1&#xff09;是一种密码散列函数&#xff0c;美国国家安全局设计&#xff0c;并由美国国家标准技术研究所&#xff08;NIST&#xff09;发布为联邦数据处理标准&#xff08;FIPS&#xff09;。SHA-1可以生成…

SpringCloud Netflix复习之Eureka

写作背景 SpringCloud Netflix作为SpringCloud第一代产品很经典&#xff0c;而且公司的老项目还在用SpringCloud Netflix的技术栈&#xff0c;有必要对SpringCloud Netflix的各种核心组件回归复习一下了。 本次复习的主角是微服务注册中心Eureka&#xff0c;本文的书写思路是五…

【大厂高频真题100题】《给表达式添加运算符》 真题练习第22题 持续更新~

给表达式添加运算符 给定一个仅包含数字 0-9 的字符串 num 和一个目标值整数 target ,在 num 的数字之间添加 二元 运算符(不是一元)+、- 或 * ,返回 所有 能够得到 target 的表达式。 注意,返回表达式中的操作数 不应该 包含前导零。 示例 1: 输入: num = "123&q…

innovus中的DanglingWire(悬垂线)的理解和处理

在innovus工具里边&#xff0c;用户经常会使用verifyConnectivity 来进行open &#xff0c;绕线完整性等问题的查验。对于绕线结果&#xff0c;尤其是PG绕线结果&#xff0c;使用这个命令可以很好的帮助用户在power planning阶段查验PG的闭合连接的状态&#xff08;在pg DB中使…

JavaScript 监听单个元素高宽变化MutationObserver

如果你只是想监听窗口大小变化 resize就能满足你 window.onresize () > {console.log("窗口变化"); };jqurey写法 $(window).resize(()>{console.log("窗口变化"); })但如果是要监听某一块元素 resize就不太适用了 例如 我们在界面上定义一个类名…

MATLAB-条形图、饼状图绘制

条形图 bar命令用于绘制二维的垂直条形图&#xff0c;用垂直的条形显示向量或者矩阵的值&#xff0c;可以显示矢量数据和矩阵数据。使用格式如下。bar( y) %为每一个y中元素画出条形 bar( x,y) %在指定的横坐标x上画出y,其中x为严格单增的…

49_IAP实验

目录 IAP介绍 一般的程序执行流程 IAP程序执行流程 实验源码&#xff1a; IAP介绍 STM32编程方式: 1.在线编程(ICP,In-Circuit Programming):通过JTAG/SWD协议或者系统加载程序(Bootloader)下载用户应用程序到微控制器中。 2.在程序中编程(IAP,In Application Programmi…

MySQL复制底层技术——LOGICAL_CLOCK并行复制、WRITESET并行复制

1. LOGICAL_CLOCK 并行复制 1&#xff0e;原理 从MySQL 5.7版本开始&#xff0c;支持LOGICAL_CLOCK级别的并行复制&#xff08;基于MySQL 5.6的库级别的Group Commit并行复制的大幅改进&#xff09;&#xff0c;通过设置参数slave_parallel_type为LOGICAL_CLOCK来启用&#x…

蓝桥杯STM32G431RBT6学习——工程建立

蓝桥杯STM32G431RBT6学习——工程建立 前言 我始终认为一边学习一边记录是最好的方式&#xff0c;一方面便知识的梳理&#xff0c;另一方面便于二次复习使用。最后一次参加蓝桥杯&#xff0c;希望能整个不错的成绩。–2023/1/4 准备工具 1、keil5 2、STM32G系列芯片包 3、S…

PostgreSQL在openEuler上本地yum不能安装而网络yum却可以的原因分析

作者&#xff1a;IT圈黎俊杰 PostgreSQL是国外著名的开源数据库&#xff0c;openEuler是国内的开源操作系统品牌&#xff0c;当前PostgreSQL对openEuler是没有适配认证的&#xff0c;PostgreSQL官方更不存在提供可直接在openEuler操作系统上安装的RPM软件包了。 在PostgreSQL官…