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

使用说明:

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

原理图:

部分程序:

#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;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

白茶丫

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

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

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

打赏作者

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

抵扣说明:

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

余额充值