51单片机的酒精检测Proteus仿真+源代码

2020-02-14来源: 51hei关键字:51单片机  酒精检测  Proteus仿真

酒精传感器仿真中没有,其实就是传感器检测时相应的电阻值会变化,用滑动电位器代替就ok

仿真原理图如下

单片机源程序如下:

//程序头函数

#include

//显示函数

#include

#include

#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

                {

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

[1] [2]
关键字:51单片机  酒精检测  Proteus仿真 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic488276.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:51单片机多点18b20温度测量系统
下一篇:基于单片机+ADC0809的数字电流表仿真+源程序+设计报告

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

单片机步进电机转速控制程序(速度LED显示)
单片机源程序如下://数码管位 高位-----低位//四个按键控制步进电机:正转,反转,加1,减1//上电时电机启动,数码管上显示速度最小档1,加减档位均能通过数码管显示出来,电机采用单双八拍方式//电机转速一共10档,通过按键调节转速 //电机正转时最高位数码管显示0,反转时显示1  #include<reg51.h>#define uchar unsigned char#define uint unsigned int#define led P0//数码管段选#define haha P2sbit s1 = P1^0;sbit s2 = P1^1;sbit s3 = P3^0;sbit
发表于 2020-02-08
单片机步进电机转速控制程序(速度LED显示)
基于51单片机的数字电容测量仪设计
本设计详细介绍了一种基于单片机的数字式电容测量仪设计方案及实现方法。设计的主要方法是采用555芯片构成单稳态触发器,将电容容量转换为脉冲宽度。通过单片机的计时器测量脉宽, 根据已知的R值,通过单片机的运算功能,计算出电容容量,最后,再通过单片机的普通I/O口控制液晶屏显示出电容容量的计算结果。系统的测量范围为10pF~ 500uF, 具有多个量程,可根据用户需要由用户选择,与用户的交互是通过键盘实现,不同量程的实现是通过单片机的I/O口控制继电器的吸合与断开来选择不同的R值,从而实现不同的量程。同时,本设计注重设计方法及流程,首先根据原理设计电路,再通过protues仿真,利用keil编程,进而借助altium designer
发表于 2020-02-08
基于51单片机的数字电容测量仪设计
基于51单片机的pwm直流电机调速
仿真原理图如下单片机源程序如下:#include <reg52.h>/********************************************** 定时器初值*********************************************/#define T0HIGH        0xec#define T0LOWW        0x8a
发表于 2020-02-08
基于51单片机的pwm直流电机调速
手把手教你单片机串口通信-基础篇
1的个数之和应为偶数。接收字符时,对1的个数进行校验,若字符不一致,则说明传输数据过程中出现错误。代码和校验发送方将所发数据块求和(或各字节异或),产生一个字节的校验字符(校验和)附加到数据块末尾。接收方接收数据时,同时对数据块(除校验字节外)求和(或各字节异或),将所得的结果与发送方的“校验和”进行比较,一致则无差。循环冗余校验通过某种数学预算实现有效信息与校验位之间的循环校验,常用语对磁盘信息的传输、存储区的完整性校验。串口的基本结构SBUF:51单片机中的特殊寄存器,串行数据缓冲器(一个接收一个发送),两个其实是共用的一个地址99H,但是两个在物理上面是分开的。当发送使用时,就采用SBUF=XXX;  
发表于 2020-02-08
手把手教你单片机串口通信-基础篇
PIC单片机振荡电路中怎样选择晶体?
什么是中断程序呢?形象的生活比喻就比如你现在这在看我的文章,突然你的朋友喊你一起去烤地瓜,这时候你就中断了看文章和朋友烤地瓜去了,烤完地瓜之后你又回来看文章。烤地瓜这件事就好比中断程序,他中断了你看文章这件事。在程序方面来说 当CPU在执行一个程序的时候,突然产生了中断事件CPU就去执行中断程序了,当执行完成后CPU又回来执行原先的程序。中断事件什么是中断事件,就是引起中断的事件。对于单片机来说这些事件是多种多样的。比如 说一个按键按下,一定的时间到了,一串数据发送完毕,或接收完一个数据。讲到中断不得不讲讲和中断相对的 查询。其实不管是按键按下 还是 时间到,还是数据发送完毕,这些事实上都可以用查询的方式办到。比如 你是经理
发表于 2020-02-08
AVR单片机熔丝位的配置
(1)在AVR的器件手册中,对熔丝位使用已编程(Programmed)和未编程(Unprogrammed)定义熔丝位的状态, “Unprogrammed”表示熔丝状态为“1”(禁止);“Programmed”表示熔丝状态为“0”(允许)。因此,配置熔丝位的过程实际上是 “配置熔丝位成为未编程状态“1”或成为已编程状态“0””。(2)在使用通过选择打钩“√”方式确定熔丝位状态值的编程工具软件时,请首先仔细阅读软件的使用说明,弄清楚“√”表示设置熔丝位状态为“0”还是为“1”。(3)使用CVAVR中的编程下载程序时应特别注意,由于CVAVR编程下载界面初始打开时,大部分熔丝位的初始状态定义为“1”,因此不要使用其编程菜单选项中的“all
发表于 2020-02-08
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved