|
本系統(tǒng)主要由如下幾大模塊構(gòu)成:MQ-2煙霧傳感器模塊、人體紅外傳感器模塊、溫度傳感器模塊、1602顯示模塊和GSM通訊模塊,系統(tǒng)的主控制器采用的是STM32F103芯片,功能強(qiáng)大,內(nèi)部資源豐富。以上相關(guān)內(nèi)容的資料都在附件中請自取,并且包含有本系統(tǒng)的程序框圖,硬件原理圖和系統(tǒng)總體程序。更多細(xì)節(jié)內(nèi)容我就不做過多介紹,附件中的資料已經(jīng)很豐富了,還請大家能夠秉持一種學(xué)習(xí)的態(tài)度,我們一起進(jìn)步。
有關(guān)黑幣的扣除并非我設(shè)置,所以如果大家的黑幣很緊張的話,建議大家從第一個(gè)開始下載,也可以像我一樣分享資料獲取黑幣的方法。
以下的截圖只是文件中的部分內(nèi)容展示,具體內(nèi)容還請大家自行下載學(xué)習(xí)。
Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件).
(請一定讀懂程序�。�!無論您出于什么目的,我都希望您能真正的弄懂這個(gè)程序,
比如板子如何與GSM模塊建立的通訊,I/O口怎么配的(結(jié)合原理圖看),ADC又如何調(diào)?為什么?等等問題)
文件MDK-ARM-->Project是家居系統(tǒng)的總程序(請?zhí)崆跋螺d好keil軟件)
單片機(jī)源程序如下:
- ////頭文件
- #include "stm32f10x.h"
- #include "GPIOLIKE51.h"
- #include "display.h"
- #include "ds18b20.h"
- #include "key.h"
- #include "usart.h"
- #include "timer.h"
- #include "ADC.h"
- #include "iwdg.h"
- #include "I2C.h"
- #include "EXTI.h"
- uchar table1[]="NOW: % C "; //液晶屏顯示內(nèi)容
- uchar table2[]="SET: % C "; //液晶屏顯示內(nèi)容
- #define BEEP BIT_ADDR(GPIOA_ODR_Addr,11) //蜂鳴器接口
- #define STEAL GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_10) //防盜模塊接口
- char Alarm_flag; //溫度發(fā)送短信標(biāo)志位,=1表示已經(jīng)發(fā)送,=0表示沒有發(fā)送
- char Smoke_Alarm; //煙霧發(fā)送短信標(biāo)志位,=1表示已經(jīng)發(fā)送,=0表示沒有發(fā)送
- char Steal_Alarm; //防盜發(fā)送短信標(biāo)志位,=1表示已經(jīng)發(fā)送,=0表示沒有發(fā)送
- void GPIO_Configuration(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure; //等同于int a;
- RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA , ENABLE); //GPIOC APB2
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//選中管腳11
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//50MHz
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //
- GPIO_Init(GPIOA, &GPIO_InitStructure);//以上設(shè)結(jié)構(gòu)體置應(yīng)用到GPIOA
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //選中管腳10
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ; //上拉輸入
- GPIO_Init(GPIOB, &GPIO_InitStructure); //以上設(shè)結(jié)構(gòu)體置應(yīng)用到GPIOB
- }
- /************************************檢測各部分是否異常***********************************************************/
- void Check(void)
- {
- if(temperature>Set_temp) //如果實(shí)際溫度值大于設(shè)置值
- {
- if((temperature>0)&(temperature<100)) //溫度在正常范圍內(nèi)才報(bào)警
- {
- BEEP=1; //啟動蜂鳴器
- if(Alarm_flag==0) //警報(bào)標(biāo)志位為1時(shí)發(fā)送溫度報(bào)警信息
- {
- Send_Message3(); //發(fā)送溫度過高報(bào)警短信
- }
- Alarm_flag=1; //標(biāo)志位置一,表示短信已經(jīng)發(fā)送,避免重復(fù)發(fā)送短信
- }
- }
- if(temperature<=Set_temp) //正常情況
- {
- Alarm_flag=0; //清除標(biāo)志位,下次溫度超過繼續(xù)發(fā)送短信一次
- }
- if(Steal_flag==1)
- {
- if(STEAL==0) //檢測到人體
- {
- BEEP=1; //啟動蜂鳴器
- if(Steal_Alarm==0) //警報(bào)標(biāo)志位為1時(shí)發(fā)送防盜報(bào)警信息
- {
- Send_Message2();
- }
- Steal_Alarm=1; //標(biāo)志位置一,表示短信已經(jīng)發(fā)送,避免重復(fù)發(fā)送短信
- }
- }
- if(STEAL==1) //正常情況
- {
- Steal_Alarm=0; //清除標(biāo)志位,下次繼續(xù)發(fā)送短信一次
- }
- if(Smoke>Set_smoke) //檢測到濃度超標(biāo)
- {
- BEEP=1; //啟動蜂鳴器
- if(Smoke_Alarm==0) //警報(bào)標(biāo)志位為1時(shí)發(fā)送煙霧報(bào)警信息
- {
- Send_Message1();
- }
- Smoke_Alarm=1; //標(biāo)志位置一,表示短信已經(jīng)發(fā)送,避免重復(fù)發(fā)送短信
- }
- if(Smoke<=Set_smoke) //正常情況
- {
- Smoke_Alarm=0; //清除標(biāo)志位,下次溫度超過繼續(xù)發(fā)送短信一次
- }
- if((Smoke<=Set_smoke)&&(temperature<=Set_temp)&&(STEAL==1))
- {
- BEEP=0; //關(guān)閉蜂鳴器
- }
- }
- //=============================================================================
- //文件名稱:Delay
- //功能概要:延時(shí)
- //參數(shù)說明:nCount:延時(shí)長短
- //函數(shù)返回:無
- //=============================================================================
- void Delay(uint z) //延時(shí)約3ms
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=5000;y>0;y--);
- }
- //=============================================================================
- //文件名稱:main
- //功能概要:主函數(shù)
- //參數(shù)說明:無
- //函數(shù)返回:int
- //=============================================================================
- int main(void)
- {
- GPIO_Configuration();
- GPIO_Configuration_LCD();
- GPIO_Configuration_USART();
- NVIC_Configuration();
- Set_ADC_Init();
- I2C_Init_Set();
- TIMER_Init();
- DS18B20_Init();
- temperature=DS18B20_Get_Temp(); //讀取實(shí)時(shí)溫度 第一次讀取跳過85度
- LCD_Initinal();
- GPIO_Configuration_KEY();
- Set_temp=I2C_EE_BufferRead(EEPROM_ADDRESS1); //讀取對應(yīng)地址的值
- Set_smoke=I2C_EE_BufferRead(EEPROM_ADDRESS2); //讀取對應(yīng)地址的值
-
- Delay(40000);Delay(40000);
- GSM_Init(); //GSM初始化
- LCD_Display_String(1,table1); //顯示內(nèi)容
- LCD_Display_String(2,table2); //顯示內(nèi)容
- IWDG_Configuration();
- while (1)
- {
- Read_Message();
- KEY();
- if(Adjust==0)
- {
- if(TIM_GetITStatus(TIM2, TIM_IT_Update)==SET) //每0.5s讀取一次溫度
- {
- temperature=DS18B20_Get_Temp(); //讀取實(shí)時(shí)溫度
- TIM_ClearITPendingBit(TIM2, TIM_IT_Update); //清除定時(shí)器中斷
-
- ADC_RegularChannelConfig(ADC1,ADC_Channel_9,1,ADC_SampleTime_7Cycles5); //選取通道和采樣周期
- ADC_SoftwareStartConvCmd(ADC1,ENABLE); //使能指定的ADC的軟件轉(zhuǎn)換啟動功能
- Smoke=0.000806*ADC_GetConversionValue(ADC1)/(10/14.7)*20-10; //3.3V分4096份 ,每份約0.000806V, 硬件已被分壓,除以10k/(10+4.7k)得出真實(shí)電壓值(0-5V),
- //再根據(jù)y=20x(0代表0%,5V代表100%),10是校準(zhǔn)值,是沒有檢測到煙霧時(shí)顯示的值,確保在潔凈空氣中濃度值盡可能低
- if(Smoke<0) //數(shù)值低于0做0處理
- Smoke=0;
- Write_Value(6,Smoke); //顯示濃度值
-
- if(Switch_flag==1) //防盜功能開啟狀態(tài)
- {
- Count++;
- if(Count>=20) //啟動定時(shí)器10s后開啟功能
- {
- Count=0;
- Steal_flag=1;
- }
- }
- }
- Write_Value(12,temperature); //顯示溫度到LCD1602
- Write_Value(0x40+12,Set_temp); //顯示設(shè)置溫度
-
- Write_Value(0x40+6,Set_smoke); //顯示設(shè)置溫度
- }
-
- Check();
- IWDG_Feed(); //10秒喂狗一次
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
程序+原理圖+PCB+學(xué)習(xí)資料+材料清單.7z
(779.35 KB, 下載次數(shù): 181)
2020-6-6 03:01 上傳
點(diǎn)擊文件名下載附件
Surprise!.7z
(13.29 MB, 下載次數(shù): 104)
2020-6-6 03:01 上傳
點(diǎn)擊文件名下載附件
參考資料.7z
(10.85 MB, 下載次數(shù): 106)
2020-6-6 03:01 上傳
點(diǎn)擊文件名下載附件
|
評分
-
查看全部評分
|