STM32 f407 温湿度采集报警

该博客详细介绍了如何使用STM32 f407进行温湿度采集并实现报警功能。源码包括了LED控制、蜂鸣器、按键、延迟函数以及LCD和传感器接口的初始化。当温度超过预设阈值(30℃)时,系统将触发报警。
摘要由CSDN通过智能技术生成

STM32 f407 温湿度采集报警
在这里插入图片描述
源码
main.c
#include “led.h”
#include “button.h”
#include “buzzer.h”
#include “delay.h”
#include “lcd.h”
#include “ds18b20.h”
#include “dht11.h”

#define WAR_T 30

int main(void) {
int yan;
char buf[10];
char dht[5];
delay_init();
LCD_Init();
buzzer_init();
//320 * 240
DS18B20_Init();
dht_init();
LCD_Clear(0x01CF);
BRUSH_COLOR = WHITE;
BACK_COLOR = 0x1f << 11;
//BACK_COLOR = BLACK;
//LCD_DisplayString(30, 50, 24, (u8 *)" 0.0 ");
LCD_DisplayMyname(10,200); //Ãû×Ö
LCD_Draw_Rectangle(1, 1, 318, 238);
LCD_Draw_Line( 110,1 ,110 ,160 );
LCD_Draw_Line( 220,1 ,220 ,160 );
LCD_Draw_Line( 1,120 ,220 ,120 );
LCD_Draw_Line( 1,160 ,318 ,160 );

LCD_DisplayString(10, 70, 16, (u8 *)"PM2.5 ug/m3");
LCD_DisplayString(125, 70, 16, (u8 *)"HCHO mg/m3");
LCD_DisplayString(260, 170, 24, (u8 *)"TIME");
LCD_DisplayString(220, 200, 24, (u8 *)"12 : 00");
LCD_DisplayString(30, 175, 24, (u8 *)"WELCOME !");

LCD_DisplayTu1(225,20);
LCD_DisplayTu2(225,100);

//for(yan=0xF800;yan<=0xFFE0;yan++);
LCD_Draw_Rectangle(10, 90, 90, 100);
LCD_Draw_Rectangle(125, 90, 210, 100);
LCD_Fill_onecolor(10, 95, 90, 100,yan);
LCD_Fill_onecolor(125, 95, 210, 100,yan);

while(1)    {
    int i;
    get_temperature(buf);
    LCD_DisplayString(225, 50, 24, (u8 *)buf);
    LCD_DisplayOTherChar(295,50,0,24);//温度符号
    dht_get_data(dht);
    LCD_DisplayNum(285, 100, dht[0], 2, 24, 0);
    LCD_DisplayNum(285, 20, dht[2], 2, 24, 0);
    //if( buf[1] >= '0'+2 && buf[2] >= 9+'0')

    delay_ms(500);
}

}
led.h
#ifndef __LED_H
#define __LED_H

#include “stm32f4xx_conf.h”

/*
LED0 PE3
LED1 PE4
LED2 PG9
GPIO管脚输出高电压时灯灭 低电压时亮
1.对于GPIO管脚打开时钟
*/

#define GPIOE_MODER (*(volatile unsigned int )(GPIOE_BASE + 0x00))
#define GPIOE_OTYPER (
(volatile unsigned int )(GPIOE_BASE + 0x04))
#define GPIOE_OSPEEDR (
(volatile unsigned int )(GPIOE_BASE + 0x08))
#define GPIOE_PUPDR (
(volatile unsigned int )(GPIOE_BASE + 0x0C))
#define GPIOE_ODR (
(volatile unsigned int *)(GPIOE_BASE + 0x14))

#define GPIOG_MODER (*(volatile unsigned int )(GPIOG_BASE + 0x00))
#define GPIOG_OTYPER (
(volatile unsigned int )(GPIOG_BASE + 0x04))
#define GPIOG_OSPEEDR (
(volatile unsigned int )(GPIOG_BASE + 0x08))
#define GPIOG_PUPDR (
(volatile unsigned int )(GPIOG_BASE + 0x0C))
#define GPIOG_ODR (
(volatile unsigned int *)(GPIOG_BASE + 0x14))

extern void led_init(void);
extern void led_on(int no);
extern void led_off(int no);
#endif
led.c
#include “led.h”
#include “bitband.h”

void led_init(void) {
GPIO_InitTypeDef LED;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOG, ENABLE);

