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_us1000; //每个ms需要的systick时钟数
}
/****************************************************************************
- 名称: void delay_us(u32 nus)
- 功能:延时nus
- 入口参数:要延时的微秒数
- 返回参数:无
- 说明:nus的值 不要大于798915us
/
void delay_us(u32 nus) {
u32 midtime;
SysTick->LOAD=nusfac_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)nmsfac_ms;//时间加载(SysTick->LOAD为24bit)
SysTick->VAL =0x00; //清空计数器
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //开始倒数
do {
midtime=SysTick->CTRL;
}
while((midtime&0x01)&&!(midtime&(1<<16)));//等待时间到达