找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6369|回复: 5
收起左侧

基于STM32f103的红外测温仪程序(测温模块MLX90614,芯片GY906)

  [复制链接]
ID:587076 发表于 2020-9-22 09:23 | 显示全部楼层 |阅读模式
之前集训要求做的红外测温仪,采用STM32F103系列作为主控,利用MLX90614采集温度,配以OLED显示以及flash存储数据(5个).
请不要问我要电路图,一是没时间,二是程序源码里面对每个模块接哪个IO口都是可以看见的,电子设计是灵活的.
下面贴出部分源码,完整程序的压缩包在附件.

单片机源程序如下:
gy906_gpio.h

#ifndef __GY906_GPIO_H_
#define __GY906_GPIO_H_

#include <inttypes.h>


#define macI2C_WR        0                /* 写控制bit */
#define macI2C_RD        1                /* 读控制bit */


/* 定义I2C总线连接的GPIO端口,用户只需要修改下面四行代码就可以任意改变SCL,SDA的引脚 */
#define macGPIO_PORT_I2C        GPIOB                        /* GPIO端口 */
#define macRCC_I2C_PORT         RCC_APB2Periph_GPIOB                /* GPIO时钟 */
#define macI2C_SCL_PIN                GPIO_Pin_9                        /* 连接到SCL时钟线的GPIO */
#define macI2C_SDA_PIN                GPIO_Pin_8                        /*连接到SDA时钟线的GPIO */


/* 定义读写SCL,SDA的宏,以便增加代码的可移植性和可阅读性 */
#if 0        /*条件编译:选择GPIO的库函数实现IO读写 */
        #define macI2C_SCL_1()  GPIO_SetBits(macGPIO_PORT_I2C, macI2C_SCL_PIN)                /* SCL = 1 */
        #define macI2C_SCL_0()  GPIO_ResetBits(macGPIO_PORT_I2C, macI2C_SCL_PIN)                /* SCL = 0 */
        
        #define macI2C_SDA_1()  GPIO_SetBits(macGPIO_PORT_I2C, macI2C_SDA_PIN)                /* SDA = 1 */
        #define macI2C_SDA_0()  GPIO_ResetBits(macGPIO_PORT_I2C, macI2C_SDA_PIN)                /* SDA = 0 */
        
        #define macI2C_SDA_READ()  GPIO_ReadInputDataBit(macGPIO_PORT_I2C, macI2C_SDA_PIN)        /* ¶áSDA¿úÏß×′ì¬ */
#else
        #define macI2C_SCL_1()  macGPIO_PORT_I2C->BSRR = macI2C_SCL_PIN                                /* SCL = 1 */
        #define macI2C_SCL_0()  macGPIO_PORT_I2C->BRR = macI2C_SCL_PIN                                /* SCL = 0 */
        
        #define macI2C_SDA_1()  macGPIO_PORT_I2C->BSRR = macI2C_SDA_PIN                                /* SDA = 1 */
        #define macI2C_SDA_0()  macGPIO_PORT_I2C->BRR = macI2C_SDA_PIN                                /* SDA = 0 */
        
        #define macI2C_SDA_READ()  ((macGPIO_PORT_I2C->IDR & macI2C_SDA_PIN) != 0)        /* 读写SDA口状态 */
#endif


void i2c_Start(void);
void i2c_Stop(void);
void i2c_SendByte(uint8_t _ucByte);
uint8_t i2c_ReadByte(void);
uint8_t i2c_WaitAck(void);
void i2c_Ack(void);
void i2c_NAck(void);
uint8_t i2c_CheckDevice(uint8_t _Address);

#endif

全部资料51hei下载地址 红外测温+显示+存储+按键控制:
测温.7z (205.15 KB, 下载次数: 540)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:423533 发表于 2021-1-20 19:17 | 显示全部楼层
太谢谢楼主的分享了。。。很实用
回复

使用道具 举报

ID:888976 发表于 2021-3-6 14:39 | 显示全部楼层
正在学习红外测温,谢谢。
回复

使用道具 举报

ID:888976 发表于 2021-3-6 14:40 | 显示全部楼层
谢谢楼主的分享了,好好下来学习。
回复

使用道具 举报

ID:756163 发表于 2021-4-25 04:27 | 显示全部楼层
亲爱的楼主 为啥我测出来的温度是276.29 就不会改变了呢
回复

使用道具 举报

ID:208271 发表于 2023-4-16 16:22 | 显示全部楼层
谢谢楼主,已测试可用。楼主程序里是通过外部中断,按键触发测量的,所以可以把测温程序从外部中断放到main里,就可以直接看到数据了。这时提取出来,测试没问题,温度需要自己加补偿
        while(1)
        {
                DelayMs(1000);
                tt=get_temperature();
                OLED_ShowCN(0,0,0);
                OLED_ShowCN(17,0,1);
                OLED_ShowStr(34,0,": ",2);
                OLED_ShowNum(50,0,change(tt)+3.14,2);//加3.14是因为我没有聚集棱镜所以辐射无法聚集导致测温有误差属于修正误差的额外加值(可以自己修改)
                if(change(tt)<32.86||change(tt)>34.16)//不正常警告
                        {
                                OLED_ShowCN(0,6,7);
              OLED_ShowCN(17,6,0);
                                OLED_ShowCN(34,6,4);
              OLED_ShowCN(50,6,5);
                                LED1(1);
        LED3(0);
                  }
                        else
    {
                                OLED_ShowCN(0,6,7);
              OLED_ShowCN(17,6,0);
                                OLED_ShowCN(34,6,6);
              OLED_ShowCN(50,6,5);       
        LED1(0);
        LED3(1);                       
                }
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表