基于单片机的工业现场报警器设计.docx
- 文档编号:16349386
- 上传时间:2023-07-12
- 格式:DOCX
- 页数:24
- 大小:367.44KB
基于单片机的工业现场报警器设计.docx
《基于单片机的工业现场报警器设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的工业现场报警器设计.docx(24页珍藏版)》请在冰点文库上搜索。
基于单片机的工业现场报警器设计
1课题总体方案设计
1.1总体方案选择及说明
由于系统要求实现8路有害气体监测,考虑到一般的传感器产生模拟电压信号,因此系统中使用ADC0809作为电压信号的采样芯片。
MCU选取ATMEL公司的89C51单片机。
显示部分选择1602液晶模块,该模块可现实16×2字符,可以清晰明了显示有害气体名称及其含量。
报警部分使用一个蜂鸣器,通过向其发送一定频率的脉冲使之产生人耳能够听到的声音。
在仿真时,使用八个可调电阻,其滑动触点与ADC0809的8路模拟信号输入端相连,以模拟监测8种不通气的传感器。
2系统整体结构
2.1系统结构框图
P0
P1
8路模拟信号
P0
图2-1
2.2系统工作原理
在系统初始化后,依次检测8路输入的模拟信号,并与相应的气体安全指标进行对比(该指标已存入单片机),有一路超过基准指标时发出报警信号,点亮相应的指示灯。
与此同时,LCD上显示相应的信息(超标气体名称及超标指数)。
当用户按下停止响铃按钮时,报警声消失,但相应的指示灯仍保持点亮。
待工作人员清除故障后,有害气体下降到安全值以下是,报警指示灯灭,LCD上显示正常。
3单元模块设计
3.1主控MCU
该系统采用ATMEL的89C51,该单片机有以下特点:
1.
与MCS-51兼容
2.4K字节可编程闪烁存储器
3.寿命:
1000写/擦循环
4.全静态工作:
0Hz-24Hz
5.128*8位内部RAM
6.32可编程I/O线
7.两个16位定时器/计数器
8.5个中断源
9.可编程串行通道
89C51管脚如图3-1
(1)所示
图3-1
(1)
3.1.1单片机的复位电路
电路如图3-1
(2)所示
复位电路采用简单廉价的上电复位电路。
需要复位单片机时,断开电源重新上电即可。
3.1.2单片机的晶振电路
电路如图3-1
(2)所示
在晶振两侧各接一个30pf的瓷片电容接地,用来削减偕波对电路的稳定性的影响。
图3-1
(2)
3.2A/D转换单元
该系统采用ADC0809A/D转换单元,ADC0809是采样频率为8位的、以逐次逼近原理进行模—数转换的器件。
其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。
ADC0809管脚与内部结构如图3-2
(1)所示。
图3-2
(1)
ADC0809的工作过程是:
首先输入3位地址,此地址经译码选通8路模拟输入之一到比较器。
START上升沿将逐次逼近寄存器复位。
下降沿启动A/D转换,之后EOC输出信号变低,指示转换正在进行。
直到A/D转换完成,EOC变为高电平,指示A/D转换结束,结果数据已存入锁存器,这个信号可用作中断申请。
当OE输入高电平时,输出三态门打开,转换结果的数字量输出到数据总线上。
地址总线上的值于所选通道的对应关系如图3-2
(2)所示
图3-2
(2)
由于考虑到系统的简化,该系统没有使用地址锁存器。
ADC0809所需的控制信号均由单片机直接提供,包括时钟信号,由单片机内部的定时器提供。
具体接线如图3-2(3)所示
其基准电位为5V,实际中应由由稳压电路单独供电。
图3-2(3)
计划由单片机提供2.5KHz时钟信号,即周期为400us。
令定时器工作于工作方式1。
则定时器0初始化程序为:
voidTimeInitial()
{
TMOD=0x10;
TH1=(65536-200)/256;
TL1=(65536-200)%256;
EA=1;
ET1=1;
TR1=1;
}
3.3显示模块
该系统采用1602液晶显示模块,可以显示16×2字符,内部包含ASCII码标准字库,便于写入显示。
其接口信号说明如图3.3所示
图3.3
3.3.11602ALCM接口说明
写指令:
输入:
RS=L,RW=L,D0~D7=指令码,E=H输出:
无
写数据:
输入:
RS=H,RW=L,D0~D7=数据,E=H输出:
无
3.3.21602ALCM初始化
初始化过程:
1.延时15ms
2.写指令38H(不检测忙信号)
3.延时5ms
4.写指令38H(不检测忙信号)
5.延时5ms
6.写指令38H(不检测忙信号)
7.(以后每次写命令,读/写数据操作之前需检测忙信号)
8.写指令38H;显示模式设置写指令
9.08H;显示关闭
10.写指令01H;显示清屏
11.写指令06H;显示光标移动设置
12.写指令0CH;显示开及光标设置
3.4报警提示部分
根据要求要在检测到危险气体时产生报警信号,并点亮相应的指示灯。
报警音由一连续方波信号组成,保证产生的方波信号频率在20—20000Hz之间,人耳即可听到,要希望是声音尖锐,则可调高频率。
为了确保有足够的功率熟入到蜂鸣器,采用如图3.4
(1)的电路,三极管的基极接到单片机的P2.7。
图3.4
(1)
为了节省单片机的管脚,本系统采用74LS138译码器做报警灯的驱动部分。
74LS138真值表如图3.4
(2)所示。
图3.4
(2)
74LS138与单片机的连接参照如图3.4(3)所示。
当正常时P3.7输出高电平,这是8个发光二极管全部熄灭,当检测到有害气体超标时,P3.7输出低电平,此时P3.4、P3.5、P3.6输出对应的值,点亮相应的发光二极管。
图3.4(3)
4软件设计
4.1主程序流程图
4.2中断服务子程序流程图
外部中断0定时器0
4.3程序说明
由于各种气体的危害浓度指标不同,程序初始定义的warn[]数组,方便对各个有害气体的安全值做具体设定。
ucharcodewarn[]={10,100,100,150,20,50,100,150};//设定各个有害气体的指标
在采集8路模拟信号时,由于存在先后的顺序,即检测到高危险气体时则会给出高危险气体对应的报警信号。
同时也可以在出现地危险气体超标时,发生高危险气体超标,则会优先警告有高危险气体。
如此便符合实际意义,维修人员可以根据报警提示,抢先修理安全隐患最大的故障。
由于ADC0809提供的是2进制数,送给1602的数据则是以一个字符为单位。
首先需要将数据进行处理,将百位,十位,个位分别取出记录。
/****************数据转换程序***************/
voiddisplay()
{temp=getdata[number]*1.0/255*500;
dispbuf[4]='%';
dispbuf[3]=temp%10+0x30;//取个位
dispbuf[2]=temp/10%10+0x30;//取十位
dispbuf[1]='.';
dispbuf[0]=temp/100%10+0x30;//取百位
write_str(0x80,gas[number-1]);
write_str(0x80+0x0b,dispbuf);
}
/*******************************************/
用外部中断0做停止响铃按键的检测,减小了CPU的使用率,同时使相应按键更加准确,及时。
程序采用模块化设计,1602的相关函数用H文件包含到项目文件中。
主文件中大量使用子函数,未定义,字符定义。
方便修改及调试。
由于考虑到该系统对时序的要求不高,故没有应用到混合编程,全部采用C语言。
充分利用高级语言通俗易懂,编写效率高,模块化设计的优点。
5调试结果与说明
该系统初期采用keilC与proteus联调仿真。
在Keil中将项目文件写好,经过编译产生HEX文件,装载到proteus中的单片机内,在Keil中将仿真设备设置为proteus,进入debug模式即可实现联调调试。
在调试中可是设置断点,用以查看相应的寄存器是否存储正确的数值,提高了软件设计的差错效率。
同时由于在proteus中可以清晰的看到硬件的真实反映,也可反过来寻找软件中存在的错误。
开始仿真,首先是自检程序,8个发光二极管依次点亮,之后蜂鸣器产生3次“嘟”声,证明器件完好。
自检结束,检测8路模拟电压信号是否超标,1602上显示“EverythingisOK”表示一切正常。
调节一号滑动变阻器,使IN1通道的电压上升,达到设定的危险值时,蜂鸣器发出报警音,与此同时,1号发光二极管点亮,1602上显示“CO0.25%”前者表示有害气体为一氧化碳,后者表示一氧化碳浓度为0.25%。
按下报警停止按钮,报警音停止,1号反光二极管仍亮,1602继续显示“CO0.25%”调节滑动变阻器是输入电压下降到0.25V以下,报警灯灭同时1602显示“EverythingisOK”。
再次调高6号滑动变阻器,1602上显示“CH41.00%”,同时六号指示灯亮,产生报警音。
此时调高一号滑动变阻器,1602上显示“CO0.25%”一号指示灯亮,产生报警音。
即系统有优先选择的功能。
由于试验中用电压信号来代替相应的气体检测传感器提供的信号,数据未经处理,如0.25%表示电压为0.25V,1.00%表示电压为1.00V,特此说明。
6使用说明
该系统无需设置,将检测不通气体的传感器接至ADC0809的8个模拟信号输入端即可。
如需检查蜂鸣器,指示灯是否良好,断电重启即可进入自检程序。
7总结
经过这两个礼拜的单片机课程设计使我对单片机的认识更加深了一步。
刚踏进大学的时候,受到家庭的熏陶,使我对单片机有着很浓厚的兴趣,在大一的时候就开始学习PIC,刚开始看单片机的书时,感觉就是在看天书。
但是渐渐的,明白了一点点。
回想起第一次在软件上仿真跑马灯程序,心情兴奋不已。
之后上了大二,买了开发板和debugger。
开始在硬件上调试程序,在之后参加的一些电子设计比赛中获得大量的实际经验,同时也培养了我团队合作的意识。
这次课程设计的要求虽然以前没有做过,但也设计了不少。
拿到课题的当天晚上在网上找了一些有关ADC0809资料,发现在proteus中没有0809的样本库,所以在之后的仿真中我使用了ADC0808代替。
晚上调到1点左右,把老师所说的基本要求完成了。
第二天下午又做了一些修饰。
原先用软件查询的方式检测报警停止按键,后来发现有时检测程序跳过,按键信号没有被查到。
后来改用中断,解决了此问题。
由于之前做过的一些项目里大部分都用到了1602,那些子模块我也都有,我就直接拿来,很好的移植到了我的程序里。
做单片机需要的是一个积累,做的东西少,自然不会形成一些感觉,就像我现在,在编程的时候就是感觉到哪,写到哪。
虽然这样子并不科学,但是对于这么一个相对规模不大的设计来说,这种感觉使我轻松的编完了程序。
还有就是以前做的模块最好都要保存下来,很多东西并不需要我们自己去一条一条的编写,我们要学会的就是拿来用就行了。
8参考文献
1、教材《单片微型计算机技术》刘国荣编机械工业出版社
2、《单片微型计算机原理、应用及接口技术》张迎新编国防工业出版社
3、《单片机实用系统设计技术》房小翠编国防工业出版社
4、《单片机应用系统设计》何立民编北航出版社
5、《单片机原理及接口技术》曹琳琳编国防科技大学出版社
7附录
附录A系统原理图
附录B程序清单
/****************************************************/
/**/
/*电气0605班李程志*/
/*完成时间:
2009.6.9*/
/*Copyright2009-2010skybird*/
/*AllRightsReserved*/
/**/
/****************************************************/
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
unsignedchardispbuf[5];
unsignedchargetdata[8];//存储八路模数转换后的结果
unsignedinttemp;
unsignedinttemp1;
unsignedcharcount;
unsignedchard=0;
charcancel=0;
ucharnumber;
ucharcodewarn[]={10,100,100,150,20,50,100,150};//设定各个有害气体的指标
ucharcodetd[]={0x04,0x14,0x24,0x34,0x44,0x54,0x64,0x74};//通道先择数组
ucharcode*gas[]={"CO","NO","NO2","SO2",
"SO3","CH4","C6H6","HCHO"};//有害气体名称
ucharcodeok[]={"EverythingisOK"};
sbitST=P3^0;
sbitOE=P3^1;
sbitEOC=P2^3;
sbitCLK=P3^3;
sbitP32=P3^2;
sbitP34=P3^4;
sbitP35=P3^5;
sbitP36=P3^6;
sbitP37=P3^7;
sbitP20=P2^0;
sbitP21=P2^1;
sbitP22=P2^2;
sbitP23=P2^3;
sbitBEEP=P2^7;
sbitP17=P1^7;
charflag=0;//检测到指标高于设定值是flag=1
/********************定时器初始化*************************/
voidTimeInitial()
{
TMOD=0x10;
TH1=(65536-200)/256;
TL1=(65536-200)%256;//定时200us
EA=1;
ET1=1;
TR1=1;
}
/*********************************************************/
/***************八路模数转换存入getdata[]******************/
voidadc()
{chari,m=1;;
for(i=0;i<8;i++)
{
P2=td[i]|0x0f;
ST=0;
OE=0;
ST=1;
ST=0;
delay(3);
while(EOC==0);
OE=1;
getdata[m]=P0;
OE=0;
m++;
}
}
/*****************************************************************/
/************************响铃程序***********************************/
voidalarm(void)
{
uchari;
for(i=60;i>0;i--)
{
BEEP=~BEEP;
delay
(2);
BEEP=~BEEP;
delay
(2);
}
}
/************************自检程序**********************************/
voidtest()
{chari;
for(i=0;i<8;i++)
{
P3=td[i];
delay(800);
}
P37=1;
for(i=0;i<3;i++)
{
alarm();
delay(1500);
}
}
/*******************************************************************/
/*******************检测程序****************************************/
voidcheck()
{chari;
for(i=1;i<=8;i++)
{
if(getdata[i]>warn[i-1])
{
flag=1;
number=i;//记录超过指标的通道;
break;
}
else
flag=0;
}
}
/******************************************************************/
/**********************数据转换程序********************************/
voiddisplay()
{temp=getdata[number]*1.0/255*500;
dispbuf[4]='%';
dispbuf[3]=temp%10+0x30;//取个位
dispbuf[2]=temp/10%10+0x30;//取十位
dispbuf[1]='.';
dispbuf[0]=temp/100%10+0x30;//取百位
write_str(0x80,gas[number-1]);//显示
write_str(0x80+0x0b,dispbuf);
}
/*******************************************************************/
/*******************************主函数******************************/
voidmain()
{
test();//自检
P3=0xff;
TimeInitial()//定时器初始化;
lcd_init();//1602初始化
EA=1;
EX0=1;
while
(1)
{
adc();//启动AD转换
check();//检查是否超标
cancel=0;
while(flag==1)
{
P32=1;
display();//显示超过指标的信息
P3=td[number-1];
P37=0;
if(cancel==0)//判断停止报警按键是否按下
{
alarm();//报警音
delay(1000);
}
P3=0x0f|td[number-1];
adc();//启动AD转换
check();//检查是否超标
}
P37=1;
write_str(0x80,ok);
cancel=0;
}
}
/*********************************************************************/
/*****************************外部中断0中断服务程序******************/
voidinter(void)interrupt0using1
{cancel=1;//停止报警键按下,cancel=1;
}
/*********************************************************************/
/*****************************定时器0中断服务程序********************/
voidt1(void)interrupt3using2
{
TH1=(65536-200)/256;
TL1=(65536-200)%256;
CLK=~CLK;
}
/*********************************************************************/
注:
电气与信息工程系课程设计评分表
项目
评价
设计方案的合理性与创造性
硬件制作或软件编程完成情况*
硬件制作测试或软件调试结果*
设计说明书质量
设计图纸质量
答辩汇报的条理性和独特见解
答辩中对所提问题的回答情况
完成任务情况
独立工作能力
组织纪律性(出勤率)
综合评分
指导教师签名:
________________
日期:
________________
注:
表中标*号项目是硬件制作或软件编程类课题必填内容;
此表装订在课程设计说明书的最后一页。
课程设计说明书装订顺序:
封面、任务书、目录、正文、评分表、附件(非16K大小的图纸及程序清单)。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 工业 现场 报警器 设计