酒精浓度检测系统设计程序设计

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

//#include "reg52.H"

#include "STC12c5A.h"

#include "1602.h"

#include "2402.h"

#define uchar unsigned char

#define uint unsigned int

//声明常量

#define ALCH 250 //醉驾标准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^4;

sbit Key_Down = P3^5;

//定义LED报警灯

sbit Led_Warn1 = P3^2;

sbit Led_Warn2 = P3^3;

sbit Buzzer = P3^0;//定义蜂鸣器

//定义乙醇传感器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;

keyvalue = 0;

keyUp = 1;

keyDown = 1;

Buzzer=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 Port_Init()

{

P1M0 = 0x80; //10000000,P1.7作为AD输入P1M1 = 0x80; //

}

void ADC_Init()

{

uint i;

P1ASF = 0x80; //设P1.7为AD输入ADC_RES = 0; //清先前的结果

ADC_CONTR|=0x80; //POWER=1,打开ADC电源

for(i=5000;i>0;i--) ; //延时

ADC_CONTR = ADC_CONTR&0xE0; //1110,0000 清ADC_FLAG,ADC_START位和低3位

ADC_CONTR = ADC_CONTR&0xf8|0x07; //设置当前通道号为P1.7

for(i=2500;i>0;i--) ; //延时

}

//进行AD转换,得到当前酒精值

uchar GetADVal()

{

uint i;

ADC_CONTR&=0xf7;

for(i=250;i>0;i--); //待输入电压稳定后开始转换//ADC_RES = 0;

ADC_CONTR |= 0x08; //ADC_Start=1, 启动转换

while((ADC_CONTR&0x10)==0); //等待转换结束ADC_FLAG=1

ADC_CONTR&=0xe7; //清ADC_FLAG和ADC_START位,停止转换

return ADC_RES;

}

//存入设定值

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 = 250;

}

//按键处理程序,参数为键值,1为Up键,2为Down键

相关文档
最新文档