基于51单片机的酒精气体检测器设计

news2024/12/24 20:42:38

使用说明:

上电以后,需要预热一段时间,此时lcd显示Loading... (预热过程为电压先上升后下降的改成,通过检测电压来检测是否预热完成) , 预热完成后显示酒精浓度,按下按下按键key1即可进入报警设置模式,按下key2加,key3减, 再次按下key1退出报警设置模式(必须为报警设置模式key2和key3才起作用)

原理图:

PCB:

程序运行图:

部分程序:

#include "stc89x_90x.h"
#include "LCD1602.h"
#include "ADC0832.h"
#include "intrins.h"

sbit k1=P1^4;
sbit k2=P1^5;
sbit k3=P1^6;

sbit beep=P3^5;
sbit beep2=P3^2;
sbit beep3=P3^3;
sbit beep4=P3^4;
sbit led=P3^6;

unsigned char temp1[]={"Potency: **%"};      //ÏÔʾ¾Æ¾«Å¨¶È
unsigned char temp2[]={"early:**%  "};      //ÏÔʾŨ¶ÈÔ¤¾¯Öµ
unsigned char temp3[]={"Loading...   "};

unsigned char key,a;                                
unsigned char dat=50;                               //¾Æ¾«Å¨¶ÈÔ¤¾¯³õʼλ
long int m;

void Delay1000ms()        //@11.0592MHz
{
    unsigned char i, j, k;

    _nop_();
    i = 8;
    j = 1;
    k = 243;
    do
    {
        do
        {
            while (--k);
        } while (--j);
    } while (--i);
}


/********
void concentration()
¾Æ¾«Å¨¶È¼ÆËã
*********/
void concentration()
{
    unsigned char count;                           //¶¨Òå8λµÄcout
    long int a;                                       //¶¨Ò峤ÕûÐͱäÁ¿

    count=ADC_acquisition();                       //½«ADC0832¶Á³öµÄÖµ¸³¸øcount
    a=count*50;
    count=(float)(a/256);

    if(count<13)
        count=(float)(13);                   //µ±µçѹֵСÓÚ1.4Vʱ£¬½«µçѹֵ¹Ì¶¨ÔÚ1.4V
    else
        count=(float)(count-13)*3.5;                   //¼ÆËã¾Æ¾«Å¨¶ÈΪһ¸ö¸¡µãÐͱäÁ¿

/*    ÕâÒ»¾äûÓÐÓÃÉÏÒ»¾äcountΪu8ÀàÐÍÒѾ­Íê³ÉÁËÀàÐÍת»»
    count=(char)count;
    */

    if(count>=100)                                   //µ±Å¨¶È´óÓÚ100%ʱ£¬½«Å¨¶È¹Ì¶¨ÔÚ100%
    {
        count=100;
        temp1[8]=count/100+'0';
    }
    else temp1[8]=' ';
    temp1[9]=count%100/10+'0';                       //½«Å¨¶ÈÖµ¸³¸øÊý×é
    temp1[10]=count%100%10+'0';
    m=count;
}


/************
void loading()
³õʼ¼ÓÔØ(Ô¤ÈÈ)º¯Êý
*************/
void loading()
{
    unsigned char s=10;
    while(s--)
    {
        WriteInstruction(0x80);
        a=0;
        while(temp3[a]!='\0')
        {
            WriteData(temp3[a]);
            a++;
        }
    }
    Delay1000ms();Delay1000ms();
    Delay1000ms();Delay1000ms();
    while(1)
    {
        concentration();
        if(m==0)
        {
            temp3[7]=' ';
            temp3[8]='O';
            temp3[9]='K';
        }        
        WriteInstruction(0x80);
        a=0;
        while(temp3[a]!='\0')
        {
            WriteData(temp3[a]);
            a++;
        }
        if(m==0)
        {
            Delay1000ms();
            break;
        }
    }        
}

/********
void independent()
Ô¤¾¯Ñ¡Ôñ룬k2ΪÔö¼Ó£¬k3Ϊ¼õÉÙ
*********/
void independent()
{
    if(k2==0)
    {
        delay(1000);
        if(k2==0)
        {
            while(k2==0);
            dat++;
            if(dat==100)dat=99;
        }
    }
    if(k3==0)
    {
        delay(1000);
        if(k3==0)
        {
            while(k3==0);
            dat--;
            if(dat==0)dat=1;
        }
    }
    temp2[6]=dat/10+'0';
    temp2[7]=dat%10+'0';
}

/**************
void first_line()
ÏÔʾµÚÒ»ÐУ¬¼´Îª¾Æ¾«Å¨¶È
***************/
void first_line()
{
    WriteInstruction(0x80);
    a=0;
    while(temp1[a]!='\0')
    {
        WriteData(temp1[a]);
        a++;
    }
    delay(1000);
}

