找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1458|回复: 0
打印 上一主题 下一主题
收起左侧

这是我的单片机酒精探测仪的程序代码,给大家互相学习一下

[复制链接]
跳转到指定楼层
楼主
ID:972552 发表于 2021-10-18 15:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//程序头函数
#include <reg52.h>
//显示函数
#include <display.h>
#include <intrins.h>
#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<WARNING&&set==0)        //如果实际的酒精值小于报警值且在正常显示状态下
                {
                        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);
                write_data('0'+WARNING%10);
                //write_com(0x80+0x40+13);//调整位置
                FENG=1;         //蜂鸣器关
                write_eeprom();                           //保存数据
        }
}

void  time1_int(void) interrupt 1 //定时器中断0
{
        uchar count;
        TL0=0xb0;
         TH0=0x3c;  //重赋初值50ms
          count++;  ///溢出值加1
        if(count==10)  //如果时间到半秒
        {
                if(flag==0)          //如果flag为0
                {
                        LED_G=0;  //绿灯亮
                        LED_R=1;  //红灯灭
                        FENG=1;          //蜂鸣器关
                }
                if(flag==1)           //如果flag为1
                {
                        LED_G=1;   //绿灯关
                        LED_R=0;   //红灯亮
                        FENG=0;           //蜂鸣器开
                }
        }

           if(count==20)          //如果时间到1秒
           {
                count=0;          //溢出值清零
                if(flag==0)         //如果flag为0
                {
                        LED_G=1;        //绿灯关
                        LED_R=1;        //红灯灭
                        FENG=1;           //蜂鸣器关
                }
                if(flag==1)           //如果flag为1
                {
                        LED_G=1;   //绿灯关
                        LED_R=1;        //红灯灭
                        FENG=1;           //蜂鸣器关
                }
        }
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表