基于单片机的酒精浓度测试仪设计报告Word格式文档下载.docx
《基于单片机的酒精浓度测试仪设计报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《基于单片机的酒精浓度测试仪设计报告Word格式文档下载.docx(21页珍藏版)》请在冰点文库上搜索。
TiD2CPP&
ADCM»
L3匚
4
37
二|P0丄
SSCPP1.ADC4PUB
V4OSTADT5?
150
j
36
_]HJJ
二P0』
6
35
MTStXADCiTl.frO
7r
34
二P0Y
iCLX^DCT?
L7二
&
33
—F0.5
P47RSI[
XTRiD?
3.0U
9
32
IPO./
10
ai
□EXLVD'
PiSTISTI
Js2?
31匚
11
J0
Z^ALE'
P4.i
二<
T:
?
S2[—阿I?
33[~1
12
:
二私珂4
B
28
—F2JA15
二1IQ砸皿
CLKOUTOINT.TWP14匚
14
17
clkouti/NTti?
J.5u
15
曲
二irs占%:
VR.臥匚愆旳?
L
1«
PDI
P40;
STC12C5A16AD
XTA12二
lfi
22
二1担丄叱0
VTAI1二
19
21
二IP2一⑷
Gwd匚
20
n
二IF23U
图6STC12C2052AD单片机管脚图
该芯片为52内核8位单片机,内部集成了10位多路A/D转换模块,适用于常用检测电路。
由STC12C5A16A组成的单片机系统原理图如图7所示。
图中AOUT为MQ-3传感器模块输出的检测电压信号,送入ADC7端口进行处理,DOU为传感器模块输出的数字电平信号,该信号可以根据乙醇气体浓度直接输出报警信号,报警阈值通过模块上的电位器进行调节。
+5VJ
U1
SIG12①久厲蛊D
虫][y.iut'
图7单片机系统原理图
图7中,按键K2和K3为醉酒阈值调整键,其中K2为“增加”,K3为“减小”按键。
L2和L3为报警指示灯,分别可以进行酒后和醉酒两级报警。
4、显示电路
显示部分采用SMC1602液晶屏进行数据显示,其主要技术参数为:
表1液晶屏技术指标
显示容量:
15X2字符
芯片工作电压:
4,5-5.6V
工作电流:
Z0mA(50V)
模块最佳工作电压;
5.0V
宇符尺寸:
2.95X435(WXH)nwn
接口信号说明如表2所示。
表2液晶屏接口信号说明
编号
特号
引脚说明
祎号
引肆说明
VSS
D2
DataI/O
2
V&
D
电源正檢
D3
DatiI/O
VI
港晶显示険压馆号
卫
D&
taI/O
RE
數摇,僧令选择站(H/L1
DS
5
读/写选择輪(IVL)
恥
I/O
G
E
便能伯号
H
D?
7
00
BLA
背光源正啾
01
16
SIK
背光源曲瓏
与单片机接口电路如图8所示。
其中J2的3脚为背光引脚,R9和R10电阻用于调节背光亮度。
J2的4、5、6引脚分别接液晶的RSE/W和E控制引脚,J2的7—14引脚为数据引脚。
图8LCD与单片机接口电路
5、阈值存储
醉酒阈值存储在EEPRO芯片AT24C04中,并可以通过“增加”、“减少”按键调节并保存。
AT24C04是IIC接口的EEPRO®
片,可以用于掉电不易失数据的存储。
其电路如图9所示。
图中A0、A1和A2为芯片的地址引脚,一般接地即可。
SCL和SDA为AT24C04和单片机IIC通信的时钟线和数据线。
图9EEPROM存储电路
6、供电及程序下载电路
本设计采用USB接口供电,电源电压5V。
同时,USB接口通过内含PL2303芯片的转换电路对单片机进行程序编写。
其电路原理如图10所示。
u汨电源及下戦口
J]
MU
+5^
rx5d
TY1
4—
USB
fowe^J^T
R1Ik
DI
^tlN4]4S
图10供电及程序下载电路
三、软件编程
1、软件流程图
本设计软件主程序流程图如图11所示
数据初始化
图11主程序流程图
2、主程序
下面介绍main.c主程序编写,其他程序略
(1)头文件和一些宏定义
#include"
STC12c5A.h"
#inelude"
1602.h"
24O2.h"
#defineucharunsignedchar
#defineuintunsignedint
(2)常量、变量定义和函数声明
〃声明常量
#defineALCH80//醉驾标准80mg/L
MQ-3模块校准
可以自行校准
〃K_MG_MV和K_ZERO为传感器校准系数,要根据每个
#defineK_MG_MV160/60〃传感器灵敏度系数,
#defineK_ZERO0〃传感器零点漂移
//定义按键
sbitKey_Up=P3A6;
sbitKey_Down=卩3人7;
〃定义LED报警灯
sbitLed_Warn1=卩3人4;
sbitLed_Warn2=卩3人5;
//定义乙醇传感器TTL电平输出引脚
sbitDOUT=P1A4;
//定义标识
volatilebitFlagStartAL=C
);
〃开始转换标志
volatilebitFlagKeyPress=
=0;
//有键弹起标志
//全局变量定义
ucharThreshold;
//酒精浓度上限报警值
uintALCounter;
//酒精转换计时器
intALValue;
//酒精测量值
floatALtemp;
//计算临时变量
uintkeyvalue,keyUp,keyDown;
//键值
char*pSave;
//EEPROM存盘用指针
//函数声明voidData_Init();
voidTimer0_Init();
voidPort_Init();
voidADC_Init();
ucharGetADVal();
voidKeyProcess(uint);
(3)各子程序
〃数据初始化
voidData_Init()
{
ALCounter=0;
ALValue=0;
Led_Warn1=1;
Led_Warn2=2;
922个脉冲
keyvalue=0;
keyUp=1;
keyDown=1;
〃定时器0初始化,中断时间约2毫秒
〃计算:
晶振11.0592MHz,定时器时钟11059200/12=921600,每毫
//16位定时器初值65536-1844=63692=0xf8cc
voidTimer0_lnit()
{I
ET0=1;
//允许定时器0中断
TMOD=1;
//定时器工作方式选择
TL0=0xcc;
//
TH0=0xf8;
//定时器赋予初值,大约为2毫秒中断1次
TR0=1;
//启动定时器
}I
〃定时器0中断
voidTimer0_ISR(void)interrupt1using0{
//定时器赋予初值
〃每1秒钟启动一次AD转换
ALCounter++;
if(ALCounter>
=500)
〃端口初始化
voidPort_Init()
P1M0=0x80;
//10000000,P1.7作为AD输入
P1M1=0x80;
//
}//ADC初始化voidADC_Init(){
uinti;
P1ASF=0x80;
II设P1.7为AD输入
ADC_RES=0;
//清先前的结果
ADC_CONTR|=0x80;
〃P0WER=1,打开ADC电源
for(i=5000;
i>
0;
i--);
//延时
ADC_CONTR=ADC_CONTR&
OxEO;
〃1110,0000清ADC_FLAG,ADC_START和低3位
0xf8|0x07;
//设置当前通道号为P1.7
for(i=2500;
}
//进行AD转换,得到当前酒精值
ucharGetADVal()
ADC_CONTR&
=0xf7;
for(i=250;
i--);
II待输入电压稳定后开始转换
IIADC_RES=0;
ADC_CONTR|=0x08;
IIADC_Start=1,启动转换
while((ADC_CONTR&
0x10)=
=0);
II等待转换结束ADC_FLAG=1
=0xe7;
//清ADC_FLAG和ADC_START位,停止转换
returnADC_RES;
//存入设定值
voidSave_Setting()
pSave=(char*)&
Threshold;
〃地址低位对应低8位,高位对应高8位
wrteeprom(0,*pSave);
II存醉酒阈值低
8位
DELAY(300);
pSave++;
wrteeprom(1,*pSave);
II存醉酒阈值高
//载入设定值
voidLoad_Setting()
Threshold;
*pSave++=rdeeprom(0);
*pSave=rdeeprom
(1);
if((Threshold>
=255)||(Threshold<
0))Threshold=80;
//按键处理程序,参数为键值,1为Up键,2为Down键
voidKeyProcess(uintnum)
switch(num)
case1:
if(Threshold<
255)Threshold++;
break;
case2:
if(Threshold>
1)Threshold--;
default:
break;
L1602」nt(2,9,Threshold);
Save_Setting();
}voidmain()
uinti,j;
EA=0;
Data_Init();
//数据初始化
TimerO」nit();
//定时器0初始化
Port_Init();
//端口初始化
ADC_Init();
//ADC初始化
EA=1;
L1602_init();
L1602_string(1,1,
"
WelcometoALCT!
L1602_string(2,1,"
DesignedbyAAA"
//延时
for(i=0;
i<
1000;
i++)
for(j=O;
j<
1OOO;
j++)
{;
〃清屏
L1602_string(1,1,"
"
Alcohol:
mg/L"
Thresho:
Load_Setting();
L1602_int(2,9,Threshold);
while
(1)
//如果FlagStartAL标志置位,则进行AD转换if(FlagStartAL==1)
//酒精浓度换算,50mg/L=62.5ppm,传感器灵敏度应事先校准
ALValue=500*GetADVal()/256;
//8位ADC,首先得到电压值,单位10毫伏
ALValue=ALValue-K_ZERO;
//首先减去零点漂移,一般是130mV
if(ALValue<
0)ALValue=0;
ALValue=ALValue*K_MG_MV;
//将mV转变成mg/L,K_MG_MV系数需要校准
L1602_int(1,9,ALValue);
if(ALValue>
Threshold)Led_Warn1=0;
//超过阈值,则Led_Warn1灯报警。
elseLed_Warn1=1;
FlagStartAL=0;
〃查询乙醇传感器TTL电平,该指示灯为传感器模块报警
if(DOUT==0)Led_Warn2=0;
elseLed_Warn2=1;
〃键盘杳询,在弹起时响应
if((Key_Up)&
(keyUp==0)){FlagKeyPress=1;
keyvalue=1;
elseif((Key_Down)&
(keyDown==0)){FlagKeyPress=1;
keyvalue=2;
}if(FlagKeyPress==1)
KeyProcess(keyvalue);
FlagKeyPress=0;
if(!
Key_Up)keyUp=0;
elsekeyUp=1;
Key_Down)keyDown=0;
elsekeyDown=1;
四、下载与调试
当程序在uVision环境下编写完成,并编译生成.hex文件后,就可以下载并进行调试了。
1、USB转串口驱动安装
打开USB驱动文件夹下的PL2303_Prolific_Driverlnstaller_v130.exe安装文件,按提示安装USB转串口驱动程序。
安装完成后,插入USB下载线后,在[开始卜[控制面板]-[打印机和其他硬件]-[设备管理器],在“端口”分支下有(ProlificUSB-to-SerialCommPort(COMX)。
X表示串口号,如果没有说明USB转串口驱动没有安装,须重新安装。
记住括号里的COM口号。
图12成功安装USB转串口驱动示意图
2、下载程序
打开STC单片机下载软件文件夹,点击运行STC_ISP_V481.exe程序,出现如下界面。
COT:
[匸L帕.」
诰童诫14胡刨坷竺戒楚左昌谟林率
图13下载软件
正确选择MCU类型,COM口(与刚才安装的COM号一致),最高波特率和最低波特率都选2400bps或者1200bps(下载线内PL2303芯片所限,没办法!
),并打开正确的.hex数据文件。
点击“Download/下载”按纽,窗口出现提示:
Chinese:
正在尝试与MCU/单片机握手连接…
Connectionisfailure.Youcantry:
1.GiveyourMCUPowerOnReset.
2.Stopoperation,thenre-selectCOMPort.
3.BecausePLCC-DIP/PQFP-DIPSockettracetooIong.~|
4.UpdatetheSTCISP.exeversion.
5.Ifstillerror,yourMCUFirmwareiserror
ornull.
Chinese:
连接失败,请尝试以下操作:
1.在单片机停电状态下,点下载按钮,再给单片机上电
2.停止下载,重新选择RS-232串口,接好电缆
3.可能需要先将P1.0/P1.1短接到地
4.可能外部时钟未接
5.因PLCC、PQFP转换座引线过长而引起时钟不振荡,请
调整参数
6.可能要升级电脑端的STCISP.exe软件
7.若仍然不成功,可能MCU/单片机内无ISP系统引导码,或需退回升级,或MCU已损坏
8.若使用USB转RS-232串口线下载,可能会遇到不兼容
的问题,可以让我们帮助购买兼容的USB转RS-232
串口线
仍在连接中,请给MCU上电...
按下电路板上的电源按纽,保证其有个失电至上电的过程,则窗口显示开始烧录芯片。
芯片烧录成功后,程序开始运行,酒精浓度测试仪正常工作。