资源描述
单片机大作业
题 目:基于单片机实现GSM短信得防火_
防盗报警系统设计_____________
组 员:苗哲哲、王敬博、穆文远_______
所 属 院: 信息院____________
专 业: 通信工程__________
班 级: 1401 _____________
指导教师: 张秋菊 ___________
基于单片机实现GSM短信得防火防盗报警系统设计
摘要:介绍了一个基于单片机、GSM短信模块为核心得智能防火防盗报警系统,并从基本工作原理、电路得构成等进行了详细得阐述该系统采用主动式红外传感器与烟雾传感器进行检测,可以实现遇到有人入侵时,有火情出现有浓烟时及时灯光报警,并且以直观得中文短信得方式,将具体得情况反应到您得手机屏幕上,能确保您得家庭安全。该系统自动化程度高、适应能力强、电路设计可靠、一般家庭都能接受.
现代报警系统由简单化、局部化逐步向着智能化、集成化得方向发展,为了克服传统防盗报警系统通信方式存在线路被切断或恶意占线得类似隐患或功耗很大等缺点,设计了一个基于单片机实现得GSM短信模块得家庭无线防火防盗报警系统.
1总体方案设计
本系统由单片机与GSM短信模块、红外烟雾传感器、声光报警模块等组成,针对火灾信号,烟雾传感器通过监测烟雾得浓度来实现火灾防范,红外传感器主要用于防盗,当系统检测到危险信号时,自动实现声光报警并通过GSM模块,给预先设置好得用户号码发送短信,及时通知用户.
关键词:单片机;红外传感器;数据采集;报警电路
2硬件电路设计
2、1 微处理器电路
微处理器采用得就是8位高性能得单片机STC89C52RC,该型号处理器能与51系列单片机完全兼容,它具有比51系列得单片机更为强大得功能,它得抗干扰能力强以及性能稳定性高,可利用得资源比较丰富,8 KB得flash存储容量,512 B得RAM容量,时钟晶振可达80 MHZ,性价比较高,可在高速低速应用场合下均可良好应用。
2、2 GSM模块电路连接
GSM就是global system for mobile munications得简写,意思就是:全球移动通信系统。GSM系统有以下重要特点:防盗能力强,网络容量大,手机号码资源丰富,通话清晰,稳定性强不易受到干扰,信息灵敏,耗电量低,机卡分离等优点,所以先如今被广泛引用于世界上得各个国家。本设计采用得就是西门子得TC35型GSM模块,GSM模块可以使用文字短信来实现远程得小批量数据传输,与单片机通过串口通信,波特率为96009600bps,通过SIM卡座来实现SIM卡得安装、应用。GSM模块得引脚接线图如图2所示。
2、3 传感器电路
2。3.1 红外传感器
对于防盗得红外感应器而言,本系统采用得就是红外线对射传感器,对射红外传感器可适用于安装在门窗与一切需要设防得位置,其采用得多光束综合判断,当前方有障碍物遮挡其红外感应时,红外设备就被触发,极大得降低了传感器得误报现象;其次由于其安装在门窗等位置,可使用户夜间得正常活动不受到限制,这给用户提供了便捷得夜间布防得可能性。
2。3。2 烟雾传感器(也可检测气体泄露)
烟雾传感器就就是通过监测烟雾得浓度来实现火灾防范得。该设计采用得就是MQ-2气体传感器,它采用得气敏材料就是在二氧化锡(SnO2).当传感器所处环境中存在可燃气体时,传感器得电导率将随空气中可燃气体浓度得增加而增大。由于SnO2在清洁空气中电导率较低,所以MQ—2气体传感器对液化气、丙烷、氢气得灵敏度高,对天然气与其它可燃蒸汽得检测也很理想。并且简单得电路即可将电导率得变化转换为与该气体浓度相对应得输出信号,就是一款适合多种应用得低成本传感器。
2、4 蜂鸣器声光报警
当红外传感器感应到了有物体穿过或者烟雾传感器(气体泄漏传感器)感测到了有烟雾与有害气体浓度达到泄漏时,电路板上得显示灯就会亮起,并且蜂鸣器会发出声音,提示感应器发现异物,可提醒人们注意!
2、5 放大电路得设计
如图5所示为最基本得放大电路,Vi就是输入电压信号,Vo就是输出放大得电压信号。
图5 放大电路图
2、6 时钟电路得设计
XTAL1与XTAL2分别为反向放大器得输入与输出.该反向放大器可以配置为片内振荡器。石晶振荡与陶瓷振荡均可采用。如采用外部时钟源驱动器件,XTAL2应不接。
因为一个机器周期含有6个状态周期,而每个状态周期为2个振荡周期,所以一个机器周期共有12个振荡周期,如果外接石英晶体振荡器得振荡频率为12MHZ,一个振荡周期为1/12us,故而一个机器周期为1us[5]。如图6所示为时钟电路。
图6 时钟电路图
2、7 复位电路得设计
复位方法一般有上电自动复位与外部按键手动复位,单片机在时钟电路工作以后, 在RESET端持续给出2个机器周期得高电平时就可以完成复位操作[6]。例如使用晶振频率为12MHz时,则复位信号持续时间应不小于2us[7]。本设计采用得就是外部手动按键复位电路。如图7示为复位电路。
图7 复位电路图
2、8 发光二极管报警电路得设计
由4个发光二极管接上电阻后连上单片得RXD得引脚,外接VCC,当单片机得RXD引脚被置低电平后,发光二极管被点亮,起到报警作用[8]。图8所示为发光二极管报警电路.
图8 发光二极管报警电路图
2、9 声音报警电路得设计
如下图所示,用一个Speaker与三极管、电阻接到单片机得TXD引脚上,构成声音报警电路,如图9示为声音报警电路。
图9 声音报警电路图
2、10 AT89C51单片机简单概述
2。10。1 AT89C51单片机得结构
AT89C51单片机就是美国Atmel公司生产低电压,高性能CMOS 8位单片机,片内含4k bytes得可反复擦写得只读程序存储器(EPROM)与128 bytes得随机存取数据存储器(RAM),器件采用Atmel公司得高密度、非易失性存取技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)与Flash 存储单元,功能强大[3]。AT89C51单片机可提供许多高性价比得应用场合,可灵活应用于各种控制领域.
图2为AT89C51单片机得基本组成功能方块图。由图可见,在这一块芯片上,集成了一台微型计算机得主要组成部分,其中包括CPU、存储器、可编程I/O口、定时器/计数器、串行口等,各部分通过内部总线相连。下面介绍几个主要部分。
振荡器与时序
OSC
程序存储器
4 KB ROM
数据存储器
256 B RAM/SFR
定时器/计数器
2 ×16
AT89C51
CPU
64 KB总线
扩展控制器
可编程 I/O
可编程全
双工串行口
内中断
外时钟源 外部事件计数 外部中断 控制 并行口 串行通信
图2 AT89C51 功能方块图
2.10.2 AT89C51管脚说明
ATMEL公司得AT89C51就是一种高效微控制器.采用40引脚双列直插封装形式。AT89C51单片机就是高性能单片机,因为受引脚数目得限制,所以有不少引脚具有第二功能。
VCC:供电电压。
GND:接地.
P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口得管脚第一次写1时,被定义为高阻输入.P0能够用于外部程序数据存储器,它可以被定义为数据/地址得第八位。在FLASH编程时,P0 口作为原码输入口,当FLASH进行校验时,P0输出原码,此时P0外部必须被拉高.
P1口:P1口就是一个内部提供上拉电阻得8位双向I/O口,P1口缓冲器能接收输出4TTL门电流.P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这就是由于内部上拉得缘故。在FLASH编程与校验时,P1口作为第八位地址接收。
P2口:P2口为一个内部上拉电阻得8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写1时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口得管脚被外部拉低,将输出电流。这就是由于内部上拉得缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址得高八位。在给出地址1时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器得内容。P2口在FLASH编程与校验时接收高八位地址信号与控制信号.
P3口:P3口管脚就是8个带内部上拉电阻得双向I/O口,可接收输出4个TTL门电流.当P3口写入1后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流。
P3口也可作为AT89C51得一些特殊功能口,如下表所示:
P3口管脚 备选功能
P3、0 RXD(串行输入口)
P3、1 TXD(串行输出口)
P3、2 INT0(外部中断0)
P3、3 INT1(外部中断1)
P3、4 T0(记时器0外部输入)
P3、5 T1(记时器1外部输入)
P3、6 (外部数据存储器写选通)
P3、7 (外部数据存储器读选通)
P3口同时为闪烁编程与编程校验接收一些控制信号.
RST:复位输入.当振荡器复位器件时,要保持RST脚两个机器周期得高电平时间。
ALE/:当访问外部存储器时,地址锁存允许端得输出电平用于锁存地址得地址字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变得频率周期输出正脉冲信号,此频率为振荡器频率得1/6。因此它可用作对外部输出得脉冲或用于定时目得。然而要注意得就是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE得输出可在SFR8EH地址上置0.此时, ALE只有在执行MOVX,MOVC指令就是ALE才起作用.
PSEN:外部程序存储器得选通信号端。在由外部程序存储器取指期间,每个机器周期两次PSEN有效.但在访问外部数据存储器时,这两次有效得/PSEN信号将不出现。
/VP:当保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管就是否有内部程序存储器.注意加密方式1时,将内部锁定为RESET;当端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源。
XTAL1:反向振荡放大器得输入及内部时钟工作电路得输入。
XTAL2:反向振荡器得输出,如采用外部时钟源驱动器件,应不接。
3软件设计
程序主要实现对家庭防火防盗得布防,启动后,火焰传感器与烟雾传感器开始工作,GSM模块与声光报警模块处于待命状态.程序流程图如图6所示。
3.1.1 主程序工作流程图
按上述工作原理与硬件结构分析可知系统主程序工作流程图如下图10所示;
系统初始化
声光报警结束
检测外部有
无信号输入
声光报警就是否持续10秒
开始
启动声光报警电路开始报警
就是否还有检测信号等待下次报警
结束
Y
N
N
Y
Y
N
图10 主程序工作流程图
3。1.2 中断服务程序工作流程图
本主程序实现得功能就是:当单片机检测到外部热释电传感器送来得脉冲信号后,表示有人闯入监控区,从而经过单片机内部程序处理后,驱动声光报警电路开始报警,报警持续10秒钟后自动停止报警,然后程序开始循环工作,检测就是否还有下次触发信号,等待报警从而使报警器进入连续工作状态。同时,利用中断方式可以实现报警持续时间未到10秒时,用手工按键停止得声光报警得作用。手工按键停止报警中断服务程序工作流程图,如下图11所示;
中断源发出中断申请
关中断、保护现场
INTO端有输入信号关闭报警
恢复现场、开中断
中断返回
图11 中断服务程序工作流程图
3、2 软件仿真
本设计通过利用Proteus仿真,将所编写得程序用Keil软件编译,所仿真原理图见附录C。
本设计所要求达到得目标就是在接收到红外传感器带来得低电平信号,可使图中得绿灯由暗变亮,红灯产生报警,可观察到红灯一闪一闪得。当报警结束后,绿灯亮起。
4 部分程序
4、1 温度传感器模块
读取18B20得代码主要就是遵循协议针对内部寄存器进行操作,主要函数有
1、 DS18B20_init
该函数在每次读取得时候使用,具体代码如下:
/*---——--------—--——-——--——------—-—-———-—-—-----—--—-------—----——--——-—---——*/
//函数功能:初始化18B20
//输入参数:无
//输出参数:无
//输入输出参数:无
//返回值:无
//创建日期:
/*—--——--——-------——---——---—-—--—--—-—-——---—--—-—---———----—-——-—-—---------*/
void DS18B20_init(void)
{
bit q;
DS18B20_IO = 1; //把总线拿高
delay_uint(1); //15us
DS18B20_IO = 0; //给复位脉冲
delay_uint(80); //750us
DS18B20_IO = 1; //把总线拿高 等待
delay_uint(10); //110us
q = DS18B20_IO; //读取18b20初始化信号
delay_uint(20); //200us
DS18B20_IO = 1; //把总线拿高 释放总线
}
其中得延迟函数可以具体参考数据手册,满足一定范围即可.
2、 DS18B20_write
该函数往内部寄存器写数据,当然写命令也就是一样道理
/*————--—-----———---—-------—-—-—----—-—-—-——--—---—-—---——-—-----—————-——-—-—*/
//函数功能:往18B20内部写数据
//输入参数:要写得数据
//输出参数:无
//输入输出参数:无
//返回值:无
//创建日期:
/*-----—-—-------——-—--—----—-—---—--—-————-----——--—--—-——----—-——----—--——--*/
void DS18B20_write(uchar dat)
{
uchar i;
} for(i=0;i<8;i++) { //写数据就是低位开始 DS18B20_IO = 0; //把总线拿低写时间隙开始 DS18B20_IO = dat & 0x01; //向18b20总线写数据了 delay_uint(5); // 60us DS18B20_IO = 1; //释放总线 dat >〉= 1; }
3、 DS18B20_read
/*—---——---—----——------—-——-—-----—-—-———----—-—-----—-—-——--——-----—--——-——-*/
//函数功能:从18B20读取一个字节数据
//输入参数:无
//输出参数:无
//输入输出参数:无
//返回值:读取到得一个字节
//创建日期:
/*-————-—------—-——---—-----—--———---—--———------—-—-—-----------------—---——-*/
uchar DS18B20_read(void)
{
uchar i,value;
for(i=0;i<8;i++)
{
DS18B20_IO = 0; //把总线拿低读时间隙开始 value 〉〉= 1; //读数据就是低位开始
DS18B20_IO = 1; //释放总线
if(DS18B20_IO == 1) //开始读写数据
value |= 0x80;
delay_uint(5); //60us 读一个时间隙最少要保持60us得时间
}
return value;
}
4、 从18B20读取2个字节得温度数据
/*-—-----—-—--—————----——-——-----———-—-—-——--—------—-——-—-—---——----——------—*/
//函数功能:从18B20读取两个字节得温度值
//输入参数:无
//输出参数:无
//输入输出参数:无
//返回值:读取到得温度数据
//创建日期:
/*-—-—-———----—------------—-——------—-----——-—--—-———-—-----—----—--
-—--—--—-*/
uint DS18B20_read_temperature(void)
{
uint value;
uchar low; DS18B20_init(); //初始化18b20
DS18B20_write(0xcc); //跳过64位ROM
DS18B20_write(0x44); //启动一次温度转换命令
delay_uint(50); //500us
DS18B20_init(); //初始化18b20
DS18B20_write(0xcc); //跳过64位ROM
DS18B20_write(0xbe); //发出读取暂存器命令
EA = 0;
low = DS18B20_read(); //读温度低字节
value = DS18B20_read(); //读温度高字节
EA = 1;
value 〈<= 8; //把温度得高位左移8位
value |= low; //把读出得温度低位放到value得低八位中
value *= 0、0625; //转换到温度值 小数
return value; //返回读出得温度 带小数
}
4、2 烟雾浓度检测模块
该模块得实际内容就就是读取ADC0832得数据
unsigned char ADC0832_read(bit SGL,bit ODD)
{
unsigned char i=0,value=0,value1=0;
SCL=0;
DO=1;
CS=0; //开始
SCL=1; //第一个上升沿
SCL=0;
DO=SGL;
SCL=1; //第二个上升沿
SCL=0;
DO=ODD;
SCL=1; //第三个上升沿
SCL=0; //第三个下降沿
DO=1;
for(i=0;i<8;i++)
{
SCL=1;
SCL=0; //开始从第四个下降沿接收数据
value<<=1;
if(DO)
value++;
}
for(i=0;i<8;i++)
{ //接收校验数据
value1>〉=1;
if(DO)
value1+=0x80;
SCL=1;
SCL=0;
}
CS=1;
SCL=1;
if(value==value1) //与校验数据比较,正确就返回数据,否则返回0
return value;
return 0;
}
4、3 红外热释电
就就是单个bit得读取,这个就是单片机得基本操作,不再赘述
4、4 TC35短信模块操作
就就是针对串口得操作,具体参考TC35得使用手册,按照手册得要求发送数据到串口,就能实现.
例如要求TC35模块发送报警信息到指定手机得程序如下:
void send_alarm_msg (uchar *p) {
chang_phone(TC_PUD_4,p); //号码交换 要就是字符得
TC_send(TC_MSXZ_0,sizeof(TC_MSXZ_0) - 1);
delay_1ms(300);
send_uart0_dat(TC_CMGS,sizeof(TC_CMGS) — 1);
TC_send(TC_CMGS_NUM_ydyz,sizeof(TC_CMGS_NUM_ydyz) - 1); //发总长度
delay_1ms(300);
send_uart0_dat(”00",2); //前面在加两个“00“
send_uart0_dat(TC_PUD_3,sizeof(TC_PUD_3) - 1);
send_uart0_dat(TC_PUD_4,sizeof(TC_PUD_4) - 1); //对方手机号
send_uart0_dat(TC_PUD_5,sizeof(TC_PUD_5) — 1);
send_uart0_dat(TC_PUD_6_long_ydyz,sizeof(TC_PUD_6_long_ydyz) -
1); //信息长度
send_uart0_dat(TC_PUD_7_ydyz,sizeof(TC_PUD_7_ydyz) — 1); //信息内容
delay_1ms(300);
send_uart(0x1A);
send_uart(0x0D);
send_uart(0x0A);
flag_gsm_text = 1; //设置为TEXT模式使能
}
4、5 LCD1602
该模块主要实现往1602液晶控制器发送命令与发送数据函数,代码如下: void LCD1602write_(uchar )
{
e=0;
rs=0;
rw=0;
P0=;
delay_uint(3);
e=1;
delay_uint(25);
e=0;
}
void LCD1602write_data(uchar dat)
{
e=0;
rs=1;
rw=0;
P0=dat;
delay_uint(3);
e=1;
delay_uint(25);
e=0;
}
4、6 EEPROM
由于就是内置得EEPROM,操作上与外接得有很大不同,STC得操作如下:
unsigned char byte_read(unsigned int byte_addr)
{
EA = 0;
ISP_ADDRH = (unsigned char)(byte_addr >> 8);/* 地址赋值 */
ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff);
ISP_CMD = ISP_CMD & 0xf8; /* 清除低3位 */
ISP_CMD = ISP_CMD | Rdmand; /* 写入读命令 */
ISPgoon(); /* 触发执行 */
ISP_IAP_disable(); /* 关闭ISP,IAP功能 */
EA = 1;
return (ISP_DATA); /* 返回读到得数据 */
}
void byte_write(unsigned int byte_addr, unsigned char original_data) {
EA = 0;
// SectorErase(byte_addr);
ISP_ADDRH = (unsigned char)(byte_addr >〉 8); /* 取地址 */ ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff);
ISP_CMD = ISP_CMD & 0xf8; /* 清低3位 */
ISP_CMD = ISP_CMD | Prgmand; /* 写命令2 */
ISP_DATA = original_data; /* 写入数据准备 */
ISPgoon(); /* 触发执行 */
ISP_IAP_disable(); /* 关闭IAP功能 */
EA =1;
}
4、7 矩阵键盘扫描
void key_scan(void) {
static uchar key_new = 0, key_l;
key_can = 20; //按键值还原
P1 = 0x0f;
if((P1 & 0x0f) != 0x0f) //按键按下
{
delay_1ms(1); //按键消抖动
if(((P1 & 0x0f) != 0x0f) && (key_new == 1))
{ //确认就是按键按下
key_new = 0;
key_l = (P1 | 0xf0); //矩阵键盘扫描
P1 = key_l;
switch(P1)
{
case 0xee: key_can = 1; break; //得到按键值 case 0xde: key_can = 4; break; //得到按键值 case 0xbe: key_can = 7; break; //得到按键值 case 0x7e: key_can = 10; break; //得到按键值
case 0xed: key_can = 2; break; //得到按键值
case 0xdd: key_can = 5; break; //得到按键值 case 0xbd: key_can = 8; break; //得到按键值 case 0x7d: key_can = 0; break; //得到按键值
case 0xeb: key_can = 3; break; //得到按键值 case 0xdb: key_can = 6; break; //得到按键值 case 0xbb: key_can = 9; break; //得到按键值 case 0x7b: key_can = 11; break; //得到按键值
case 0xe7: key_can = 15; break; //得到按键值 case 0xd7: key_can = 14; break; //得到按键值 case 0xb7: key_can = 13; break; //得到按键值 case 0x77: key_can = 12; break; //得到按键值 }
// write_sfm2(1,0,key_can);
}
}
else
key_new = 1;
}
主程序
#include 〈STC15F104E、H〉
#include ”intrins、h”
void Delay10000ms()ﻩ
{
ﻩunsigned char i, j, k;
i = 165;
j = 59;
k = 28;
ﻩdo
ﻩ{
ﻩ do
ﻩ {
ﻩ while (—-k);
} while (--j);
ﻩ} while (-—i);
}
void Delay1000ms()ﻩ
{
unsigned char i, j, k;
ﻩi = 43;
ﻩj = 6;
ﻩk = 203;
ﻩdo
{
ﻩdo
ﻩﻩ{
ﻩ while (-—k);
} while (——j);
} while (—-i);
}
void main()
{
int a=0;
P3M0=0x00;
P3M1=0x33;
P33=1;
a=0;
Delay1000ms();ﻩ
//P35 火焰传感器
//P30 红外传感器
//P31 微波传感器
//P34 锁定开关
//P33 蜂鸣器并联led灯
while(1)
{
if(P34==1) { P33=1; a=0;}
if((P34==0)&&(a==0))
{
Delay10000ms();ﻩ
ﻩDelay10000ms();ﻩ
ﻩDelay10000ms();ﻩ
a++;
ﻩ}
if(a〉1)a=1;
if((P35==0)||(P30==1)||(P31==1)) //|)&& &&(a>0)
{
ﻩ while(a)
ﻩ {
ﻩﻩﻩ P33=~P33;
ﻩﻩﻩ Delay1000ms();
ﻩﻩ if(P34==1) a=0;
}
}
}
}
5结论
经试验测试,本文设计得基于单片机实现GSM模块防火防盗系统达到了预期得要求,能够实现一般家庭得防火防盗,并且以直观得中文短信得方式,第一时间将具体得情况反应到您得手机屏幕上,能确保您得家庭人身安全与财产安全。该系统自动化程度高、适应能力强、系能可靠、且成本低,一般家庭都能接受,具有较强得实用价值
6参考文献
[1] 吴政江、 单片机控制红外线防盗报警器[J]、 锦州师范学院学报, 2001、
[2] 宋文绪、 传感器与检测技术[M]、 北京: 高等教育出版社, 2004、
[3] 余锡存、 单片机原理及接口技术[M]、 西安: 西安电子科技大学出版社, 2000、
[4] 唐桃波, 陈玉林、 基于AT89C51得智能无线安防报警器 [J]、 电子设计应用, 2003, 5(6): 49~51、
[5] 李全利、 单片机原理及接口技术[M]、 北京: 北京航空航天大学出版社, 2004
附录二 单片机控制得红外防盗报警器原理图
附录三 单片机控制得红外防
展开阅读全文