红外测温


前言

一、原理

红外测温的原理可以直接去看卖家的手册,手册多余的话太多了,知道他是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通信的模块写代码很容易。