/*************
void second_line()
ÏÔʾµÚ¶þÐУ¬¼´Îª¾Æ¾«Å¨¶ÈÔ¤¾¯Öµ
**************/
void second_line()
{
    independent();
    temp2[6]=dat/10+'0';
    temp2[7]=dat%10+'0';
    WriteInstruction(0x80+0x40);
    a=0;
    while(temp2[a]!='\0')
    {
        WriteData(temp2[a]);
        a++;
    }
    delay(1000);
}

/*******
void main()
Ö÷º¯Êý
********/
void main()
{
    unsigned char n=0;
    key=0;
    Init();
    loading();
    Init();
    while(1)
    {
        concentration();             //¾Æ¾«Å¨¶È¼ì²âλ
        first_line();                 //ÏÔʾµÚÒ»Ðоƾ«Å¨¶È
        if(k1==0)
        {
            delay(1000);
            if(k1==0)
            {
                while(k1==0);
                if(key==0)key=1;
                else key=0;
            }
        }
        if(key==1)
        {
            independent();
            second_line();
            n=1;
        }
        if(key==0)
        {
            if(n==1)
            {
                WriteInstruction(0x01);
            }
            n=0;
        }
        if(dat<=m)
        {
            led=0;

资料包括:

实物图:

 

需要完整的资料可在我的资源里下载,也可以加入我的纷传圈子,里面有资源压缩包的百度网盘下载地址及提取码。

纷传点击用微信打开即可,过程有点繁琐请见谅。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/111591.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL:互联网公司常用分库分表方案汇总

本文目录 一、数据库瓶颈 IO瓶颈 CPU瓶颈 二、分库分表 水平分库 水平分表 垂直分库 垂直分表 三、分库分表工具 四、分库分表步骤 五、分库分表问题 非partition key的查询问题 非partition key跨库跨表分页查询问题 扩容问题 六、分库分表总结 七、分库分表示例 …

因特网概述

目录1 网络、互连网&#xff08;互联网&#xff09;和因特网2 因特网发展的三个阶段3 因特网的标准化工作4 因特网的组成1 网络、互连网&#xff08;互联网&#xff09;和因特网 网络&#xff08;Network&#xff09;由若干结点&#xff08;Node&#xff09;和连接这些结点的链…

2022年山东省职业院校技能大赛高职组“网络系统管理”赛项规程

2022年山东省职业院校技能大赛高职组“网络系统管理”赛项规程一、赛项名称赛项名称&#xff1a;网络系统管理赛项组别&#xff1a;高职组赛项类别&#xff1a;电子与信息大类二、竞赛目的本赛项旨在借鉴世界技能大赛的办赛理念与技术规程&#xff0c;通过竞赛让参赛选手经历一…

论文导读 | 关于内存子图匹配算法的调研

前言 近年来&#xff0c;图数据结构在学术界和工业界的应用越来越广泛&#xff0c;包括社交网络分析、道路分析、化学分子合成、生物蛋白质网络分析、金融欺诈检测等等。子图匹配&#xff08;Subgraph Matching&#xff09;是图分析领域研究的一个重要课题&#xff0c;其旨在一…

批发进销存软件哪个好用?求测评

产品产量增加&#xff0c;在其他条件不变的情况下&#xff0c;就会形成规模效应&#xff0c;这样产品的生产成本就会降低。批发市场就可以对接大批量生产和出售单价更低的商品。而零售业往往也会采取批发货物的方式来降级成本。但是产品种类多&#xff0c;对于的供应商和客户也…

FactoryBean

FactoryBean ①简介 FactoryBean是Spring提供的一种整合第三方框架的常用机制。和普通的bean不同&#xff0c;配置一个FactoryBean类型的bean&#xff0c;在获取bean的时候得到的并不是class属性中配置的这个类的对象&#xff0c;而是getObject()方法的返回值。通过这种机制&…

网友:我30多岁了,现在转行学编程来得及吗?

这些年&#xff0c;互联网行业的变化发展很快&#xff0c;很多公司也是借助互联网发展的大趋势发展的非常好。 水涨船高&#xff0c;行业好&#xff0c;意味着互联网行业的从业者的工资也就跟着高&#xff0c;很多互联网行业刚入门的月薪基本都已经过万了&#xff0c;一些传统行…

Android设计模式详解之命令模式

前言 命令模式是行为型设计模式之一&#xff1b; 定义&#xff1a;将一个请求封装成一个对象&#xff0c;从而让用户使用不同的请求把客户端参数化&#xff1b;对请求排队或者记录日志&#xff0c;以及支持可撤销的操作&#xff1b; 使用场景&#xff1a; 需要抽象出待执行…

自动化测试高手-价值篇

自动化测试的最终交付价值是什么&#xff1a;自动化测试项目的最终交付价值是它产生的收益&#xff0c;也就是投入回报率比&#xff0c;ROI&#xff0c;一个成功的自动化测试项目必然是获得了高ROI的收益。 自动化测试高手就是要做出成功的自动化测试项目&#xff0c;不仅要写代…

linux命令date

linux命令date 文章目录linux命令date一、date二、使用&#xff08;一&#xff09;结合格式&#xff0c;格式输出数据&#xff08;二&#xff09;结合选项&#xff08;options&#xff09;一、date date命令可以获取到当前系统时间&#xff0c;主要是为了shell脚本的 date用法…

Html中锚点的使用

概述 URL是由多个部分组成。包括协议、主机&#xff08;域名&#xff09;、端口、路径、查询参数和锚点 https://www.example.com:80/path/to/myfile.html?key1value1&key2value2#anchor锚点&#xff08;anchor&#xff09;是网页内部的定位点&#xff0c;使用 # 加上锚…

3_Spring_IOC原理分析_重要

IOC底层原理 1 XML解析技术读取配置文件 <bean id"empDao" class"com.msb.dao.impl.EmpDaoImpl"></bean> 将上面的信息读取进入程序 对象的ID ,一个是对象的类的全路径名 2 反射技术实例化对象,放到容器中 获得类的字节码 Class clazz Clas…

论文导读 | GPU与LSM-tree的优化--以加速compaction和scan为例

GPU是一种新硬件&#xff0c;相比较于CPU&#xff0c;有较高的读写带宽和更强的并行能力&#xff0c;在很多领域都有非常好的应用。今天我们以LSM-tree上的compaction和scan为例&#xff0c;介绍GPU如何在加速数据库的操作中发挥作用。 一、GPU的发展历程 图1&#xff1a;GPU的…

基于uniapp+ssm+mysql一站式婚庆服务平台app设计

开发软件&#xff1a;Idea HBuilder mysql 开发技术&#xff1a; SSM Vue uniapp 用户功能&#xff1a; 注册登陆&#xff0c;填写基本的个人信息&#xff0c;就可以注册&#xff0c;注册完成后即可登陆 查看店铺&#xff0c;在首页有很多的店铺&#xff0c;有婚纱店&…

PHP 精度计算问题(精确算法)

1. PHP 中的精度计算问题 当使用 php 中的 -*/ 计算浮点数时, 可能会遇到一些计算结果错误的问题 这个其实是计算机底层二进制无法精确表示浮点数的一个 bug, 是跨域语言的, 比如 js 中的 舍入误差 所以大部分语言都提供了用于精准计算的类库或函数库, 比如 php 中的 bc 高精…

逻辑回归、激活函数sigmoid、损失及优化、案例代码实现

一、逻辑回归 逻辑回归&#xff08;Logistic Regression&#xff09;&#xff1a;是机器学习中的一种分类模型&#xff0c;是一种分类算法&#xff0c;与回归之间有一定的联系&#xff0c;由于算法的简单和高效&#xff0c;在实际中应用非常广泛 应用场景&#xff1a;广告点击…

Web入门开发【八】- 学习探索

Web案例详解 简单的个人静态网站&#xff0c;这是一个单页的简单静态web网站&#xff0c;前面已经详细讲过。 这个案例是动态的企业官网&#xff0c;增加了多菜单&#xff0c;动态登录等功能&#xff0c;是入门学习者进阶的实践必做项目。 我们再来看企业后台管理系统&#xff…

Python Yolov5火焰烟雾识别源码分享

程序示例精选 Python Yolov5火焰烟雾识别 如需安装运行环境或远程调试&#xff0c;见文章底部微信名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 Yolov5比较Yolov4,Yolov3等其他识别框架&#xff0c;速度快&#xff0c;代码结构简单&#xff0c;识别效率高&#x…

操作系统开启分段并进入保护模式

段基地址 32位的地址&#xff0c;如果没开启分页&#xff0c;指的是当前段所在的物理地址&#xff0c;否则是分页前的虚拟地址 G(Granurality) 值为1表示段界限以4K为单位&#xff0c;否则以字节为单位 段界限 描述段的大小size-1,单位由G决定。 D/B 对于代码段&#xf…

【Linux】缓冲区/磁盘inode/动静态库

目录 一、缓冲区 1、缓冲区的概念 2、缓冲区的意义 3、缓冲区刷新策略 4、同一份代码&#xff0c;打印结果不同 5、仿写FILE 5.1myFILE.h 5.2myFILE.c 5.3main.c 6、内核缓冲区 二、了解磁盘 1、磁盘的物理结构 2、磁盘的存储结构 2.1磁盘的定位 3、磁盘的抽象…