找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4229|回复: 5
收起左侧

酒精测试仪程序

[复制链接]
ID:254369 发表于 2017-11-27 20:54 | 显示全部楼层 |阅读模式
我现在有原理图,实物已经按照原理图接线,程序现在有问题,望各位大神指教
#include "reg52.H"
#include <STC89c52.h>
#include <L1602.h>
#include <2402.h>

#define uchar unsigned char
#define uint  unsigned int

//声明常量
#define ALCH       80       //醉驾标准80mg/L
//K_MG_MV和K_ZERO为传感器校准系数,要根据每个MQ-3模块校准
#define K_MG_MV    160/66  //传感器灵敏度系数,每毫克/L对应的10毫伏数
#define K_ZERO     15       //传感器零点漂移,约130mV

//定义按键
sbit Key_Up = P3^6;
sbit Key_Down = P3^7;

//定义LED报警灯
sbit Led_Warn1 = P2^0;
sbit Led_Warn2 = P2^1;
sbit Led_Warn3 = P2^2;


//定义乙醇传感器TTL电平输出引脚
sbit DOUT = P1^4;

//定义标识
volatile bit FlagStartAL = 0;  //开始转换标志
volatile bit FlagKeyPress = 0; //有键弹起标志

//全局变量定义
uchar Threshold;                   //酒精浓度上限报警值
uint  ALCounter;                //酒精转换计时器
long   ALValue;                   //酒精测量值
float ALtemp;                    //计算临时变量

uint keyvalue, keyUp, keyDown; //键值
char * pSave;                  //EEPROM存盘用指针

//函数声明
void Data_Init();
void Timer0_Init();
void Port_Init();
void ADC_Init();
uchar GetADVal();
void KeyProcess(uint );

//数据初始化
void Data_Init()
{
   ALCounter = 0;
   ALValue = 0;
   Led_Warn1 = 1;
   Led_Warn2 = 2;
   Led_Warn3 = 3;
   keyvalue = 0;
   keyUp = 1;
   keyDown = 1;
}

//定时器0初始化,中断时间约2毫秒
//计算:晶振11.0592MHz,定时器时钟11059200/12=921600,每毫秒922个脉冲
//      16位定时器初值65536-1844=63692=0xf8cc
void Timer0_Init()
{
        ET0 = 1;        //允许定时器0中断
        TMOD = 1;       //定时器工作方式选择
        TL0 = 0xcc;     //
        TH0 = 0xf8;     //定时器赋予初值,大约为2毫秒中断1次
        TR0 = 1;        //启动定时器
}

//定时器0中断
void Timer0_ISR (void) interrupt 1 using 0
{
        TL0 = 0xcc;
        TH0 = 0xf8;     //定时器赋予初值

        //每1秒钟启动一次AD转换
    ALCounter ++;
    if (ALCounter >= 500)
    {
       FlagStartAL = 1;
           ALCounter = 0;
    }                                 
}

//存入设定值

void Save_Setting()
{
   pSave =  (char *)&Threshold;          //地址低位对应低8位,高位对应高8位
   wrteeprom(0, *pSave);              //存醉酒阈值低8位
   DELAY(300);
   pSave ++;
   wrteeprom(1, *pSave);              //存醉酒阈值高8位
   DELAY(300);
}

//载入设定值
void Load_Setting()
{
   pSave =  (char *)&Threshold;
   *pSave++ = rdeeprom(0);
   *pSave = rdeeprom(1);
   if ((Threshold>=255)||(Threshold<0)) Threshold = 80;
}

//按键处理程序,参数为键值,1为Up键,2为Down键
void KeyProcess(uint num)
{
   switch (num)
   {
      case 1:
             if (Threshold<255) Threshold++;
             break;
          case 2:
             if (Threshold>1) Threshold--;
             break;
          default:
             break;
   }
   L1602_int(2,9,Threshold);
   Save_Setting();
}

void main()
{
   uint i,j;

   EA = 0;
   Data_Init();     //数据初始化
   Timer0_Init();   //定时器0初始化
   Port_Init();     //端口初始化
   ADC_Init();      //ADC初始化
   EA = 1;
   L1602_init();
   L1602_string(1,1,"Welcome to ALCT! ");
   L1602_string(2,1,"Designed by AAA  ");
   //延时
   for (i=0;i<1000;i++)
      for (j=0;j<1000;j++)
             {;}
   //清屏
   L1602_string(1,1,"                ");
   L1602_string(2,1,"                ");
   L1602_string(1,1,"Alcohol:    mg/L");
   L1602_string(2,1,"Thresho:    mg/L");
   //载入设定值
   Load_Setting();
   L1602_int(2,9,Threshold);
   while(1)
   {
      //如果FlagStartAL标志置位,则进行AD转换
          if (FlagStartAL == 1)
          {
             //酒精浓度换算,50mg/L=62.5ppm,传感器灵敏度应事先校准
         ALValue = 500 * GetADVal() / 256;        //8位ADC,首先得到电压值,单位10毫伏
             ALValue = ALValue - K_ZERO;              //首先减去零点漂移,一般是130mV
                 if (ALValue < 0) ALValue = 0;                          
                 ALValue = ALValue * K_MG_MV;             //将mV转变成mg/L,K_MG_MV系数需要校准           
         L1602_int(1,9,ALValue);
                 if (ALValue > Threshold) Led_Warn1 = 0;  //超过阈值,则 Led_Warn1灯报警,否则报警灯灭。
                 else Led_Warn1 = 1;
                 FlagStartAL = 0;
           }
       //查询乙醇传感器TTL电平,该指示灯为传感器模块报警
           if (DOUT == 0)  Led_Warn2 = 0;
           //键盘查询,在弹起时响应
           if ((Key_Up)&&(keyUp==0)) {FlagKeyPress = 1; keyvalue = 1;}
       else if ((Key_Down)&&(keyDown==0)) {FlagKeyPress = 1; keyvalue = 2;}
           if (FlagKeyPress == 1)
           {
          KeyProcess(keyvalue);
          FlagKeyPress = 0;           
           }
       if (!Key_Up) keyUp = 0;
           else keyUp = 1;
       if (!Key_Down) keyDown = 0;
           else keyDown = 1;
           DELAY(100);
   }
}


原理图

原理图
回复

使用道具 举报

ID:515069 发表于 2019-4-26 17:30 | 显示全部楼层
看不懂
回复

使用道具 举报

ID:512465 发表于 2019-4-28 20:03 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:684148 发表于 2020-12-12 23:46 来自手机 | 显示全部楼层
wrteeprom这个报错了
回复

使用道具 举报

ID:280000 发表于 2020-12-30 17:02 | 显示全部楼层
是显示问题吗
回复

使用道具 举报

ID:1121316 发表于 2024-5-18 20:06 | 显示全部楼层
ALValue = 500 * GetADVal() / 256;        //8位ADC,首先得到电压值,单位10毫伏

这个500和256有什么说法
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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