基于51单片机的酒精检测仪

1、主要功能

如果实际的酒精值小于报警值且在正常显示状态下:绿灯闪,关蜂鸣器和继电器;如果实际的酒精值大于报警值且在正常显示状态:红灯闪,开蜂鸣器和继电器。

2、仿真图

在这里插入图片描述

3、实验验证

基于51单片机的酒精测试仪

4、程序源码

在这里插入图片描述

/**
  ************************************* Copyright ****************************** 
  File name: // 酒精检测
  Author:Kevin
  Version: //1.0
  Description: // 用于详细说明此程序文件完成的主要功能
  Others: // 其它内容的说明
  Log: // 公众号:Kevin的学习站
  ******************************************************************************
 */

//程序头函数
#include <reg52.h>
//显示函数
#include <display.h>
#include <intrins.h>
#include "eeprom52.h"
#include "temp.h"

//宏定义
#define uint unsigned int 
#define uchar unsigned char
#define Data_ADC0809 P1
 
//管脚声明
sbit P34=P3^4;//温度
sbit LED_R= P2^2; //红指示灯
sbit LED_G= P2^0; //绿色指示灯
sbit FENG = P2^5; //蜂鸣器
//ADC0809
sbit ST=P3^3;
sbit EOC=P3^6;
sbit OE=P3^2;
//按键
sbit Key1=P2^6;	//设置按键
sbit Key2=P2^7; //加
sbit Key3=P3^7;	//减
bit bdata flag;//指示灯和蜂鸣器闪烁报警标志位
uchar set;	  //设置标志位


//函数声明
extern uchar ADC0809();
extern void Key();

//酒精含量变量
unsigned int temp=0;
unsigned int 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();	   //保存数据
	}	
}
//初始化函数
void init()	 
{
	TMOD=0x01; //定时器0方式1
 	TL0=0xb0;
 	TH0=0x3c;
	TL1=65000/256;
	TH1=65000/256;  //赋初值
 	EA=1;	//开总中断
	ET0=1;	//允许定时器0中断
 	TR0=1;	//定时器0开
}
 //主函数
void main()
{
	Init1602();	//1602初始化
	init_eeprom();  //开始初始化保存的数据
	init();	 //初始化函数
	while(1)//主循环
	{
		if(set==0) //如果没有按下设置(默认set是0,就是正常显示状态)
		{
			temp=ADC0809();	//读取酒精值
			Display_1602(temp,WARNING,ReadTemperature());	 //显示酒精值
		}
		if(temp<WARNING&&set==0)	//如果实际的酒精值小于报警值且在正常显示状态下
		{
			flag=0;	 //执行下面flag=0的(主要就是绿灯闪,关蜂鸣器和继电器)
		}
		else if(temp>WARNING&&set==0)  //如果实际的酒精值大于报警值且在正常显示状态下
		{
			flag=1;	//执行下面flag=1的(主要就是红灯闪,开蜂鸣器和继电器)
		}
		Key();//按键扫描
	}
}
//ADC0809读取信息
uchar ADC0809()
{
	uchar temp_=0x00;
	//初始化高阻太

	OE=0;
	//转化初始化
	ST=0;
	//开始转换
	ST=1;
	ST=0;
	//外部中断等待AD转换结束
	while(EOC==0)
	//读取转换的AD值
	OE=1;
	temp_=Data_ADC0809;
	OE=0;
	return temp_;
}
//按键函数
void Key()
{
	if(Key1==0)	//如果设置按键按下
	{
		while(Key1==0);//等待按键释放
		FENG=0;	//蜂鸣器响
		set++;	//设置的变量加1
		flag=0;	//绿灯闪
		TR0=0;	//关定时器0
		write_com(0x0f);//打开显示 无光标 光标闪烁
		write_com(0x80+15);//位置
//   		write_com(0x06);//当读或写一个字符是指针后一一位
		FENG=1;	//蜂鸣器关
	}
	if(set>=2)	//又按了下设置
	{
		set=0;	//正常显示状态
//		write_com(0x38);//屏幕初始化
		write_com(0x0c);//打开显示 无光标 无光标闪烁
		FENG=1;	//蜂鸣器关
		flag=1;	//红灯闪
		TR0=1;	//定时器0开
	}
	if(Key2==0&&set!=0)	  //在设置的状态下按下加
	{
		while(Key2==0);	  //等待按键释放
		FENG=0;		//蜂鸣器响
		WARNING++;	//报警值加1
		if(WARNING>=255)  //如果报警值大于等于255
		WARNING=0;		 //报警值归零
		write_com(0x80+13);
		write_data('0'+WARNING/100); 
		write_data('0'+WARNING/10%10);
		write_data('0'+WARNING%10);	   //显示报警值
		//write_com(0x80+0x40+13);//调整位置
		FENG=1;	 //蜂鸣器关
		write_eeprom();			   //保存数据
	}
	if(Key3==0&&set!=0)	 //在设置的状态下按下减
	{
		while(Key3==0);	 //等待按键释放
		FENG=0;		 //蜂鸣器响
		WARNING--;	 //报警值减1
		if(WARNING<=0)	//如果报警值小于等于0
		WARNING=255;	//那么报警值为255
		write_com(0x80+13);
		write_data('0'+WARNING/100);
		write_data('0'+WARNING/10%10);
		write_data('0'+WARNING%10);
		//write_com(0x80+0x40+13);//调整位置
		FENG=1;	 //蜂鸣器关
		write_eeprom();			   //保存数据
	}
}

void  time1_int(void) interrupt 1 //定时器中断0
{
	uchar count;
	TL0=0xb0;
 	TH0=0x3c;  //重赋初值50ms
  	count++;  ///溢出值加1
	if(count==10)  //如果时间到半秒
	{
		if(flag==0)	  //如果flag为0
		{
			LED_G=0;  //绿灯亮
			LED_R=1;  //红灯灭
			FENG=1;	  //蜂鸣器关
		}
		if(flag==1)	   //如果flag为1
		{
			LED_G=1;   //绿灯关
			LED_R=0;   //红灯亮
			FENG=0;	   //蜂鸣器开
		}
	}

   	if(count==20)	  //如果时间到1秒
   	{
		count=0;	  //溢出值清零
		if(flag==0)	 //如果flag为0
		{
			LED_G=1;	//绿灯关
			LED_R=1;	//红灯灭
			FENG=1;	   //蜂鸣器关
		}
		if(flag==1)	   //如果flag为1
		{
			LED_G=1;   //绿灯关
			LED_R=1;	//红灯灭
			FENG=1;	   //蜂鸣器关
		}
	}
}

其它毕设/课设资源
基于51单片机的智能温控风扇
基于51单片机的智能水箱控制系统
基于51单片机的智能家居安防系统
基于51单片机的计算器设计
基于单片机的声光电子琴
自动浇花系统的设计
基于51单片机数字电压表的设计
基于51单片机的CO浓度报警器设计
基于51单片机的温度报警器设计
51单片机+PM2.5+温湿度
基于51单片机的智能小车
基于51单片机+超声波模块的避障小车
基于51单片机的四通道交通灯设计

项目的仿真和程序工程已经放在下面公众号里面,可以关注公众号:Kevin的学习站,输入关键字:“51酒精测试仪”,就可以获取啦!创作不易,但您的点赞、关注、收藏就是对我最大的鼓励!
在这里插入图片描述

  • 3
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kevin的学习站

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值