基于STC12C5A16AD酒精浓度测试仪制作.docx
- 文档编号:25916855
- 上传时间:2023-06-16
- 格式:DOCX
- 页数:35
- 大小:266KB
基于STC12C5A16AD酒精浓度测试仪制作.docx
《基于STC12C5A16AD酒精浓度测试仪制作.docx》由会员分享,可在线阅读,更多相关《基于STC12C5A16AD酒精浓度测试仪制作.docx(35页珍藏版)》请在冰豆网上搜索。
基于STC12C5A16AD酒精浓度测试仪制作
技师核心技术专题研修
设计说明书
课题名称基于STC12C5A16AD酒精浓度测试仪制作
专业班级07技师1班
学生姓名李江
学号091304
指导教师毛宏光
宁波技师学院电气技术系
二零零年月
摘要
自《刑法修正案(八)》和修改后的《道路交通安全法》正式实施,“醉酒驾驶”正式入刑。
不仅交警部门,而且很多车主都期盼能够有便携仪器方便地测量气体酒精浓度,为安全驾驶提供保障,有效减少重大交通事故的发生。
本研究设计的酒精浓度测试仪是一款实用性强、安全可靠的气体乙醇浓度检测工具,采用高精度MQ-3乙醇气体传感器对空气中的乙醇浓度进行检测,利用宏晶公司高性能低成本单片机STC12C5A16AD对检测信号进行A/D转换和处理,最后通过液晶屏显示输出。
本研究设计的酒精浓度测试仪还具有醉酒阈值设定功能,可以根据法律法规或用户需要设定修改醉酒阈值,并进行保存。
关键词:
A/D转换;MQ-3;STC12C5A16AD;酒精浓度
目录
1 引言4
2 总体设计5
2.1设计前的准备工作5
2.2设计的要求5
2.3设计构思5
2.4硬件电路PCB设计6
2.5软件程序的设计6
3 硬件设计7
3.1 微处理器系统7
3.1.1 阈值存储电路7
3.1.2 复位电路7
3.1.3 超限报警电路7
3.2 键盘和显示模块8
3.3 供电及程序下载电路9
3.3.1 单片机最小系统硬件电路设计9
3.3.2MQ_3传感器硬件电路设计10
4 软件设计11
4.1 总体程序流程图11
4.2 AT24C04初始化程序11
4.2.1 LCD1602初始化程序14
5 制作和调试18
5.1仿真调试中的问题18
5.2硬件电路的问题18
6 结论19
致 谢20
参考文献21
附录1 系统实物图22
附录2实验原理图23
附录3电路PCB24
附录4源程序25
1 引言
本设计基于STC12C5A16AD单片机设计的酒精气体浓度探测仪,可用来检测酒精气体浓度,酒精气体浓度测试仪在生产生活中有重要的应用,比如,在一些环境要求严格的生产车间,用这种酒精浓度探测仪,可随时检测车间内的酒精气体浓度,当酒精气体浓度高于允许限定值时,发出警报,提醒人们及时通风换气,做到安全生产,此酒精测试仪经过再一步的改进可以使用到酒后驾驶测试上面去,利用该测试仪来告诫驾驶员请勿酒后驾驶。
在这次的设计中,利用了MQ-3型酒精的传感器通过对空气中的酒精浓度测试转换成0~5V的模拟量电压进行输出,把这个0~5V的电压传送到STC12C5A16AD内部自带的A/D转换模块中去,通过模拟量模块的转换输出一个8位0~255的数据给单片机的P1口,再通过单片机进行一些软件程序的处理显示在LCD的液晶上面。
2 总体设计
2.1设计前的准备工作
本次设计中主要测试的对象就是几种不同浓度的酒精溶液,主要的控制对象就是基于STC12C5A16AD单片机控制处理部分,那么在设计首先需要研究的就是该系统的硬件结构,通过几天的资料查询,确定下来以MQ-3为测试的传感器,有了传感器之后就利用了Proteus数字电路仿真软件进行了硬件的电路的设计,有了硬件电路之后就需要设计软件了,那么也是通过各种渠道进行资料的收集,大概出来一个初步的设计构思,最后一个就是要对MQ-3的酒精传感器进行一个特性的研究分析,在查询各种资料后得出了,为了尽量减少设计的气体传感器的测量误差,在测量酒精溶液样品时要考虑并解决3个主要问题。
一是外界环境流动空气对传感器的影响和对气体样品的稀释,二是样品的稳定性对测量带来的误差,三是水蒸气对测量的影响。
知道了这三点信息之后就进行前期的测试和验证,通过98%的工业乙醇和水混合得到几种浓度的酒精溶液进行测试,根据自己的测试和各种查询的资料得出了一点酒精传感器相关特性的资料。
2.2设计的要求
在这次设计当中,设计的要求有通过酒精传感器要对几种不同浓度的酒精溶液进行浓度测试,通过前期的资料查询和各种分析最终确定下来测试浓度范围在0~30度,误差率在5%~15%之间,由于酒精传感器的特性关系测量的浓度越高误差率就越大了,在模拟量转换过程中使用到单片机自带的A/D功能,需要在液晶屏上对酒精浓度的显示并且超过预设值后进行蜂鸣器报警,除此之外还需要通过串口与上位机进行通讯并且能够简单的传送一些数据等。
2.3设计构思
在这次设计中采用了STC12C5A16AD单片机,使用这款单片机的主要原因有目前市场比较常见的,另外内存比51单片机大4倍,最主要的是这款单片机集成了8位高速A/D转换器,而且在烧写程序的时候比较方便,然后程序的结构完全跟其他51一样,所以采用了这个单片机。
在设计该测试仪时首先查看了STC12C5A16AD单片机的数据手册,了解到了一些基本使用,就是A/D转换的过程,根据这个思路进行设计,在软件方面设计可以根据其他参考的例程进行程序的编写,这个测试仪主要用来试验,所以被测的酒精也是自己根据剂量配比的。
在设计之初初步的想法就是通过传感器对各种浓度的酒精进行测试,然后将测试的结果通过单片机进行转换,然后显示到LED的数码管上面,测试仪还具有超限报警,传感器故障显示,按钮复位,串口与上位机通讯等功能。
2.4硬件电路PCB设计
在这次的设计中,省去了AD0809芯片所以硬件设计并不复杂,由于单片机的管脚可以由自己定义,所以制版的时候相对于也比较的简单,但是由于线比较多,所以在设计中还是需要合理的放置才不会出错。
具体的硬件部件见附图。
2.5软件程序的设计
在这个测试仪的设计中最主要的部分就是软件的设计,单片机的程序设计是最主要的一部分,如果没有一个很好的程序就无法使测试仪正常的工作起来,在这次程序的设计中采用C语言的编程,因为这个程序中需要牵涉到数据的计算,由于C语言对数据的处理比较的方便和简单,而且整个编程的过程C语言相对于汇编语言简单。
这次整个程序分为了几个部分,第一部分就是对整个程序中所需要用到的一些数据进行定义,那么我这次的程序中需要用到浮点数、整数等,所以就在程序的开始进行一个全局的定义,第二部分就是主程序,主程序中包括了那些中断的初始,以及P0.0的数据的采集控制,单片机的一些IO口的初始,串口通讯的初始等。
第三部分就是对AD采集进来的数据进行转换,根据传感器的特性做了一些转换公式,通过各个区间的比较满足条件进行转换,转换出来的数据送到指定的数据寄存器里面。
第四部分显示部分,在前进的数据处理之后对所需要的数据进行显示,第五部分就是一些子程序,有中断的子程序和延时的子程序。
整个程序的结果就是有这些部分组成。
3 硬件设计
本系统硬件主要有三大模块组成:
微处理器系统、键盘和显示模块和串口模块。
3.1 微处理器系统
本系统的微处理器采用STC12C5A16AD单片机,是STC系列单片机的其中一款自带A/D转换功能,经过设计前的准备和收集的资料设计出可靠的硬件电路。
3.1.1 阈值存储电路
如图3-1是较为常用的单片机外围存储电路,本存储器采用了EEPROM,是ATMEL公司生产的一款。
醉酒阈值存储在EEPROM芯片AT24C04中,并可以通过“增加”、“减少”按键调节并保存。
AT24C04是IIC接口的EEPROM芯片,可以用于掉电不易失数据的存储。
其电路如图3-1所示。
图中A0、A1和A2为芯片的地址引脚,一般接地即可。
SCL和SDA为AT24C04和单片机IIC通信的时钟线和数据线
图3-1单片机外围时钟电路
3.1.2 复位电路
如图3-2是系统中的复位电路硬件设计,此复位设计采用高电平复位。
图3-2单片机复位电路
3.1.3 超限报警电路
如图3-3所示为超限报警电路,电路采用有源蜂鸣器报警提示。
图3-3超限报警电路
3.2 键盘和显示模块
如图3-4是系统需要的按键电路设计,在电路中共用到了3个按键分别为,加、减计数和复位按键。
如图3-5所示,为液晶显示接口硬件设计,采用接插件设计,方便、易插拔。
图3-4单片机按键电路
图3-5单片机显示接口电路
3.3 供电及程序下载电路
如图3-6为电源电路设计,电路中得供电方式采用USB供电,目的是为了方便插接,接口标准化。
如图3-7为程序下载及单片机通讯电路,程序下载电路采用STC_ISP下载方式下载,利用MAX3232设计硬件下载电路,这样的设计也是经过深思熟虑的,其一是下载程序方便,其二是单片机通讯电路容易设计。
图3-6单片机电源供电电路
图3-7单片机电源供电电路
3.3.1 单片机最小系统硬件电路设计
如3-8所示为单片机最小系统核心硬件电路设计,电路中都是单片机工作缺一不可的一些器件,例如:
晶振、电容、复位电路、电源等。
图3-8单片机系统核心电路
3.3.2MQ_3传感器硬件电路设计
MQ-3乙醇气体传感器及其调理电路原理如图3-9所示。
其外形如图5所示。
经过调理,检测信号由电阻值转变成电压值,便于后续电路进行A/D转换和处理
图3-9MQ-3传感器原理图设计
该传感器模块具有如下特点,方便与单片机系统接口组成检测仪器。
●具有信号输出指示。
●双路信号输出(模拟量输出及TTL电平输出)
●TTL输出有效信号为低电平。
●模拟量输出0~5V电压,浓度越高电压越高
4 软件设计
4.1 总体程序流程图
如图4-1所示为总体程序流程图。
当检测到酒精气味时,气体传感器MQ-3两个电极端A-B间电阻将变小,对应与气体传感器负载电阻的分压将变大,输出电压也将变大。
图4-1总体程序流程图
4.2 AT24C04初始化程序
#include"2402.h"
voidDELAY(unsignedintt)
{
while(t!
=0)
t--;
}
/******************************
IICDRIVE
******************************/
voidIICStart(void)
{
SCL=0;
DELAY
(1);
SDA=1;SCL=1;DELAY
(1);
SDA=0;DELAY
(1);
SCL=0;
}
voidIICStop(void)
{
SDA=0;SCL=1;DELAY
(1);
SDA=1;DELAY
(1);
SCL=0;
}
voidSEND0(void)
{
SDA=0;
SCL=1;
DELAY
(1);
SCL=0;
}
voidSEND1(void)
{
SDA=1;
DELAY
(1);
SCL=1;
DELAY
(1);
SCL=0;
}
bitCheck_Ack(void)
{
unsignedcharerrtime=250;
DELAY
(1);
SCL=1;
DELAY
(1);
CY=SDA;
while(CY)
{
errtime--;
CY=SDA;
if(!
errtime)
{
IICStop();
return1;
}
}
DELAY
(1);
SCL=0;
return0;
}
voidWrite_byte(unsignedchardat)
{
unsignedchari;
for(i=0;i<8;i++)
{
if((dat<
SEND1();
else
SEND0();
}
}
unsignedcharRead_byte(void)
{
unsignedchari,temp=0;
for(i=0;i<8;i++)
{
SDA=1;
SCL=1;
DELAY
(1);
if(SDA==1)
{
temp=temp<<1;
temp=temp|0x01;
}
else
temp=temp<<1;
SCL=0;
}
returntemp;
}
/************************************
EEPROMDRIVE
Addr:
from0x00-->
*************************************/
unsignedcharrdeeprom(unsignedcharaddr)
{
unsignedchartemp=0;
bitflag=0;
IICStart();
Write_byte(0xa0);
Check_Ack();
Write_byte(addr);
Check_Ack();
IICStart();
Write_byte(0xa1);
Check_Ack();
temp=Read_byte();
SEND1();
IICStop();
returntemp;
}
voidwrteeprom(unsignedcharaddr,unsignedchardat)
{
IICStart();
Write_byte(0xa0);
Check_Ack();
Write_byte(addr);
Check_Ack();
Write_byte(dat);
Check_Ack();
IICStop();
}
4.2.1 LCD1602初始化程序
/********************************************************************
*文件名:
液晶1602显示.c
*描述:
该程序实现了对液晶1602的控制。
***********************************************************************
#include"1602.h"
#include"math.h"
voiddelay()
{
inti,j;
for(i=0;i<=10;i++)
for(j=0;j<=2;j++);
}
ucharConvert(ucharIn_Date)
{
/*
uchari,Out_Date=0,temp=0;
for(i=0;i<8;i++)
{
temp=(In_Date>>i)&0x01;
Out_Date|=(temp<<(7-i));
}
returnOut_Date;
*/
returnIn_Date;
}
voidenable(uchardel)
{
P0=Convert(del);
RS=0;
RW=0;
E=0;
delay();
E=1;
delay();
}
voidwrite(uchardel)
{
P0=Convert(del);
RS=1;
RW=0;
E=0;
delay();
E=1;
delay();
}
voidL1602_init(void)
{
enable(0x01);
enable(0x38);
enable(0x0c);
enable(0x06);
enable(0xd0);
}
voidL1602_char(ucharhang,ucharlie,charsign)
{
uchara;
if(hang==1)a=0x80;
if(hang==2)a=0xc0;
a=a+lie-1;
enable(a);
write(sign);
}
voidL1602_string(ucharhang,ucharlie,uchar*p)
{
uchara;
if(hang==1)a=0x80;
if(hang==2)a=0xc0;
a=a+lie-1;
enable(a);
while
(1)
{
if(*p=='\0')break;
write(*p);
p++;
}
}
//显示整型的温湿度数据用,共占用4位,其中一位符号位
voidL1602_int(ucharhang,ucharlie,intnum)
{
uinttemp;
uintgewei,shiwei,baiwei,sign;
//首先将4位清空
L1602_char(hang,lie+0,'');
L1602_char(hang,lie+1,'');
L1602_char(hang,lie+2,'');
L1602_char(hang,lie+3,'');
if(num>=0)
{
sign=0;
}
else
{
sign=1;
}
temp=abs(num);
baiwei=temp/100;
temp=temp-baiwei*100;
shiwei=temp/10;
gewei=temp-shiwei*10;
num=abs(num);
if(num>=100)
{
if(sign==1)//负数
{
L1602_char(hang,lie,'-');
}
L1602_char(hang,lie+1,baiwei+48);
L1602_char(hang,lie+2,shiwei+48);
L1602_char(hang,lie+3,gewei+48);
}
elseif(num>=10)
{
if(sign==1)
{
L1602_char(hang,lie+1,'-');
}
L1602_char(hang,lie+2,shiwei+48);
L1602_char(hang,lie+3,gewei+48);
}
else
{
if(sign==1)
{
L1602_char(hang,lie+2,'-');
}
L1602_char(hang,lie+3,gewei+48);
}
}
5 制作和调试
5.1仿真调试中的问题
在整个设计中的第一步就是仿真的调试,在仿真的调试存在的问题有,仿真时候电路设计的问题,第一个问题就是刚开始的时候设计的电路始终都不会来,原因就是在仿真中LCD1602显示是比较方便的,但是在初始化过程中出错那就麻烦了,因为在程序中的清屏写得有问题,所以一开始就显示不正常反复的跳转。
第二问题就是在仿真调试的时候经常会遇到的问题就是有些器件无法正常的使用,比如MQ-3就没有仿真器件,只能是用别的模拟量器件代替。
5.2硬件电路的问题
在硬件电路调试中碰到的问题也不少,第一个问题就是蜂鸣器报警电路有点小问题,把原因是把蜂鸣器和发光二极管接到了一IO口中,导致发光二极管不会亮蜂鸣器报警也不正常。
第二问题就是LCD显示的时候在检测到模拟量的时候反应有点迟钝这个就是程序效率的问题了,造成了整个电路调试的时候有不正常了。
第三个问题就是,在刚开始设计电路的时候没有很好的验证,导致了那些下拉电阻和上拉电阻都没有什么用处,所以需要在焊接上去的电路中把这些问题的给解决。
6 结论
此次酒精测试仪的设计参考了一些网上搜集来得资料,主要是软件方面,在硬件设计上还是花费了一些时间,尤其是对EEPROM的操作上,自上单片机课程以来对于外部访问,尤其是地址操作很不习惯也不熟悉,所以在操作上存在一定的困难。
在硬件上对于单片机选型也是一门学问,这次课题设计中必须要用到的两样东西是ADC和串口,那么ATMEL公司的AT89C51系列的单片机不具备自带ADC功能,必须外接ADC0809如此一来在硬件的设计上又增加了新的难度,为了简化电路,提高成功率我选择了STC系列单片机具体型号为STC12C5A16AD,此型号单片机自带8位高速ADC经过软甲你编程设计即可派上用场,这样大大减轻了设计压力。
在做好PCB后在调试方面还是存在一定的问题,例如串口在调试的时候第一次就没有成功,原因是在设计原理图的时候网络标号标错了,导致TXD和RXD接反了,所以找到故障排除后串口调试就成功了,其次是LCD的显示问题,在显示的时候被测值在屏幕上显示总是慢半拍,程序效率低了点,在程序中我采用了1SA/D转换一次,其实感觉上还是有点慢的,主板调试成功后就是MQ-3传感器调试了,这次的传感器没有选择模块式的,原因是价格太贵,还有就是自己想弄明白它的工作原理,为了这两个理由也是吃了不少苦头,总的来说还是有一定收获的。
经过这次单片机的课程设计才让我真正了解到我们还有许多的知识都需要学习,在某个方面还是比较欠缺的,希望自己在以后的学习中更加的努力去学习,尽可能的自己去多写一些自己的程序,参考、参照只是辅助的一部分,重心总在自己身上。
致 谢
本人在课题设计过程中得到了毛宏光老师的细心指导,以及同学的帮助,在此我由衷的感学老师和同学,整个过程中还是比较曲折的,在我不懈努力的情况下完成了此次设计。
参考文献
[1]张立红单片微型计算机原理与应用[M]中国劳动和社会保障出版社
[2]周坚单片机C语言轻松入门[M]北京航空航天大学出版社
[2]赵建领零基础单片机C语言程序设计[M]机械工业出版社
附录1 系统实物图
附录2实验原理图
附录3电路PCB
主板PCB
MQ-3传感器PCB
附录4源程序
#include"STC12c5A.h"
#include"1602.h"
#include"2402.h"
#defineucharunsignedchar
#defineuintunsignedint
//声明常量
#defineALCH80//醉驾标准80mg/L
//K_MG_MV和K_ZERO为传感器校准系数,要根据每个MQ-3模块校准
#defineK_MG_MV160/66//传感器灵敏度系数,每毫克/L对应的10毫伏数
#defineK_ZERO0//传感器零点漂移,约130mV
//定义按键
sbitKey_Up=P3^6;
sbitKey_Down=P3^7;
//定义LED报警灯
sbitLed_Warn1=P3^4;
sbitLed_Warn2=P3^5;
//定义乙醇传感器TTL电平输出引脚
sbitDOUT=P1^4;
//定义标识
volatilebitFlagStartAL=0;//
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 STC12C5A16AD 酒精 浓度 测试仪 制作