




已阅读5页,还剩38页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
河南机电高等专科学校 毕业设计说明书 设计题目:酒精浓度检测仪设计系 部 电子通信工程系 专 业 应用电子技术 班 级 应电 103 学生姓名 学 号 指导教师 2010年 12 月 12日目录1 绪论11.1 呼吸气体酒精浓度检测报警仪开发背景11.2呼吸气体酒精浓度检测报警仪的简介11.3呼吸气体酒精浓度检测报警仪课程设计基本要求与设计简介22 单片机最小系统介绍32.1 STC89C52简介32.2 复位电路介绍52.3 晶振电路介绍63 信号采集和AD转换过程的软硬件设计73.1 MQ-3酒精浓度传感器模块简介73.2 AD转换软硬件件设计83.2.1 ADC0804简介83.2.2 本设计中ADC0804外围硬件连接103.2.3 本设计中AD转换软件实现114 显示模块软硬件设计134.1 LCD1602简介134.2 本设计中LCD1602的硬件连接介绍144.3 本设计中LCD1602的软件设计144.3.1 本设计的液晶写命令子函数和写数据子函数程序分析144.3.2 本设计中用到的液晶指令介绍164.3.3 本设计中的字符串显示和数据实时更新的实现方法165. 其它外围设备软硬件设计195.1 报警电路软硬设计195.1.1 硬件部分设计195.1.2 软件部分设计195.2 待机指示灯软硬件设计205.2.1 硬件部分设计205.2.2 软件部分设计205.3 按键软硬件设计205.3.1 硬件部分设计215.3.2 软件部分设计215.4 电源电路226系统总体设计236.1 硬件总体框图236.2 程序流程图246.3 硬件调试256.4 软件调试256.4.1 标志数的应用256.4.2 按键的消抖与松手检测的程序实现266.4.3 定时器与定时器中断27结束语28致谢29参考文献30附录一 硬件设计原理图31附录二 实物照片32附录三 程序33 1 绪论1.1 呼吸气体酒精浓度检测报警仪开发背景我国经济、科技正在迅速腾飞,汽车早已进入寻常百姓家。我国正在步入“汽车社会”,2011年我国汽车总数突破8000万辆,位居世界第三,这也带来了许多问题,酒驾正是其中之一。酒精有使神经系统镇定松弛的作用,但也会成抑制力明显减弱,可能造成酒后暴力行为。如果酒后驾车,由于神经系统涣散和判断力下降,有可能造成严重交通事故。据科学实验表明,饮酒后对交通灯的反应慢,转向急速驾车摇摆不定,违法转弯和急速转弯等行为发生概率大大增大。喝酒后开车发生交通事故的概率是未喝酒时的16倍。2011年05月01日,我国正式将酒驾列为刑事犯罪。酒驾给了我们惨痛教训,为了避免悲剧的再次发生,检测仪器便出现了,本课程设计所制作的基于单片机的呼吸气体酒精浓度测试报警仪正是用于交警检测和自我检测的良好仪器,防止酒后驾车引发的交通事故。1.2呼吸气体酒精浓度检测报警仪的简介燃料电池型、半导体型、气体色谱分析型、比色型、红外线型是呼吸气体酒精浓度测报警仪的五种最基本类型。其中燃料电池型和半导体型是使用最为普遍的两种类型。燃料电池型与其它类型相比具有抗干扰能力强,精度高,受环境因素影响小,稳定性好等特点。它是当前全世界科学家都在广泛研究的环保型应用技术,它可以直接把可燃气体转变成电能,而不产生污染,其应用前景之一就是作为无污染的清洁能源,酒精传感器便是燃料电池的一个分支。燃料电池酒精传感器采用白金作为电极,在燃烧室内填充相应特殊催化剂,使进入燃烧室内的酒精充分燃烧转变为电能,也就是在两个电极上产生电压,电能消耗在外接负载上,此电压与进入燃烧室内气体的酒精浓度成正比。与半导体型相比,燃料电池型呼气酒精测试仪具有稳定性好,精度高,抗干扰性好的优点。但是由于燃料电池酒精传感器的结构要求非常精密,制造难度相当大,目前只有美国、英国、德国等少数几个国家能够生产,加上材料成本高,因此价格相当昂贵,是半导体酒精传感器的几十倍。本设计传感器是采用半导体型。1.3呼吸气体酒精浓度检测报警仪课程设计基本要求与设计简介本设计要求成品能对呼吸气体中的酒精浓度进行实时采集、转换、分析、显示、超值报警。成品硬件主要包括基于STC89C52单片机的微控制模块、MQ-3传感器采集模块、基于ADC0804芯片的A/D转换模块、按键控制模块、以1602为核心的显示模块、报警电路模块等。软件部分包括实时数据采集转换程序设计、实时按键检测程序设计、显示程序设计、报警检测和报警程序设计,考虑到MQ-3传感器在使用前有一个预热过程所以设计还加入了待机程序的设计。2 单片机最小系统介绍图2-1 最小系统电路图2.1 STC89C52简介本设计以STC89C52单片机为控制核心。单片机也就是MCU,即微控制单元,大学阶段51型和52型是同学最常使用的,用于课程设计或毕业设计的为控制单元。52型是在51型的基础上发展而来的,它兼容51指令系统,其功能更为强大,ROM和RAM存储空间也比51型更大。STC89C52是52型中最普遍的一种。它除了具备一般52型的优点以外,还具有程序无法解密,价格低,功耗低,运算高速,高可靠强性,抗静电和抗干扰能力强,功能强大等突出优点。STC89C52有40个引脚,32 I/O口,它们分别是:P0口,1号到8号引角;P3口,10号到17号引角;P2口,21号到28脚;P0口,32号到39号引脚。STC89C52可以实现两级中断嵌套,内含2个外部中断入口,可以同时实现两个计时器或计数器中断,还含有一个串口通信中断。串口通信中可以使用2个全双工串行通信口。2个读写口线,片内振荡器及时钟电路也给使用者带来了极大方便。STC89C52可以按照常规方法进行编程,也可以在线编程。STC_ISP_V479是本设计使用的程序下载软件,它以冷启动的方式,很方便地将hex文件载入单片机。相比以往的MCU,STC89C52可降至0Hz的静态逻辑操作,可自由选择两种软件节电工作模式也是其突出优点。空闲方式时,自动停止CPU当前工作,但允许RAM,定时/计数器,串行通信口及中断系统,继续工作,即可以随时相应突发状况,重新进入工作模式,这样可以节省电源。另外STC89C52的ROM采用电擦除电存储方式,具有可反复擦写的Flash存储器,这给程序编写者带来了极大方便,可以反复擦写下载十万余次,方便程序调试,同时大大节约了设计成本。图2-2 STC89C52单片机各引脚图2.2 复位电路介绍图2-3 复位电路电路图单片机工作过程中有一个程序指针,它指向即将要执行的程序。单片机上电时要执行复位操作,使得程序指针指针指向程序的0000H地址处,即单片机将要执行第一条语句,以后每执行完一条语句程序指针都依次增加。这样使得单片机每次执行程序都处于确定状态,如果没有程序指针,就不知道程序一开始应该从哪里开始执行,也不知道工作时应该执行哪条语句。上电时的自动复位,使得各端口的输出输入电平不会处于不确定状态,不会使外围设备产生误动作;也能防止内部一些控制寄存器的功能紊乱。另外,在单片机工作过程中,如前所述,ATC89C52单片机的就好引脚RST若输入大于2个机器周期时间的高电平时,单片机就会执行复位操作,即程序指针将由当前指针跳回到程序的0000地址处。以上所说的上电复位,和RST按键复位正是单片机复位操作的两种基本形式。上电复位的实现方法是,在接通电源时,RST引脚获得瞬间高电平,因为电容电压不能突变,随着图3中的电容C2的充电,RST引脚所获得的高电平逐渐下降,但能保持两个机器周期以上的时间,单片机复位。RST按键复位的方法是,在图3所示的复位电路中,当轻触开关S1被按下,RST与VCC相连,也能获得瞬间高电平,因为电容电压不能突变,随着图3中的电容C2的充电,RST引脚所获得的高电平逐渐下降,但能保持两个机器周期以上的时间,单片机复位。在复位电路的设计中,要选择合适的元器件参数,电阻的阻值不宜过大或者过小,过大使得RST不可能获得高电平,过小也不能起到限流作用。另外电容容值也应该合适,要保证放电时,RST引脚上的高电平也能保持两个机器周期以上的高电平。本设计使用的电解电容容值和各电阻阻值在图3中都有标注。2.3 晶振电路介绍 图2-4 晶振电路电路图单片机必须有时钟信号控制,才能使得工作时各指令在操作上有严格的时间次序,可以通过两种方法提供时钟信号,一种是外部时钟方式,另一种是内部时钟方式。外部时钟方式是在XTAL1端引入外部已有的时钟信号,而XTAL2端悬空,外部时钟信号一般是频率小于12MHZ的方波。外部时钟方式一般是用于多台单片机协同工作时,如单片机之间的通信,这样要使单片机有统一的工作节奏。本设计采用内部时钟方式,其电路结构简单,功率消耗低。本系统中为了尽量降低功耗的原则,采用了内部时钟方式。晶振全称为晶体振荡器(英文Crystal Oscillators),其作用在于产生原始的时钟频率。内部时钟方式的电路实现方法是在XTAL1和XTAL2引脚外接石英晶体,与单片机片内震荡电路形成震荡回路,图中电容C3和C4的容值为22pF,它们的作用是加快起振和稳定频率。3 信号采集和AD转换过程的软硬件设计3.1 MQ-3酒精浓度传感器模块简介图3-1 MQ-3酒精浓度传感器模块引脚示意图MQ-3酒精浓度传感器模块由传感器探头和调理电路组成。MQ-3酒精浓度传感器探头输出的微弱电流送入调理电路,使信号放大并滤去杂波。MQ-3酒精浓度传感器模块引脚示意图如上图,除VCC和GND以外,模块还有两个输出端口,TTL电平输出端口和模拟信号输出端口。在检测的酒精浓度值大于传感器内预设值时,TTL电平输出端口将输出高电平,起报警信号作用,若小于预设值则输出低电平。由于传感器模块内部预设值不方便通过程序改变,所欲在本设计中TTL电平输出端口悬空,而报警值则在程序中设定,报警由单片机程序控制,这要便于修改。模拟信号输出端口能输出0到+VCC 的模拟信号,当检测的酒精浓度越大时输出电压越高。此端口接入ADC0804的6号引脚,实现AD转换。 表3-1 MQ-3传感器参数表名称MQ3传感器 A.标准工作条件符号参数名称技术条件备注 Vc 回路电压15VAC or DC VH 加热电压5.0V0.2V AC or DC RL 负载电阻可调 RH 加热电阻313室温 PH 加热功耗900mW B.环境条件符号参数名称技术条件备注 Tao 使用温度 -10-50 Tas 储存温度 -20-70 RH相对湿度 小于 95% RH O2 氧气浓度 21%(标准条件) 氧气浓度会影响灵敏度特性最小值大于C.灵敏特性 符号 参数名称 技术参数 备注 Rs 敏感体电阻 1M- 8 M (200ppm alcohol ) 适用范围: 10-1000ppm Alcohol (200/100)alcohol 浓度斜率 0.6 标准工作条件 温度: 202 Vc:5.0V0.1V 相对湿度: 65%5% Vh: 5.0V0.1V 预热时间 不少于24小时3.2 AD转换软硬件件设计3.2.1 ADC0804简介图3-2 ADC0804引脚示意图ADC0804是属于连续渐进式的A/D转换器,这类型的A/D转换器除了转换速度快(几十至几百us)、分辨率高外,还有价钱便宜的优点,普遍被应用于微电脑的接口设计上。 芯片参数: 工作电压:+5V,即VCC=+5V。 模拟输入电压范围:0+5V,即0Vin+5V。 分辨率:8位,即分辨率为1/2=1/256,转换值介于0255之间。 转换时间:100us(fCK=640KHz时)。 转换误差:1LSB。 参考电压:2.5V,即Vref=2.5V。3.2.2 本设计中ADC0804外围硬件连接图3-3 ADC0804外围电路连接20号引脚角和10号引脚分别接VCC和GND,为芯片提供工作电压。在精确测量时,8号引脚模拟地和10号引脚数字地应该分开接,为芯片提供基准电压,此处把它们接在一起,同时接地。1号引脚,片选信号接入P1.5,当P1.5输出低电平时,芯片被选中处于工作状态。引脚二为外部读数据允许位,它接到P1.6,当P1.6输出低电平时,芯片处于外部许状态,转换后的数据被送入DB0到DB7引脚,DB0到DB7引脚为数据输出端口,它与单片机P3口依次相连,此时单片机可以从P3口取走。引脚三为外部写数据允许位,它与单片机P1.7口相连,当P1.7输低电平时,芯片处于外部写允许状态,此时芯片从6号和7号引脚获取电压差值,当此引脚再次拉高时,芯片便开始AD转换。6号引脚Vin(+)接传感器模块的模拟信号输出端口,其间接入的10K电阻并不影响输入电压,但可以起到限流作用,防止瞬间高电流将芯片烧坏。7号引脚Vin(-)接地,转换的原始模拟电压就是6号引脚和7号引脚的电压差值。5号引脚在转换时输出高电平信号,结束时输出低脉冲。它如果与单片机的外部中断端口(P3.2或P3.3)相连,在转换结束后给单片机一个中断,让单片机读走数据。考虑到ADC0804的转换时间还是非常快的,本设计中此引脚悬空,没有和单片机外部中断入口相连。在程序中可以用软件延时的方式等待它转换完毕,或者用定时器中断方式每隔一定时间采样,让芯片有充分转换时间。在本设计中采用了第一种做法模拟信号输出端口,具体方法在下一小节中介绍。19号引脚跨接一个10K电阻与4号引脚相连,4号引脚在与56PF的电容相接,电容另一端接地。这样电阻和电容便于芯片内部电路形成了RC震荡电路,它产生周期信号,为芯片提供时序,芯片正是在此时序的控制下有条不紊的工作。9号引脚应接入二分之一的VCC为电路提供参考基准电压,具体做法是,将两个10K电阻串联接在VCC和GND上分压,接号引脚并接在他们中间,获取参考电压。3.2.3 本设计中AD转换软件实现图3-4 ADC0804控制时序图 参考上图,CS端在初始化函数void init()中便将他拉低使芯片一直处于工作状态,在主函数中先判断是否处于检测状态,若是检测状态,不断调用检测命令和显示命令,使单片机可以实时检测。当测试值超标,则使报警电路报警,显示模块和报警电路的软硬件设计将在后面详细介绍。下面具体讲述转换过程,上电后由于RD和WR都和I/O相连,即输出默认电平,无需初始化。在转换时先将WR拉低,调用带形参子函数void delay(),用delay(1);语句延时约一毫秒,让ADC0804有足够时间读走6、7号引脚上的电压差值。RD拉高后,芯片开始转换,此时程序用delay(5);语句软件延时约五毫秒,让芯片转换完成。再让RD端拉低,同样软件延时一毫秒,让单片机读走数据。下面介绍转换原则,ACD0804有八位数据输出口,即转换精度为256,它将最高值(此处为1000ppm),分为255份,当得到一个转换数据时,用最大值除以255,再乘以该数据值便是最终转换值。AD转换子函数分析:void ad()wr=0; /将WR拉低,让芯片开始读6、7号引脚电压值delay(1); /延时约一毫秒,让芯片忙完wr=1; /将WR拉高,上升沿到来时,AD转换开始delay(5); /软件延时约五毫秒,等待AD转换完成P3=0xff; /将P3口全部拉高,等待测试数据delay(1); /延时一会,避免紊乱rd=0; /将RD拉低,芯片送出数据delay(1); /延时约一毫秒,让P3口temp=P3; /将数据存入temprd=1; /将RD拉高4 显示模块软硬件设计4.1 LCD1602简介LCD1602每行可以输出16个字符,可以显示两行,故称1602,它不带中文字库,故只能显示数字、字母和普通字符。在本设计中不检测液晶的忙与闲,用前面对待ADC0804的方法,用软件延时来等待液晶的忙操作时间。液晶显示输出D0到D7口接P0.0到 P0.7,单独使用一个口,另外还要接上10K上拉电阻来提高P0口带负载能力。当处于读状态时,RS处于低脉冲,R/W为高脉冲,E为高脉冲 ,D0D7=状态字当处于读数据时,RS为高脉冲,R/W为高脉冲,E为高脉冲,D0D7=数据。当处于写指令时,RS为低脉冲,R/W为低脉冲,D0D7=指令码,E=高脉冲。当处于写数据时,RS为高脉冲,R/W为低脉冲,E为高脉冲,D0D7=数据。4.2 本设计中LCD1602的硬件连接介绍图4-1 LCD1602硬件连接图1号引脚VSS接地2号引脚VDD接电源正,为液晶提供合适电压。15号和16号引脚也分别接电源正和地,点亮液晶背光灯,15号叫也可以串接一个5欧姆电阻,适当减小背光亮度,本设计中并未接。3号角接到10K可调电阻M103的可调端,M103另外两端接电源正和地。用于调整液晶对比度。RS、R/W、E分别与I/O口P2.5、P2.6、P2.7相连。数据口与P0口连接,外接10欧姆上拉电阻。4.3 本设计中LCD1602的软件设计4.3.1 本设计的液晶写命令子函数和写数据子函数程序分析图4-2 LCD1602写操作时序注意前提,在初始化函数void init()中,已将R/W拉低(对应lcden=0;语句),即只对液晶进行写操作,不读液晶状态。之前有位定义sbit lcdrs=P25;sbit lcdrw=P26;sbit lcden=P27;写命令函数各语句分析:void write_com(uchar com)lcdrs=0; /将RS拉低,说明对指令操作, 上电时是默认高电平P0=com; /对P0赋值,该值是对应命令码 ,com为形参delay(5); /延时约五毫秒lcden=1; /E拉高,让液晶读P0口,写入对应命令码delay(5); /延时约五毫秒,让液晶忙完再对其操作,防止数据丢失lcden=0; /将E拉低写数据函数各语句分析:void write_com(uchar da)lcdrs=1; /将RS拉低高,说明对数据操作P0=da; /对P0赋值,该值是要写入的数据 ,da为形参delay(5); /延时约五毫秒lcden=1; /E拉高,让液晶读P0口,写入数据delay(5); /延时约五毫秒,让液晶忙完再对其操作,防止数据丢失lcden=0; /将E拉低结合图10,将对以上分析更加清楚。值得注意的是,在写数据的操作中,写入的都是字符ASCII码,例如想写1,让液晶在某处显1,可写write_data(1);或者write_data(0x30+1);4.3.2 本设计中用到的液晶指令介绍分析本设计程序,你会看到这些写指令命令:write_com(0x38);write_com(0x0c);write_com(0x06);write_com(1);write_com(0x80+); 下面对它们中的指令码做介绍:0x38:液晶初始化指令,让液晶按每行显示16个字符,显示两行,并且每个字符显示处的点阵为5X7;0x0C:不显示光标,光标不闪烁;0x06:在写入一个数据后地址自动加一,显示不移动;1即0x01:清屏指令,即将液晶内部存储数据清楚,地址指针指向零;0x80+:设置写入数据的地址,所加的就是对应地址。4.3.3 本设计中的字符串显示和数据实时更新的实现方法 写字符串子程序:void write_str(uchar *p)while(*p)write_data(*p+);这里灵巧的应用了数组指针,比传统的for嵌套循环写入方便很多。用while(*p)自动检测是否写完,当写完后指针变为零,跳出循环。如想写入AC value:,只需先定义数组uchar code str=AC value:;,再写语句write_str(str);写完后指针变为零,自动结束。数据实时更新的实现方法,检测时不断调用显示子函数,display();显示函数如下:void display()uint value; /定义局部变量valueuchar a,b,c; /定义局部变量a、b、cvalue=3.92*temp; /获得value值,它是以ppm为单位a=value/100; /a为value的百位b=value%100/10; /b为value的十位c=value%10; /c为value的个位write_com(0x80+0x40+4); /将数据写在第二行,第五个字符处write_data(0x30+a); /在第二行,第五个字符处写入value百位write_com(0x80+0x40+5); /将数据写在第二行,第六个字符处write_data(0x30+b); /在第二行,第六个字符处写入value十位write_com(0x80+0x40+6); /将数据写在第二行,第七个字符处write_data(0x30+c); /在第二行,第七个字符处写入value个位在循环语句中不断调用AD转换程序, ad();,又不断调用显示函数,数据就能实时检测更新。在待机时,循环程序中不断执行语句:write_com(0x80+6); /将数据写在第一行,第七个字符处write_data(tablea); /在第一行,第七个字符处写入时钟的分钟write_com(0x80+7); /将数据写在第一行,第八个字符处write_data(tableb); /在第一行,第八个字符处写入闪烁的冒号write_com(0x80+8); /将数据写在第一行,第九个字符处write_data(tablec); /在第一行,第九个字符处写入时钟的秒钟十位write_com(0x80+9); /将数据写在第一行,第十个字符处write_data(tabled); /在第一行,第十个字符处写入时钟的秒钟个位由于是在不断循环调用,即不断数据刷新,而a、b、c、d的改变是通过定时器零实现的。这在后面的程序调试中详细说明。5. 其它外围设备软硬件设计5.1 报警电路软硬设计5.1.1 硬件部分设计图5-1 报警电路将蜂鸣器的正端接电源正,负端接P1.0。低电平有效,蜂鸣器响起。发光二极管D1为报警灯,它的正端接电源正,负端与470K电阻相连再接上P1.1。低电平有效,D1点亮。电阻限流电阻。5.1.2 软件部分设计 位定义语句:sbit beep=P10; /定义蜂鸣器sbit d1=P11; /定义报警灯 用程序让蜂鸣器响: beep=0; /低电平输出时,蜂鸣器打开 用程序让蜂鸣器关闭: beep=1; /高电平输出时,蜂鸣器关闭 用程序将D1点亮: d1=0; /低电平输出时,D1点亮 用程序将D1熄灭: d1=1; /高电平输出时,D1熄灭5.2 待机指示灯软硬件设计5.2.1 硬件部分设计图5-2 待机指示灯电路发光二极管D2为待机指示灯,它的正端接电源正,负端与470K电阻相连再接上P1.3。低电平有效,D2点亮。电阻限流电阻。5.2.2 软件部分设计 位定义语句:sbit d2=P11; /待机指示灯警灯 用程序将D2点亮: d2=0; /低电平输出时,D2点亮 用程序将D2熄灭: d2=1; /高电平输出时,D2熄灭5.3 按键软硬件设计5.3.1 硬件部分设计图5-3 按键电路S2和S3分别和P2.1和P2.0,再与GND相接。S2为待机控制按键。S3为检测控制按键。R18和R19与VCC相连再并接在开关前,是为了在松手时,使I/O获得稳定的高电平。5.3.2 软件部分设计 位定义语句:sbit k1=P20; /S3位定义sbit k2=P21; /S2位定义S2按键检测: if(k1=0) /检测按键是否按下delay(5); /消抖if(k1=0) /再检测按键是否按下flag=0; /写入要进行的操作,这里是将标志数flag置零while(!k1); /松手检测S3按键检测: if(k2=0) /检测按键是否按下delay(5); /消抖if(k2=0) /再检测按键是否按下flag=1; /写入要进行的操作,这里是将标志数flag置一while(!k2); /松手检测5.4 电源电路图5-4 电源电路如上图为本设计的电源电路。接入220V交流电后从变压器输出12V交变电压,再经过桥式整流电路整流,输出直流电。稳压芯片7805使电压稳定在5V,电解电容C5和C6滤除杂波。S4为紧锁开关,也是电源总开关。D4与R17串联,跨接在VCC与GND之间,作为电源指示灯。6系统总体设计6.1 硬件总体框图MQ-3传感器模块LCD显示模块MCU控制中心报警电路与待机指示灯电路A/D转换模块按键图6-1 硬件总体框图6.2 程序流程图执行酒精浓度的实时检测,显示和报警执行待机程序,液晶显示简易计时,不检测和不显示酒精浓度k2按下标志数flag置一k1按下标志数flag置零k1与k2未按下标志数flag为初始值1检测按键k1与k2是否按下开始图6-2 程序流程图6.3 硬件调试 在制作实物时有忘记连接、虚焊、飞线以及连接错误等情况,好在都成功检查了出来并改善了。目前硬件工作正常。制作过程中最严重的问题是将液晶的数据口与P0口连接错误,完全倒置连接。考虑到P0口与液晶数据口连接处布线密集,飞线难度大,最后既定,将8根数据线剪断,再焊上两排排针,用杜邦线连接,最后效果很好。 硬件的连接已经在前面各节中详细介绍,此处不再赘述。电路原理图和实物照片参见附录一和附录二。6.4 软件调试 本设计所用编译软件时keil。各模块的软件设计已经在前面各节中介绍,这里主要介绍下标志数的应用,按键消抖和松手检测,定时器和定时器中断,主要谈及它们的原理以及软件实现过程。6.4.1 标志数的应用(主函数运行待机程序还是检测程序的判断)为了能让主函数分清是执行执行待机程序还是检测程序报警程序,引进标志数flag。 当flag为1时执行待机程序: while(flag=1) 待机程序当flag为0时执行检测报警程序:while(flag=0) 检测报警程序在初始化函数中先将flag置一:flag=1;上电后则进入待机状态。按键k1后使flag置零,执行检测报警程序。按键k2后使flag置零,又执行待机程序。值得注意的是要在执行待机程序或检测报警程序前,执行待机程序的程序尾部,以及执行检测报警程序的程序尾部多加入按键检测程序:if(k1=0) /按键检测delay(5); /消抖if(k1=0)flag=0;while(!k1); /松手检测if(k2=0) /按键检测delay(5); /消抖if(k2=0)flag=1;while(!k2); /松手检测 这样就可以重新设置flag,再执行完待机程序或检测报警程序后,判断接下来要执行什么程序。6.4.2 按键的消抖与松手检测的程序实现为什么要消抖?主要在手刚刚按下轻触开关时,会有抖动,有抖动时,程序会快速跑走,这样有可能等同于按了两下或多下按键的效果。消抖原理:在检测到按键后,立刻延时约五毫秒,即延时消抖,这样就过了抖动时间,之后手的按键力度是非常稳定的。注意延时结束后立马在检测下按键是否还按下,以免因其它抖动误判。程序如下。k1消抖:if(k1=0) /按键检测delay(5); /延时消抖if(k1=0) /再次按键检测 k2消抖:if(k2=0) /按键检测delay(5); /延时消抖if(k2=0) /再次按键检测 其实用了连个开关k1和k2来分别将标志数flag置一或置零,此时消抖不是很重要,不消抖也不会让程序误判。松手检测,用while语句,如下。k1松手检测语句:while(!k1);k2松手检测语句:while(!k2);当还按着键时,一直执行while循环语句,等待放手,放手后跳出循环,执行下面语句。6.4.3 定时器与定时器中断本设计在待机时,执行一个简易的十分钟以内的计时程序。这时用定时器零产生中断,让其计时。定时器是独立与cpu的单独部件,与软件延时比起来,它不占用程序时间,定时很精确。当时间到了时,它就产生定时中断,让主程序让执行定时器中断函数。设置TMOD=0x01;使定时器零工作在方式一,工作方式一是十六位不能自动重装初值的方式,所以在进入定时器中断函数后要重新装初值。结束语 从理论上说,要判断是否是酒后驾驶,最简单可行的方法是现场检测驾驶人员呼气中的酒精含量。大量的统计研究结果表明,如果被测者深吸气后以中等力度呼气达三秒钟以上,这时呼出的气就是从肺部深处出来的气体,呼气中的酒精含量与血液中的酒精含量。 根据国家质量监督检验检疫局发布的车辆驾驶人员血液、呼气酒精含量阈值与检验(GB195222004)中规定,该规定指出,饮酒驾车是指车辆驾驶人员血液中的酒精含量大于或者等于20mg/100ml,小于80mg/100ml的驾驶行为。醉酒驾车是指车辆驾驶人员血液中的酒精含量大于或者等于80mg/100ml的驾驶行为本设计编程采用c语言,体现了其很好的计算机语言优势。本人非常认真地且独立地完成了本毕业设计地全部工作,有电路图的设计,原理图的绘制,实物的制作,程序的编写与调试、论文的撰写。在设计中查过许多资料,请教过老师和同学,但无剽窃等原则性错误。致谢本设计是在指导老师顾学俊老师的悉心指导下,还有许多同学的帮助下完成的。顾老师严谨的治学态度,优秀的学术底蕴,孜孜不悔的教学精神,平易近人的人格魅力,对我影响深远。在此向顾老师表示深深地感谢!也对所有帮助过我毕业设计的人在此一并表示感谢!参考文献1 徐玮.51单片机综合学习系统1602字符型液晶显示篇J.电子制作,2008,2(1):1-32 苏成富.多功能音乐门铃J.电机电器技术日用电器,2000,(3):68-69 3 郇玉龙,赵宁.用单片价设计电子音乐门铃J.电子制作用单片机制作, 2007,(5):24-264 夏方林.基于AT89C2051的单户可视对讲门铃室内分机的设计J.微计算机信息,2004,5(10):96-975 胡俐蕊,朱彪. 多功能电子门铃的设计与实现J.电子元器件应用,2006.10,(8):35-38.6 冯育长等.单片机系统设计育实例分析M,西安电子科技大学出版社,2007.7 李念强等.单片机原理及应用M,机械工业出版社,2007.8 吴金戌等.8051单片机实践与应用M,清华大学出版社,2002. 11 沈红卫. 单片机实用系统设计实例与分析M. 北京:北京航空航天大学出版社.9 谢魁.一种新型的语音门铃 电子与自动化J,2000(3):46-47.10 孟利民, 张明珊. 无线可视对讲门铃系统中语音通信的设计与实现J.浙江工业大学学报,2005.2(1):24-27.附录一 硬件设计原理图附录二 实物照片附录三 程序/*定义包含reg52头文件*/#include/*/*宏定义*/define uint unsigned int#define uchar unsigned char/*/*位定义*/sbit beep=P10;sbit d1=P11;sbit d2=P13;sbit k1=P20;sbit k2=P21;sbit lcdrs=P25;sbit lcdrw=P26;sbit lcden=P27;sbit cs=P15;sbit rd=P16;sbit wr=P17;/*/*定义字符数组*/uchar code str=AC value:;uchar code str0=ppm;uchar code table=0123456789: ;/*/*定义无符号字符型全局变量*/uchar flag,temp,a,b,c,d,tt;/*/*子函数声明*/void init(); /初始化函数void delay(uint); /有无符号整型形参的延时函数void write_str(uchar *); /向液晶写入字符串的函数void write_com(uchar); /液晶写命令函数void write_data(uchar); /液晶写数据函数void ad(); /AD转换函数void display(); /酒精浓度显示函数/*/*主函数部分*/void main()init(); /调用初始化函数while(1)if(k1=0) /按键检测delay(5); /消抖if(k1=0)flag=0;while(!k1); /松手检测if(k2=0) /按键检测delay(5); /消抖if(k2=0)flag=1;while(!k2); /松手检测while(flag=0) /执行待机程序TR0=0;d2=1;write_com(1);write_com(0x80);write_str(str);writ
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论