我做的课程设计,用的数码管,也做了protues仿真,你有需要的话,我邮箱是。希望对你有帮助,#include<>sbit P11=P1^1;sbit P12=P1^2;sbit P13=P1^3;sbit P14=P1^4;/////数码管1断码控制///////////////sbit P15=P1^5;sbit P16=P1^6;sbit P17=P1^7;sbit P32=P3^2;/////数码管2段码控制////////////////sbit up=P3^7;sbit down=P3^6; ////按键操作端口//////////////////sbit P35=P3^5; ////////控制晶闸管端口/////////sbit DQ =P3^3; ///////温度传感器端口///////// #define THCO 0xee#define THLO 0x00unsigned char code duan[]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90,0x88,}; //////////////////////////////////////////int b=0;char pwm=0;int k;char r=0,q=0;static char wendu_1;char hao=20;//////////////////////////////////////////////void delay(unsigned int i){while(i--);}//////////////////////////////////////////Init_DS18B20(void){unsigned char x=0;DQ = 1; //DQ复位delay(8); //稍做延时DQ = 0; //单片机将DQ拉低delay(80); //精确延时 大于 480usDQ = 1; //拉高总线delay(14);x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败delay(20);}////////////////////////////////////////////ReadOneChar(void){unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--){DQ = 0; // 给脉冲信号dat>>=1;DQ = 1; // 给脉冲信号if(DQ)dat|=0x80;delay(4);}return(dat);}////////////////////////////////////////////////WriteOneChar(unsigned char dat){unsigned char i=0;for (i=8; i>0; i--){DQ = 0;DQ = dat&0x01;delay(5);DQ = 1;dat>>=1;}//delay(4);}/////////////////////////////////////////////////DS18B20程序读取温度ReadTemperature(void){unsigned char a=0;unsigned char b=0;unsigned int t=0;float tt=0;Init_DS18B20();WriteOneChar(0xCC); // 跳过读序号列号的操作WriteOneChar(0x44); // 启动温度转换Init_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度a=ReadOneChar();b=ReadOneChar();t=b;t<<=8;t=t|a;tt=t*;return(t);}xianshi(){/////////////////当前温度显示///////////////////////////// P11=1; P0=duan[wendu_1/1000]; for(k=0;k<1000;k++); P1=0;P12=1; P0=duan[wendu_1/100%10]; for(k=0;k<1000;k++); P1=0;P13=1; P0=duan[wendu_1%100/10]; for(k=0;k<1000;k++); P1=0;P14=1; P0=duan[wendu_1%10]; for(k=0;k<1000;k++); P1=0; ///////////////////////////目标电压显示/////////////// P15=1; P2=duan[hao/1000]; for(k=0;k<1000;k++); P1=0;P16=1; P2=duan[hao/100%10]; for(k=0;k<1000;k++); P1=0;P17=1; P2=duan[hao%100/10]; for(k=0;k<1000;k++); P1=0;P32=1; P2=duan[hao%10]; for(k=0;k<1000;k++); P32=0;////////////////////////////////////////////////////////// }/////////////////////////////////////////////////////////// main(void){ P11=0; P12=0; P13=0; P14=0; P15=0; P16=0; P17=0; P32=0; P35=0; /////////////////////////////////////////////////////////// while(1){ wendu_1=ReadTemperature()/16;//读温度 xianshi(); ///显示系统数据/////////////////////////////////////操作函数//////////////////////////////////// if(down==0) {hao--;} if(up==0){hao++;} ///////////////////////////////////////////////////////////////////hao为理想温度/////wendu_1为实际环境温度/////////////////////////////////////////////////////////////////P35为高时 led灯工作///////////////////////////////////// P35=0; pwm=hao-wendu_1; if(pwm>0) {P35=1;} if(pwm<0) {P35=0;} if(pwm==0) {P35=0;}///////////////////////////////////////////////////////////////// }}
推荐用STC12C5A16AD ,他完全兼容89C51,而且具有很多片内外设如AD,EEPROM之类的,89C51是基础的51单片机,只带有基本的51单片机外设,做测量可能要通过搭电路的方式实现AD等功能不了解你项目的功能需求,还是看自己选择吧,STC12C那个用的时候注意1T时钟系统和12T时钟系统的区别,其他的都是和89C51一样的
用DS18B20做的电子温度计,非常简单。#include <> #include\"\"#include <>#include <>//********************************************************#define Seck (500/TK) //1秒中的主程序的系数#define OffLed (Seck*5*60) //自动关机的时间5分钟!//********************************************************#if (FHz==0) #define NOP_2uS_nop_()#else #define NOP_2uS_nop_();_nop_()#endif//**************************************#define SkipK 0xcc //跳过命令#define ConvertK 0x44 //转化命令#define RdDs18b20K 0xbe //读温度命令//*******************************************extern LedOut(void);//*************************************************sbit PNP1=P3^4;sbit PNP2=P3^5;sbit BEEP=P3^2;//***********************************#defineDQ PNP2 //原来的PNP2 BEEP//***********************************static unsigned char Power=0;//************************************union{ unsigned char Temp[2]; //单字节温度 unsigned int Tt; //2字节温度}T;//***********************************************typedef struct{ unsigned char Flag; //正数标志 0;1==》负数 unsigned char WenDu; //温度整数 unsigned int WenDuDot; //温度小数放大了10000}WENDU; //***********************************************WENDU WenDu;unsigned char LedBuf[3];//----------------------------------//功能:10us 级别延时// n=1===> 6Mhz=14uS 12MHz=7uS//----------------------------------void Delay10us(unsigned char n){ do{ #if (FHz==1) NOP_2uS;NOP_2uS; #endif }while(--n);}//-----------------------------------//功能:写18B20//-----------------------------------void Write_18B20(unsigned char n){ unsigned char i; for(i=0;i<8;i++){ DQ=0; Delay10us(1);//延时13us 左右 DQ=n & 0x01; n=n>>1; Delay10us(5);//延时50us 以上 DQ=1; }}//------------------------------------//功能:读取18B20//------------------------------------unsigned char Read_18B20(void){ unsigned char i; unsigned char temp; for(i=0;i<8;i++){ temp=temp>>1; DQ=0; NOP_2uS;//延时1us DQ=1; NOP_2uS;NOP_2uS;//延时5us if(DQ==0){ temp=temp&0x7F; }else{ temp=temp|0x80; } Delay10us(5);//延时40us DQ=1; } return temp;}//-----------------------------------void Init (void){ DQ=0; Delay10us(45);//延时500us DQ=1; Delay10us(9);//延时90us if(DQ){ //0001 1111b=1f Power =0; //失败0 }else{ Power++; DQ=1; }}//----------------------------------void Skip(void){ Write_18B20(SkipK); Power++;}//----------------------------------void Convert (void){ Write_18B20(ConvertK); Power++;}//______________________________________void Get_Ds18b20L (void){ [1]=Read_18B20(); //读低位 Power++;}//______________________________________void Get_Ds18b20H (void){ [0]=Read_18B20(); //读高位 Power++;}//------------------------------------//规范化成浮点数// sssss111;11110000// sssss111;1111()//------------------------------------void ReadTemp (void){ unsigned char i; unsigned intF1=0; char j=1; code int Code_F[]={6250,1250,2500,5000}; ; if ([0] >0x80){ //负温度 =~; //取反+1=源吗 +符号S ; } <<= 4; //左移4位 [0]; // 温度整数 //************************************************** [1]>>=4; //--------------------------- for (i=0;i<4;i++){ //计算小数位 F1 +=([1] & 0x01)*Code_F; [1]>>=1; } ; //温度的小数 Power=0;}//----------------------------------void Delay1S (void){ static unsigned int i=0; if (++i==Seck) {i=0ower++;}}//----------------------------------void ReadDo (void){ Write_18B20(RdDs18b20K); Power++;}/**********************************函数指针定义***********************************/code void (code *SubTemp[])()={ Init,Skip,Convert,Delay1S,Init,Skip,ReadDo,Get_Ds18b20L, Get_Ds18b20H,ReadTemp};//**************************************void GetTemp(void){ (*SubTemp[Power])();}//---------------------------------------------------//将温度显示,小数点放大了 GetBcd(void){ LedBuf[0]= / 10; LedBuf[1]= % 10 +DotK; LedBuf[2]=()%10; if(LedBuf[0]==0)LedBuf[0]=Black; if() return; if(LedBuf[0] !=Black){ LedBuf[2]=LedBuf[1]; LedBuf[1]=LedBuf[0]; LedBuf[0]=Led_Pol; //'-' }else{ LedBuf[0]=Led_Pol; //'-' }}/*//---------------------------------------------------void JbDelay (void){ static long i; if (++i>=OffLed){ P1=0xff; P2=0xff; PCON=0x02; }}*//*****************************************************主程序开始1:2002_10_1 设计,采用DS18B20测量2:采用函数数组读取数码管显示正常!3:改变FHz可以用6,12MHz工作!******************************************************/code unsigned char Stop[3] _at_ 0x3b;void main (void){ P1=0xff; ; while (1){ GetTemp(); GetBcd(); // JbDelay(); LedOut(); }}复制代码 20091012_8b1ef92155560c13b5807ZmoDVSacjwD[1].jpg (12 KB) 2009-10-21 23:21 上传下载次数:0
在食品工业、酿酒行业、石化和工矿企业、环境检测、公安交通管理、社会公用事业等一些国民经济生产和人们工作生活的领域和场合中,常常需要检测特定环境中酒精气体的浓度,以确保工厂企业环境安全和人民生命财产安全[1-4]。如监控酒精生产车间和石化厂的酒精浓度,可以避免工厂起火和爆炸事故的发生;监测工矿企业场地的酒精浓度,能避免工作人员出现酒精中毒等恶性事故;检测司机体内酒精含量,可以防止驾驶人员酒后驾车,减少恶性交通事故的发生。因此,研制酒精气体浓度检测仪具有十分广阔的现实和潜在的市场需求,并具有十分重要的意义。传统的酒精气体检测仪因传感器性能、电路设计、数据处理算法等原因,存在着气体选择性不高、抗干扰性能差、智能化程度低、仪器操作复杂、无法实时保存和调看数据等突出问题[3-4]。鉴于此,笔者设计和研制了一种无线智能酒精浓度探测仪,弥补了传统酒精检测仪器的缺点和不足。
1 系统总体方案
该酒精浓度探测仪由发送端和接收端两部分组成,其原理框图分别如图1和图2所示。发送端主要包括酒精浓度传感器与A/D转换电路、STC90C52RC单片机、浓度阈值设置与声音报警电路、语音播报电路、LCD显示电路和无线收发电路六部分;接收端由无线收发电路、STC90C52RC单片机、数据接口通信电路和上位计算机组成。
2 系统硬件电路设计
传感器电路与A/D转换电路
TGS2620为日本费加罗(FIGARO)公司生产的一款可以探测气体中酒精浓度的半导体气体传感器,具有灵敏度高、功耗低、寿命长、成本低等特点[5-6]。其电路连接如图3所示,其中,RH为加热器电阻,室温下时为83±8 Ω;RS为传感器电阻,其阻值和还原性气体浓度之间的数学关系为:
通过检测VRL就可以确定出待测气体浓度C。
电路中运放OP07接成电压跟随器形式,对传感器和后级电路进行隔离,减小电源波动和外界因素对采样数据的影响。ICL7660是MAXIM公司生产的小功率极性反转电源转换器,作用是将+5 V电源变换成-5 V电源为OP07供电。其中,CC2采用漏电小、介质损耗低的10 μF钽电容,以提高电源转换效率。TLC1549是TI公司生产的10位分辨率逐次逼近型ADC芯片,具有自动采样和保持、可按比例量程校准转换范围、抗噪声干扰功能,在满刻度时总误差最大仅为±1 LSB。
LCD显示、阈值设置与声音报警电路
16×2个字符液晶显示模块DM-162显示报警阈值和酒精浓度值。为了减少单片机I/O口的使用数量和简化电路结构,采用间接控制(4位数据总线)方式,接口电路如图4上部分所示。初始化时,需写入28H指令码将8位总线转为4位数据接口方式。管脚BLA、BLK和VL分别是液晶背光源正极、负极和显示对比度调整端,RS、E分别是寄存器选择端、读/写信号线和使能端。
酒精浓度阈值设置和声音报警电路如图4下部分所示。当设置键S1按下时,进入阈值设置(初始阈值为500 ppm)界面,再按下键S2或S3,对阈值作增加或减小操作,步长为20 ppm。阈值设置好后写入STC90C52RC单片机片内5 KB EEPROM的第一扇区2000H和2001H地址中,使系统重启不必重新设置。若酒精浓度值大于阈值,将口线置为低电平,三极管8550驱动蜂鸣器发声音报警。
语音播报电路
采用华邦(Winbond)公司的ISD2560语音录放集成芯片作酒精浓度值播放,电路如图5所示。话筒采用差分形式接入到片内前置放大器的MIC端和MIC REF端,以抵消噪声和提高输入共模抑制比。扬声器接成双端输出形式,输出功率为单端用法时功率的4倍。单片机的P2口、和口线分别与地址线A0~A9相连,用来设定ISD2560片内480 KB EEPROM(地址为0H~257H)中存储语音段的起始地址,录音和放音功能均从该起始地址开始,录音过程中信息段地址自动增加。本系统在ISD2560中需录入语音信息有:“当前酒精浓度值为”、“零”、“一”、“二”、“三”、“四”、“五”、“六”、“七”、“八”、“九”、“十”、“百”、“千”、“点”、“ppm(浓度单位)”。由于ISD2560的语音录放时间为60 s,按每秒3个汉字计算,则可录放180个汉字,因此满足播报要求。此外,通过、和口线可以配置ISD2560的操作模式[7-8](地址为300H~3FFH)。口线分别用来控制语音芯片的片选、芯片的开关、录音/放音模式选择。口用来判断芯片的存储空间是否已经填满或者信息存储是否溢出。由于录音时在每个信息段结尾处自动插入标志,当放音遇到该标志时产生宽约为 ms的负脉冲。用口检测到此脉冲的上升沿后才播放另一段录音,避免语音播放不连续。
无线收发电路
系统采用NORDIC公司生产的工作于 5 GHz的ISM频段的单片无线收发器芯片nRF24L01完成无线数据的收发工作,nRF24L01的最高传输速率为2 Mb/s,电路如图6所示。稳压芯片 V将5 V输入电压转换成 V给nRF24L01供电。nRF24L01与单片机接口为四线SPI方式,CSN、SCK、MOSI、MISO管脚分别是SPI的片选使能线、时钟线、数据输入线、数据输出线。IRQ为中断信号线(低电平有效),接至单片机的外部中断管脚,单片机主要是通过该接口线与nRF24L01进行通信并判断数据接收和数据发送是否完成。CE为芯片的RX/TX模式选择线。IREF为参考电流输入端,通过22 kΩ电阻接地。管脚ANT1和ANT2给天线提供平衡的RF输出,通过后接的简单射频网络匹配电路获得单端50 Ω的阻抗输出。网络匹配电路在发送模式时阻止谐波,在接收模式时克制本地振荡漏出。VDD_PA管脚输出 V电压,给片内功率放大器提供电源。
数据接口通信电路
接收端的计算机与单片机间的通信由串行USB接口集成电路CH340T完成,如图7所示。CH340T支持或者通信,具有仿真接口,并且可以升级外围串口设备,支持常用的MODEM联络信号,支持IRDA规范的SIR红外通信,提供RS23RS48RS422接口等功能。CH340T内置有独立的收发缓冲区,支持通信波特率50 b/s~2 Mb/s的单工、半双工、全双工等异步串行通信。图7中,在CH340T芯片的发送脚TXD上反接一个二极管1N4001,防止该引脚将电流倒灌到单片机;在接收引脚RXD上加一个300 Ω的限流电阻来防止单片机对CH340T倒灌电流;从而避免电流倒灌导致不需要供电工作的另一方芯片继续工作。
3 系统软件设计
下位机软件设计
下位机的程序开发和调试是在Keil μVision4集成开发环境下进行的,包括发送端和接收端的软件设计。
发送端软件设计
发送端软件流程如图8所示。单片机上电后进行系统初始化,完成单片机内部系统变量的初始化以及TLC154DM-16ISD2560和nRF24L01等外部设备的初始设置;然后延时大约5 min,预热传感器TGS2620,保证传感器工作正常;程序初始化结束后,系统进入监控状态。若报警阈值设置键按下,进入报警限设置模式;若录音键按下,进入录音模式;然后启动A/D转换获取采样数据,作滤波处理、标度变换和系统误差校正后得到被测酒精浓度值。该值与报警阈值比较,若结果是“大于”或“等于”,启动蜂鸣器发声程序,作声音报警,提示酒精浓度超标;接着该值在DM-162液晶模块上实时显示;最后判断放音键是否按下。若按下则根据酒精浓度值查找ISD2560中对应语音信息的存储地址开始放音;放音结束后,该值由nRF24L01发送程序发送到接收端;待发送完成后,采集、显示和发送新一轮的酒精浓度数据。
发送端软件应用了防脉冲干扰平均滤波法[9]对A/D采样数据作预处理。其原理是:连续采样K次,然后对这K个采样数据进行比较,去除其中的最大值和最小值,计算剩下的K-2个数据的算术平均值作为采样有效值。该方法融合了中位值滤波法和算术平均滤波法的优点,既可去掉脉动性质的干扰,又可消除偶然出现的脉冲性干扰引起的采样值偏差。为加快计算速度,设计数字滤波器时K=10。
为了提高系统的实时性,软件中采用分段线性插值法[10-11]作标度变换。过程如下:(1)按传感器TGS2620的标定曲线,将该曲线进行非等距分段(曲率变化大(小)时,样点距离取小(大)),选取各分段点坐标(VRLi,Ci)(i=0,1,…,M),其中:VRLi和Ci分别为不同样点时传感器输出电压值和对应浓度值;(2)计算相邻样点间的拟合直线斜率ki=(Ci+1-Ci)/(VRLi+1-VRLi)(i=0,1,…,M-1);(3)将M组坐标数据(VRLi,Ci)和对应斜率ki存储于单片机片内EEPROM的第二扇区(地址为2200H~23FFH)中;(4)每采集到一个电压值VRL即查询EEPROM表,找出VRL所在区间(VRLi,Ci)~(VRLi+1,Ci+1),取出该区间(VRLi,Ci)和ki数据,用线性插值公式C=Ci+ki(VRL-VRLi)计算出当前酒精浓度值C。
将采集到的N个样本数据(xi,yi)代入式(5)中即得到系数a、b的值,并存入单片机的内存单元中。系统测量时,将标度变换后的酒精浓度测量值x代入误差校正方程y=ax+b中,即可得到校正后的酒精浓度值y,从而达到消除系统误差的目的。
接收端软件设计
接收端单片机的软件流程如图9所示。接收端开机上电后,程序初始化设置nRF24L01和串口,然后进入监控场景。当nRF24L01接收到一帧完整的酒精浓度数据后,立即通过串口发送到上位机。接收端单片机与PC之间数据交互采用异步通信模式。独立波特率,串口协议设置为:波特率9 600 b/s,8 bit数据位,1 bit停止位,无校验位。
上位机软件设计
上位机用户界面采用通用的基于对象的程序设计语言Microsoft Visual Basic 开发,实现酒精浓度数据的接收、显示和保存。软件用到了串行通信控件MSComm。MSComm控件是Microsoft公司提供的Windows下串行通信编程的ActiveX控件,通过对此控件的属性和事件进行相应的编程操作,即可轻松地实现串行通信。串口通信协议与接收端完全相同。上位机软件的程序流程如图10所示。
4 系统测试
为了检验本系统的测量性能,采用无水乙醇和纯净水按照一定体积比配制标准的酒精溶液作为被测量对象,测试结果如表1所示。其中:单位ppm=μg/mL表示1 mL酒精溶液中含酒精的质量。由测量结果可以看出,测试数据覆盖传感器的量程,测试最大相对误差小于±2%,优于同类设计产品[3-5]。
为了获得本仪器发送端与接收端的最大无错误率的通信距离,在室外进行了nRF24L01随距离的错误率(临界区间)测试实验,结果如表2所示。其中,每米的错误率是10次试验后计算得到的平均值。可见,nRF24L01的传输距离可达到100 m,略高于RFID、ZIGBEE和蓝牙等无线通信技术[12]。
5 主要技术指标
本仪器主要技术指标如下:(1)测量范围:50~5 000 ppm;(2)灵敏度(传感器电阻变化率):;(3)测量精度:≤±2%;(4)传输距离:≤100 m;(5)工作电源:DC+5 V;(6)工作环境温度:-40 ℃~+70 ℃;(7)工作环境相对湿度:0~85%RH。
6 结束语
本文设计研制了一种基于STC90C52RC单片机、TGS2620酒精传感器和nRF24L01无线通信芯片的酒精浓度探测仪。该仪器现已投入到成都市某小型酿酒厂酒池的实际生产中。现场工作情况表明:系统运行正常,工作可靠;系统具有气体选择性和灵敏度高、稳定性好、智能化程度高、通信距离远、功耗低、抗工业干扰能力强、性价比优异等优点。该仪器可以应用于食品加工行业、工矿企业、石油和化学工业、环境检测与保护、社会公用事业、高空作业人员、公安交通管理(如酒后驾车、交通警察执法)等需要现场检测或无线遥测酒精气体浓度的场合中,市场应用前景广阔、推广价值较高。
参考文献
[1] 李海涛.基于QNX的远程车载酒驾智能监控系统[J].电子技术应用,2014,40(8):136-139.
[2] 宋晓宇,高国伟,李世川,等.基于单片机控制的酒精浓度检测系统的设计[J].传感器世界,2017,23(8):18-23.
[3] 俞露芦,陶大锦.基于单片机的酒精浓度检测仪的设计[J].微型机与应用,2014,33(22):34-36.
[4] 葛毓.基于GPRS/GPS的车载酒精检测和控制电路的设计[D].南昌:南昌大学,2010.
[5] Zhang Zhe,Tong Jin,Chen Donghui,et al. Electronic nose with an air sensor matrix for detecting beef freshness[J].Journal of Bionic Engineering,2008,5(1):67-73.
[6] FIGARO Information for TGS sensors[EB/OL].(2008-04-23)[2019-07-03].(1104).pdf.
[7] 程可嘉,王振松,刘晓云.ISD2560在门禁系统语音播报中的应用[J].自动化技术与应用,2009,28(5):75-77.
[8] 胡珍玉.智能语音提示器系统设计[J].应用能源技术,2012,15(12):34-38.
[9] 张秀再,陈彭鑫,张光宇,等.河流水质实时监测系统[J].电子技术应用,2015,41(2):82-85.
[10] 梁晓雷.基于单片机的分段线性插值算法实现[J].电脑知识与技术,2012,8(21):5236-5243.
[11] 韩潇,曾立,占丰,等.基于分段多项式近似的DDFS研究及FPGA实现[J].电子技术应用,2018,44(3):22-30.
[12] 佚名.各种主流无线通信技术[EB/OL].(2018-05-11)[2019-07-03]..
胡仕兵,陈子为
(成都信息工程大学 电子工程学院,四川 成都610225)
stm32单片论文可以不用仿真的。 但是用仿真器要好一点,首先,用仿真后常用的功能是不用慢吞吞串口烧录代码。其次,仿真器最主要的作用是仿真调试,检查代码找不到任何问题时,会直接点开debug。先全速运行几秒后点击停止,看程序是死在一个莫名的循环里面,还是其他情况。然后再设断点,单步运行一遍主函数。基本几个流程下来,问题点基本就迎刃而解。仿真器可以解决做项目时数不清的问题,所以仿真器是一套找错的方法。
如果真遇到查酒驾,当着警察的面,掏出酒在那边猛喝「吨吨吨吨」。然后说自己是刚喝的酒,刚才开车的时候是没有喝的,肯定行不通的嘛!如果真的是这样,有可能酒驾就变成醉驾了。
当警察面喝酒能算酒驾吗
最高人民法院、最高人民检察院以及公安部联合出台了《关于办理醉酒驾驶机动车刑事案件适用法律若干问题的意见》,上面第6条提到了。
都想到过,也都遇到过,都已经办过了。也就是说,交警在判定酒驾的时候,根本不会管你之前开车有没有喝,当着警察面喝,就是酒驾。就好比:不管前面学习努力了没有,你考试没有考好,老师就说你之前上课,就是开小差,学习就是不认真。
当警察面喝酒可能有什么后果
加重处罚后果,当警察面喝酒,除了根本无法逃避酒驾的惩罚,反而有可能把这个事情搞得更严重了。首先,前面讲到过的:你当着交警的面,「哗」这么喝下去,血液里的酒精含量就变得更高了。常见的二锅头举个例子:正常喝一大口,大概是50mL,酒精浓度56%,也就是24g左右的酒精。温州大学瓯江学院有论文《酒后血液中酒精含量的数学模型》,上面讲。
按照普通成年人男性体重75kg来算,差不多有50kg的体液。24g酒精,假设这酒精都被人体吸收掉了,相当于是血液酒精的浓度上升了48mg/100mL。按照国家标准《车辆驾驶人员血液、呼气酒精含量阈值与检验》里面的规定来看。血液中的酒精含量大于或等于20mg/100mL,就算饮酒后驾驶了;大于或者等于80mg/100mL的话,算是醉酒后驾驶了。
甚至达到前面说的《关于办理醉酒驾驶机动车刑事案件适用法律若干问题的意见》里面规定的,血液酒精含量200mg/100mL的这个从重处罚标准。好比说:摔了一跤,本来就小小一个伤口,你却是不去管它,反而在上面撒点盐,痛得要死。搞了不好,这个盐还是不干净的,还把伤口给感染了。
除此之外,按照《中华人民共和国治安管理处罚法》规定。和警察作对,当场喝酒、撒泼打滚这些行为,还有可能会被认定为,阻碍人民警察依法执行职务。被罚款甚至是行政拘留的事情,也不是说没有发生过。
其他类似方法也基本没用
除了当场喝酒,还有当场喷酒精漱口水、当场狂喝水,这些办法其实都是没有什么用的。
用酒精漱口水,往嘴巴里面喷酒精漱口水,确实可能会引起呼气酒精检测数值不准确。它是超过正常水平很多了,主要是因为刚喷完漱口水,酒精在口腔里面会有残留。就好比:你刚吃完大蒜,也会有残留,是吧,味道会比较大,对不对?警察遇到这种情况一般他等你几分钟,是不是?然后他说:“「哎」我这有瓶矿泉水,我们人民警察送你的,白白送你漱个口,我们再来测一下,行不行?”
想靠这个借口蒙混过关,是不太可能的。狂喝矿泉水,理论上确实是能够起到稀释酒精的作用的,但实际上对检测结果,基本上是没有影响的。有理论依据的,河北工业大学有论文《基于STM32F407ZG的呼气式酒精含量检测仪的研究》,上面讲。呼气式酒精检测,是要求被测者深吸气之后,以中等力度呼气3s以上的,检测的是肺部深处的气体。
而且刚才也讲到的,一个成年男性有差不多50kg体液,就差不多50L,一瓶500mL的矿泉水,就算全部吸收到身体里面,影响多少?1%左右。这对抽血检验也几乎是造不成什么大影响的。就好比说:小时候,偷偷在家里看电视、玩电脑。爸妈回来检查,立刻:「哦哟」遥控器把它关掉,或怎么样。
没有用的。爸妈回来第一件事情:电视机上手「啪」一放,摸一下;iPad手上摸一下,热的。“你刚才在干嘛?”是不是?屏幕黑的又没有用的。
遇到查酒驾,任何行为都是没意义的
所以总得来讲,遇到查酒驾,当着警察的面喝酒、喷漱口水或者是狂喝矿泉水,这些都是没有意义的,反而有可能会让事情变得更加严重。还是那句话了:“「哎呀」,开车不喝酒,喝酒不开车。”这个实在是太重要了。
可以测出司机是否喝酒或酒精超限。将酒精检测加入到对司机的日常监管中,对所有司机都有一个警示作用。车辆操作能力降低。饮酒后驾车,因酒精麻痹作用,行动笨拙,反应迟钝。超限禁止上岗,避免安全事故。酒精检测先刷脸,测试超标系统会自动锁定驾驶员信息,使他不能正常上路运营,11月9日,19台智能酒精检测仪在交运温馨巴士上岗,对驾驶员隔夜酒,上岗前喝酒等现象进行自动化智能监管,不仅提高管理效率,还提高管理的公正,公平性。
我可以帮你,不过不是免费的。把你的联系方式发到我的邮箱。
随着公安部五条禁令的公布,酒精检测仪的需求逐渐增加。目前,酒精检测仪主要还是电化学性质的。在方式上主要有如下两种:一种是发光管显示;一种是数码显示。发光管显示一般常见的分为三段显示:一段为未饮酒区;一段为饮酒区;一段为酗酒区。根据测试的情况,相应的指示灯被点亮。另一种是数显式酒精检测仪。检测的结果直接以数字的形式显示出来。而这两年出现一种新型的半导体酒精检测仪,ca2000是一种高可靠、高精度、呼吸式酒精检测仪。它的核心部件采用新型高科技微变氧化物半导体,可以准确探测气体酒精含量,且不受烟味、可乐、咖啡等非酒精类气体的干扰。ca2000小巧轻便,操作简单,是便携应用的最佳选择。检测原理:当具有n型导电性的氧化物暴露在大气中时,会由于氧气的吸附而减少其内部的电子数量而使其电阻增大。其后如果大气中存在某种特定的还原性气体,它将与吸附的氧气反应,从而使氧化物内的电子数增加,导致氧化物电阻减小。半导体-氧化物传感器就是通过该阻值的变化来分析气体浓度。
相当于毕业论文,目测没300行代码下不来,要是自己写,你就给20分,相当于打法要饭的--
嗯!原理很简单,就是通过检测红外线的探透率而转换成酒精浓度的。一对红外传感器(发射+接收)通过接收到的红外线(光电反应)形成的电流信号的大小来判断酒精浓度(相当于红外线传播的介质)。不过要求的器件灵敏度和线性度非常高。
由电路图可知,定值电阻与传感器的电阻串联,电压表测量气敏电阻两端的电压,电流表测电路电流,酒精浓度增大时,气敏电阻阻值减小,电路总电阻减小,电源电压不变,由欧姆定律可知电路电流增大,电流表的示数将增大,气敏电阻阻值减小,气敏电阻分压减小,电压表的示数将减小.故答案为:增大;减小.
在食品工业、酿酒行业、石化和工矿企业、环境检测、公安交通管理、社会公用事业等一些国民经济生产和人们工作生活的领域和场合中,常常需要检测特定环境中酒精气体的浓度,以确保工厂企业环境安全和人民生命财产安全[1-4]。如监控酒精生产车间和石化厂的酒精浓度,可以避免工厂起火和爆炸事故的发生;监测工矿企业场地的酒精浓度,能避免工作人员出现酒精中毒等恶性事故;检测司机体内酒精含量,可以防止驾驶人员酒后驾车,减少恶性交通事故的发生。因此,研制酒精气体浓度检测仪具有十分广阔的现实和潜在的市场需求,并具有十分重要的意义。传统的酒精气体检测仪因传感器性能、电路设计、数据处理算法等原因,存在着气体选择性不高、抗干扰性能差、智能化程度低、仪器操作复杂、无法实时保存和调看数据等突出问题[3-4]。鉴于此,笔者设计和研制了一种无线智能酒精浓度探测仪,弥补了传统酒精检测仪器的缺点和不足。
1 系统总体方案
该酒精浓度探测仪由发送端和接收端两部分组成,其原理框图分别如图1和图2所示。发送端主要包括酒精浓度传感器与A/D转换电路、STC90C52RC单片机、浓度阈值设置与声音报警电路、语音播报电路、LCD显示电路和无线收发电路六部分;接收端由无线收发电路、STC90C52RC单片机、数据接口通信电路和上位计算机组成。
2 系统硬件电路设计
传感器电路与A/D转换电路
TGS2620为日本费加罗(FIGARO)公司生产的一款可以探测气体中酒精浓度的半导体气体传感器,具有灵敏度高、功耗低、寿命长、成本低等特点[5-6]。其电路连接如图3所示,其中,RH为加热器电阻,室温下时为83±8 Ω;RS为传感器电阻,其阻值和还原性气体浓度之间的数学关系为:
通过检测VRL就可以确定出待测气体浓度C。
电路中运放OP07接成电压跟随器形式,对传感器和后级电路进行隔离,减小电源波动和外界因素对采样数据的影响。ICL7660是MAXIM公司生产的小功率极性反转电源转换器,作用是将+5 V电源变换成-5 V电源为OP07供电。其中,CC2采用漏电小、介质损耗低的10 μF钽电容,以提高电源转换效率。TLC1549是TI公司生产的10位分辨率逐次逼近型ADC芯片,具有自动采样和保持、可按比例量程校准转换范围、抗噪声干扰功能,在满刻度时总误差最大仅为±1 LSB。
LCD显示、阈值设置与声音报警电路
16×2个字符液晶显示模块DM-162显示报警阈值和酒精浓度值。为了减少单片机I/O口的使用数量和简化电路结构,采用间接控制(4位数据总线)方式,接口电路如图4上部分所示。初始化时,需写入28H指令码将8位总线转为4位数据接口方式。管脚BLA、BLK和VL分别是液晶背光源正极、负极和显示对比度调整端,RS、E分别是寄存器选择端、读/写信号线和使能端。
酒精浓度阈值设置和声音报警电路如图4下部分所示。当设置键S1按下时,进入阈值设置(初始阈值为500 ppm)界面,再按下键S2或S3,对阈值作增加或减小操作,步长为20 ppm。阈值设置好后写入STC90C52RC单片机片内5 KB EEPROM的第一扇区2000H和2001H地址中,使系统重启不必重新设置。若酒精浓度值大于阈值,将口线置为低电平,三极管8550驱动蜂鸣器发声音报警。
语音播报电路
采用华邦(Winbond)公司的ISD2560语音录放集成芯片作酒精浓度值播放,电路如图5所示。话筒采用差分形式接入到片内前置放大器的MIC端和MIC REF端,以抵消噪声和提高输入共模抑制比。扬声器接成双端输出形式,输出功率为单端用法时功率的4倍。单片机的P2口、和口线分别与地址线A0~A9相连,用来设定ISD2560片内480 KB EEPROM(地址为0H~257H)中存储语音段的起始地址,录音和放音功能均从该起始地址开始,录音过程中信息段地址自动增加。本系统在ISD2560中需录入语音信息有:“当前酒精浓度值为”、“零”、“一”、“二”、“三”、“四”、“五”、“六”、“七”、“八”、“九”、“十”、“百”、“千”、“点”、“ppm(浓度单位)”。由于ISD2560的语音录放时间为60 s,按每秒3个汉字计算,则可录放180个汉字,因此满足播报要求。此外,通过、和口线可以配置ISD2560的操作模式[7-8](地址为300H~3FFH)。口线分别用来控制语音芯片的片选、芯片的开关、录音/放音模式选择。口用来判断芯片的存储空间是否已经填满或者信息存储是否溢出。由于录音时在每个信息段结尾处自动插入标志,当放音遇到该标志时产生宽约为 ms的负脉冲。用口检测到此脉冲的上升沿后才播放另一段录音,避免语音播放不连续。
无线收发电路
系统采用NORDIC公司生产的工作于 5 GHz的ISM频段的单片无线收发器芯片nRF24L01完成无线数据的收发工作,nRF24L01的最高传输速率为2 Mb/s,电路如图6所示。稳压芯片 V将5 V输入电压转换成 V给nRF24L01供电。nRF24L01与单片机接口为四线SPI方式,CSN、SCK、MOSI、MISO管脚分别是SPI的片选使能线、时钟线、数据输入线、数据输出线。IRQ为中断信号线(低电平有效),接至单片机的外部中断管脚,单片机主要是通过该接口线与nRF24L01进行通信并判断数据接收和数据发送是否完成。CE为芯片的RX/TX模式选择线。IREF为参考电流输入端,通过22 kΩ电阻接地。管脚ANT1和ANT2给天线提供平衡的RF输出,通过后接的简单射频网络匹配电路获得单端50 Ω的阻抗输出。网络匹配电路在发送模式时阻止谐波,在接收模式时克制本地振荡漏出。VDD_PA管脚输出 V电压,给片内功率放大器提供电源。
数据接口通信电路
接收端的计算机与单片机间的通信由串行USB接口集成电路CH340T完成,如图7所示。CH340T支持或者通信,具有仿真接口,并且可以升级外围串口设备,支持常用的MODEM联络信号,支持IRDA规范的SIR红外通信,提供RS23RS48RS422接口等功能。CH340T内置有独立的收发缓冲区,支持通信波特率50 b/s~2 Mb/s的单工、半双工、全双工等异步串行通信。图7中,在CH340T芯片的发送脚TXD上反接一个二极管1N4001,防止该引脚将电流倒灌到单片机;在接收引脚RXD上加一个300 Ω的限流电阻来防止单片机对CH340T倒灌电流;从而避免电流倒灌导致不需要供电工作的另一方芯片继续工作。
3 系统软件设计
下位机软件设计
下位机的程序开发和调试是在Keil μVision4集成开发环境下进行的,包括发送端和接收端的软件设计。
发送端软件设计
发送端软件流程如图8所示。单片机上电后进行系统初始化,完成单片机内部系统变量的初始化以及TLC154DM-16ISD2560和nRF24L01等外部设备的初始设置;然后延时大约5 min,预热传感器TGS2620,保证传感器工作正常;程序初始化结束后,系统进入监控状态。若报警阈值设置键按下,进入报警限设置模式;若录音键按下,进入录音模式;然后启动A/D转换获取采样数据,作滤波处理、标度变换和系统误差校正后得到被测酒精浓度值。该值与报警阈值比较,若结果是“大于”或“等于”,启动蜂鸣器发声程序,作声音报警,提示酒精浓度超标;接着该值在DM-162液晶模块上实时显示;最后判断放音键是否按下。若按下则根据酒精浓度值查找ISD2560中对应语音信息的存储地址开始放音;放音结束后,该值由nRF24L01发送程序发送到接收端;待发送完成后,采集、显示和发送新一轮的酒精浓度数据。
发送端软件应用了防脉冲干扰平均滤波法[9]对A/D采样数据作预处理。其原理是:连续采样K次,然后对这K个采样数据进行比较,去除其中的最大值和最小值,计算剩下的K-2个数据的算术平均值作为采样有效值。该方法融合了中位值滤波法和算术平均滤波法的优点,既可去掉脉动性质的干扰,又可消除偶然出现的脉冲性干扰引起的采样值偏差。为加快计算速度,设计数字滤波器时K=10。
为了提高系统的实时性,软件中采用分段线性插值法[10-11]作标度变换。过程如下:(1)按传感器TGS2620的标定曲线,将该曲线进行非等距分段(曲率变化大(小)时,样点距离取小(大)),选取各分段点坐标(VRLi,Ci)(i=0,1,…,M),其中:VRLi和Ci分别为不同样点时传感器输出电压值和对应浓度值;(2)计算相邻样点间的拟合直线斜率ki=(Ci+1-Ci)/(VRLi+1-VRLi)(i=0,1,…,M-1);(3)将M组坐标数据(VRLi,Ci)和对应斜率ki存储于单片机片内EEPROM的第二扇区(地址为2200H~23FFH)中;(4)每采集到一个电压值VRL即查询EEPROM表,找出VRL所在区间(VRLi,Ci)~(VRLi+1,Ci+1),取出该区间(VRLi,Ci)和ki数据,用线性插值公式C=Ci+ki(VRL-VRLi)计算出当前酒精浓度值C。
将采集到的N个样本数据(xi,yi)代入式(5)中即得到系数a、b的值,并存入单片机的内存单元中。系统测量时,将标度变换后的酒精浓度测量值x代入误差校正方程y=ax+b中,即可得到校正后的酒精浓度值y,从而达到消除系统误差的目的。
接收端软件设计
接收端单片机的软件流程如图9所示。接收端开机上电后,程序初始化设置nRF24L01和串口,然后进入监控场景。当nRF24L01接收到一帧完整的酒精浓度数据后,立即通过串口发送到上位机。接收端单片机与PC之间数据交互采用异步通信模式。独立波特率,串口协议设置为:波特率9 600 b/s,8 bit数据位,1 bit停止位,无校验位。
上位机软件设计
上位机用户界面采用通用的基于对象的程序设计语言Microsoft Visual Basic 开发,实现酒精浓度数据的接收、显示和保存。软件用到了串行通信控件MSComm。MSComm控件是Microsoft公司提供的Windows下串行通信编程的ActiveX控件,通过对此控件的属性和事件进行相应的编程操作,即可轻松地实现串行通信。串口通信协议与接收端完全相同。上位机软件的程序流程如图10所示。
4 系统测试
为了检验本系统的测量性能,采用无水乙醇和纯净水按照一定体积比配制标准的酒精溶液作为被测量对象,测试结果如表1所示。其中:单位ppm=μg/mL表示1 mL酒精溶液中含酒精的质量。由测量结果可以看出,测试数据覆盖传感器的量程,测试最大相对误差小于±2%,优于同类设计产品[3-5]。
为了获得本仪器发送端与接收端的最大无错误率的通信距离,在室外进行了nRF24L01随距离的错误率(临界区间)测试实验,结果如表2所示。其中,每米的错误率是10次试验后计算得到的平均值。可见,nRF24L01的传输距离可达到100 m,略高于RFID、ZIGBEE和蓝牙等无线通信技术[12]。
5 主要技术指标
本仪器主要技术指标如下:(1)测量范围:50~5 000 ppm;(2)灵敏度(传感器电阻变化率):;(3)测量精度:≤±2%;(4)传输距离:≤100 m;(5)工作电源:DC+5 V;(6)工作环境温度:-40 ℃~+70 ℃;(7)工作环境相对湿度:0~85%RH。
6 结束语
本文设计研制了一种基于STC90C52RC单片机、TGS2620酒精传感器和nRF24L01无线通信芯片的酒精浓度探测仪。该仪器现已投入到成都市某小型酿酒厂酒池的实际生产中。现场工作情况表明:系统运行正常,工作可靠;系统具有气体选择性和灵敏度高、稳定性好、智能化程度高、通信距离远、功耗低、抗工业干扰能力强、性价比优异等优点。该仪器可以应用于食品加工行业、工矿企业、石油和化学工业、环境检测与保护、社会公用事业、高空作业人员、公安交通管理(如酒后驾车、交通警察执法)等需要现场检测或无线遥测酒精气体浓度的场合中,市场应用前景广阔、推广价值较高。
参考文献
[1] 李海涛.基于QNX的远程车载酒驾智能监控系统[J].电子技术应用,2014,40(8):136-139.
[2] 宋晓宇,高国伟,李世川,等.基于单片机控制的酒精浓度检测系统的设计[J].传感器世界,2017,23(8):18-23.
[3] 俞露芦,陶大锦.基于单片机的酒精浓度检测仪的设计[J].微型机与应用,2014,33(22):34-36.
[4] 葛毓.基于GPRS/GPS的车载酒精检测和控制电路的设计[D].南昌:南昌大学,2010.
[5] Zhang Zhe,Tong Jin,Chen Donghui,et al. Electronic nose with an air sensor matrix for detecting beef freshness[J].Journal of Bionic Engineering,2008,5(1):67-73.
[6] FIGARO Information for TGS sensors[EB/OL].(2008-04-23)[2019-07-03].(1104).pdf.
[7] 程可嘉,王振松,刘晓云.ISD2560在门禁系统语音播报中的应用[J].自动化技术与应用,2009,28(5):75-77.
[8] 胡珍玉.智能语音提示器系统设计[J].应用能源技术,2012,15(12):34-38.
[9] 张秀再,陈彭鑫,张光宇,等.河流水质实时监测系统[J].电子技术应用,2015,41(2):82-85.
[10] 梁晓雷.基于单片机的分段线性插值算法实现[J].电脑知识与技术,2012,8(21):5236-5243.
[11] 韩潇,曾立,占丰,等.基于分段多项式近似的DDFS研究及FPGA实现[J].电子技术应用,2018,44(3):22-30.
[12] 佚名.各种主流无线通信技术[EB/OL].(2018-05-11)[2019-07-03]..
胡仕兵,陈子为
(成都信息工程大学 电子工程学院,四川 成都610225)