家庭安防系统课程设计Word文档格式.docx
《家庭安防系统课程设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《家庭安防系统课程设计Word文档格式.docx(33页珍藏版)》请在冰点文库上搜索。
3.画出系统功能实现流程图。
4.编写控制程序。
、设计报告正文
1.总体设计
1.1开发与运行环境
本设计以C语言为开发语言,在KEILUVISI0N4软件平台上进行C程序的编辑,连接和调试,最终与proteus仿真软件相结合,进行相关的电路仿真及修改,最后利用protel99SE软件进行产品的PCB绘制和设计,最终完成电路的焊接和调试,制作出成品。
1.2硬件功能描述
此报警器可实现通过温度度或红外传感器检测指定位置温度、通过烟雾传感
器检测家庭烟雾浓度,通过触发电子开关、红外传感器等元件检测是否有人从窗户等地方进入,然后进行报警管理,具体如下:
(1)实现对温度和烟雾浓度等级的显示,上电自动显示初始时间“X-YY”,“X”表示烟雾浓度等级,共分五个等级,“丫丫”表示此时的环境温度。
(2)当第一次按下第一个弹性按键时进入设置温度报警下限状态,数码管显示“L-YY”,通过第二个和第三个按键可以进行温度下限的加与减。
(3)当第二次按下第一个弹性按键时进入设置温度报警上限状态,数码管显示“H-YY”,通过第二个和第三个按键可以进行温度上限的加与减。
(4)当第三次按下第一个弹性按键时进入设计烟雾报警等级状态,通过第二个和第三个按键可以进行烟雾浓度报警等级的加与减。
(5)当红外传感器检测到有人通过,或者当环境的温度或烟雾浓度超过设置的数值,蜂鸣器发出声音进行报警。
2.硬件结构
该报警器主要包括单片机、复位电路、按键电路、供电电源、温度检测模块烟雾和红外检测模块等几部分,单片机我们选择的是51系列单片机,便宜且好
实现。
电子钟总体设计如图1所示。
图1电子钟的总体设计
2.1硬件模块描述
(1)数码管显示部分
该报警器显示只需4位,格式为“X-丫丫”,因此需采用4个数码管,采用1个4位一体的共阳极数码管,若使4个数码管正常显示,必须采用数码管的动态扫描方式,即每一时刻只有一个数码管点亮,采用软件延时和人眼的视觉停留效果,使人眼看到的数码管是同时点亮的。
因此需要用8个端口控制数码管的段选,即决定数码管显示什么字符,4个端口控制数码管的位选,即决定该时刻让哪个数码管点亮。
考虑到数码管采用动态扫描方式,即循环扫描数码管的8位,
并将显示字符送入段选段,采取直接用P0口控制数码管的8个段选,为了加强驱动数码管的能力,在数码管的为选段加入三极管。
P2口控制位选。
数码管连
接如图2。
图3按键连接电路
(3)MQ-2烟雾传感器部分
此部分为为烟雾传感器,分为五个等级,当环境的烟雾浓度超过设置的浓度等级,蜂鸣器发出滴的声响,可通过按键关闭或开启,若无手动操作,如烟雾浓度持续超过限度都会报警。
闹钟连接如图4所示。
图4闹钟连接电路
(4)测温模块
为使电路最大限度简化,数字温度传感器显然优于模拟温度传感。
在以前使
用的温度传感器中,DS18B20独特的单线接口方式,在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯,使得其脱颖而出,
加之之前的一些使用经验使得编程容易许多。
故温度传感选DS18B20测温
模块如图5所示
DNG
CQCDV
■
VC
1
iF
2
3
R23
4.7K
P3.3
DS2
DS1820
图5测温模块电路
C
(5)电源模块
为了焊接电路简单,我们选择使用外接电源直接提供,简单、好实现。
电源
模块如图6所示3.
图6电源模块电路
5)红外传感器模块
红外传感器模块当有人接近时,单片机会检测到高电平,到没人时检测到的是低电平。
1234
3.软件设计
3.1主流程逻辑设计
在主程序中设置定时器定时器0工作在方式一,开始循环扫描个按键的状
态,检测到该按键按下,则执行相应的程序,其中按键一的按下还有标志位,每
次按下标志位都加一,根据标志位的不同可对温度和烟雾的报警上下限调整。
主
程序流程图7如下图所示。
图7主程序流程图
3.2温度和烟雾设定逻辑设计
时间设定模块的设计要点是按键的去抖处理与“一键多态”的处理。
即只涉及3个键完成了烟雾和温度参数的设定。
软件法去抖动的实质是软件延时,即检测到某一键状态变化后延时一段时间,再检测该按键的状态是否还保持着,如是则作为按键处理,否则,视为抖动,不予理睬。
“一键多态”即多功能键的实
现思想是,根据按键时刻的系统状态,决定按键采取何种动作,即何种功能。
时
间设定流程图如图
其中DS18B2啲操作序列如下。
典型的单总线命令序列如下:
第一步:
初始化;
第二步:
ROM命令跟随需要交换的数据;
第三步:
功能命令跟随需要交换的数据;
(每次访问单总线器件,必须严格遵守这个命令序列。
)
如果出现序列混乱,则单总线器件不会响应主机。
但是这个准则对于搜索ROM命令和报警搜索命令例外。
在执行两者中任何一条命令之后,主机不能执行其后的功能命令,必须返回至第一步。
1初始化
基于单总线上的所有传输过程,都是以初始化开始的。
初始化过程由主机发出的复位脉冲和从机响应的应答脉冲组成。
应答脉冲使主机知道总线上有从机设备,且准备就绪,复位和应答脉冲的时间详见单总线信号部分。
2ROM命令
在主机检测到应答脉冲后,就可以发出ROM命令。
每种命令长度为8,主机在发出功能命令之前必须送出合适的ROM命令。
ROM命令的操作流程如图3所示。
ROM命令字如下:
•READRO命令代码]33H0:
如果只有一片DS1820可用此命令读出其序列号,若在线DS1820多于一个,将发生冲突。
•MATCHROW代码]55HC:
多个DS1820在线时,可用此命令匹配一个给定序列号的DS1820此后的命令就针对该DS1820
•SKIPROM命令代码[CCH:
此命令执行后的存储器操作将针对在线的所有DS1820
•SEARCHRDH令代码]F0H]:
用以读出在线的DS1820的序列号。
•ALARMSEAR命令代码]ECH:
当温度值高于TH或低于TL中的数值时,此命令可以读出报警的DS1820
3功能命令
•WRITESCRATCHP命令代码]4EH:
写两个字节的数据到温度寄存器。
•READSCRATCHP命令代码[BEH]:
读取温度寄存器的温度值。
•COPYSCRATCHPAD代码]48H]:
将温度寄存器的数值拷贝到EEROM中,保证温度值不丢失。
•RECALLE命令代码]B8H:
将EERO中的数值拷贝到温度寄存器中。
•READPOWERSUP命令代码]B4H]:
在本命令送到DS1280之后的每一个读数据间隙,指出电源模式:
“0”为寄生电源;
“1”为外部电源。
4DS18B20时序及信号方式
所有的单总线器件要求采用严格的通信协议,以保证数据的完整性。
该协议
定义了几种信号类型:
复位脉冲、应答脉冲、写0、写1、读0和读1。
所有这些信号,除了应答脉冲以外,都由主机发出同步信号。
并且发送所有的命令和数据都是字节的低位在前,这一点与多数串行通信格式不同(多数为字节的高位在
前)。
初始化序列:
复位和应答脉冲
单总线上的所有通信都是以初始化序列开始,包括:
主机发出的复位脉冲及
从机的应答脉冲,如图9所示。
当从机发出响应主机的应答脉冲时,即向主机表
从机竝低急线电阻上竝
图9DS18B20复位与应答脉冲
明它处于总线上,且工作准备就绪。
在主机初始化过程,主机通过拉低单总线至少480卩s,以产生(Tx)复位脉冲。
接着,主机释放总线,并进入接收模式(Rx)。
当总线被释放后,5k上拉电阻将单总线拉高。
在单总线器件检测到上升沿后,延时15-60卩s,接着通过拉低总线60-240卩s,以产生应答脉冲。
4.1写时隙
存在两种写时隙:
“写1”和“写0”。
主机采用写1时隙向从机写入1,而采用写0时隙向从机写入0。
所有写时隙至少需要60卩s,且在两次独立的写时隙之间至少需要1卩s的恢复时间。
两种写时隙均起始于主机拉低总线(图5所示)。
产生写1时隙的方式:
主机在拉低总线后,接着必须在15卩s之内释放总线,由5k上拉电阻将总线拉至高电平;
而产生写0时隙的方式:
在主机拉低总线后,只需在整个时隙期间保持低电平即可(至少60卩s)。
在写时隙起始后15-60卩s期间,单总线器件采样总线电平状态。
如果在此期间采样为高电平,则逻辑1被写入该器件;
如果为0,则写入逻辑0。
4.2读时隙
单总线器件仅在主机发出读时隙时,才向主机传输数据,所以,在主机发出读数据命令后,必须马上产生读时隙,以便从机能够传输数据。
所有读时隙至少需要60卩s,且在两次独立的读时隙之间至少需要1卩s的恢复时间。
每个读时隙都由主机发起,至少拉低总线1卩s(图5所示)。
在主机发起读时隙之后,单总线器件才开始在总线上发送0或1。
若从机发送1,则保持总线为高电平;
若发送0,则拉低总线。
当发送0时,从机在该时隙结束后释放总线,由上拉电阻将总线拉回至空闲高电平状态。
从机发出的数据在起始时隙之后,保持有效时间15卩s,因而,主机在读时隙期间必须释放总线,并且在时隙起始后的15卩s之
内采样总线状态。
Vpu
1-wiRE.e.^te
GND
3.3AD0832逻辑设计
ADC0832为8位分辨率A/D转换芯片,其最高分辨可达256级,可以适应一般的模拟量转换要求。
其内部电源输入与参考电压的复用,据有双数据输出可作为数据校验,以减少数据误差,转换速度快且稳定性能强。
ADC0832与单片机的接口应为4条数据线,分别是CSCLKDODI。
但由于D0端与DI端在通信时并未同时有效并与单片机的接口是双向的,所以电路设计时可以D0和DI并联在一根数据线上使用。
当ADC0832未工作时其CS输入端应为高电平,此时芯片禁用,CLK和DO/DI的电平可任意。
当要进行A/D转换时,须先将CS使能端置于低电平并且保持低电平直到转换完全结束。
此时芯片开始转换工作,同时由处理器向芯片时钟输入端CLK输入时钟脉冲,DO/DI端则使用DI端输入通道功能选择的数据信号。
在第1个时钟脉冲的下沉之前DI端必须是高电平,表示启始信号。
在第2、3个脉冲下沉之前DI端应输入2位数据用于选择通道功能,其功能项见表1。
TABLE6,MUXAciaressing:
ADCO832Single-EndedMUXMode
MUXAddrese
Channel#
SGL/
DIF
ODD/SIGN
O
+
COMisirtterrruHytiecjtoAG1MD
TABLE7.MUXAddressing:
ADCO832DifferentialMUXMode
MUXAddress
ODD/
SIGN
—
如表1所示,当此2位数据为“1”、“0”时,只对CH0进行单通道转换。
当2位数据为“1”、“1”时,只对CH1进行单通道转换。
当2位数据为“0”、“0”时,将CH0作为正输入端IN+,CH1作为负输入端IN-进行输入。
当2位数据为“0”、“1”时,将CH0作为负输入端IN-,CH1作为正输入端IN+进行输入。
到第3个脉冲的下沉之后DI端的输入电平就失去输入作用,此后DO/DI端则开始利用数据输出DO进行转换数据的读取。
从第4个脉冲下沉开始由DO端输出转换数据最高位DATA7,随后每一个脉冲下沉DO端输出下一位数据。
直到第11个脉冲时发出最低位数据DATAQ—个字节的数据输出完成。
也正是从此位开始输出下一个相反字节的数据,即从第11个字节的下沉输出DATD0
随后输出8位数据,到第19个脉冲时数据输出完成,也标志着一次A/D转换的结束。
最后将CS置高电平禁用芯片,直接将转换后的数据进行处理就可以了。
更详细的时序说明请见表2。
CijKiUi
ADC0832Timing
yi<
5«
ii»
kiiuni4i»
muiiisn
JwmmwmRm
T
CUIhlTtaTH
DlPSELKT[Gl
9FT10
MUISITUIG
*iME
MURKrCAT!
L51RUJCAU
ADC0832程序流程图如图11所示。
图11ADC0832程序流程图
|rnini
4.设计结果
4.1原理图及PCB绘制
123456
利用protel99SE软件进行作品的电路设计和PCB绘制,如图12、图13所
示。
图13多功能电子钟PCB
4.2编程及调试
根据绘制的原理图,以C语言为开发语言,在KEILUVISI0N4软件平台上进行C程序的编辑,连接和调试,最终与proteus仿真软件相结合。
仿真效果如图14所示,程序见附录1。
图14报警器仿真效果
4.3实物作品
焊接电路后,测试成功,实物效果如图15所示。
图15实物效果
三、设计总结
在本次综合课程设计,我主要负责的是软件部分的ADC0832和18B20的程
序。
在写程序的过程中我总结了一下几点需要注意的地方:
1•在写程序之前一定要读懂芯片手册,特别是芯片的初始化,芯片的各个管脚的定义和时序图。
2•程序流程图起了很大的作用,在复杂的程序中帮我们理清了思路,在写程序中让我们少走弯路。
3•在写程序的时候一定要对函数名和各个位定义的名称特别注意,要有规范的写程序的格式,不然对后面检查修改程序造成麻烦。
通过这次课程设计,我也发现了不少问题。
比如,在使用keil软件的时候对
它的编译环境不是很熟,导致总是报错,但是最后还是被我克服了。
总的来说还是有不小的收获。
经过这次的设计,我对AD转换和各个芯片的通信更加熟悉了,对于读芯片的能力又有了提高。
当然这次课程设计虽然经过了我们的努力,但是肯定还是存在这很多不足,希望老师批评指正,我们很乐意接受。
2006.
2006.
2007.
四、参考文献
[1]万福君,潘松峰.单片微机原理系统设计与应用•中国科学技术大学出版社
[2]求是科技.8051系列单片机C程序设计完全手册[M].人民邮电出版社,
[3]张萍.基于数字温度计DSI8B20的温度测量仪的开发[J].自动化仪表,
附录
附录1报警器程序
#include<
AT89X52.h>
#ineludevintrins.h>
#include"
DS18B20.h"
#defineuintunsignedint
#defineucharunsignedchar//宏定义
#defineSETP1_0//定义调整键
#defineDECP1_1//定义减少键
#defineADDP1_2//定义增加键
#defineBEEPP3_4〃定义蜂鸣器
#definehujiaoP1_3
sbitHC=P1A5;
//
sbitADCS=P3A7;
sbitADCLK=卩3人5;
sbitADDI=P3A6;
sbitADDO=P3A6;
bitshanshuo_st;
//闪烁间隔标志
bitbeep_st;
//蜂鸣器间隔标志
bitflag=0;
〃紧急呼叫标志
sbitDIAN=P2A5;
//小数点
uintabc;
ucharx=4;
//计数器
signedcharm;
//温度值全局变量
ucharn;
ucharset_st=0;
//状态标志
signedcharshangxian=30;
//上限报警温度,默认值为30
signedcharxiaxian=5;
//下限报警温度,默认值为5
ucharnongdu=4;
ucharcodeLEDData[]={0x28,0xeb,0x32,0xa2,0xe1,0xa4,0x24,0xea,0x20,0xa0};
/*****延时子程序*****/
voidDelay(uintnum)
{
while(--num);
}
/*****初始化定时器o*****/
voidInitTimer(void)
TMOD=0x1;
TH0=0x4c;
TLO=OxOO;
//50ms(晶振11.0592M)}
/*****定时器0中断服务程序*****/
voidtimerO(void)interrupt1
TL0=0x00;
x++;
/*****
读取温度*****/
voidcheck_wendu(void)
uinta,b,c;
c=ReadTemperature()-5;
//获取温度值并减去DS18B20的温漂误差a=c/100;
II计算得到十位数字
b=c/10-a*10;
II计算得到个位数字
m=c/10;
〃计算得到整数位
n=c-a*100-b*10;
〃计算得到小数位
if(m<
0){m=0;
n=0;
}II设置温度显示上限
if(m>
99){m=99;
n=9;
/*****显示开机初始化等待画面*****/
Disp_init()
P2=0xf7;
〃显示-
P0=Oxbf;
Delay(200);
P0=0xef;
P0=Oxfb;
P0=0xfe;
P0=Oxff;
II关闭显示
I*****显示温度子程序*****/
Disp_Temperature()〃显示温度
P2=LEDData[m%10];
II显示C
Delay(300);
P2=LEDData[mI10];
II显示个位
PO=Oxef;
P2=0xf7;
〃显示十位
P2=LEDData[abc];
〃显示百位
P0=0xff;
I*****显示报警温度子程序*****/
Disp_alarm(ucharbaojing)
P2=0x3c;
//显示C
P0=0xbf;
P2=LEDData[baojing%10];
//显示十位
P2=LEDData[baojing/10];
//显示百位
P0=0xfb;
if(set_st==1)P2=0x61;
elseif(set_st==2)P2=0x3d;
//上限H、下限L标示P0=0xfe;
//关闭显示
Disp_nongdu(ucharbaojing)〃烟雾浓度报警显示
P2=0xff;
P2=LEDData[baojing];
〃显示浓度
voidAlarm()
if((m>
=shangxian&
&
beep_st==1)||(m<
xiaxian&
beep_st==1))BEEP=1;
elseif(abc>
=nongdu&
beep_st==1)BEEP=1;
//elseif(HC==1)BEEP=1;
//
elseBEEP=0;
if(x>
=10){beep_st=~beep_st;
x=0;
voidAlarm1()
if(beep_st==1)BEEP=1;
ucharADC0832(bitmode,bitchannel)//AD转换,返回结果
uchari,dat,ndat;
ADCS=0;
//拉低CS端_nop_();
_nop_();
ADDI=1;
//第1个下降沿为高电平
ADCLK=1;
//拉高CLK端
ADCLK=0;
//拉低CLK端,形成下降沿1