基于51单片机的酒精浓度检测仪设计

基于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

点赞分享,一起学习进步!一起成长。

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值