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

使用说明:

上电以后,需要预热一段时间,此时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;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值