LED.GPIO_Mode = GPIO_Mode_OUT;
LED.GPIO_OType = GPIO_OType_PP;
LED.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4;
LED.GPIO_PuPd = GPIO_PuPd_NOPULL;
LED.GPIO_Speed = GPIO_Fast_Speed;

GPIO_Init(GPIOE, &LED);
LED.GPIO_Pin = GPIO_Pin_9;
GPIO_Init(GPIOG, &LED);
GPIO_SetBits(GPIOE, GPIO_Pin_3 | GPIO_Pin_4);
GPIO_SetBits(GPIOG, GPIO_Pin_9);

}

void led_on(int no) {
switch(no) {
case 0 :
PGOut(9) = 0;
break;
case 1 :
PEOut(4) = 0;
break;
case 2 :
PEOut(3) = 0;
break;
default:
break;
}
}

void led_off(int no) {
switch(no) {
case 0 :
PGOut(9) = 1;
break;
case 1 :
PEOut(4) = 1;
break;
case 2 :
PEOut(3) = 1;
break;
default:
break;
}
}
button.h
#ifndef __BUTTON_H
#define __BUTTON_H

#include “stm32f4xx_conf.h”

extern void button_init(void);
extern int button_state(int);

#endif
button.c
#include “button.h”
#include “bitband.h”
// PF9 PF8 PF7 PE6
//按键按下是1 抬起是0
void button_init(void) {
GPIO_InitTypeDef BUTTON;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOF, ENABLE);

BUTTON.GPIO_Mode = GPIO_Mode_IN;
BUTTON.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;
BUTTON.GPIO_PuPd = GPIO_PuPd_NOPULL;

GPIO_Init(GPIOF, &BUTTON);

BUTTON.GPIO_Pin = GPIO_Pin_6;
GPIO_Init(GPIOE, &BUTTON);

}

int button_state(int no) {
int ret;

switch(no)  {
    case 0 : 
        ret = PFIn(9);
        break;
    case 1 :
        ret = PFIn(8);
        break;
    case 2 :
        ret = PFIn(7);
        break;
    case 3 :
        ret = PEIn(6);
        break;
    default:
        ret = 1;
        break;
}   return !ret;

}
buzzer.h
#ifndef __BUZZER_H
#define __BUZZER_H

#include “stm32f4xx_conf.h”

extern void buzzer_init(void);
extern void buzzer_on(void);
extern void buzzer_off(void);

#endif
buzzer.c
#include “buzzer.h”
#include “bitband.h”
//pd7
void buzzer_init(void) {
GPIO_InitTypeDef BUZZER;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);

BUZZER.GPIO_Mode = GPIO_Mode_OUT;
BUZZER.GPIO_OType = GPIO_OType_PP;
BUZZER.GPIO_Pin = GPIO_Pin_7;
BUZZER.GPIO_PuPd = GPIO_PuPd_NOPULL;
BUZZER.GPIO_Speed = GPIO_Fast_Speed;

GPIO_Init(GPIOD, &BUZZER);
GPIO_ResetBits(GPIOD, GPIO_Pin_7);

}

void buzzer_on(void) {
PDOut(7) = 1;
}

void buzzer_off(void) {
PDOut(7) = 0;
}
delay.h
#ifndef __DELAY_H
#define __DELAY_H
#include “stm32f4xx.h”

typedef uint32_t u32;
typedef uint16_t u16;
typedef uint8_t u8;

#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
#define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))

//GPIO
#define GPIOA_ODR_Addr (GPIOA_BASE+20) //0x40020014
#define GPIOB_ODR_Addr (GPIOB_BASE+20) //0x40020414
#define GPIOC_ODR_Addr (GPIOC_BASE+20) //0x40020814
#define GPIOD_ODR_Addr (GPIOD_BASE+20) //0x40020C14
#define GPIOE_ODR_Addr (GPIOE_BASE+20) //0x40021014
#define GPIOF_ODR_Addr (GPIOF_BASE+20) //0x40021414
#define GPIOG_ODR_Addr (GPIOG_BASE+20) //0x40021814
#define GPIOH_ODR_Addr (GPIOH_BASE+20) //0x40021C14
#define GPIOI_ODR_Addr (GPIOI_BASE+20) //0x40022014
//GPIO
#define GPIOA_IDR_Addr (GPIOA_BASE+16) //0x40020010
#define GPIOB_IDR_Addr (GPIOB_BASE+16) //0x40020410
#define GPIOC_IDR_Addr (GPIOC_BASE+16) //0x40020810
#define GPIOD_IDR_Addr (GPIOD_BASE+16) //0x40020C10
#define GPIOE_IDR_Addr (GPIOE_BASE+16) //0x40021010
#define GPIOF_IDR_Addr (GPIOF_BASE+16) //0x40021410
#define GPIOG_IDR_Addr (GPIOG_BASE+16) //0x40021810
#define GPIOH_IDR_Addr (GPIOH_BASE+16) //0x40021C10
#define GPIOI_IDR_Addr (GPIOI_BASE+16) //0x40022010

