STC89C52的室内火气安全检测装置设计.docx
《STC89C52的室内火气安全检测装置设计.docx》由会员分享,可在线阅读,更多相关《STC89C52的室内火气安全检测装置设计.docx(31页珍藏版)》请在冰豆网上搜索。
STC89C52的室内火气安全检测装置设计
STC89C52的室内火、气安全检测装置设计
课程设计总结报告
课程名称电子技术课程设计
设计题目STC89C52的室内火、气安全检测装置设计
专业电子科学与技术
班级
姓名
学号
指导教师
报告成绩
二〇一二年四月八日
《系统设计与实践》课程设计任务书
一、课题名称
《基于STC89C52的室内火、气安全检测装置》
二、设计任务
1.采用STC89C52单片机和DS18B20和烟雾、气体传感器MQ-2等设计室内火灾、有毒气体泄露等多功能检测装置;
2.能检测火灾事故,并报警。
3.能检测有毒气体泄露事故,并报警
4.能实时显示室内温度值,并通过键盘设置温度报警上下限值。
三、设计报告撰写规范
系统设计总结报告正文,主要含以下内容(硬件、软件各部分内容也可组合起来进行撰写说明):
1.系统总体设计方案(画出系统原理框图、方案的论证与比较等内容);
2.硬件系统分析与设计(各模块或单元电路的设计、工作原理阐述、参数计算、元器件选择、完整的系统电路图、系统所需的元器件清单。
等内容);
3.软件系统分析与设计(各功能模块的程序设计流程图与说明、软件系统设计、软件抗干扰措施、完整的程序等内容);
4.系统仿真调试与参数测量(使用仪器仪表、故障排除、电路硬件和软件调试的方法和技巧、指标测试的参数和波形、测量误差分析);
5.总结(本课题核心内容及使用价值、电路设计、软件设计的特点和选择方案的优缺点、改进方向和意见等);
6.按统一格式列出主要参考文献。
第1节引言
本应用系统设计的目的是通过在课堂上学习的知识,以及查阅资料,培养一种自学的能力。
并且引导一种创新的思维,把学到的知识应用到日常生活当中。
在设计的过程中,不断的学习,思考和同学间的相互讨论,运用科学的分析问题的方法解决遇到的困难,掌握单片机系统一般的开发流程,学会对常见问题的处理方法,积累设计系统的经验,充分发挥教学与实践的结合。
全能提高个人系统开发的综合能力,开拓了思维,为今后能在相应工作岗位上的工作打下了坚实的基础。
第2节STC89C52的室内火、气安全检测装置的硬件结构设计
2.1DS18B20工作原理
DS18B20采用3脚PR-35封装或8脚SOIC封装,其内部结构框图如图3所示。
图3DS18B20内部结构图
64位ROM的位结构如图4所示。
开始8位是产品类型的编号,接着是每个器件的惟一的序号,共有48位,最后8位是前面56位的CRC检验码,这也是多个DS18B20可以采用一线进行通信的原因。
非易失性温度报警器触发器TH和TL,可通过软件写入户报警上下限。
图464位ROM结构图
DS18B20温度传感器的内部存储器还包括一个高速暂存RAM和一个非易失性的可擦除的EERAM。
高速暂存RAM的结构为8字节的存储器,结构如图5所示。
头2个字节包含测得的温度信息,第3和第4字节是TH和TL的拷贝,是易失的,每次上电复位时被刷新。
第5个字节为配置寄存器,它的内容用于确定温度值的数字转换分辨率。
DS18B20工作时按此寄存器中的分辨率将温度转换为相应精度的数值。
该字节各位的定义热图6所示。
低5位一直为1,TM是测试模式位,用于设置DS18B20在工作模式还是在测试模式。
在DS18B20出厂时该位被设置为0,用户不要改动,R1和R0决定温度转换得精度位数,即用来设置分辨率,定义方法见表1。
图5高速暂存RAM结构图
图6配置寄存器
表1DS18B20分辨率的定义规定
由于DS18B20单线通信功能是分时完成的,它有严格的时隙概念,因此读写时序很重要,系统对DS18B20的各种操作必须按协议进行.操作协议为:
初始化DS18B20→发ROM功能命令→发存储器操作命令→处理数据.
图8DS18B20测温原理图
DS18B20可以采用两种方式供电,一种是采用电源供电方式,此时DS18B20的1脚接地,2脚作为信号线,3脚接电源.另一种是寄生电源供电方式,如图9所示.单片机端口接单线总线,为为保证有效DS18B20时钟周期内提供足够的电流,可用一个MOSFET管来完成对总线的上拉.
图9DS18B20采用寄生电源的电路图
当DS18B20处于写存储器操作和温度A/D转换操作时,总线上必须有强的上拉,上拉开启时间最大为10us.采用寄生电源供电方式时Vdd和GND端均接地.由于单线制只有一根线,因此发送接口必须是三态的
2.3STC89C2单片机及其引脚说明
89C51是一种高性能低功耗的采用CMOS工艺制造的8位微控制器,它提供下列标准特征:
4K字节的程序存储器,128字节的RAM,32条I/O线,2个16位定时器/计数器,一个5中断源两个优先级的中断结构,一个双工的串行口,片上震荡器和时钟电路。
STC89C52管脚功能图
引脚说明:
·VCC:
电源电压
·GND:
地
·P0口:
P0口是一组8位漏极开路型双向I/O口,作为输出口用时,每个引脚能驱动8个TTL逻辑门电路。
当对0端口写入1时,可以作为高阻抗输入端使用。
当P0口访问外部程序存储器或数据存储器时,它还可设定成地址数据总线复用的形式。
在这种模式下,P0口具有内部上拉电阻。
在EPROM编程时,P0口接收指令字节,同时输出指令字节在程序校验时。
程序校验时需要外接上拉电阻。
·P1口:
P1口是一带有内部上拉电阻的8位双向I/O口。
P1口的输出缓冲能接受或输出4个TTL逻辑门电路。
当对P1口写1时,它们被内部的上拉电阻拉升为高电平,此时可以作为输入端使用。
当作为输入端使用时,P1口因为内部存在上拉电阻,所以当外部被拉低时会输出一个低电流(IIL)。
·P2口:
P2是一带有内部上拉电阻的8位双向的I/O端口。
P2口的输出缓冲能驱动4个TTL逻辑门电路。
当向P2口写1时,通过内部上拉电阻把端口拉到高电平,此时可以用作输入口。
作为输入口,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出电流(IIL)。
P2口在访问外部程序存储器或16位地址的外部数据存储器(例如MOVX@DPTR)时,P2口送出高8位地址数据。
在这种情况下,P2口使用强大的内部上拉电阻功能当输出1时。
当利用8位地址线访问外部数据存储器时(例MOVX@R1),P2口输出特殊功能寄存器的内容。
当EPROM编程或校验时,P2口同时接收高8位地址和一些控制信号。
·P3口:
P3是一带有内部上拉电阻的8位双向的I/O端口。
P3口的输出缓冲能驱动4个TTL逻辑门电路。
当向P3口写1时,通过内部上拉电阻把端口拉到高电平,此时可以用作输入口。
作为输入口,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出电流(IIL)。
P3口同时具有AT89C51的多种特殊功能,具体如下表1所示:
端口引脚
第二功能
P3.0
RXD(串行输入口)
P3.1
TXD(串行输出口)
P3.2
(外部中断0)
P3.3
(外部中断1)
P3.4
T0(定时器0)
P3.5
T1(定时器1)
P3.6
(外部数据存储器写选通)
P3.7
(外部数据存储器都选通)
表1P3口的第二功能
·RST:
复位输入。
当振荡器工作时,RST引脚出现两个机器周期的高电平将使单片机复位。
·ALE/
:
当访问外部存储器时,地址锁存允许是一输出脉冲,用以锁存地址的低8位字节。
当在Flash编程时还可以作为编程脉冲输出(
)。
一般情况下,ALE是以晶振频率的1/6输出,可以用作外部时钟或定时目的。
但也要注意,每当访问外部数据存储器时将跳过一个ALE脉冲。
·
:
程序存储允许时外部程序存储器的读选通信号。
当AT89C52执行外部程序存储器的指令时,每个机器周期
两次有效,除了当访问外部数据存储器时,
将跳过两个信号。
·
/VPP:
外部访问允许。
为了使单片机能够有效的传送外部数据存储器从0000H到FFFH单元的指令,
必须同GND相连接。
需要主要的是,如果加密位1被编程,复位时EA端会自动内部锁存。
当执行内部编程指令时,
应该接到VCC端。
·XTAL1:
振荡器反相放大器以及内部时钟电路的输入端。
·XTAL2:
振荡器反相放大器的输出端。
在本次设计中,采用89C51作为CPU处理器,充分利用其硬件资源,结合D触发器CD4013,分频器CD4060,模拟转换开关CD4051,计数器74LS90等数字处理芯片,主要控制两大硬件模块,量程切换以及显示模块。
下面还将详细说明。
2.4信号调理及放大整形模块,LM358芯片LM358内部包括有两个独立的、高增益、内部频率补偿的双运算放大器,适合于电源电压范围很宽的单电源使用,也适用于双电源工作模式,在推荐的工作条件下,电源电流与电源电压无关。
它的使用范围包括传感放大器、直流增益模块和其他所有可用单电源供电的使用运算放大器的场合。
特性:
内部频率补偿
直流电压增益高(约100dB)
单位增益频带宽(约1MHz)
电源电压范围宽:
单电源(3—30V);
双电源(±1.5一±15V)
低功耗电流,适合于电池供电,低输入偏流
低输入失调电压和失调电流
共模输入电压范围宽,包括接地
差模输入电压范围宽,等于电源电压范围
输出电压摆幅大(0至Vcc-1.5V)
第3节软件设计
统程序主要包括主程序,读出温度子程序,温度转换命令子程序,计算温度子程序,显示数据刷新子程序等等.
1.主程序
主程序的主要功能是负责温度的实时显示,读出并处理DS18B20的测量温度值,温度测量1s进行一次,其程序流程图见图10.
2.读出温度子程序
读出温度子程序的主要功能是读出RAM中的9个字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写.其程序流程图如图11所示.
图10DS18B20温度计主程序流程图
图11读出温度子程序流程图
3.温度转换命令子程序
温度转换命令子程序主要是发温度转换开始命令,当采用12分辨率时转换时间为750ms,在本程序设计中采用1s显示程序延时法等待转换的完成.温度转换命令子程序流程图如图12所示.
图12温度转换命令子程序流程图
4.计算温度子程序
计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判断,其程序流程图如图13所示.
图13计算温度子程序流程图
5.显示数据刷新子程序
显示数据刷新子程序主要是对显示数据进行刷新操作,当最高显示位为0时将符号显示位移入下一位.程序流程图如图14所示.
图14显示数据刷新子程序流程图
结束语
通过这两周的课程设计,我运用相关知识,自己从头至尾完完全全的制作了一块板子,并进行调试。
对“纸上学来终觉浅,绝知此事要躬行”这句话的含义也了解的更加透彻了。
虽然,讲解枯燥乏味;虽然,焊接烫伤了手;虽然……但还是很开心(也有放假两周的喜悦)。
最后做完了,验收时效果不是很好,心里还是有点淡淡的小伤感。
呵呵,算了不想了,下次努力吧(如果有下次的话)。
事实上,只有通过自己亲力亲为的去解决,才能体会到成功是的那份收获时的喜悦,从这次课程设计中,我深切的体会自己动手创造出来的劳动成果才是可贵的,不仅如此,在参与动手的过程中会有很多意想不到的收获。
参考文献
[1]李光飞,楼苗然主编.51系列单片机.北京:
北京航空航天大学出版社,2003
[2] 孙江宏、李良玉等.《Protel99电路设计与应用》.机械工业出版社.2003.2
[3]康华光.邹寿彬.电子技术基础(数字部分)[M].高等教育出版社.1998.7
[4]张毅刚.单片机原理及应用[M].高等教育出版社.2003
[5]陈步月.基于单片机的测试技术原理与应用[M].机械工业出版社.2007.3
[6]李忠国.陈刚.单片机应用技能实训[M].辽宁科技出版社.2006.11
[7]冯育长.马金强.单片机系统设计于实例分析[M].2007.5
附录一:
#include
#include//包含_nop_()函数定义的头文件
#defineucharunsignedchar
#defineuintunsignedint
#defineledP0
#definekeyP2
uinty1,y2,y3,y4;
unsignedcharTL;//储存暂存器的温度低位
unsignedcharTH;//储存暂存器的温度高位
uinttemph,templ;
uintTN;//储存温度的整数部分
uintTD;//储存温度的小数部分
floatTD1;//以小数形式储存温度的小数部分
uinttemp;
sbitw1=P1^7;
sbitw2=P1^6;
sbitw3=P1^5;
sbitw4=P1^4;
sbitMQ=P1^3;
sbitfmq=P3^5;
sbitdeng=P3^6;
uchars=0;//模式切换标志位
ucharcodetable2[]={0xc0,0xcf,0xa4,0x86,0x8b,0x92,0x90,0xc7,0x80,0x82,0xff};//没点的反
ucharcodetable4[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x2e,0x20};//0~9的ASCii码
unsignedcharcodetable1[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//没点的正
unsignedcharcodetable3[]=
{0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0xff};//有点的正
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voiddelay_2us()//延时2us
{
ucharp;
for(p=0;p<1;p++)
_nop_();
}
/*****************************************************
函数功能:
延时若干纳秒
入口参数:
n
***************************************************/
voiddelay_nus(ucharn)//延时2nus
{
ucharp;
for(p=0;pdelay_2us();
}
voiddelay1ms()
{
uchari,j;
for(i=0;i<2;i++)
for(j=0;j<30;j++);
}
/*****************************************************
函数功能:
延时若干微秒
入口参数:
n
***************************************************/
voiddelayms(ucharn)
{
uchari;
for(i=0;idelay1ms();
}
/*****************************************************
函数功能:
位置寻找函数
***************************************************/
findout(uintr,uinty)
{
uinti;
for(i=0;i<11;i++)
{
if(table4[i]==r)
break;
}
y=i;
}
/************************************************************************
以下是DS18B20的操作程序
************************************************************************/
sbitDQ=P1^0;
uchartime;//设置全局变量,专门用于严格延时
/*****************************************************
函数功能:
将DS18B20传感器初始化,读取应答信号
出口参数:
flag
***************************************************/
/*****************************************************
函数功能:
将DS18B20传感器初始化,读取应答信号
出口参数:
flag
***************************************************/
bitInit_DS18B20(void)
{
bitflag;//储存DS18B20是否存在的标志,flag=0,表示存在;flag=1,表示不存在
DQ=1;//先将数据线拉高
for(time=0;time<2;time++)//略微延时约6微秒
;
DQ=0;//再将数据线从高拉低,要求保持480~960us
for(time=0;time<200;time++)//略微延时约600微秒
;//以向DS18B20发出一持续480~960us的低电平复位脉冲
DQ=1;//释放数据线(将数据线拉高)
for(time=0;time<10;time++)
;//延时约30us(释放总线后需等待15~60us让DS18B20输出存在脉冲)
flag=DQ;//让单片机检测是否输出了存在脉冲(DQ=0表示存在)
for(time=0;time<200;time++)//延时足够长时间,等待存在脉冲输出完毕
;
return(flag);//返回检测成功标志
}
/*****************************************************
函数功能:
从DS18B20读取一个字节数据
出口参数:
dat
***************************************************/
unsignedcharReadOneChar(void)
{
unsignedchari=0;
unsignedchardat;//储存读出的一个字节数据
for(i=0;i<8;i++)
{
DQ=1;//先将数据线拉高
_nop_();//等待一个机器周期
DQ=0;//单片机从DS18B20读书据时,将数据线从高拉低即启动读时序
dat>>=1;
_nop_();//等待一个机器周期
DQ=1;//将数据线"人为"拉高,为单片机检测DS18B20的输出电平作准备
for(time=0;time<2;time++)
;//延时约6us,使主机在15us内采样
if(DQ==1)
dat|=0x80;//如果读到的数据是1,则将1存入dat
else
dat|=0x00;//如果读到的数据是0,则将0存入dat
//将单片机检测到的电平信号DQ存入r[i]
for(time=0;time<8;time++)
;//延时3us,两个读时序之间必须有大于1us的恢复期
}
return(dat);//返回读出的十进制数据
}
/*****************************************************
函数功能:
向DS18B20写入一个字节数据
入口参数:
dat
***************************************************/
WriteOneChar(unsignedchardat)
{
unsignedchari=0;
for(i=0;i<8;i++)
{
DQ=1;//先将数据线拉高
_nop_();//等待一个机器周期
DQ=0;//将数据线从高拉低时即启动写时序
DQ=dat&0x01;//利用与运算取出要写的某位二进制数据,
//并将其送到数据线上等待DS18B20采样
for(time=0;time<10;time++)
;//延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样
DQ=1;//释放数据线
for(time=0;time<1;time++)
;//延时3us,两个写时序间至少需要1us的恢复期
dat>>=1;//将dat中的各二进制位数据右移1位
}
for(time=0;time<4;time++);//稍作延时,给硬件一点反应时间
}
/*****************************************************
函数功能:
显示温度的整数部分
入口参数:
x
***************************************************/
voiddisplay_temp1(ucharx)
{
uchark,l;//j,k,l分别储存温度的百位、十位和个位
k=x/10%10;//取十位
l=x%10;//取个位
w1=0;
led=table1[k];
delay(4);
w1=1;
led=table3[l];
w2=0;
delay(4);
w2=1;
}
//小数部分
voiddisplay_temP3(ucharx)
{
w3=0;
led=table1[x];
delay(4);
w3=1;
w4=0;
led=0xC6;
delay(4);
w4=1;
}
/*****************************************************
函数功能:
做好读温度的准备
***************************************************/
voidReadyReadTemp(void)
{
Init_DS18B20();//将DS18B20初始化
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0x44);//启动温度转换
for(time=0;time<100;time++);//温度转换需要一点时间
Init_DS18B20();//将DS18B20初始化
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneCh