1、 太原工业学院大学生科技创新 室内外环境监测报警系统 设计报告 系 部 名 称: 电子工程系 项 目 名 称: 室内外环境监测报警系统 指 导 教 师: 陆 锋 申 请 者: 冯国栋 年 级 专 业: 11级电子信息工程 申 请 日 期: 2013年11月24日 联 系 电 话: 15388513926
2、 一、 项目主要内容 本项目将利用单片机与传感器等电子器件,设计一款实用方便的室内外环境监测报警系统。设计分为两个模块,室内模块和室外模块。室内模块主要功能是:测量室内温度和湿度、火灾监测报警、烟雾(或有害气体)监测报警;室外模块的主要功能是:测量室外温湿度。两个模块可以通过无线(采用ZigBee)连接,单片机将收集的数据进行处理,将温度、湿度及室内外温差显示在LCD显示器上;当出现火情、有害气体泄漏时,蜂鸣器用不同频率的响声分别对各种情况进行预警。 二、 项目主要创新 1.设计的室内外环境监测报警系统灵巧、简便。 2.将日常生活中需要的几种监测报警系统进行统一
3、的整合。最主要的是设计了温湿检测、火灾监测、烟雾及有害气体监测报警。 3.可以用我们设计的系统作为控制系统,外接风扇、水雾喷洒或换气系统。根据温度变化调节风扇、根据湿度喷洒水雾或根据空气质量开关换气系统。 4.使用了ZigBee近距离无线组网通讯技术。 三、 硬件电路设计 硬件电路包括室内模块和室外模块。室内模块相当于协调器,使用了STM32和CC2530两款芯片,主要用于检测室内温湿度并显示、监测火灾、有毒气体以及报警装置、接收室外温湿信息并显示、控制继电器等。室外模块相当与终端设备,使用CC2530芯片,主要用于检测室外或其他地方温湿参数,并把这些参数无线发射到室内模块进行显示。下
4、面是主要的硬件设计。 1. STM32核心板电路图 2. CC2530核心板电路图 3. 电源电路设计 ASM117-3.3是5V转3.3V芯片 4. DS18B20电路设计 5. DHT11电路设计 6. 火灾、烟雾监测电路设计 烟雾、有害气体监测使用MQ_2,利用红外接受二极管监测是
5、否有火灾发生。LM393是一种低功率失调电压双比较器,它类似于增益不可调的运算放大器。每个比较器有两个输入端和一个输出端,两个输入端一个称为同向输入端,一个称为反相输入端。在比较两个电压时,任意一个输入端加一个固定电压作参考电压,另一端加一个待比较信号电压。 7. LCD显示电路设计 8. 继电器电路设计 9. 按键电路 10. CC2530串口通信电路设计 四、 部分软件设计 由于程序较长,这里提供部分程序。 1. STM32主程序部分 #include "stm3
6、2f10x.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_T
7、emp(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(
8、); 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();
9、 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) { cas
10、e 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监测温度程序 #i
11、fndef __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
12、 #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 Ds18b20Ou
13、tputInitial(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 14、t(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;//读取是否成功的标志位
15、 Ds18b20OutputInitial();//P0_6设置为输出模式
Ds18b20Data = 1;//拉高总线
Ds18b20Delay(260);
Ds18b20Data = 0;//拉低总线
Ds18b20Delay(750);
Ds18b20Data = 1;//拉高总线
Ds18b20InputInitial();//P0_6设置为输入模式
while((Ds18b20Data != 0)&&(Flag_1 == ON))//等待ds18b20响应,具有防止超时功能
{ 16、 //等待约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)
{
ui 17、nt 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);
18、
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++)
{
V 19、alue >>= 1;
Ds18b20OutputInitial();//P0_6设置为输出模式
Ds18b20Data = 0;//拉低总线产生读信号
Ds18b20Delay(3);
Ds18b20Data = 1;//释放总线准备读数据
Ds18b20Delay(3);
Ds18b20InputInitial();//P0_6设置为输入模式
//等待读取数据
if(Ds18b20Data == 1) Value |= 0x80;
Ds18b20Delay(15);
} 20、
return Value;
}
void Temp_test(void) //温度读取函数
{
uchar V;
Ds18b20Initial();//初始化
Ds18b20Write(0xcc);//逃过 ROM
Ds18b20Write(0x44);//温度转换命令
Ds18b20Initial();
Ds18b20Write(0xcc);//逃过 ROM
Ds18b20Write(0xbe);//读DS1820温度暂存器命令
temperature[0] = Ds18b20Read 21、);
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;
22、
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;
23、 }
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;
/ 24、/组合成完整数据
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万倍,方 25、便显示
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软件, 26、完成了基于STM32F103VBT6最小系统的核心电路板的设计、基于CC2530的核心板电路设计、室内监测模块电路设计、室外监测模块电路设计,并制作了电路板、完成了电路板焊接,通过了硬件测试。
2.完成了软件编程。分别使用了Keil和IAR软件完成了对STM32和CC2530的软件设计,并完成了软件测试。
3.使用了Zigbee 低功耗个域网协议,实现了无线数据联网、传递。
4.结合软件和硬件进行系统测试,分别进行了火灾监测报警、烟雾监测报警、有害气体报警监测、联网收集室内外温湿度测试,基本达到了设计要求。
通过本次创新设计,我掌握了很多知识,动手实践能力有了很大的提高,为我以后的学习、工作打下了良好的基础。






