资源描述
太原工业学院大学生科技创新
室内外环境监测报警系统
设计报告
系 部 名 称: 电子工程系
项 目 名 称: 室内外环境监测报警系统
指 导 教 师: 陆 锋
申 请 者: 冯国栋
年 级 专 业: 11级电子信息工程
申 请 日 期: 2013年11月24日
联 系 电 话: 15388513926
一、 项目主要内容
本项目将利用单片机与传感器等电子器件,设计一款实用方便的室内外环境监测报警系统。设计分为两个模块,室内模块和室外模块。室内模块主要功能是:测量室内温度和湿度、火灾监测报警、烟雾(或有害气体)监测报警;室外模块的主要功能是:测量室外温湿度。两个模块可以通过无线(采用ZigBee)连接,单片机将收集的数据进行处理,将温度、湿度及室内外温差显示在LCD显示器上;当出现火情、有害气体泄漏时,蜂鸣器用不同频率的响声分别对各种情况进行预警。
二、 项目主要创新
1.设计的室内外环境监测报警系统灵巧、简便。
2.将日常生活中需要的几种监测报警系统进行统一的整合。最主要的是设计了温湿检测、火灾监测、烟雾及有害气体监测报警。
3.可以用我们设计的系统作为控制系统,外接风扇、水雾喷洒或换气系统。根据温度变化调节风扇、根据湿度喷洒水雾或根据空气质量开关换气系统。
4.使用了ZigBee近距离无线组网通讯技术。
三、 硬件电路设计
硬件电路包括室内模块和室外模块。室内模块相当于协调器,使用了STM32和CC2530两款芯片,主要用于检测室内温湿度并显示、监测火灾、有毒气体以及报警装置、接收室外温湿信息并显示、控制继电器等。室外模块相当与终端设备,使用CC2530芯片,主要用于检测室外或其他地方温湿参数,并把这些参数无线发射到室内模块进行显示。下面是主要的硬件设计。
1. STM32核心板电路图
2. CC2530核心板电路图
3. 电源电路设计
ASM117-3.3是5V转3.3V芯片
4. DS18B20电路设计
5. DHT11电路设计
6. 火灾、烟雾监测电路设计
烟雾、有害气体监测使用MQ_2,利用红外接受二极管监测是否有火灾发生。LM393是一种低功率失调电压双比较器,它类似于增益不可调的运算放大器。每个比较器有两个输入端和一个输出端,两个输入端一个称为同向输入端,一个称为反相输入端。在比较两个电压时,任意一个输入端加一个固定电压作参考电压,另一端加一个待比较信号电压。
7. LCD显示电路设计
8. 继电器电路设计
9. 按键电路
10. CC2530串口通信电路设计
四、 部分软件设计
由于程序较长,这里提供部分程序。
1. STM32主程序部分
#include "stm32f10x.h"
#include "delay.h"
#include "sys.h"
#include "USART.h"
#include "LCD.h"
#include "DHT11.h"
#include "DS18B20.h"
#include "MQ_2.h"
#include "IR.h"
#include "LED.h"
#include "BUZZER.h"
#include "KEY.h"
#include "RELAY.h"
#include "Display.h"
void Deal_With(u8,u8);
void Deal_Temp(u8,u8);
extern unsigned char TH, TL, RH, RL;
extern unsigned char temp[7];
extern u8 RES;
int main(void)
{
u8 ts = 0;
u8 fs = 1;
u8 mq = 0;
u8 ir = 0;
u8 h_norm = H_TEMP;
u8 l_norm = L_TEMP;
delay_init();
LED_Init();
Buzzer();
RELAY_Init();
IR_Init();
MQ_Init();
USART1_Configuration();
USARTx_NVIC_Configuration();
LCD_Init(0x38,0x0c,0x06,0x01);
DS18B20_WriteEEPROM();
Scan_Key_Configuration();
while(1)
{
DHT11_ReadData();
DS18B20_ReadTemperature();
Temp_Conversion();
Slect_Model();
mq = MQ_Scan();
ir = IR_Scan();
ts = Key_Scan();
switch(ts)
{
case KVALUE1 : fs = Set_LCD(ts); break;
case KVALUE2 : h_norm = Set_H_Param(ts,fs); break;
case KVALUE3 : l_norm = Set_L_Param(ts,fs); break;
case KVALUE4 : Reset_Instrument(ts); break;
default : break;
}
switch(fs)
{
case 0 : break;
case 1 : Display_Indoor(); break;
case 2 : Display_Outdoor_1(); break;
case 3 : Display_Outdoor_2(); break;
case 4 : Display_Set_Temp_Param(h_norm,l_norm); break;
default : break;
}
Deal_With(mq,ir);
Deal_Temp(h_norm,l_norm);
}
}
2. CC2530监测温度程序
#ifndef __DS18B20_H__
#define __DS18B20_H__
extern unsigned char Ds18b20Initial(void);
extern void Temp_test(void);
extern void Temp_Conversion(void);
extern unsigned char temp[7];
extern unsigned char tflag;
#endif
#include "iocc2530.h"
#include "OnBoard.h"
#define uint unsigned int
#define uchar unsigned char
#define Ds18b20Data P0_6 //温度传感器引脚
#define ON 0x01 //读取成功返回0x00,失败返回0x01
#define OFF 0x00
uchar temperature[2]; //存放温度数据
uchar temp[7];//存放分解的7个ASCII码温度数据
uchar tflag;
void Ds18b20Delay(uint k);
void Ds18b20InputInitial(void);//设置端口为输入
void Ds18b20OutputInitial(void);//设置端口为输出
uchar Ds18b20Initial(void);
void Ds18b20Write(uchar infor);
uchar Ds18b20Read(void);
void Temp_test(void); //温度读取函数
void Temp_Conversion(void);
//时钟频率为32M
void Ds18b20Delay(uint k)
{
/*uint i,j;
for(i=0;i<k;i++)
for(j=0;j<2;j++);*/
MicroWait(k);
}
void Ds18b20InputInitial(void)//设置端口为输入
{
P0DIR &= 0xbf;
}
void Ds18b20OutputInitial(void)//设置端口为输出
{
P0DIR |= 0x40;
}
//ds18b20初始化
//初始化成功返回0x00,失败返回0x01
uchar Ds18b20Initial(void)
{
uchar Status = 0x00;
uint CONT_1 = 0;
uchar Flag_1 = ON;//读取是否成功的标志位
Ds18b20OutputInitial();//P0_6设置为输出模式
Ds18b20Data = 1;//拉高总线
Ds18b20Delay(260);
Ds18b20Data = 0;//拉低总线
Ds18b20Delay(750);
Ds18b20Data = 1;//拉高总线
Ds18b20InputInitial();//P0_6设置为输入模式
while((Ds18b20Data != 0)&&(Flag_1 == ON))//等待ds18b20响应,具有防止超时功能
{ //等待约60ms左右
CONT_1++;
Ds18b20Delay(10);
if(CONT_1 > 8000)Flag_1 = OFF;
Status = Ds18b20Data;
}
Ds18b20OutputInitial();//P0_6设置为输出模式
Ds18b20Data = 1;//拉高总线
Ds18b20Delay(100);
return Status;
}
//主机往Ds18b20写数据
void Ds18b20Write(uchar infor)
{
uint i;
Ds18b20OutputInitial();//P0_6设置为输出模式
//发送一个字节
for(i=0;i<8;i++)
{
//发送一位
if((infor & 0x01))
{
Ds18b20Data = 0;
Ds18b20Delay(6);
Ds18b20Data = 1;
Ds18b20Delay(50);
}
else
{
Ds18b20Data = 0;
Ds18b20Delay(50);
Ds18b20Data = 1;
Ds18b20Delay(6);
}
infor >>= 1;//移位
}
}
//主机从Ds18b20读数据
uchar Ds18b20Read(void)
{
uchar Value = 0x00;
uint i;
Ds18b20OutputInitial();//P0_6设置为输出模式
Ds18b20Data = 1;//总线拉高,准备读数据
Ds18b20Delay(10);
for(i=0;i<8;i++)
{
Value >>= 1;
Ds18b20OutputInitial();//P0_6设置为输出模式
Ds18b20Data = 0;//拉低总线产生读信号
Ds18b20Delay(3);
Ds18b20Data = 1;//释放总线准备读数据
Ds18b20Delay(3);
Ds18b20InputInitial();//P0_6设置为输入模式
//等待读取数据
if(Ds18b20Data == 1) Value |= 0x80;
Ds18b20Delay(15);
}
return Value;
}
void Temp_test(void) //温度读取函数
{
uchar V;
Ds18b20Initial();//初始化
Ds18b20Write(0xcc);//逃过 ROM
Ds18b20Write(0x44);//温度转换命令
Ds18b20Initial();
Ds18b20Write(0xcc);//逃过 ROM
Ds18b20Write(0xbe);//读DS1820温度暂存器命令
temperature[0] = Ds18b20Read();
temperature[1] = Ds18b20Read();
V = temperature[1];
V <<= 8;
V = V | temperature[0];
if(V < 0x0fff)
{
tflag = 0;
}else
{
tflag = 1;
}
Ds18b20Initial();
}
void Temp_Conversion(void)
{
uchar temp_data_1,temp_data_2;
uint TempDec;
temp_data_1 = temperature[1];
temp_data_1 &= 0xf0;//取高4位
if (temp_data_1 == 0xf0)//判断是正温度还是负温度读数
{
//负温度读数求补,取反加1,判断低8位是否有进位
if (temperature[0]==0)
{
//有进位,高8位取反加1
temperature[0] = ~temperature[0]+1;
temperature[1] = ~temperature[1]+1;
}
else
{
//没进位,高8位不加1
temperature[0] = ~temperature[0]+1;
temperature[1] = ~temperature[1];
}
}
//取高字节低4位(温度读数高4位),注意此时是12位精度
temp_data_1 = temperature[1] << 4;
//取低字节高4位(温度读数低4位),注意此时是12位精度
temp_data_2 = temperature[0] >> 4;
//组合成完整数据
temp_data_1 = temp_data_1 | temp_data_2;
temp[0] = temp_data_1/100+0x30;//取百位转换为ASCII码
temp[1] = (temp_data_1%100)/10+0x30;//取十位转换为ASCII码
temp[2] = (temp_data_1%100)%10+0x30;//取个位转换为ASCII码
temperature[0] &= 0x0f;//取小数位转换为ASCII码
//625=0.0625*10000,表示小数部分,扩大1万倍,方便显示
TempDec = temperature[0]*625;
temp[3] = TempDec/1000+0x30;//取小数十分位转换为ASCII码
temp[4] = (TempDec%1000)/100+0x30;//取小数百分位转换为ASCII码
temp[5] = ((TempDec%1000)%100)/10+0x30;//取小数千分位转换为ASCII码
temp[6] = ((TempDec%1000)%100)%10+0x30;//取小数万分位转换为ASCII码
}
五、 项目总结
1.使用Altium Desicner软件,完成了基于STM32F103VBT6最小系统的核心电路板的设计、基于CC2530的核心板电路设计、室内监测模块电路设计、室外监测模块电路设计,并制作了电路板、完成了电路板焊接,通过了硬件测试。
2.完成了软件编程。分别使用了Keil和IAR软件完成了对STM32和CC2530的软件设计,并完成了软件测试。
3.使用了Zigbee 低功耗个域网协议,实现了无线数据联网、传递。
4.结合软件和硬件进行系统测试,分别进行了火灾监测报警、烟雾监测报警、有害气体报警监测、联网收集室内外温湿度测试,基本达到了设计要求。
通过本次创新设计,我掌握了很多知识,动手实践能力有了很大的提高,为我以后的学习、工作打下了良好的基础。
展开阅读全文