#define PAOut(n) BIT_ADDR(GPIOA_ODR_Addr,n)
#define PAIn(n) BIT_ADDR(GPIOA_IDR_Addr,n)

#define PBOut(n) BIT_ADDR(GPIOB_ODR_Addr,n)
#define PBIn(n) BIT_ADDR(GPIOB_IDR_Addr,n)

#define PCOut(n) BIT_ADDR(GPIOC_ODR_Addr,n)
#define PCIn(n) BIT_ADDR(GPIOC_IDR_Addr,n)

#define PDOut(n) BIT_ADDR(GPIOD_ODR_Addr,n)
#define PDIn(n) BIT_ADDR(GPIOD_IDR_Addr,n)

#define PEOut(n) BIT_ADDR(GPIOE_ODR_Addr,n)
#define PEIn(n) BIT_ADDR(GPIOE_IDR_Addr,n)

#define PFOut(n) BIT_ADDR(GPIOF_ODR_Addr,n)
#define PFIn(n) BIT_ADDR(GPIOF_IDR_Addr,n)

#define PGOut(n) BIT_ADDR(GPIOG_ODR_Addr,n)
#define PGIn(n) BIT_ADDR(GPIOG_IDR_Addr,n)

#define PHOut(n) BIT_ADDR(GPIOH_ODR_Addr,n)
#define PHIn(n) BIT_ADDR(GPIOH_IDR_Addr,n)

#define PIOut(n) BIT_ADDR(GPIOI_ODR_Addr,n)
#define PIIn(n) BIT_ADDR(GPIOI_IDR_Addr,n)

#define SYSCLK 168 //调用系统时钟

void delay_init(void);
void delay_ms(u16 nms);
void delay_us(u32 nus);
#endif
delay.c
#include “delay.h”

//利用系统定时,编写的延时函数
static u8 fac_us=0; //us延时倍乘数
static u16 fac_ms=0; //ms延时倍乘数,在ucos下,代表每个街拍的ms数

/****************************************************************************

  • 名称: delay_init()
    *功能:延时函数初始化
  • 入口参数:无
  • 返回参数:无
    ***************************************************************************/
    void delay_init() {
    SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
    fac_us=SYSCLK/8;
    fac_ms=(u16)fac_us
    1000; //每个ms需要的systick时钟数
    }

/****************************************************************************

  • 名称: void delay_us(u32 nus)
  • 功能:延时nus
  • 入口参数:要延时的微秒数
  • 返回参数:无
  • 说明:nus的值 不要大于798915us
    /
    void delay_us(u32 nus) {
    u32 midtime;
    SysTick->LOAD=nus
    fac_us; //时间加载
    SysTick->VAL=0x00; //清空计数器
    SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //开始倒数
    do {
    midtime=SysTick->CTRL;
    }
    while((midtime&0x01)&&!(midtime&(1<<16)));//等待时间到达
    SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器
    SysTick->VAL =0X00; //清空计数器
    }
    /
    *
  • 名称: void delay_xms(u16 nms)
  • 功能:延时nms
  • 入口参数:要延时的毫秒数
  • 返回参数:无
  • 说明:SysTick->LOAD为24位寄存器,所以,最大延时为:nms<=0xffffff81000/SYSCLK
    对168M条件下nms<=798ms
    /
    void delay_xms(u16 nms) {
    u32 midtime;
    SysTick->LOAD=(u32)nms
    fac_ms;//时间加载(SysTick->LOAD为24bit)
    SysTick->VAL =0x00; //清空计数器
    SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //开始倒数
    do {
    midtime=SysTick->CTRL;
    }
    while((midtime&0x01)&&!(midtime&(1<<16)));//等待时间到达
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值