本系统主要由如下几大模块构成:MQ-2烟雾传感器模块、人体红外传感器模块、温度传感器模块、1602显示模块和GSM通讯模块,系统的主控制器采用的是STM32F103芯片,功能强大,内部资源丰富。以上相关内容的资料都在附件中请自取,并且包含有本系统的程序框图,硬件原理图和系统总体程序。更多细节内容我就不做过多介绍,附件中的资料已经很丰富了,还请大家能够秉持一种学习的态度,我们一起进步。
Altium Designer画的原理图和PCB图如下:(附件中可下载工程文件)
程序 原理图 PCB 材料清单.7z
(779.35 KB, 售价: 2 E币)
参考资料.7z
(10.85 MB, 售价: 1 E币)
(请一定读懂程序!!!无论您出于什么目的,我都希望您能真正的弄懂这个程序,
比如板子如何与GSM模块建立的通讯,I/O口怎么配的(结合原理图看),ADC又如何调?为什么?等等问题)
文件MDK-ARM-->Project是家居系统的总程序(请提前下载好keil软件)
部分源码:
- ////头文件
- #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 "; //液晶屏显示内容
- uchar table2[]="SET: % C "; //液晶屏显示内容
- #define BEEP BIT_ADDR(GPIOA_ODR_Addr,11) //蜂鸣器接口
- #define STEAL GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_10) //防盗模块接口
- char Alarm_flag; //温度发送短信标志位,=1表示已经发送,=0表示没有发送
- char Smoke_Alarm; //烟雾发送短信标志位,=1表示已经发送,=0表示没有发送
- char Steal_Alarm; //防盗发送短信标志位,=1表示已经发送,=0表示没有发送
- 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);//以上设结构体置应用到GPIOA
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //选中管脚10
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ; //上拉输入
- GPIO_Init(GPIOB, &GPIO_InitStructure); //以上设结构体置应用到GPIOB
- }
- /************************************检测各部分是否异常***********************************************************/
- void Check(void)
- {
- if(temperature>Set_temp) //如果实际温度值大于设置值
- {
- if((temperature>0)&(temperature<100)) //温度在正常范围内才报警
- {
- BEEP=1; //启动蜂鸣器
- if(Alarm_flag==0) //警报标志位为1时发送温度报警信息
- {
- Send_Message3(); //发送温度过高报警短信
- }
- Alarm_flag=1; //标志位置一,表示短信已经发送,避免重复发送短信
- }
- }
- if(temperature<=Set_temp) //正常情况
- {
- Alarm_flag=0; //清除标志位,下次温度超过继续发送短信一次
- }
- if(Steal_flag==1)
- {
- if(STEAL==0) //检测到人体
- {
- BEEP=1; //启动蜂鸣器
- if(Steal_Alarm==0) //警报标志位为1时发送防盗报警信息
- {
- Send_Message2();
- }
- Steal_Alarm=1; //标志位置一,表示短信已经发送,避免重复发送短信
- }
- }
- if(STEAL==1) //正常情况
- {
- Steal_Alarm=0; //清除标志位,下次继续发送短信一次
- }
- if(Smoke>Set_smoke) //检测到浓度超标
- {
- BEEP=1; //启动蜂鸣器
- if(Smoke_Alarm==0) //警报标志位为1时发送烟雾报警信息
- {
- Send_Message1();
- }
- Smoke_Alarm=1; //标志位置一,表示短信已经发送,避免重复发送短信
- }
- if(Smoke<=Set_smoke) //正常情况
- {
- Smoke_Alarm=0; //清除标志位,下次温度超过继续发送短信一次
- }
- if((Smoke<=Set_smoke)&&(temperature<=Set_temp)&&(STEAL==1))
- {
- BEEP=0; //关闭蜂鸣器
- }
- }
- //=============================================================================
- //文件名称:Delay
- //功能概要:延时
- //参数说明:nCount:延时长短
- //函数返回:无
- //=============================================================================
- void Delay(uint z) //延时约3ms
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=5000;y>0;y--);
- }
- //=============================================================================
- //文件名称:main
- //功能概要:主函数
- //参数说明:无
- //函数返回: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(); //读取实时温度 第一次读取跳过85度
- LCD_Initinal();
- GPIO_Configuration_KEY();
- Set_temp=I2C_EE_BufferRead(EEPROM_ADDRESS1); //读取对应地址的值
- Set_smoke=I2C_EE_BufferRead(EEPROM_ADDRESS2); //读取对应地址的值
-
- Delay(40000);Delay(40000);
- GSM_Init(); //GSM初始化
- LCD_Display_String(1,table1); //显示内容
- LCD_Display_String(2,table2); //显示内容
- IWDG_Configuration();
- while (1)
- {
- Read_Message();
- KEY();
- if(Adjust==0)
- {
- if(TIM_GetITStatus(TIM2, TIM_IT_Update)==SET) //每0.5s读取一次温度
- {
- temperature=DS18B20_Get_Temp(); //读取实时温度
- TIM_ClearITPendingBit(TIM2, TIM_IT_Update); //清除定时器中断
-
- ADC_RegularChannelConfig(ADC1,ADC_Channel_9,1,ADC_SampleTime_7Cycles5); //选取通道和采样周期
- ADC_SoftwareStartConvCmd(ADC1,ENABLE); //使能指定的ADC的软件转换启动功能
- Smoke=0.000806*ADC_GetConversionValue(ADC1)/(10/14.7)*20-10; //3.3V分4096份 ,每份约0.000806V, 硬件已被分压,除以10k/(10+4.7k)得出真实电压值(0-5V),
- //再根据y=20x(0代表0%,5V代表100%),10是校准值,是没有检测到烟雾时显示的值,确保在洁净空气中浓度值尽可能低
- if(Smoke<0) //数值低于0做0处理
- Smoke=0;
- Write_Value(6,Smoke); //显示浓度值
-
- if(Switch_flag==1) //防盗功能开启状态
- {
- Count++;
- if(Count>=20) //启动定时器10s后开启功能
- {
- Count=0;
- Steal_flag=1;
- }
- }
- }
- Write_Value(12,temperature); //显示温度到LCD1602
- Write_Value(0x40+12,Set_temp); //显示设置温度
-
- Write_Value(0x40+6,Set_smoke); //显示设置温度
- }
-
- Check();
- IWDG_Feed(); //10秒喂狗一次
- }
- }
复制代码
【必读】版权免责声明
1、本主题所有言论和内容纯属会员个人意见,与本论坛立场无关。2、本站对所发内容真实性、客观性、可用性不做任何保证也不负任何责任,网友之间仅出于学习目的进行交流。3、对提供的数字内容不拥有任何权利,其版权归原著者拥有。请勿将该数字内容进行商业交易、转载等行为,该内容只为学习所提供,使用后发生的一切问题与本站无关。 4、本网站不保证本站提供的下载资源的准确性、安全性和完整性;同时本网站也不承担用户因使用这些下载资源对自己和他人造成任何形式的损失或伤害。 5、本网站所有软件和资料均为网友推荐收集整理而来,仅供学习用途使用,请务必下载后两小时内删除,禁止商用。6、如有侵犯你版权的,请及时联系我们(电子邮箱1370723259@qq.com)指出,本站将立即改正。
|