×
单片机 > 单片机程序设计 > 详情

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

发布时间:2020-08-27 发布时间:
|

酒精传感器仿真中没有,其实就是传感器检测时相应的电阻值会变化,用滑动电位器代替就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);


关键字:51单片机  酒精检测  Proteus仿真 


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
Keil(MDK-ARM)系列教程(七)_菜单