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

上传人:bao****ty 文档编号:132456822 上传时间:2020-05-16 格式:DOCX 页数:27 大小:21.71KB
返回 下载 相关 举报
酒精浓度检测系统设计程序设计.docx_第1页
第1页 / 共27页
酒精浓度检测系统设计程序设计.docx_第2页
第2页 / 共27页
酒精浓度检测系统设计程序设计.docx_第3页
第3页 / 共27页
酒精浓度检测系统设计程序设计.docx_第4页
第4页 / 共27页
酒精浓度检测系统设计程序设计.docx_第5页
第5页 / 共27页
点击查看更多>>
资源描述

《酒精浓度检测系统设计程序设计.docx》由会员分享,可在线阅读,更多相关《酒精浓度检测系统设计程序设计.docx(27页珍藏版)》请在金锄头文库上搜索。

1、/#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 = P34;sbit Key_D

2、own = P35;/定义LED报警灯sbit Led_Warn1 = P32;sbit Led_Warn2 = P33;sbit Buzzer = P30;/定义蜂鸣器/定义乙醇传感器TTL电平输出引脚sbit DOUT = P14;/定义标识volatile bit FlagStartAL = 0; /开始转换标志volatile bit FlagKeyPress = 0; /有键弹起标志/全局变量定义uchar Threshold; /酒精浓度上限报警值uint ALCounter; /酒精转换计时器long ALValue; /酒精测量值float ALtemp; /计算临时变量uin

3、t 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;/

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

5、动一次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;i0;i-) ; /延时 ADC_CONTR = ADC_CONTR&0xE0; /111

6、0,0000 清ADC_FLAG,ADC_START位和低3位 ADC_CONTR = ADC_CONTR&0xf8|0x07; /设置当前通道号为P1.7 for(i=2500;i0;i-) ; /延时/进行AD转换,得到当前酒精值uchar GetADVal() uint i; ADC_CONTR&=0xf7; for(i=250;i0;i-); /待输入电压稳定后开始转换 /ADC_RES = 0; ADC_CONTR |= 0x08; /ADC_Start=1, 启动转换 while(ADC_CONTR&0x10)=0); /等待转换结束ADC_FLAG=1 ADC_CONTR&=0x

7、e7; /清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 =

8、 rdeeprom(1); if (Threshold=255)|(Threshold0) Threshold = 250;/按键处理程序,参数为键值,1为Up键,2为Down键void KeyProcess(uint num) switch (num) case 1: if (Threshold1) Threshold-; break; default: break; L1602_int(2,9,Threshold); Save_Setting();void delay_ms(uint z) /长延时函数uint x,y;for(x=z;x0;x-)for(y=110;y0;y-);void

9、 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,I Love MCU! ); /延时 for (i=0;i1000;i+) for (j=0;j1000;j+) ; /清屏 L1602_string(1,1, ); L1602_string(2,1, ); L1602_str

10、ing(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

11、 if (ALValue Threshold) Led_Warn1 = 0; /超过阈值,则 Led_Warn1灯报警,否则报警灯灭Buzzer=0; else Led_Warn1 = 1;Buzzer=1; FlagStartAL = 0; /查询乙醇传感器TTL电平,该指示灯为传感器模块报警 if (DOUT = 0) Led_Warn2 = 0; else Led_Warn2 = 1; P3=P3|0xf0;/拉高P3口,以读取P3口的值 Key_Up=1; Key_Down=1; if(Key_Up=0) delay_ms(5);/延时消抖 if(Key_Up=0) FlagKeyPress = 1; keyvalue = 1; else ; while(!Key_Up);/松手检测 else if(Key_Down=0) delay_ms(5); if(Key_Down=0) FlagKeyPress = 1; keyvalue = 2; else ;while(!Key_Down); else key

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号