您的位置:首页 > 其它

课设要求,基于STM32F407的防火报警装置

2015-07-26 18:18 309 查看
其实以前也做过一个类似的,这次也就是上次做的改进~



这个是自己脑海里的。。。实际上数据融合还在考虑中。。。毕竟没时间,老师就要求一个周的时间弄完,也是比较仓促,还要写文档。。。蓝牙用的是透传,你懂得~

谈一谈对“数据融合”的看法,其实自己并不了解数据融合,只是觉得自己要做的是把这些数据整合处理,通过MQ2采集到的数据设置一个阀值,然后是DHT11的温湿度阀值,通过计算将这三个数据设定一个同样的权值域,然后不同的域有不同的响应,可以理解为是一个安全级别数。

下面是传感器MQ2代码:

#include "adc.h"

#include "delay.h"

void Adc_Init(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

ADC_CommonInitTypeDef ADC_CommonInitStructure;

ADC_InitTypeDef ADC_InitStructure;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//ʹÄÜGPIOAʱÖÓ

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //ʹÄÜADC1ʱÖÓ

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//PA5 ͨµÀ5

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;//Ä£ÄâÊäÈë

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;//²»´øÉÏÏÂÀ­

GPIO_Init(GPIOB, &GPIO_InitStructure);//³õʼ»¯

RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE);
//ADC1¸´Î»

RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE);
//¸´Î»½áÊø

ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;//¶ÀÁ¢Ä£Ê½

ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;//Á½¸ö²ÉÑù½×¶ÎÖ®¼äµÄÑÓ³Ù5¸öʱÖÓ

ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; //DMAʧÄÜ

ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;//Ô¤·ÖƵ4·ÖƵ¡£ADCCLK=PCLK2/4=84/4=21Mhz,ADCʱÖÓ×îºÃ²»Òª³¬¹ý36Mhz

ADC_CommonInit(&ADC_CommonInitStructure);//³õʼ»¯

ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//12λģʽ

ADC_InitStructure.ADC_ScanConvMode = DISABLE;//·ÇɨÃèģʽ

ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//¹Ø±ÕÁ¬Ðøת»»

ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;//½ûÖ¹´¥·¢¼ì²â£¬Ê¹ÓÃÈí¼þ´¥·¢

ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//ÓÒ¶ÔÆë

ADC_InitStructure.ADC_NbrOfConversion = 1;//1¸öת»»ÔÚ¹æÔòÐòÁÐÖÐ Ò²¾ÍÊÇֻת»»¹æÔòÐòÁÐ1

ADC_Init(ADC1, &ADC_InitStructure);//ADC³õʼ»¯

ADC_Cmd(ADC1, ENABLE);//¿ªÆôADת»»Æ÷

}

{

//ÉèÖÃÖ¸¶¨ADCµÄ¹æÔò×éͨµÀ£¬Ò»¸öÐòÁУ¬²ÉÑùʱ¼ä

ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_480Cycles );
//ADC1,ADCͨµÀ,480¸öÖÜÆÚ,Ìá¸ß²ÉÑùʱ¼ä¿ÉÒÔÌá¸ß¾«È·¶È

ADC_SoftwareStartConv(ADC1);
//ʹÄÜÖ¸¶¨µÄADC1µÄÈí¼þת»»Æô¶¯¹¦ÄÜ

while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//µÈ´ýת»»½áÊø

return ADC_GetConversionValue(ADC1);
//·µ»Ø×î½üÒ»´ÎADC1¹æÔò×éµÄת»»½á¹û

}

u16 Get_Adc_Average(u8 ch,u8 times)

{

u32 temp_val=0;

u8 t;

for(t=0;t<times;t++)

{

temp_val+=Get_Adc(ch);

delay_ms(5);

}

return temp_val/times;

}

DHT11代码:

#include "dht11.h"

#include "delay.h"

void DHT11_Rst(void)

{

DHT11_IO_OUT();
//SET OUTPUT

DHT11_DQ_OUT=0; //

delay_ms(20); //

DHT11_DQ_OUT=1; //DQ=1

delay_us(30);
//

}

u8 DHT11_Check(void)

{

u8 retry=0;

DHT11_IO_IN();//SET INPUT

while (DHT11_DQ_IN&&retry<100)

{

retry++;

delay_us(1);

};

if(retry>=100)return 1;

else retry=0;

while (!DHT11_DQ_IN&&retry<100)

{

retry++;

delay_us(1);

};

if(retry>=100)return 1;

return 0;

}

u8 DHT11_Read_Bit(void)

{

u8 retry=0;

while(DHT11_DQ_IN&&retry<100)

{

retry++;

delay_us(1);

}

retry=0;

while(!DHT11_DQ_IN&&retry<100)

{

retry++;

delay_us(1);

}

delay_us(40);

if(DHT11_DQ_IN)return 1;

else return 0;

}

u8 DHT11_Read_Byte(void)

{

u8 i,dat;

dat=0;

for (i=0;i<8;i++)

{

dat<<=1;

dat|=DHT11_Read_Bit();

}

return dat;

}

u8 DHT11_Read_Data(u8 *temp,u8 *humi)

{

u8 buf[5];

u8 i;

DHT11_Rst();

if(DHT11_Check()==0)

{

for(i=0;i<5;i++)//¶ÁÈ¡40λÊý¾Ý

{

buf[i]=DHT11_Read_Byte();

}

if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])

{

*humi=buf[0];

*temp=buf[2];

}

}else return 1;

