基于51单片机的酒精浓度检测仪设计
(仿真+程序+原理图+设计报告)
功能介绍
本系统由STC89C51单片机+MQ-3酒精传感器+ADC0832模块+LCD1602模块+报警模块+电源构成
具体功能:
1、LCD1602实时显示酒精浓度;
2、可以按键设置报警值,实现声光报警;三个按键:设置键、加键、减键。
3、当浓度未超过阀值时,绿灯闪烁;当超过阈值时,红灯闪烁并蜂鸣器报警。
//程序头函数
#include <reg52.h>
#include <intrins.h> //包含头文件
//显示函数
#include <display.h>
#include "eeprom52.h"
//宏定义
#define uint unsigned int
#define uchar unsigned char
//管脚声明
sbit LED_R= P2^2; //红色指示灯
sbit LED_G= P2^0; //绿色指示灯
sbit FENG = P2^5; //蜂鸣器
sbit CS = P1^4;
sbit Clk = P1^2;
sbit DATI = P1^3;
sbit DATO = P1^3; //ADC0832引脚
//按键
sbit Key1=P2^6;
sbit Key2=P2^7;
sbit Key3=P3^7;
/*******************************定义全局变量********************************/
unsigned char dat = 0; //AD值
unsigned char CH=0; //通道变量
unsigned int sum=0; //平均值计算时的总数
unsigned char m=0;
bit bdata flag; //定义位变量
uchar set; //设置变量
uchar K_ZERO=40; //传感器零点漂移,约130mV
//函数声明
extern void Key();
/*
void delay(uint z)
{
uint i,j;
for(i=0;i<z;i++)
for(j=0;j<121;j++);
}
*/
//酒精含量变量
uchar temp=0;
//指示灯变量
uchar WARNING=25; //报警值变量
/******************把数据保存到单片机内部eeprom中******************/
void write_eeprom()
{
SectorErase(0x2000);
byte_write(0x2000, WARNING);
byte_write(0x2060, a_a);
}
/******************把数据从单片机内部eeprom中读出来*****************/
void read_eeprom()
{
WARNING = byte_read(0x2000);
a_a = byte_read(0x2060);
}
/**************开机自检eeprom初始化*****************/
void init_eeprom()
{
read_eeprom(); //先读
if(a_a != 1) //新的单片机初始单片机内问eeprom
{
WARNING = 25;
a_a = 1;
write_eeprom(); //保存数据
}
}
/****************************************************************************
函数功能:AD转换子程序
入口参数:CH
出口参数:dat
****************************************************************************/
unsigned char adc0832(unsigned char CH)
{
unsigned char i,test,adval;
adval = 0x00;
test = 0x00;
Clk = 0; //初始化
DATI = 1;
_nop_();
CS = 0;
_nop_();
Clk = 1;
_nop_();
if ( CH == 0x00 ) //通道选择
{
Clk = 0;
DATI = 1; //通道0的第一位
_nop_();
Clk = 1;
_nop_();
Clk = 0;
DATI = 0; //通道0的第二位
_nop_();
Clk = 1;
_nop_();
}
else
{
Clk = 0;
DATI = 1; //通道1的第一位
_nop_();
Clk = 1;
_nop_();
Clk = 0;
DATI = 1; //通道1的第二位
_nop_();
Clk = 1;
_nop_();
}
Clk = 0;
DATI = 1;
for( i = 0;i < 8;i++ ) //读取前8位的值
{
_nop_();
adval <<= 1;
Clk = 1;
_nop_();
Clk = 0;
if (DATO)
adval |= 0x01;
else
adval |= 0x00;
}
for (i = 0; i < 8; i++) //读取后8位的值
{
test >>= 1;
if (DATO)
test |= 0x80;
else
test |= 0x00;
_nop_();
Clk = 1;
_nop_();
Clk = 0;
}
if (adval == test) //比较前8位与后8位的值,如果不相同舍去。若一直出现显示为零,请将该行去掉
dat = test;
nop_();
CS = 1; //释放ADC0832
DATO = 1;
Clk = 1;
return dat;
}
void init() //定时器初始化函数
{
TMOD=0x01; //定时器工作方式
TL0=0xb0;
TH0=0x3c; //赋初值50ms
EA=1; //打开中断总开关
ET0=1; //打开定时器0中断允许开关
TR0=1; //打开定时器0定时开关
}
void AlcoholCalibration(void) //酒精初始化校准函数
{
sum = 0;
for(m=0;m<50;m++) //读50次AD值
{
sum = adc0832(0)+sum; //读到的AD值,将读到的数据累加到sum
}
temp=sum/50; //跳出上面的for循环后,将累加的总数除以50得到平均值temp
K_ZERO = 500 * temp / 256; //8位ADC,首先得到电压值,单位10毫伏
Display_1602(0,WARNING); //显示AD数值和报警值
}
硬件设计
使用元器件:
单片机:STC89C51;
(注意:单片机是通用的,无论51还是52、无论stc还是at都一样,引脚功能都一样。程序也是一样的。)
9*15万用板;MQ-3酒精传感器;
ADC0832;8脚IC座;
40脚IC座;1602液晶;
16p母座;16p排针;
2.2k电阻*2;1k电阻*2;
10k电阻*2;220Ω电阻;
9012三极管;10uf电解电容;
30pf瓷片电容*2;12MHz晶振;
按键*4;103排阻(10k);
有源蜂鸣器;5mmLED (红绿) *2;
DC电源接口;自锁开关;
导线:若干;
流程图:
设计资料
01 仿真图
本设计使用proteus8.9版本设计!具体如图!
02 原理图
本系统原理图采用Altium Designer19设计,具体如图!
03 程序
本设计使用软件keil4和keil5两个版本编程设计,无需担心!具体如图!
04 设计报告
一万两千字设计报告,具体如下!
05 设计资料
全部资料包括仿真源文件 、程序(含注释)、AD原理图、视频讲解、参考论文等。具体内容如下,全网最全! !
下面是开源51单片机设计资料
大家共同学习进步:
链接:百度网盘 请输入提取码
提取码:2ht2
点赞分享,一起学习进步!一起成长。