return 0;

}

u8 DHT11_Init(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);//ʹÄÜGPIOGʱÖÓ

//GPIOF9,F10³õʼ»¯ÉèÖÃ

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 ;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//ÆÕͨÊä³öģʽ

GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//ÍÆÍìÊä³ö

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//50MHz

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//ÉÏÀ­

GPIO_Init(GPIOG, &GPIO_InitStructure);//³õʼ»¯

DHT11_Rst();

return DHT11_Check();

}

蓝牙,其实说白了就是串口通信,TX,RX反接蓝牙,然后透传

#include "sys.h"

#include "usart.h"

#if 1

#pragma import(__use_no_semihosting)

struct __FILE

{

int handle;

};

FILE __stdout;

_sys_exit(int x)

{

x = x;

}

int fputc(int ch, FILE *f)

{

while((USART1->SR&0X40)==0);//Ñ­»··¢ËÍ,Ö±µ½·¢ËÍÍê±Ï

USART1->DR = (u8) ch;

return ch;

}

#endif

#if EN_USART1_RX //Èç¹ûʹÄÜÁ˽ÓÊÕ

u8 USART_RX_BUF[USART_REC_LEN];

u16 USART_RX_STA=0; //½ÓÊÕ״̬±ê¼Ç

//bound:²¨ÌØÂÊ

void uart_init(u32 bound){

GPIO_InitTypeDef GPIO_InitStructure;

USART_InitTypeDef USART_InitStructure;

NVIC_InitTypeDef NVIC_InitStructure;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //ʹÄÜGPIOAʱÖÓ

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//ʹÄÜUSART1ʱÖÓ

//´®¿Ú1¶ÔÓ¦Òý½Å¸´ÓÃÓ³Éä

GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //GPIOA9¸´ÓÃΪUSART1

GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); //GPIOA10¸´ÓÃΪUSART1

//USART1¶Ë¿ÚÅäÖÃ

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //GPIOA9ÓëGPIOA10

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//¸´Óù¦ÄÜ

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//ËÙ¶È50MHz

GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //ÍÆÍ츴ÓÃÊä³ö

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //ÉÏÀ­

GPIO_Init(GPIOA,&GPIO_InitStructure); //³õʼ»¯PA9£¬PA10

//USART1 ³õʼ»¯ÉèÖÃ

USART_InitStructure.USART_BaudRate = bound;//²¨ÌØÂÊÉèÖÃ

USART_InitStructure.USART_WordLength = USART_WordLength_8b;//×Ö³¤Îª8λÊý¾Ý¸ñʽ

USART_InitStructure.USART_StopBits = USART_StopBits_1;//Ò»¸öֹͣλ

USART_InitStructure.USART_Parity = USART_Parity_No;//ÎÞÆæżУÑéλ

USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//ÎÞÓ²¼þÊý¾ÝÁ÷¿ØÖÆ

USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
//ÊÕ·¢Ä£Ê½

USART_Init(USART1, &USART_InitStructure); //³õʼ»¯´®¿Ú1

USART_Cmd(USART1, ENABLE); //ʹÄÜ´®¿Ú1

USART_ClearFlag(USART1, USART_FLAG_TC);

#if EN_USART1_RX

USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//¿ªÆôÏà¹ØÖжÏ

//Usart1 NVIC ÅäÖÃ

NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//´®¿Ú1ÖжÏͨµÀ

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//ÇÀÕ¼ÓÅÏȼ¶3

NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;
//×ÓÓÅÏȼ¶3

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
//IRQͨµÀʹÄÜ

NVIC_Init(&NVIC_InitStructure);
//¸ù¾ÝÖ¸¶¨µÄ²ÎÊý³õʼ»¯VIC¼Ä´æÆ÷¡¢

#endif

}

void USART1_IRQHandler(void)
//´®¿Ú1ÖжϷþÎñ³ÌÐò

{

u8 Res;

#ifdef OS_TICKS_PER_SEC //Èç¹ûʱÖÓ½ÚÅÄÊý¶¨ÒåÁË,˵Ã÷ҪʹÓÃucosIIÁË.

OSIntEnter();

#endif

if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //½ÓÊÕÖжÏ(½ÓÊÕµ½µÄÊý¾Ý±ØÐëÊÇ0x0d 0x0a½áβ)

{

Res =USART_ReceiveData(USART1);//(USART1->DR);
//¶ÁÈ¡½ÓÊÕµ½µÄÊý¾Ý

if((USART_RX_STA&0x8000)==0)//½ÓÊÕδÍê³É

{

if(USART_RX_STA&0x4000)//½ÓÊÕµ½ÁË0x0d

{

if(Res!=0x0a)USART_RX_STA=0;//½ÓÊÕ´íÎó,ÖØпªÊ¼

else USART_RX_STA|=0x8000;
//½ÓÊÕÍê³ÉÁË

}

else //»¹Ã»ÊÕµ½0X0D

{

if(Res==0x0d)USART_RX_STA|=0x4000;

else

{

USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;

USART_RX_STA++;

if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//½ÓÊÕÊý¾Ý´íÎó,ÖØпªÊ¼½ÓÊÕ

}

}

}

}

#ifdef OS_TICKS_PER_SEC //Èç¹ûʱÖÓ½ÚÅÄÊý¶¨ÒåÁË,˵Ã÷ҪʹÓÃucosIIÁË.

OSIntExit();

#endif

}

#endif
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: