• 8.27 MB
  • 2022-04-22 13:43:04 发布

基于单片机的多功能数显表设计.doc

  • 68页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'第68页共49页基于单片机的多功能数显表设计引言本毕业设计的设计任务为一个多功能数显表。该数显表可以测量和显示气压、冲击频率和耗气量。并且具有RS232接口和时间显示。本毕业设计作品选用AK-4气压传感器和LWGY涡轮流量传感器,通过MCS-51单片机来控制操作,实现信号数据的采集、处理和发送。本毕业设计作品不仅可以将气压、冲击频率、耗气量及时间等数据显示在8个LED数码管上,还会通过RS232串口,将数据发送到PC上。并由PC上的配套程序,将信息数据显示在显示器上,这两部分所显示的数据是完全相同的。其中数字显示时间单位为秒,冲击频率的单位为BMP,耗气量的单位为立方米/小时。同时,系统会自动计时,开始运行3分钟之后,自动结束测量、显示,并保存信息数据。下面就将对本毕业设计作品进行详细的介绍。1.设计任务1.1任务说明本毕业设计的课题为多功能数显表。设计的主要任务为设计一个多功能数显表,该数显表可以测量和显示气压、冲击频率和耗气量。而且还要有RS232接口和时间显示。对于本次毕业设计的任务还有以下的要求。首先,要采用AK-4气压传感器和LWGY涡轮流量传感器来采集信息数据。其次,要采用MCS51单片机来完成系统的控制,要求制作单片机控制系统、驱动电路、A/D转换、显示电路以及测量电路。再次,系统的电源要求采用~220V供电。然后,还要求在测量开始时,开始计时,3分钟后自动结束测量并保存数据。而且,RS232的波特率为4800。最后,规定了数字显示数据的内容和单位:时间(秒)、冲击频率(BMP)、耗气量(立方米/小时)。1.2任务分析根据本次毕业设计的课题和设计的主要任务,我们可以知道,要设计的系统的主要功能就是对气压、冲击频率和耗气量的测量和显示。要完成对气压、冲击频率和耗气量的测量,就必须要用到传感器。根据设计任务的具体要求,就可以知道:AK-4气压传感器很明显是用来测量气体气压的传感器,它的输出信号就是数显表要显示的冲击频率和气压数据的信息来源;LWGY涡轮流量传感器则应该是数显表显示的耗气量数据的信息来源。但在这其中需要要注意的问题就是,两个传感器的输出信号的类型不一定能够直接传送到MCS-51单片机去处理。那么,就要弄清楚各自的输出信号的类型,然后分别设计出信号的处理电路,将它们转换成MCS-51单片机可以接受的信号。否则,MCS-51单片机可能根本接收不到数据,或接收到的数据中的信息并不是我们所需要的。 第68页共49页还有一个主要功能就是对气压、冲击频率和耗气量的显示功能。数据的显示部分,我们只需要扩展出几个LED数码管,就可以将数据信息很好的显示出来。要实现这个功能,首先,就要有驱动电路来驱动LED数码管,让LED数码管有显示数据的必要条件;其次,还要有需要显示的信息数据,这些数据就要来源于MCS-51单片机,MCS-51单片机提供这些信息数据之前,要对传感器传输过来的信息做好转换处理,来保证信息的准确性和可靠性。这个部分需要注意的问题是,系统要扩展出多个LED数码管,要处理好信息传输的时序,以保证LED数码管得到的数据信息,与我们想要它们显示的信息是一致的。这就需要有MCS-51单片机要发出一个选定使能信号,每次只有一个LED数码管是接收和显示数据年的。MCS-51单片机循环选定一遍所有LED数码管,就可以很好的完成一次完整的数据显示过程。但是,这个过程的处理时间是很快的,很难让人眼的视觉有滞留的感觉。所以,要让LED数码管有满意的显示效果,就必须加上数据的锁存,让LED数码管得到数据信息后可以一直显示收到的信息,直到下一次数据传输过来的时候,数据就会被刷新,这样就可以很好的实现这个功能了。而至于时间的显示,我们可以通过MCS-51单片机的计时器功能来实现。系统还有一个功能就是要有RS232串行通讯接口连接到PC。MCS-51单片机本身就有串行通讯的功能,也有专用的串行通讯的引脚和串行通讯控制器。所以,在完成这部分功能方面,MCS-51单片机自己就可以完全胜任这个部分的工作,要实现这个功能也就比较容易了。这个部分需要注意的问题就是,MCS-51单片机的电平标准和PC的电平标准是不一致的,要进行串行通讯的时候,MCS-51的串行通讯接口和PC串行通讯接口要有电平转换电路来为信息通讯做桥梁,以保证信息传送的有效性。否则,就会有部分电路被烧掉的危险,因此要特别注意这个问题。以上是完成设计主要任务而对要设计的系统的硬件电路方面的任务的分析,此外,系统的软件方面也是不容忽视的。因为,本次要设计的系统的功能任务比较多,所以,MCS-51单片机的处理任务也比较繁重,系统软件的算法也就直接影响到系统运行的稳定性。系统的软件算法要充分考虑到任务性质的主次和特点,安排好任务的处理顺序和条理。要充分利用好中断服务功能,来满足系统处理要求,来很好的实现设计任务中所要求的功能和效果。其中需要注意的问题是,当算法设计中涉及到两个或多个中断服务的时候,一定要根据中断程序所服务的中断功能,来设置好中断的优先级。否则,会带来系统稳定的很大隐患,因此,要特别注意这方面的细节问题。综上所述,本次毕业设计的任务的特点为系统工作量比较大,但任务功能的实现方面没有难度性很高的功能。但是,要想设计出来的系统可以稳定、可靠得实现出设计任务要求的任务,有很多的细节问题是需要特别注意的。以上分析中的需要注意的问题都进行功能设计中的重要细节部分,在设计时,要给予充分的考虑和周密的设计。根据以上的详细分析,下面就对我设计出来的方案做详细的介绍。 第68页共49页1.总体设计根据任务要求所要实现的功能,我设计出了两种方案来实现。这两个方案都可以很好的实现系统所要求的功能,不过是通过不同的途径来完成的。本部分就将对这两个方案作总体上的介绍和分析,后面将通过对两个方案的比较,选出最适合本系统的方案,并最终选定为本毕业设计作品要使用的方案。2.1总体设计方案一此设计方案的系统方框图如下图所示。方案一的系统原理框图方案一的单片机时钟信号是由外部的振荡电路提供,通过X1,X2引脚输入。石英晶体选用12M的,电容选用30μf的。复位电路采用上电复位方式。单片机的P0口用来作读取A/D转换的结果和发送ADC0809通道选择地址数据。单片机的P1口用来发送LED数码管显示内容的数据总线。单片机的P2口的第三位用来提供LED数码管读取总线数据的片选信号。系统共用到9个数码管,这三条线通过3线-8线译码器来实现对数码管的片选,最后一个就用P2.5来提供片选。而P2.7、ALE、RD和WR引脚就用来对ADC0809提供控制信息,来控制A/D转换过程。INT1外部中断脚被用来接收传感器LWGY输出的信号数据。最后,TXD和RXD根据引脚的特殊功能,被用来做与PC做串口通信,完成与PC的数据传输功能。 第68页共49页方案一的A/D转换部分的功能主要由ADC0809来实现。方案一中,ADC0809只需要负责传感器AK-4输出的信号数据做模数转换。单片机发出启动转换控制信号后,ADC0809开始做模数转换。单片机通过软件延时来完成对转换数据的读取。方案一的传感器输出信号处理部分由两个传感器各自的信号处理电路组成。其中,两个方案对AK-4传感器输出信号的处理原理是一样的,而且都要处理出两个信号的参数。这也是由它的输出信号特性决定的,可以通过很简单的处理,就可以满足ADC0809对输入信号的要求,再处理出信号的波动脉冲,传输到MCS-51单片机转换成冲击频率。不同的是对传感器LWGY输出信号处理的方法。在本延时式方案里,只是将电流脉冲信号简单的处理成电压脉冲信号。然后,将频率信号接入单片机的外部中断口,让单片机来扫描其频率。以完成对耗气量的测定。方案一的LED数码管显示部分采用的是最常用的方式来实现的。用P1口发送显示数据,P2口的低三位来发送片选信息。将8个数码管扫描一次,就完成了一次数据的显示。方案一的PC串行通讯接口部分,采用了两个电平转换的芯片。这两个芯片分别为MC1488和MC1489,它们都是串口电路电平转换的常用芯片。可以保证功能的可靠实现。2.2总体设计方案二此设计方案的系统方框图如下图所示。方案二的系统原理方框图中断式方案的单片机时钟信号也是由外部的振荡电路提供,通过X1,X2引脚输入。石英晶体选用12M的,电容选用30μ 第68页共49页f的。但复位电路选用按键式复位电路。单片机的P0口用来作读取A/D转换的结果和发送ADC0809通道选择地址数据。单片机的P1口用来发送LED数码管显示内容的数据总线和提供LED数码管读取总线数据的片选信号。系统共用到9个数码管,这三条线通过3线-8线译码器来实现对数码管的片选,最后一个也是用P2.5来做片选。而P2.7、ALE、RD和WR引脚就用来对ADC0809提供控制信息,来控制A/D转换过程。INT1外部中断脚被用来接收A/D转换结束信号。最后,TXD和RXD根据引脚的特殊功能,被用来做与PC做串口通信,完成与PC的数据传输功能。中断式方案的的A/D转换部分的功能也主要由ADC0809来实现。中断式方案中,ADC0809则需要负责传感器AK-4和传感器LWGY两个传感器输出的信号数据做模数转换。单片机发出启动转换控制信号后,ADC0809开始做模数转换。单片机通过外部中断方式来完成对转换数据的读取。中断式方案的传感器输出信号处理部分也由两个传感器各自的信号处理电路组成。对AK-4传感器输出信号处理方法与方案一类似,但由于其信号线性极好,只需要将其转换成电压信号,就可以得到气压信号;本方案加入了对转换出来的脉冲信号的整流。在本中断式方案里,在得到冲击频率信号方面,只对传感器LWGY输出信号进行电平转换的处理方法,就得到了电压的脉冲信号,再传输到MCS-51中处理,就可以得到耗气量的参数信息了。中断式方案的LED数码管显示部分采用的是一个功能比较强大的芯片4511。它可以将BCD码直接转换成LED数码管的驱动信号,并将信号锁存传输给LED数码管,给系统带来极大的方便。因此,只需要P1口的低四位就可以完成显示信息的数据传输。剩下的高四位刚好可以通过3线-8线译码器完成片选信号的控制。从而只用一个P1口就完成了LED数码管部分功能的实现。中断式方案的PC串行通讯接口部分,采用了比较常用的MAX232。它也是专用的RS232接口的电平转换电路。完全可以胜任本系统的串口电平转换功能的实现。2.3总体设计方案的比较从以上的介绍中,我们可以看到,这两种设计方案的主要却别有两个地方。第一个就是LWGY传感器输出信号的处理方法。方案一的处理方法处理后可以直接作为数据信息传输给MCS-51单片机处理,方案二的处理方法处理后则可以传输给ADC0809做A/D转换,然后再传输给MCS-51单片机处理。第二各就是对LED数码管的驱动方式。方案一是MCS-51单片机输出LED数码管的驱动信号,通过数据锁存来完成数字的显示,而方案二则是MCS-51单片机输出数据信息,经过译码和锁存的专用芯片来驱动LED数码管,来完成数字显示功能。除了这两个主要的不同之处之外,在其他部分的功能实现上也略有不同。其中包括MCS-51单片机的复位电路,串行通讯端口的电平转换,MCS-51单片机的I/O资源分配等等。下面我就这些具体电路的细节方面做详细的介绍和比较,以分析出哪个方案更适合这个系统,从而选定为最终的设计方案。 第68页共49页1.方案的具体设计和比较从以上方案的总体设计的介绍,我们可以了解到,这两个硬件电路方面的设计方案的都是主要由单片机、A/D转换、LED数码管显示、传感器的信号处理和与PC通信的RS232串口连接等部分组成。要想系统能够真正的运行起来,协调各部分功能电路的软件也是必不可少的。下面就从这些方面对这两个方案进行详细的说明、分析和比较。3.1硬件方案的具体设计和比较按照上述的总体设计方案,本人设计出了两个完整的具体硬件电路原理图。方案一的硬件电路原理图如附图1所示。方案二的电路原理图如附图2所示。两个设计方案都有各自的特色,下面就详细的介绍它们各个功能电路部分的特色所在。3.1.1晶振电路的设计⑴设计原理8051片内有一由高增益反相放大器构成的振荡器。反相放大器的输入端为xTALl,输出端为xTAL2,两端踌接石英晶体及两个电容形成稳定的自激振荡器。电容通常取30PF左右。振荡频率范围是1.2—12MHz,如下图(左)所示。晶体振荡器的振荡信号从xTAL2端输出到片内的时钟发生器上。时钟发生器为二分频器.向CPU提供两相时钟信号P1和P2。时钟信号纳周期称作饥器状态时间s.是振荡周期的2倍。每个时钟周期有两个节拍(相)P1和P2,cPU就以两相时钟P1和P2为基本节拍指挥805l单片机各部件协调工作。下图(右)给出片内时钟发生原理。⑵具体电路设计 第68页共49页这部分在两个方案中是相同的,电路图如下图所示。系统方案的时钟发生部分电路图在本设计中,考虑到由于ADC0809片内无时钟,可利用8031单片机提供的地址锁存允许信号ALE经D触发器二分频后获得,ALE脚的频率时单片机时钟频率的1/6(但要注意的是,每当访问外部数据存储器时,将少一个ALE脉冲)。如果单片机时钟频率采用6MHz,则ALE脚的输出频率为1MHz,再二分频后为500kHz,恰好符合ADC0809对时钟频率的要求。因此,晶体振荡器选择12M的,而自激振荡电路中的电容就取30PF。3.1.2按键复位电路的设计⑴设计原理单片机复位是使CPU和系统中的其他功能部件都处立—个确定的初始状态,并从这个状态开始工作,例如复位后PC=0000H,使单片机从第—个单元取指令。大论是在单片机刚开的接广电源时,还是断电后或者发生故障后都要复位,所以我们必须弄清楚MGS—51型单片机复位的条件、复体电路和复位后状态。单片机复位的条件是:必须使RSW阳或RST引脚(9)加上持续两个机器周期(即24个振荡周期)的高电平。例如,若时钟频率为12MHz,每机器周期为1μs,则只需2μs以上时间的高点平,在RST引脚出现高电平后的第二个机器周期执行复位。单片机常见的复位电路如下图(a),(b)所示。下图中(a)图为上电复位点路,它足利用电容充电来实现的。在接电瞬间,RESET端的电位与VCC相同,随着充电电流的减少,RESET的电位逐渐下降。只要保证RESET为高电平的时间大于两个机器周期,使能正常复位。下图中(b)图为按键复位电路。该电路除具有上电复位功能外,若要复位,只需按图(b)中的RESET键,此时电源vCC经电阻R1、R2分压,在RESET端产生一个复位高电平。 第68页共49页⑵具体电路设计的分析和比较①方案一此方案中采用上电复位电路。电路如下图所示。上电复位电路图上电式复位电路的特点是很方便,当有电源接通给单片机时,此电路就可以自动产生复位信号。它足利用电容充电来实现的。在接电瞬间,RESET端的电位与VCC相同,随着充电电流的减少,RESET的电位逐渐下降。只要保证RESET为高电平的时间大于两个机器周期,使能正常复位。②方案二此方案中采用了按键式的复位电路,如下图所示。 第68页共49页按键复位电路图这种复位电路的特点就是上电以后,可以随时通过按键来发出复位信号。该电路除具有上电复位功能外,若要复位,只需按图中的RESET键,此时电源vCC经电阻R1、R2分压,在RESET端产生一个复位高电平。这对系统的可控性是很有帮助的。⑶方案比较前面已经介绍了复位电路的两种形式,其实对系统而言并没有什么大的区别,但考虑到系统调试时的方便,本系统采用了按键复位方式。当调试不成功时,经过调整后,只需单片机复位即可进行下一次的调试。这也降低了其他硬件由于电源供电问题,而导致的调试不成功。所以,最终选定按键复位电路为单片机部分的复位电路。3.1.3传感器输出信号处理电路的设计在进行设计之前,我们必须弄清楚所选用的传感器的工作原理和输出信号的特点。这样,才能知道如何让MCS-51单片机处理所收到的信息数据,才能有的放矢的将传感器输出的信号转换成下一部分的处理电路所能接收的数据信息。3.1.3.1LWGY型涡轮流量传感器的信号处理电路⑴设计原理LWGY型涡轮流量传感器(以下简称传感器)与显示仪表配套组成涡轮流量计。可测量液体的瞬时流量和累计体积总量,也可以对液体实现定量控制。传感器具有精度高、寿命长、操作维护简单等特点,广泛用于工厂、油田、化工、冶金、造纸等行业,是流量计量和节能的理想仪表。LWGY型涡轮流量传感器的工作原理为,被测液体流经传感器时,传感器内叶轮借助于液体的动能而旋转。此时叶轮叶片使检出装置中的磁路磁阻发生周期性变化,因而在检出线圈两端就感应出与流量成正比的电脉冲信号,经前置放大器放大后送至显示仪表。在测量范围内,传感器的流量脉冲频率与体积流量成正比,这个比值即为仪表系 第68页共49页数,用K表示,K=f/Q或K=N/V式中:f——流量信号频率(Hz)Q——体积流量(m3/h或L/h)N——脉冲数V——体积总量(m3或L)每台传感器的仪表系数由制造厂填写在检定证书中。K值设入配套的显示仪表中,便可显示出瞬时流量和体积总量。技术指标:◆介质温度:-20~+120℃;-20~+200℃(定做);◆环境温度:-20~+50℃;◆传输距离:传感器至显示仪表的距离可达500m;◆防爆等级:dⅡCT4。⑵具体电路设计的分析和比较系统选用的LWGY涡轮流量传感器,输出信号为频率型的电流信号,这部分电路是用来处理传感器LWGY所输出的信号数据的。但是,A/D0809在转换时,所能接收的输入信号为幅值型的电压信号,所以在把传感器的信号拿去处理之前,必须将它转换成A/D转换器所要求的信号类型。系统设计时,在这一部分加入了一个频率-电压变换电路。①方案一此方案的电路原理图如下图所示。LWGY传感器输出信号处理方案一电路图 第68页共49页这种处理方案的原理就是,将传感器原有输出的电流频率信号转换成电压频率信号。但此时的电压幅值还很小,不容易被感知。所以,要通过一个运算放大器来将电压幅值变大到足以做驱动信号。电路的输出端直接于单片机的外部中断输入脚INT1。电路的输出信号就可以申请到中断,中断服务程序就可以来完成对中断次数的累加。每过一定的时间来读取次数累加结果,并将累加器清零,就可以换算出信号的频率大小了。②方案二此方案的电路原理图如下图所示。LWGY传感器输出信号处理方案二电路图此处理方案是根据LWGY传感器的输出信号的特点而设计的。LWGY传感器的输出信号的电平很低,因此其信号本身不能足以驱动MCS-51单片机工作。因此,我们只需要将电平转换为TTL电平,就可以用MCS-51单片机来数脉冲的方式,计算出脉冲信号的频率,从而得到数显表所需要的耗气量显示数据。但是,为了得到更好的效果和可靠性,我还将电平转换后的脉冲进行整形,然后再传输给单片机。但是,本处理方案中用了三个整形电路来整形是因为,74HC14中集成了6个整形单元,此电路和AK-4传感器的处理电路中各用了三个。这样不仅可以保证得到好的效果,还充分利用了硬件资源。③方案比较通过以上两种方案的比较,可以很明显看到,方案二的设计更好一些。因为它是充分利用了所要处理的信号的特性,简单方便的得到了我们所需要的信号。这不仅可以节省硬件资源,还使运行的可靠性有所提高。因此,我选用方案二来作为系统的最终解决方案。3.1.3.2AK-4气压传感器的信号处理电路⑴设计原理 第68页共49页AK-4型压力传感器主要用途:它适用于各种动静态,气、液体介质的压力测量、控制AK-4型压力传感器特点:★具有零点、灵敏度调整功能,标准电压、电流信号输出★精度高,性能稳定可靠,结构紧凑、安装使用方便★根据用户要求可提供各种螺纹接口★AK-4a:普通型铝外壳AK-4b:不锈钢外壳AK-4c:密封型,全O圈密封,隔潮;全不锈钢结构,防腐AK-4F:数显压力变送器,31/2数码显示,直接显示压力数值,并具有变送功能AK-4型压力传感器的主要技术指标:技术指标技术参数单位量程0-0.1,0.2,0.5,1,2,5,10,15,20,25,30,40,50,60,100MPa输出信号0-5,1-5V4-20,0-10mA精度0.20.30.5%FS非线性0.20.30.5%FS迟滞0.20.30.5%FS重复性0.20.30.5%FS供桥电压±6,12,24VDC绝缘电阻≥100MΩ工作温度-10至+50℃零点偏移0.20.30.5%FS/4h热零点偏移0.20.30.5%FS/10℃热灵敏度偏移0.20.30.5%FS/10℃允许过负荷120%FS 第68页共49页接线方式插座:1、电源(+);2、输出(+)3、输出(-);4电源(-)。导线连接方式见合格证书⑵具体电路的设计这个部分为一个电流-电压变换器是两个方案中相同的部分。与前一个信号处理电路相同的道理,AK-4气压传感器的输出信号为幅值型的电流信号,也不是A/D转换器所需要的形式。因此,在A/D转换之前,也要把传感器的信号进行一下处理。①方案一的设计方案一的具体设计为一个精确度很高的电流-电压转换器,如下图所示:电流-电压变换器上图所示的电流-电压变换器,采用高输入阻抗的运放,对于微电流有较高的灵敏度,它只需10mA电流就能得到5V电压输出。图中,输入极CH3130本身输入阻抗极高,加上因同相输入端和反相输入端均处于零电位,进一步见效了漏电流。如果对输入端接线工艺处理得好,其漏电流可以小于1pA。第二极CH3134接成100倍反相放大器。根据输入电流的极性,一方面产生反相的电压输出,一方面提供负反馈,保证有稳定的变换系数。本毕业设计所选用的AK-4气压传感器的输出信号为4~20mA的电流幅值信号。因此,为了满足ADC0809的输入信号要求,只需将信号转换成电压信号后,再放大250倍左右即可。所以,得出的各个元件的参数如上图所示。②案二的具体设计 第68页共49页方案二的设计方案如下图所示:方案二电路原理图根据AK-4气压传感器的输出信号为0~10mA的电流,那么,将它的输出端并接在一个500欧姆的电阻上,就可以得到0~5V的电压信号了。由于AK-4气压传感器的输出线性很好,所以这样得到的电压信号完全可以很好的传递传感器得到的信息。这个电压信号经过采样电压跟随器,被传送到一个RC滤波网络,最后得到一个稳定可靠的数据信号。它的输出要传送到ADC0809做A/D转换,来换算成要显示的气压信息。3.1.3.3冲击频率信号测量电路设计对冲击频率数据测量电路的设计如下图所示:冲击频率测量电路原理图 第68页共49页在这两个方案中,这部分是几乎一样的。稍有区别的地方就是,在方案一中,电流-电压转换器已经将信号进行了放大处理,因此直接去与比较器连接来得到气压的脉动信号;在方案二中则是从并有传感器信号的电阻上进行电压采样,然后才去跟比较器比较,来得到气压的脉动信号。但是,方案二最后传送到单片机之前,又做了整形,使得信号有更好的有效性。综合以上的设计分析和比较,整体上来说,方案二要较方案一更加系统化,有很好的连贯性,而且硬件的效率比较高,分配比较合理。因此,我选择了方案二的设计方案作为最终的解决方案。3.1.4A/D转换电路的设计从传感器输出的信号为模拟信号,MCS-51单片机并不能处理,所以,在传送给MCS-51单片机处理之前,必须将它转换成数字信号。本毕业设计作品选用了常用的ADC0809来完成这部分的功能。3.1.4.1设计原理⑴转换器件的引脚及功能ADC0809是一种逐次逼近式8路模拟输入、8位数字量输出的A/D转换器。其引脚如下图所示。由引脚图可见,ADC0809共有28个引脚,采用双列直插式封装。其主要引脚功能如下:①IN0~IN7是8路模拟信号输入端。②D0~D7是8位数字量输出端。③A、B、C与ALE控制8路模拟通道的切换,A、B、C分别与三根地址线或数据线相连,三者编码对应8个通道地址口。C、B、A=000~111分别对应IN0~IN7通道地址。ADC0809的引脚图 第68页共49页强调说明一点:ADC0809虽然有8路模拟通道可以同时输入8路模拟信号,但每个瞬间只能转换一路,各路之间的切换由软件变换通道地址实现。④OE、START、CLK为控制信号端,OE为输出允许端,START为启动信号输入端,CLK为时钟信号输入端。⑤Vr(+)和Vr(-)为参考电压输入端。⑵ADC0809结构及转换原理ADC0809的结构框图如下图所示。ADC0809是采用逐次逼近的方法完成A/D转换的。由单一的+5V电源供电;片内带有锁存功能的8路选1的模拟开关,由C、B、A的编码来决定所选的通道。ADC0809完成一次转换需100μs左右。输出具有TTL三态锁存缓冲器,可直接连到MCS-51的数据总线上。通过适当的外接电路,ADC0809可对0~5V的模拟信号进行转换。ADC0809工作过程如下:首先用指令选择ADC0809的一个模拟输入通道,当执行MOVX@DPTR,A时,产生一个启动信号给START引脚送入脉冲,开始对选中通道转换。当转换结束后发出结束信号,置EOC脚为高电平,则可以读出转换的数字量。利用MOVXA,@DPTR把该通道转换结果读到A累加器中。ADC0809的结构图⑶MCS一5l的中断系统 第68页共49页中断系统在计算机中起相当重要作用,一个中断功能很强的计算机,特大大提高处理外界事件的能力。MCS一51单片机的中断系统有五个中断源,具有两个中断优先级,可实现两级中断嵌套。用户可以用关中断指令屏蔽所有的中断请求,也可用开中断指令使CPU接收中断申请,用户也可以对每一中断源用软件开关和设置其级别。下图给出MCS一51的中断系统。8051单片机有五个中断源,其中两个外中断源,由INT0和INT1引脚输入,三个内部中断源,分别由定时器To溢出、定时器Tl溢出和串行口发送/接收请求提供。⑴外中断源由INT0和INT1输入的两个外中断及其触发方式钦存在特殊功能寄存器TCON的低四位,其格式:TF1TF0IE1IT1IE0IT0TCON(88H)IE1(TCON.3):外部中断INT1(P3.3)申请标志位。当cPu检测到INT1引脚上出现中断申请信号,由硬件置IEl=1,申请中断。cPU响应中断进入中断服务程序后,IEl被硬件自动清o(指脉冲边沿触发方式,电乎申请方式IEl不能由硬件清0)。ITl(TCON.2):外中断INT1触发方式控制位,由软件置I或清0。ITl=0时,外中断为电乎触发方式.面五输入低电乎,置位IEl,申请中断。采用电平触发方式,外中断源输入到顶否必须保持低电平,直到该中断被cPu响应.而且在执行完中断服务程序前,此有效中断源必须撤消,否则产生下一次中断。当ITl=1时,外中断1为边沿触发方式、CPU每个机器周期采样中断源,当相继的两次采洋,一次为高电平,一次为低电平,则置IEl=l,表示外中断1向CPU申请中断。当该中断被cCPU响应后,IEl由硬件清0。这种边沿触发方式,要求外中断源输入的高和低电平时间必须保持一个机器周期以上。IE0(TCON.1):外中断0(INT0)请求标志。IE0=1,外部中断0向CPU申请中断.当CPU响应中断时,由硬件使IE0复位(指边沿触发方式)。H0(TCON.0):外中断0(INT0 第68页共49页)触发方式控制位,IT0=0,外中断0为电平触发方式:IT0=1,外中断0为边沿触发方式。⑵内中断源TF0(TCON.5):定时器T0溢出产断标志垃。当To允许计数后v从初值开始加1计数,溢出后置TFo=1.向CPU申请中断、直到响应中断后由硬件使TFo=0。T门(TCON.7):定时器T1的溢出中断标志,其功能同TFo。RI(SCON.o)和TI(SCON.1):串口中断申请标志。串口的接收中断RI和发送中断TI“逻辑”或以后为内部一个中断源。串口申请帧,CPU响应中断后,无硬件清户断功能,T1和RI必须由软件清0(中断服务程序中必须有清TI和RI指令)。⑷MCS-51与ADC0809的接口在讨论MCS-51与ADC0809的接口设计之前,先来讨论单片机如何来控制ADC的问题。用单片机控制ADC的时候,多数采用查询和中断控制两种方法。查询法是在单片机把启动命令送到ADC之后,执行别的程序,同时对ADC的状态进行查询,以检查ADC变换是否已经结束,如查询到变换已结束,则读入转换完毕的数据。中断控制法是在启动信号送到ADC之后,单片机执行别的程序。当ADC变换结束并向单片机发出中断请求信号时,单片机相应此中断请求,进入中断服务程序,读入转换数据,并进行必要的数据处理,然后返回到原程序。这种方法单片机无需进行转换时间的管理,CPU效率高,所以特别适合于转换时间较长的ADC。如果对转换速度要求高,采用上述两种ADC控制方法往往不能满足要求,可采用DMA(直接存储器存取)的方法,这时,可在ADC与单片机之间插入一个DMA接口(例如Intel公司的8237DMA控制器)。传输一开始,AD转换的数据就可以从输出寄存器经过DMA中的数据寄存器直接传输到主存储器,因而不必受程序的限制。⑴软件延时方式ADC0809与8031单片机的接口如下图所示。延时方式接口图由于ADC0809片内无时钟,可利用8031单片机提供的地址锁存允许信号 第68页共49页ALE经D触发器二分频后获得,ALE脚的频率时单片机时钟频率的1/6(但要注意的是,每当访问外部数据存储器时,将少一个ALE脉冲)。如果单片机时钟频率采用6MHz,则ALE脚的输出频率为1MHz,再二分频后为500kHz,恰好符合ADC0809对时钟频率的要求。由于ADC0809具有三态锁存器,其8位数据输出引脚可直接与数据总线相连。地址译码脚A、B、C分别与地址总线的低三位A0、A1、A2相连,以宣统IN0~IN7中的一个通路。将P2.7(地址总线A15)作为片选信号,在启动A/D转换时,由单片机的写入信号和P2.7控制ADC的地址锁存和转换启动,由于ALE和START连在一起,因此ADC0809在锁存通道地址的同时,启动并进行转换。在读取转换结构时,用低电平的读信号和P2.7脚经一级或非门后,产生的正脉冲作为OE信号,用以打开三态输出锁存器。⑵中断方式ADC0809与8031的中断方式接口电路只需要将上图中的ADC0809的EOC脚经过一个非门连接到8031的INT1脚即可。采用中断方式可大大节省CPU的世军安,当转换结束时,EOC发出一个脉冲向单片机提出中断请求,单片机响应中断请求,由外部中断1的中断服务程序读A/D结果,并启动ADC0809的下一个转换,外部中断1采用跳沿触发方式。⑶查询方式ADC0809有表明转换完成的状态信号的Eoc端。因此,可以用查询方式,软件测试Eoc的状态,即可确知转换是否完成,然后进行数据传送。3.1.4.2具体方案设计和比较电路连接主要涉及两个问题,一是8路模拟信号通道选择,二是A/D转换完成后转换数据的传送。⑴8路模拟通道选择A、D、C分别接地址钡存器提供的低三位地址,只要把三位地址写入佃09中的地址锁存器,就实现了模拟通道选择。对系统来说,地址锁存器是一个输出口,为了把三位地址写入,还要提供口地址。本系统使用的是线选法,口地址由P2.7确定,同时和WR相或取反后作为开始转换的选通信号。因此,若无关位都取O,则该ADC0809的8路通道IN0—IN7通道地址分别为0000H一0007H。从前面的图中可以看到,把ADC0809的ALE信号与START信号连接在一起了,这样使得在ALE信号的前沿写入地址信号,紧接着在其后沿就启动转换。因此,启动ADC0809进行转换只需要下面的指令(以通道0为例):MOVDPTR,#6000H;选中通道0 第68页共49页MOV@DPTR,A;WR信号有效,启动转换⑵转换后数据的传送①方案一此方案主要采用的是软件延时的方法来确定转换过程的完成与否。因为A/D转换一次所需要的时间是一定的,所以只需要通过软件延时足够的时间就可以确定转换已经完成。此时就可以直接去读取转换的结果了。由以上分析可知:在编写软件时,应令P2.7=A15=0;A0、A1、A2给出被选择的模拟通道的地址;执行一条输出指令,启动A/D转换;执行一条输入指令,读取转换结果。译码的程序时采用软件延时的方法,分别对8路模拟信号轮流采样一次,并依次把结果转储到数据存储区的转换程序。MAIN:MOVR1,#data;置数据区首地址MOVDPTR,#7FF8H;P2.7=0,且指向通道0MOVR7,#08H;置通道数LOOP:MOV@DPTR,A;启动A/D转换MOVR6,#0AH;软件延时,等待转换结束DLAY:NOPNOPNOPDJNZR6,DLAYMOVXA,@DPTR;读取转换结果MOV@R1,A;转存到内PRAM中INCDPTR;指向下一个通道INCR1;修改数据区指针DJNZR7,LOOP;8个通道全采样完了吗?……②方案二此方案采用的是中断的方法来完成对转换完成与否的判别的。当A/D转换完成的时候,ADC0809会有一个完成信号从EOC脚发出。那么,我们就可以运用这个信号来申请到单片机的中断,通过中断服务程序来完成对转换结果的读取。这种方法的实现程序如下:INT1:SETBIT1;外部中断1初始化编程SETBEASETBEX1 第68页共49页MOVDPTR,#7FF8H;启动ADC0809对IN0通道转换MOVA,#00HMOVX@DPTR,A……中断服务程序:PINT1:MOVDPTR,#7FF8H;读取A/D结果送缓冲单元30HMOVXA,@DPTRMOV0H,AMOVA,#00H;启动ADC0809对IN0的转换MOVX@DPTR,ARETI①方案比较和确定考虑到才本系统中单片机不只是控制A/D转换和对转换结果的读取,还有很多工作要做。那么,方案一这种软件延时的方案就太浪费单片机的资源了。于之相比,方案二的中断方式更加适合本系统,因为在启动A/D转换之后,单片机可以转去处理其他的事情,而当A/D转换完成后,又可以第一时间将转换结果读出来。很明显,方案二的中断方式读取转换结果更适合本系统。它也是本设计作品最终选定的方案。3.1.5LED数码管显示电路的设计这部分电路所要完成的功能主要有片选中一个LED数码管,传送所要显示的数据和对数据的锁存。为了能让单片机去同时处理其他的事情,单片机不能一直扫描所以数码管,来实现LED数码管数据一直显示的满意效果。所以必须引入数据锁存功能,来实现LED数码管一直有显示数据。当有新的数据要显示的时候,直需要单片机重新对每个LED数码管重新输出一次数据即可。其中,有一个问题,就是当数据还没有全部传送给LED数码管,新的数据就已经准备好了。此时,如果数据处理不好,就会新旧数据混合显示出来。而造成数据输出并不是我们想要的结果。这个问题,可以从软件方面来解决。就是当有新的数据完成的时候,无论已经传输了几个LED数码管的数据,都从第一个数据从新传输,就可以很好的避免这个问题的发生了。3.1.5.1设计原理从LED显示器的显示原理可知,为了显示字母数字,必须最终转换成响应段选码。这种转换可通过硬件译码器或软件进行译码。下面介绍用译码器或软件译码的一些接口电路。 第68页共49页⑴软件译码显示器接口BCD――七段16进制译码驱动显示接口。单片机应用系统,通常要求LED显示器能显示16进制及十进制带小数点的数。因此,在选择译码器时,要能够完成BCD码至16进制的锁存、译码,并具有驱动功能,否则就不如用软件译码接口。MOTOROLA公司生产的CMOSBCD-七段16进制锁存、译码驱动芯片。该电路的特点时可用字母ABCDEF来显示二进制数10、11、12、13、14、15,同时还有译码器输入大于等于10时的指示端(h+I)。当输入数据>=10时,(h+I)端输出“1”电平。另外还有输入数据时,电路输入端VCR为0电平(其他输入状态时为高阻)的功能。电路内部还有一个290Ω的限流电阻。而为选通端,电路中的锁存器在LE为0时输入数据,在LE=1时锁存数据。下表为4511的真值表。从表中可以看出,当显示数据大于等于10时,(h+I)端输出1电平。4511真值表及显示内容表输入输出显示DCBAabcdefgh+I数值0000111111000000101100100100101101101020011111100103010001100110401011011011050110101111106011111100000710001111111081001111101109101011101111A101100111111B110010011101C110101111011D111010011111E111110001110F 第68页共49页如附图2所示的LED显示部分是使用4511的多位静态LED显示接口电路,该电路中可直接显示多位16进制数。若要显示带小数点的十进制数,则只要在LED的dp端另加驱动控制即可。LED显示块采用共阴极。在4511内部有输出限流电阻,故LED不需要外加限流电阻。该接口软件十分简单。当给P1.7高电平时开显示,由P1.4、P1.5、P1.6控制而一次选中一位LED然后由P1.0~P1.3送入BCD码,在LE转高电平时锁存该位数据并译码、驱动显示。显示方法如下:程序功能:将以R0为首地址的连续8个BCD码在LED上显示。入口参数:R0:存储显示字节的首地址,为MCS-51片上存储器。出口参数:空。变量说明:CONBIT是P1扣P1.4~P1.5的数据,是控制位显示位变量,片上存储器。程序如下:STADISP:CLRP1.7;使74LS138无效MOVA,#00H;先赋值MOVCONBIT,#00H;控制位初值MOVR7,#08H;循环次数控制器DISPLAY:MOVA,@R0;将数据赋给AADDA,CONBIT;加上控制位数据MOVP1,A;将数据输出在P1口上ADDA,#10H;ANLA,#7FH;保持P1.7有效MOVP1,A;将数据锁存入MC14495数据置于总线上,需要将选中电平变高INCR0MOVA,CONBITADDA,#10HMOVCONBIT,A;控制字节指向下一个显示单元DJNZR7,DISPLAY;巡回8次,直至完成⑵硬件锁存接口可采用74LS273,上升沿八D锁存器,可以用来进行静态驱动,如系统连接原理图所示,此时,74LS273直接输出段选码来驱动LED。 第68页共49页74LS273引脚图⑶译码器74LS138译码器74LS138的引脚图如下图所示:74LS138的引脚图由图可知,该译码器有3个输入端A、B、C,它们共有8种状态的组合,即可译出8个输出信号Y0~Y7,故该译码器称为3线-8线译码器。该译码器的主要特点是,设置了E1、E2和E3,3个使能输入端。由功能表可知,对于正逻辑,当E3为1,且E2和E1均为0时,译码器处于工作状态。3.1.5.2具体方案的设计和比较 第68页共49页⑴方案一此方案的电路原理图见方案一的附图1。在此方案中,采用的是数据锁存器74LS273来静态驱动。单片机的P1口用来输出LED数码管所要显示的信息数据,用P2口的低四位来做LED数码管的线选信号。其中,对LED数码管的线选信号的产生是通过3线-8线译码器74LS138和P2.5来实现的。另外一条线使用来对74LS138提供使能信号的信号线。按照顺序,先选定要显示的数码管,然后输出要显示的数据。锁存器自动锁存住显示数据,LED数码管就可以完成满意的显示效果。这种方法实现起来比较简单,但带来的问题就是软件上的问题,单片机提供显示信息的数据之前要做很多数据处理,代码转换之类的工作。⑵方案二此方案的电路原理图见方案二的附图2。在这个方案中,采用的是前文所介绍的功能强大的数据译码、锁存芯片MC14495。它可以将BCD码转换成LED数码管所能识别的驱动码。单片机只是需要将A/D转换结果的数据换算成BCD码的数据,这对单片机来讲是相比之下减少了一部分的工作量。而这也正是我们所要选择设计方案的原则之一。在数据传送和LED数码管选定方面,此方案只需要一个P1口就可以实现了,因为MC14495所需要的数据信息只要4位BCD码即可。因此,P1口的剩下的部分又可以用来做LED数码管选定的信号输出。同理方案一选用3线-8线译码器的话,需要的片选信号又恰好只需要4位信号就可以实现了,至于最后一个数码管,则需要用P2.5来提供片选,同时,传送数据的时候要关闭3线-8线译码器的使能端。将以上的分析结合起来,P1口的低四位用来传输显示信息数据,高四位用来提供LED数码管的选定信息,再加上P2.5口就可以很好的实现出我们想要的比较满意的效果出来了。⑶方案比较从以上的分析,可以很明显的看出,方案二的方法既可以减少单片机的工作量,有比方案一的方法节省单片机的I/O资源。无论从那个方面看,方案二的方法都是更加适合本系统的设计的。因此,方案二被选定为本毕业设计作品的解决方案。3.1.6与PC串口通讯的接口电路的设计根据设计任务,系统要与PC进行串行通讯。系统所用的MCS-51单片机和PC本来就已经具备了完成串行通讯的基本功能,所以,在设计的时候,只需要注意一些信号处理的细节,再按照RS232的协议规定和规定的波特率来设计,这部分功能就能很可靠的实现了。下面就详细说明我的具体设计过程。3.1.6.1设计原理⑴串行接口 第68页共49页8051单片机除具有四个8位并行口外,还具有串行接口。8051的串行口是全双工串行通信接口、能同时进行串行发送和接收,可作UATR(通用异步接收和发送器)用,也可以作同步移位寄存器用。应用串口可实现单片机间点对点的双机通信、多机通信以及8051与系统微机(如IBM—PC机)之间的通信,其帧格式可有8位、10值和21位,能设置各种波持率。8051通过引脚RxD(P3.0)串行数据接收端和引脚TXD(P3.1)串行数据发送端与外界通信。其内部结构如下图所示。图中有两个物理上独立的接收、发送缓冲器SBUF,它们占用同一地址99H,可同时发送、接收数据。8051用定时器T1作为串行通信波特率发生器,T1溢出率经2分频(或不分频),又经16分频作为串行发送或接收的移位脉冲。接收器为双缓冲结构,在前一字节队接收缓冲器读出之前,后一字节就开始接收(输入移位寄存器).但后一字节接收完毕而前一字节CPU未读取时,前一字节丢失。对于发送缓冲器、因为发送时CPU是主动的,不会产生重叠错误.不用双缓冲结构。串行口的发送和接收是以特殊功能寄存器SDUF的名义进行读写纳。发“写”命令时,就向发送缓冲器SDUF装载并开始由TXD引脚向外发送一帧数据.发送完后使中断标志位TI=1。在满足串口接收中断标志垃RI=0,置允许接收位REN=1,就启动接收一帧数据进入移位寄存器,并装载到接收SBUF中.同时RI=1。当发读命令时,将接收缓冲器SBUF信息经内总线送CPU。⑵MCS-51串行通信资源MSC-51串行I/O口、RXD(P3.0)和TXD(P3.1)是全双工的串行口,它可作UATR(通用异步接收和发送器),也可作为同步移位寄存器。应用串行口可实现MCs-51机之间点对点的单机间通信、多机通信.以及与系统机(如IBM—Pc)间的单机或多机通信。为此功能服务的MCS-51串行通信资源包括:①异步串行发送器和接收器,有两个物理上独立的发送数据缓冲器sBuF(只能写入)和接收效据缓冲器(只能读出),公用口地址为99H。②两个特殊功能寄存器SCON和风PCON用来控制串行口工作方式和波特率.SCON为串行口控制寄存器,口地址98H,可位寻址,有四种工作方式。其中方式o为移位寄存器方式,波特串为fosc/12,主要用于I/O扩展。方式1为8位UART,波特率可变为T1溢出率/N。方式2为9位UART,波持率为fosc/64或fosc/32。方式3为9位UART,波特率为T1溢出率/N。一般方式1用于点对点通信,方式2,3用于多级通信。特殊功能寄存器PCON,口地址97H,其最高位别SMOD是串行口波持率控制位.当SMOD=1,波特率加倍.①波特率发生器,可用定时器T1或T2构成。⑶RS232通讯协议基本结构★波特率4800bit/s,8bit,1位停止,无校验位 第68页共49页 格式 0EBH,地址,命令,长度(n),数据1,---数据n,冗余★说明: 0EBH为帧起始位 长度小于输出端口数 冗余=地址+命令+长度+数1+---+数n 如果冗余=0EBH,为防止与帧起始位相同,则发送反码,即冗余=14H★当接收正确时, 1)在命令1,2,5,6时,回送0EBH,地址,命令,01H,0FAH,冗余,    并执行命令。 2)在命令3,4,7时,回送相应信息。★当接收不正确时, 1)地址正确,冗余不正确,回送0EBH,地址,命令,01H,0F5H,冗余。 2)地址不正确,不回送任何信息。★命令 命令1:作用:切换输出1,---n(n<=输出端口数)的通道到数据1---数据n所示输入通道。格式:0EBH,地址,01H,长度,数据1---数据N,冗余 命令2:作用:将指定的输出接到指定的输入,其中数据1和数据2为一对输出和输入,数据3和数据4为一对输出和输入,----,最多有n对。格式:0EBH,地址,02H,长度2n,数据1,---数据2n,冗余。 命令3:作用:要求回送输入信道有无信号输入及有无键按下。格式:0EBH,地址,03H,01H,XX,冗余(XX为EBH以外的任何值,如OOH)。 命令4:作用:要求回送当前切换器状态,回送之后将有无键标志清0。格式:0EBH,地址,04H,01H,XX,冗余。 命令5:作用:改变输入预选器状态格式:0EBH,地址,05H,长度,输入预选器值,冗余。 命令6:作用::改变输出通道,为预选器对应的输入。 第68页共49页格式:0EBH,地址,06H,01H,输出通道,冗余。 命令7:作用:回送所有输出信道状态及输出信号有无的状态信息。格式:0EBH,地址,07H,01H,XX,冗余(XX为EBH以外的任何,如00H) 命令8:作用:关断音视频。格式:0EBH,地址,08H,长度n,数1---数n,冗余。 命令9:作用:修改循环方式。格式:EBH,地址,09H,04H,起/停,时间,1-4通道循环开关,5-8通道   循环开关,冗余。 命令0:作用:查询设备地址和软件版本号。(注:使用此命令时,地址栏和命令栏   必须同时为00H)格式:EBH,00H,00H,01H,01H,冗余。 命令F:作用:改变输出黑场时间。格式:EBH,地址,0FH,01H,黑场时间,冗余。3.1.6.2具体方案设计在Pc机系统内部装有异步通信适配器,利用它可以实现异步串行通信。该适配器的核心元件是可编程的Intel8250芯片,它使PC机有能力与其它具有标准的Rs—232C接口的计算机或设备进行通信。而Mcs—51串片机本身具有一个全双工的串行口,因此只要配以电平转换的驱动电路、隔离电路就可组成一个简单可行的通信接口。Pc机和单片机最简单的连接是零调制三线经济型。这是进行全双工通信所必须的最少线路。因为MCs—51单片机输入、输出电平为TTL电平,而PC机配置的是RS—232c标准接口,二者的电气规范不同,所以要加电平转换电路,常用的有MCl488、MCl489和MAX232,下图给出了采用MAX232芯片的PC机和单片机串行通信接口电路,与PC机相连采用9芯标准插座。 第68页共49页从以上的分析来看,与PC串口通讯的接口电路部分方案的选择,无非就是电平转换芯片的选用。而以上两类芯片对实现功能方面都没有什么问题,都是完全可以胜任的。那么,我从电路组成的复杂程度来看,MAX232的接法明显比另外一种简明很多。这在系统的调试的适合,会有很大的帮助,不仅出现错误的机会便小,在排查错误的适合也是很方便的。因此,本毕业设计作品选用了MAX232来实现这部分的功能。3.1.7供电电源部分根据任务要求,系统采用~220V供电,而系统各部分功能电路都是要求直流供电的,那么,系统就需要将其转换成直流来提供电源。我们可以选择变压器和直流稳压电源,但是,采用直流稳压电源的话,要比采用变压器高出很多,而且,两种方法都可以很好的实现任务要求的功能。在能实现任务要求功能的前提下,考虑到系统的实际成本,本毕业设计作品采用交直流变压器来给系统提供电源。其原理框图如下图所示。从以上具体设计方案的电路原理图可以看到,大部分的功能芯片的工作电压都是+5V。但是,还要少数运放是需要+5V和-5V同时供电,才能正常工作的,所以要求系统选用的电源能满足这个要求,也就是可以三端输出,一段正电压输出,一端负电压输出,一端电源地输出。供电原理框图 第68页共49页除此之外,系统所选用的传感器所需要的工作电源跟其他部件的要求是不相同的。LWGY涡轮流量传感器的工作电压为+15V/-15V,而AK-4气压传感器的工作电压为+12V/-12V。因此要特别考虑它们的需求。通过以上的分析,我们可以明显看到,LWGY涡轮流量传感器的工作电压为大部分功能芯片的三倍,因此,我们只需要用一个分压电阻网络就可以很方便的得到大部分功能芯片所需要的±5V电压。综上所述,本系统需要一个~220V变直流的变压器提供电源。它必须可以同时输出正负电压和电源地,也要同时输出两路电压提供电源,一路为±15V,一路为±12V。要实现这个功能,只需要用两个变压器反接,则可以得到正负电压,从变压器的适当地方抽出两个输出线头就可以实现15V和12V的输出。3.2.系统软件部分的设计系统的软件部分主要由单片机的控制程序和PC里的配套程序来组成的。下面就从这两方面来进行介绍3.2.1单片机需要的控制程序的设计单片机的控制程序要完成对A/D转换的控制及转换结果的读取,然后对转换结果进行转换,换算成我们所需要的数据形式,其中包括LED数码管显示信息数据的提供和PC串口通讯要提供的数据。当这些数据都准备完毕以后,就要向LED数码管传输过去,同时要做好LED数码管的选定工作;这些数据还要通过与PC串口通讯的接口传送给PC,以供PC进行数据显示。当这些任务完成的时候,会有新的数据从A/D转换部分传送过来,单片机就要重复以上的工作,来实现数据信息的不停变化的显示。在这一些过程进行的开始,单片机就要启动内置的定时器,设定为大约三分钟。当这三分钟计时完毕的时候,整个系统将停止所有工作,此时也就是所有的工作已经完成的时候。根据以上的分析,和对各个工作的协调之后,设计得出的程序框图如下图所示。主程序部分:开始定时及中断初始化A/D转换初始化 第68页共49页启动A/D转换等待转换完成从数据缓冲区读取显示信息将数据转换成真实信息数据将真实数据显示在LED上是否已经转换并显示完?NY屏蔽中断串行通讯初始化发送联系信号PC是否准备好了?N 第68页共49页Y发送显示数据检验数据是否正确?N继续循环做下一轮处理A/D转换结束中断服务程序部分:读取A/D转换结果数据初步处理将数据保存到数据存储区启动下一次转换中断返回 第68页共49页计时器中断服务程序部分:计时器时间到开始中断服务程序是否到已满计时1s的循环次数?NY计算出要显示的时间数据将数据转换成驱动信号,传送给LED来显示时间读取脉冲计数,保存后清零计时是否已经满3分钟?N中断返回Y结束根据这个程序框图,本设计作品设计出的完整程序如下列程序清单所示。ORG0000HAJMPMAINORG00013HAJMPINT1ORG000BH 第68页共49页AJMPINT2MAIN:MOVTMOD,#01H;初始化MOVTH0,3CHMOVTL0,#0B0HSETBTR0SETBEASETBET0SETBEX1MOVR1,#20MOVR3,#180ADCZ:MOVDPTR,#0BFF8H;指向A/DIN0MOVR0,#30H;存数据区首址SETBIT1;选脉冲触发方式MOVX@DPTR,A;启动A/D转换LED:MOVR1,30H;转换数据,驱动LED数码管显示MOVR3,89HMOVR4,03HL0:MOVA,@R1MOVB,#10HDIVABSUBBB,#9JCL1ADDB,#17INCAL1:ADDA,R3INCR3ADDB,R3INCR3MOVP1,AMOVP1,BINCR1DJNZR4,L0 第68页共49页AJMPLEDACALASTART;串口发送数据到PCAJMPLEDASTART:CLREAMOVTMOD,#20H;设T1为定时模式2MOVTH1,#0E8H;设定时器初值MOVTL1,#0E8H;SETBTR1;MOVPCON,#10H;设串口方式2MOVSCON,#0FDH;波特率为4800ATT1:MOVSBUF,#0AAH;发送联络信号AWAIT1:JBCT1,ARR1SJMPAWAIT1ARR1:JBCR1,ARR2;等待PC回答SJMPARR1ARR2:MOVA,SBUFXRLA,#0BBJ;判断PC准备好了吗?JNZATT1;PC未好,继续联络ATT2:MOVR0,#30H;建立数据块指针MOVR7,#10H;块长度计数初值MOVR6,#00H;清检查和单元ATT3:MOVSBUF,@R0;发送一个数据字节MOVA,R6ADDA,@R0;求检查和MOVR6,A;保存检查和INCR0AWAIT2:JBCT1,ATT4SJMPAWAIT2ATT4:DJNZR7,ATT3;整个数据发送完了吗?MOVBUF,R6;发送检查和AWAIT3:JBCT2,ARR3SJMPAWAIT3ARR3:JBCR1,ARR4;等待PC回答SJMPARR3 第68页共49页ARR4:MOVA,SBUFJNZATT2;PC回答有错AEND:RET;INT1:MOVXA,@DPTR;通过中断服务程序,读取并处理A/D转换结果MOVB,#4DIVABMOVX@R0,AMOVX@R0,A;存入RAM单元INCR0;数据区地址+1MOVDPTR,#0BFF8HMOVR0,#30HMOVR2,@2HADCZ1:MOVX@DPTR,ARETI;返回INT2:DJNZR1,TIME1;通过中断服务程序来驱动LED数码管时间显示部分MOVA,#181SUBBA,R3MOVB,#100DIVABADDA,#0E0HMOVP1,AMOVA,#10XCHA,BDIVABADDA,#0F0HMOVP1,ACLRP2.5MOVP1,BMOV@R0,R2MOVR2,#00HDJNZR3,TIME1;定时3分钟检测,时间到,则停止 第68页共49页ENDTIME1:RETI3.2.2PC中要用到的配套程序这部分程序主要任务就是接收串口传送过来的数据,并将数据显示到显示器上。同时,还要把接收到的数据保存下来。⑴设计原理:SPCOMM的属性、方法和事件1.属性●CommName:表示COM1、COM2等串口的名字;●BaudRate:根据实际需要设定的波特率,在串口打开后也可更改此值,实际波特率随之更改;●ParityCheck:表示是否需要奇偶校验;●ByteSize:根据实际情况设定的字节长度;●Parity:奇偶校验位;●StopBits:停止位;●SendDataEmpty:这是一个布尔型属性,为true时表示发送缓存为空,或者发送队列里没有信息;为false时表示发送缓存不为空,或者发送队列里有信息。2.方法●Startcomm方法用于打开串口,当打开失败时通常会报错。错误主要有7种:⑴串口已经打开;⑵打开串口错误;⑶文件句柄不是通信句柄;⑷不能够安装通信缓存;⑸不能产生事件;⑹不能产生读进程;⑺不能产生写进程;●StopComm方法用于关闭串口,没有返回值;●WriteCommData(pDataToWrite:PChar;dwSizeofDataToWrite:Word)方法是个带有布尔型返回值的函数,用于将一个字符串发送到写进程,发送成功返回true,发送失败返回false。执行此函数将立即得到返回值,发送操作随后执行。该函数有两个参数,其中pDataToWrite是要发送的字符串,dwSizeofDataToWrite是发送字符串的长度。3.事件●OnReceiveData:procedure(Sender:TObject;Buffer:Pointer;BufferLength:Word)ofobject当有数据输入缓存时将触发该事件,在这里可以对从串口收到的数据进行处理。Buffer中是收到的数据,BufferLength是收到的数据长度。 第68页共49页●OnReceiveError:procedure(Sender:TObject;EventMask:DWORD)当接收数据出现错误时将触发该事件。⑵SPCOMM的使用先要调通它们之间的握手信号。假定它们之间的通信协议是:PC到8051一帧数据6个字节,8051到PC一帧数据也为6个字节。当PC发出(F0,01,FF,FF,01,F0)后8051能收到一帧(F0,01,FF,FF,01,F0),表示数据通信握手成功,两者之间就可以按照协议相互传输数据。创建一个新的工程COMM.DPR,把窗体的NAME属性定为FCOMM,把窗体的标题定义为测试通信,按照下图添加控件1.设定COMM1属性:●波特率:4800;●奇偶校验位:无;●字节长度:8;●停止位:1;●串口:COM1。Memo1中将显示发送和接收的数据。将新的窗体存储为Comm.pas。本设计作品设计出的完整程序如下列程序清单所示。程序源代码://变量说明varfcomm:TFCOMM;viewstring:string;i:integer;rbuf,sbuf:array[16]ofbyte;//打开串口 第68页共49页procedureTFCOMM.FormShow(Sender:TObject);begincomm1.StartComm;end;//关闭串口procedureTFCOMM.FormClose(Sender:TObject;varAction:TCloseAction);begincomm1.StopComm;end;//自定义发送数据过程proceduresenddata;vari:integer;commflg:boolean;beginviewstring:=‘’commflg:=true;fori:=1to6dobeginifnotfcomm.comm1.writecommdata(@sbuf[i],1)thenbegincommflg:=false;break;end;//发送时字节间的延时sleep(2);viewstring:=viewstring+inttohex(sbuf[i],2)+‘’;end;viewstring:=‘发送’+viewstring;fcomm.memo1.lines.add(viewstring);fcomm.memo1.lines.add(‘’);ifnotcommflgthenmessagedlg(‘发送失败!’,mterror,[mbyes],0);end;//发送按钮的点击事件 第68页共49页procedureTFCOMM.Btn_sendClick(Sender:TObject);beginsbuf[1]:=byte($f0);//帧头sbuf[2]:=byte($01);//命令号sbuf[3]:=byte($ff);sbuf[4]:=byte($ff);sbuf[5]:=byte($01);sbuf[6]:=byte($f0);//帧尾senddata;//调用发送函数end;//接收过程procedureTFCOMM.Comm1ReceiveData(Sender:TObject;Buffer:Pointer;BufferLength:Word);vari:integer;beginviewstring:=‘’;move(buffer^,pchar(@rbuf^),bufferlength);fori:=1tobufferlengthdoviewstring:=viewstring+inttohex(rbuf[i],2)+‘’;viewstring:=‘数字显示:’+viewstring;memo1.lines.add(viewstring);memo1.lines.add(‘’);end;3样机调试以上为本毕业设计作品的设计过程和结果的详细介绍,但是,从本质上来讲,都是纯理论的设计和分析。为了验证本毕业设计作品的可行性,我还做了模拟样机,来对本毕业设计作品中设计方案的主要功能及其理论进行实际验证。同时,在模拟样机的调试过程,也可以发现本毕业设计作品中有没有一些不足和错误的地方。为了能检验本毕业设计的可行性,并将其质量推向一个更高的层次,我认真的设计了模拟样机,也进行了仔细的功能调试。下面就对这方面的过程进行介绍。 第68页共49页4.1硬件电路部分通过以上对本毕业设计作品的详细介绍,我们可以很清楚的看到,其实本毕业设计作品所做的系统,最主要的环节就是:A/D转换、MCS-51单片机的处理和数字显示部分。所以,我所做的模拟样机,也就主要完成对这几个环节的实现方案的检验。既然本模拟样机的设计目的,是为了检验系统功能的可行性。那么,模拟样机只需完成对系统功能的检验,而不用实现系统的所有功能。因此,此模拟样机要完成的任务就是:MCS-51单片机控制完成A/D转换,读取到转换结果后,将其转换成数字显示部分需要的信息数据,最后传输到LED数码管,由LED数码管将转换结果显示出来。根据以上的想法,我设计的模拟样机的硬件系统原理框图如下所示:模拟样机硬件电路原理方框图本模拟样机的单片机驱动电路包括:按键复位电路、时钟信号产生电路及单片机电源等等。要模拟设计方案中的功能,这部分电路要跟设计方案中一直。因此,12M的晶振,50μf的电容,按键复位电路都是跟设计方案中的功能电路是完全一样的,详细设计见附图2。可变电压部分是模拟传感器的输出信号经过处理电路处理后的数据信号的,根据前面的设计可以知道,经过处理过的信号为0~5V的电压信号。那么,这部分只需要一个+5V的电压来源和一个电位器组合起来就可以实现了,当调节电位器的适合,从电位器分压得到的电压即为我们所需要的可变电压信号了。A/D转换部分仍然由ADC0809来完成。但是,模拟机只需要模拟这部分的功能原理,因此模拟样机只需要将一路模拟信号转换成数字信号,就可以很好的验证这部分的功能可靠性。因此,在这部分,ADC0809只对一路可变电压做A/D转换。 第68页共49页数字显示部分,也是由设计方案的LED数码管来完成。这部分,只需要验证,通过MCS-51单片机处理过的数据可以如实的显示在LED数码管上,即可很好的验证这部分功能的可行性。因此,这里只采用2个LED数码管来完成这部分的验证,这两个数码管分别显示ADC0809处理结果的两位16进制的数字。如果,可以实现这两位处理结果的显示,那么要显示我们所需要的数据信息,只需要将数据进行处理之后,再显示就可以实现这部分功能了。通过以上对各个部分功能检验的设计方案,MCS-51单片机部分需要完成的任务就是控制ADC0809完成A/D转换,再将转换结果处理之后传输给LED数码管显示。那么,MCS-51的P0口用来做与ADC0809的地址/数据总线,P1口用来传送LED数码管的显示信息,P2口的部分引脚用来做控制总线,即可很好的控制系统完成所以任务了。其中控制总线部分基本和本毕业设计方案的相同,只是在LED数码管的选定上,用两个引脚来做片选控制信息,就可以实现这部分功能了。根据以上分析和设计,设计出的电路原理图如附图3所示。4.2软件部分根据硬件电路的设计,MCS-51单片机的控制程序设计并不难。控制程序首先对各个部分及中断进行初始化,然后启动A/D转换,A/D转换结束信号会自动启动中断服务程序。中断服务程序就去读取转换结果,并将结果保存在数据缓存区。接下来就是从数据缓存区读取数据出来,进行数据和驱动代码之间的转换。最后,将驱动代码传输到数据总线上,控制LED数码管来显示数据信息。由以上设计方式设计出的程序流程图如下图所示:开始系统及中断的初始化启动A/D转换读取转换结果数据处理并转换成驱动代码 第68页共49页传输数据并选定LED读取延迟显示时间以达到满意效果启动下一次转换中断服务程序:中断服务开始读取转换结果保存数据到数据缓冲区中断返回根据上图所示的流程图,设计出来的程序如下所示:程序源代码:ORG0000HAJMPMAINORG0013HAJMPPINT1ORG001BHAJMPCHECK 第68页共49页MAIN:MOVR0,#0SETBP2.4MOVTMOD,#10HMOVTH1,#0FEHMOVTL1,#0CHSETBTR1SETBEASETBET1CLRP2.7SETBP2.7MOVA,#00HMOV80H,ACLRP2.7LOOP:MOVA,30HMOVB,#16DIVABMOVDPTR,#SEGTBLMOVCA,@A+DPTRMOV90H,ACLRP2.1ACALLDIMSSETBP2.1MOVA,BMOVCA,@A+DPTRMOV90H,ACLRP2.0ACALLDIMSSETBP2.0AJMPLOOPPINT1:SETBP2.6MOVA,80HCLRP2.6 第68页共49页MOV30H,ASETBP2.7MOVA,#00HMOV80H,ACLRP2.7RETICHECK:MOVC,0A3HJNCL1CLRP2.4SETBP2.4L1:CLRTF1SETBTR1RETISEGTBL:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,67H,77H,7CH,39H,5EH,79H,71HDIMS:MOVR7,#50DLAY:DJNZR7,DLAYRET4.3调试效果经过对系统的调试,系统完全可以完成模拟样机的设计任务。当系统开始运行候,改变可变电压的大小,数码管上会马上变化显示出电压的幅值。其效果如下图所示: 第68页共49页3结论单片机就它的待点和功能来说,确切名称应是单片微控制器(Single-chipMicrocontroller)。单片机集成度高、体积小、功能强、稳定可靠、使用灵活、价格低廉,这些特点,使得它适于直接面对对象。因此,单片机在工业过程控制、智能化仪表的研制、机电一体化产品开发、计算机网络通信、乃至家用电器的智能化等许多工程技术领域得到了广泛地应用。本毕业设计作品,就是单片机在智能化仪表方面的具体应用,充分体现了单片机的优越之处。本毕业设计论文,从硬件设计到软件设计,根据硬件的工作原理及设计原理,对本毕业设计的设计方案做了仔细的分析和比较,最后确定下来完整可行的解决方案。为了验证设计出的系统的功能可靠性和方案的可行性,本人还制作了模拟样机。模拟样机是为了验证方案原理而设计的,在调试过程中,也得到了令人满意的效果,很好的验证了设计方案的可行性。这一个学期来,尽管本人尽了最大努力去完成本毕业设计任务的研究,但是所做的工作仍有许多不足,还要许多内容需要完善,恳请各位老师对不足或疏漏之处给予指出。 第68页共49页谢辞本论文是在我的导师郝卫东老师的亲切关怀和悉心指导下完成的。在整个毕业设计任务和论文的完成过程中,郝老师都付出了很多的心血,从论文的选题、开题到方案设计及最后的论文撰写、修改都离不开郝老师的精心指导。郝老师在百忙之中仍抽出宝贵的时间和我研究、讨论论文和设计中所遇到的难点,直到我寻找解决问题的途径,他渊博的知识、严谨的治学态度以及对国内学术动态敏锐的洞察力,使我受益匪浅,终生难忘。在此,我要真诚地感谢郝卫东老师。在这一个学期的学习和生活中,得到了许多同学的帮助,在此我要感谢000121班的全体同学们,是他们给我提供了一个良好的学习和研究环境,在和他们的讨论和交流过程中,使我增长了不少知识,积累了不少经验。而除了以上提到的之外,当然还要很多的人曾经帮助过我。他们在各自的岗位上默默地作出了贡献,为我和像我一样的许多人服务。所以在这里,我要向所有关心和帮助过我的人表示我最诚挚的祝福和感谢。 第68页共49页参考文献[1]候朝帧,微机与单片机应用基础[M],北京理工大学出版社,1995[2]余永权,单片机应用系统的功率接口技术[M],北航出版社,1991[3]罗宜晶,多媒体计算机软件大全[M],电子科技大学出版社,1991[4]高海生等,单片机应用技术大全[M],西南交大出版社,1996[5]何立民,单片机应用技术选编1/2/3[M],北航出版社,1992[6]DALASSemiconductor,AatomaticIdentificationDataBook[M],1995[7]李秉操,单片机接口技术及其在单片机的应用[M],陕西电子编辑部,1993[8]陈汝全,微机与单片机接口及应用[M],电子科技大学出版,1996[9]林间,李湍,使用电子电路大全(一二三)[M],电子工业出版社,1993[10]刘甘娜,微机原理及接口技术[M],西安交通大学出版社,1996[11]张育荣,曾彦贺,Delphi从入门到精通[M],清华大学出版社,1996[12]刘守义,单片机应用技术[M],西安电子科技大学出版社,2002[13]王承发,邱祥辉,微型计算机原理及应用(修订版)[M],1999[14]徐惠民,安德宁,单片微型计算机原理、接口及应用[M],北京有点大学出版社,2000[15]白驹垳,雷晓平,单片计算机及其应用[M],电子科技大学出版社,1997IntroductiontoprogrammingfortheApacheAPIbySameerParekhTheApacheGroupdesignedtheApachewebserverwithmodularityinmind.WhentheApacheGrouprewrotetheservercoreforthe0.8.xreleaseofApachetheybuiltintothecoreanextensiblemoduleAPIinordertoprovideaconsistentinterfaceforfunctionality.Theyseperatedoutthebulkoftheserver"soperationsintoasetofmodules,sothattheservercorewouldbeaminimalsetofoperations.Thegroupdesignedthemodulestructurewithanumberofmotivations.First,theApacheGroupisseriouslyconcernedwithserverperformance.Byabstracting 第68页共49页outmostoftheserver"soperationsintoseperatemodules,theApacheGroupmadeitpossibleforserveradministratorstoeasilyremovemoduleswhichcontainfunctionalitytheydon"tneed,improvingtheirapplication"sspecificperformance.Second,third-partydeveloperscaneasilydevelopforApaacheusingtheextensiblemoduleAPI,addingtoitsgeneralfunctionality.Apachegrewfromaseriesofpatchestothethen-popularNCSAHTTPdserver.WithamoduleAPI,functionalitycannowbeaddedtotheserverwithoutanuglysetofpatches.Finally,inadditiontoprovidingincredibleflexibilty,anAPIallowswebengineerstodevelopapplicationsunderthisAPIwhichpreviouslyrequiredtheslowCGIsystem.NetscapeCommunicationsCorporationhasdonesomebenchmarktestsandfoundthatusingaserverAPIovertheCGIinterfaceprovidesaX%performanceimprovement.InthisarticlewewillprovideyouwithanintroductiontoprogrammingfortheApacheServerAPI.Wewilldissecttheexistingconfig_log_module,whichprovideswebserveradminstratorsaconfigurablealternativetothestandardHTTPDCommonLogFormat.Theconfig_log_moduleprovidesserveradministratorswiththeabilitytocreatecustomloglines,usinga"printf"styleconfigurationdirective.The"LogFormat"directiveisusedtospecifytheexactformatofthelogline.Forexample:LogFormat"%h%l%u%t"%r"%s%b"IstheLogFormatdirectivethatwouldbeusedtoemulatethestandardcommonlogformat.Theinitialcommentsinthemod_log_config.csourcefiledescribealltheLogFormatdirectives.Thecoredatastructureinamoduleisthe"module"structure.Whenbuildingamodule,theapplicationdeveloperdefinesthisstructureandfillsitwiththeappropriatefunctionscallswhichshouldberuninordertoinvoketheoperationsforthemodule.Themodulestructureformod_log_config.c,isasfollows:moduleconfig_log_module={STANDARD_MODULE_STUFF,init_config_log,/*initializer*/NULL,/*createper-dirconfig*/NULL,/*mergeper-dirconfig 第68页共49页*/make_config_log_state,/*serverconfig*/NULL,/*mergeserverconfig*/config_log_cmds,/*commandtable*/NULL,/*handlers*/NULL,/*filenametranslation*/NULL,/*check_user_id*/NULL,/*checkauth*/NULL,/*checkaccess*/NULL,/*type_checker*/NULL,/*fixups*/config_log_transaction/*logger*/};TheNULLentriesinthistablerefertoportionsoftheserverAPIwhichtheconfig_log_moduledonotuse.Wewillnotdescribethosefunctionsinthisarticle.TheLogFormatdirectiveisdefinedinthe"commandtable","config_log_cmds",whichisasfollows:command_recconfig_log_cmds[]={{"TransferLog",set_config_log,NULL,RSRC_CONF,TAKE1,"thefilenameoftheaccesslog"},{"LogFormat",log_format,NULL,RSRC_CONF,TAKE1,"alogformatstring(seedocs)"},{NULL}};Thisstructureisknownasthe"command_rec".Thecommand_recconsistsofanull-terminatedlistofsubstructures,oneforeachconfigurationdirective.Eachsubstructurehasthefollowingfields:thenameoftheconfigdirective,thefunctionwhichprocessestheconfigdirective,apointertoextradata,theAllowOverridesbitforthisconfigurationoption(wewillnotdescribeAllowOverrideshere),adescriptionoftheconfigurationformat,andadescriptionstring,foruseinthecaseofsyntaxerrors.Theconfig_log_cmdsstructurecontainstwodirectives.TheTransferLog,whichdescribesthefiletowhichtheloggetsstored,andtheLogFormat,whichistheactualformatoftheconfigurationfile.ByspecifyingTAKE1astheformatoftheconfigurationoption,theApacheconfigurationcoreisdirectedtolookforoneandonlyoneoptionfollowingtheconfigurationdirective.OtherpossiblesettingsfortheconfigurationformatincludeTAKE2andFLAG,whichmeantolookfortwooptionsortoacceptthedirectiveasanon/offswitch,respectively.WewillonlyusetheTAKE1formatinthisarticle.NowthatwehaveseenhowtheApacheconfigurationcoreunderstandsthemodule-specificconfiguration,wewilllookathowthecoreprocessesandstorestheconfigurationdatainternallysothatthemodulemayaccessthisdatawhennecessary. 第68页共49页Theconfig_log_modulestoresitsmodule-specificconfigurationoptionsinastructure.Modulescandefineforthemselveshowtheystoretheirconfigurationoptions.Somemodules,whichonlyneedoneoption,mayjustuseasimplenull-terminatedstringratherthanaCstructure.Theconfig_log_modulestructure,knownastheconfig_log_state,istypedef"edasfollows:typedefstruct{char*fname;array_header*format;intlog_fd;}config_log_state;TheApacheAPIrequiresonefunctioninordertoproperlyallocatethememoryfortheconfigurationstructure.Thecommentsforthemodulestructuredefinethisfunctionasthe"serverconfig"function.(Therealsoexistsa"per-dirconfig"function,whichisnotusedbyconfig_log_module.)Theconfig_log_moduleusesthemake_config_log_state()functiontoallocatememoryforthedatastructure:void*make_config_log_state(pool*p,server_rec*s){config_log_state*cls=(config_log_state*)palloc(p,sizeof(config_log_state));cls->fname=NULL;cls->format=NULL;cls->log_fd=-1;return(void*)cls;}Themake_config_log_statefunctiontakesasargumentsapointertothe"Apachememorypool"andapointertotheserver-wideconfigurationstructure.Apacheusesaninternalmemoryallocationsystemtopreventmemoryleaks,whichwewillnotdescribeindetailhere.make_config_log_state,verysimplyjustallocatesenoughmemoryforthemoduleconfigurationdatastructure,initializesittoNULLvalues,andreturnsapointertothenewlyallocatedmemory.Notethatthememoryallocationuses"palloc",whichisApache"sinternalmemoryallocationfunction.Amoduleshouldneveruse"malloc"toallocatememory.AllmemoryallocationsshouldbemadeusingApache"ssetof"pool"memoryallocationfunctions.(Apacheinternallytakescareofdeallocatingsuchmemory,whichiswhythereisno"pfree".)Oncethememoryforallthemodule"sconfigurationstructuresareallocated,theserverparsestheconfigurationfilesandcallsthefunctionsasdescribedbythecommand_recstructureforthatmodule.SettingtheLogFormat,forexample,isdonewiththelog_formatfunction: 第68页共49页char*log_format(cmd_parms*cmd,void*dummy,char*arg){char*err_string=NULL;config_log_state*cls=get_module_config(cmd->server->module_config,&config_log_module);cls->format=parse_log_string(cmd->pool,arg,&err_string);returnerr_string;}AstheLogFormatdirectiveisa"TAKE1"configurationdirective,thesecondargumenttothefunctionisn"tused.Thereforewecallit"dummy"inthefunctiondefinition/prototype.Thefunctionfirstusesthestandard"get_module_config"functiontoextractfromtheservercorethedatastructurewhichwasinitializedandallocatedforthismodulewiththemake_config_log_statefunction.Oncetheget_module_configfunctionretrievestheconfigurationstructure,theconfigurationoptionthatwaspassedintoLogFormatandprovidedtothefunctionin"arg"isassignedtotheproperlocationwithinthedatastructureandthe"parse_log_string"functioniscalledtoparsethedirectiveintoitscomponentpartsandreturnanerrormessageifthedirectiveisbadlyformatted.ThefunctionthenreturnsaNULLpointeronsuccess,or,ifanerrorhadoccurred,apointertoacharacterstringcontaininganerrormessagewhichthenthenprintedtostderr.Finally,onceboththeTransferLogandLogFormatdirectiveshavebeenprocessed,theserverisreadytoinitializeitself.Theconfig_log_module"sinitializitionrequiresthatitopenafileondisk(or,ifthe"|..."formatwaspassedtoTransferLog,openapipetoachildprocess)forloggingpurposes:voidinit_config_log(server_rec*s,pool*p){/*First,do"physical"server,whichgetsdefaultlogfdandformat*forthevirtualservers,iftheydon"toverride...*/config_log_state*default_conf=open_config_log(s,p,NULL);/*Then,virtualservers*/for(s=s->next;s;s=s->next)open_config_log(s,p,default_conf);}init_config_logverysimplycallsopen_config_log()foreveryserver(themainserverandallvirtualhosts)beingrunwithApache.Itjustscrollsthroughthelinkedlistofserversfromthedataintheserver_recstructure,callingopen_config_logforeachone:config_log_state*open_config_log(server_rec*s,pool*p,config_log_state*defaults){config_log_state*cls=get_module_config(s->module_config,&config_log_module);if(cls->log_fd>0)returncls;/*virtualconfigsharedw/mainserver*/if(cls->format==NULL){char*dummy;if(defaults) 第68页共49页cls->format=defaults->format;elsecls->format=parse_log_string(p,DEFAULT_LOG_FORMAT,&dummy);}if(cls->fname==NULL){if(defaults){cls->log_fd=defaults->log_fd;returncls;}elsecls->fname=DEFAULT_XFERLOG;}if(*cls->fname=="|"){FILE*dummy;spawn_child(p,config_log_child,(void*)(cls->fname+1),kill_after_timeout,&dummy,NULL);if(dummy==NULL){fprintf(stderr,"Couldn"tforkchildforTransferLogprocessn");exit(1);}cls->log_fd=fileno(dummy);}else{char*fname=server_root_relative(p,cls->fname);if((cls->log_fd=popenf(p,fname,xfer_flags,xfer_mode))<0){fprintf(stderr,"httpd:couldnotopentransferlogfile%s.n",fname);perror("open");exit(1);}}returncls;}Theopenconfiglogfunctiondoesthenecessaryfileopen/processspawningthatisnecessaryforthestorageofthelogswhichareloggedaccordingtotheLogFormatdefinedwiththeLogFormatdirective.(TheTransferLogdirectiveallowsapipeintheformof"|..."tobeexecuted,towhichthelogslinesaresent.)Onceeverythingissetup,theservercanfinallybegintoacceptrequests.Asthismoduleisonlyaloggingmodule,itdoesn"tuseanyoftheAPIfunctionalityotherthanthe"logger"function.Theloggerfunction,astherestofthefunctionsusedintheprocessofhandlingarequest,takesasanargumentapointertothe"request_rec"datastructure.The"request_rec"storesallthedatapertainingtoaparticularrequestmadeontheserver.Theloggerfunctionusesthedatastoredwithinthisstructuretofindtheinformationitneedstologtothefile.Therequest_recstructureisdefinedasfollows:structrequest_rec{pool*pool;conn_rec*connection;server_rec*server;request_rec*next;/*Ifwewindupgettingredirected,*pointertotherequestweredirectedto.*/request_rec*prev;/*Ifthisisaninternalredirect,*pointertowhereweredirected*from*.*/request_rec*main;/*Ifthisisasub_request(seerequest.h)*pointerbacktothemainrequest.*//*Infoabouttherequestitself...webeginwithstuffthatonly*protocol.cshouldevertouch...*/char*the_request;/*Firstlineofrequest,sowecanlogit*/ 第68页共49页intassbackwards;/*HTTP/0.9,"simple"request*/intproxyreq;/*Aproxyrequest*/intheader_only;/*HEADrequest,asopposedtoGET*/char*protocol;/*Protocol,asgiventous,orHTTP/0.9*/char*status_line;/*Statusline,ifsetbyscript*/intstatus;/*Inanycase*//*Requestmethod,twoways;also,protocol,etc..Outsideofprotocol.c,*look,butdon"ttouch.*/char*method;/*GET,HEAD,POST,etc.*/intmethod_number;/*M_GET,M_POST,etc.*/intsent_bodyct;/*bytecountinstreamisforbody*//*MIMEheaderenvironments,inandout.Also,anarraycontaining*environmentvariablestobepassedtosubprocesses,sopeoplecan*writemodulestoaddtothatenvironment.**Thedifferencebetweenheaders_outanderr_headers_outisthatthe*latterareprintedevenonerror,andpersistacrossinternalredirects*(sotheheadersprintedforErrorDocumenthandlerswillhavethem).**The"notes"tableisfornotesfromonemoduletoanother,withno*othersetpurposeinmind...*/table*headers_in;table*headers_out;table*err_headers_out;table*subprocess_env;table*notes;char*content_type;/*Breaktheseout---wedispatchon"em*/char*handler;/*Whatwe*really*dispatchon*/char*content_encoding;char*content_language;intno_cache;/*Whatobjectisbeingrequested(eitherdirectly,orviainclude*orcontent-negotiationmapping).*/char*uri;/*completeURIforaproxyreq,orURLpathforanon-proxyreq*/char*filename;char*path_info;char*args;/*QUERY_ARGS,ifany*/structstatfinfo;/*ST_MODEsettozeroifnosuchfile*//*Variousotherconfiginfowhichmaychangewith.htaccessfiles*Theseareconfigvectors,withonevoid*pointerforeachmodule*(thethingpointedtobeingthemodule"sbusiness).*/void*per_dir_config;/*Optionssetinconfigfiles,etc.*/void*request_config;/*Noteson*this*request*//**alinkedlistoftheconfigurationdirectivesinthe.htaccessfiles*accessedbythisrequest.*N.B.alwaysaddtotheheadofthelist,_never_totheend.*thatway,asubrequest"slistcan(temporarily)pointtoaparent"slist*/conststructhtaccess_result*htaccess;};Thisarticlewillnotgointothedetailsofhowtheconfig_log_moduleactuallydoesitsloggingandparsestheLogFormatformatstring,asthatisjuststandardC.Theconfig_log_transactionfunctionprototype,however,isasfollows:intconfig_log_transaction(request_rec*r);Thefunctiondependsontherequest_recstructure,someelementsofwhichwedescribehere.pool-ApointertothepoolofmemoryfromwhichallocationsshouldbemadewhileprocessingthisoneHTTPrequest.Afterprocessingthisrequest,allallocationsmadefromthispoolarefreed.connection-Apointertotheconn_recstructure,whichdescribesdetailsoftheconnection,suchasthelocalsocketaddress,remotesocketaddress,etc.Wewillnotdiscusstheconn_recindetailinthisarticle.server-The"server"isapointertotheserver_rec,whichpointstoalltheconfigurationinformationspecifictotheserver(i.e.eitherthemainserveroroneofthevirtualhostservers)underwhichthisrequestwas 第68页共49页made.Mostimportantwithintheserver_recstructureisthe"module_config"pointer,whichisusedbytheget_module_configfunctiontoreturnmodule-specificconfigurationdirectives.main/next/prev-Somerequestsmayresultinaninternalredirect,resultinginaseperatelogicalrequest,eventhoughitgoesoverasingleHTTPrequest.Themain/next/prevpointerspointtothechainofrequest_recstructureswhichwereprocessedthroughinternalredirectsforthecurrentsingleHTTPrequest.the_request-stringwhichjustcontainsthefirstlineoftherequest.(e.g."GET/index.htmlHTTP/1.0")assbackwards-booleanflagtoseewhetherornotwe"reprocessinganold-styleHTTP/0.9"simple"request.status-theHTTPstatusreturncodepertainingtotherequest.(I.e.200for"DocumentFollows"or404for"NotFound")httpd.hcontainsalistofalltheavailablestatuscodesthattheservercurrentlysupports.headers_in-Apointertoa"table"structure(thetablestructureisnotdescribedinthisarticle)whichlistsalloftheincomingHTTPstructureswhichtheclientsenttotheserver.headers_out-A"table"pointertotheheaderswhichtheserversendsbacktotheclient.subprocess_env-Another"table"pointerwithalloftheenvironmentvariablesthataresetforCGI,SSI,etc.content_type-TheMIMEContent-typeforusewithdispatchingtheactualrequesthandlers.ThisContent-typemaybeanactualMIMEtypeoritmayactuallybeaninternaltypeinordertodispatchtoaspecificmodule"shandlerbasedonvariouscriteria.(e.g.CGI_MAGIC_TYPE)uri-TheURLpathforagivenrequest.(arequest"GET/index.htmlHTTP/1.0"wouldassociate"/index.html"tothe"uri"variablewithinrequest_rec)filename-Iftherequesthastranslatedtoanactualfileinthefilesystem,thisisthefullpathtothatfile.Insomeinstances(proxymodule,forexample) 第68页共49页the"filename"isnotarepresentationofafileinthefilesystem,butperhapsaproxyURL.finfo-a"stat"structurewithinformationaboutthefile,ifitexistsinthefilesystem.Ifitdoesn"t,theserversetsfinfo.st_modeequaltozero.>ApacheHTTPServerVersion2.0ApacheHookFunctionsIngeneral,ahookfunctionisonethatApachewillcallatsomepointduringtheprocessingofarequest.Modulescanprovidefunctionsthatarecalled,andspecifywhentheygetcalledincomparisontoothermodules.CreatingahookfunctionInordertocreateanewhook,fourthingsneedtobedone:DeclarethehookfunctionUsetheAP_DECLARE_HOOKmacro,whichneedstobegiventhereturntypeofthehookfunction,thenameofthehook,andthearguments.Forexample,ifthehook 第68页共49页returnsanintandtakesarequest_rec*andanintandiscalled"do_something",thendeclareitlikethis:AP_DECLARE_HOOK(int,do_something,(request_rec*r,intn))Thisshouldgoinaheaderwhichmoduleswillincludeiftheywanttousethehook.CreatethehookstructureEachsourcefilethatexportsahookhasaprivatestructurewhichisusedtorecordthemodulefunctionsthatusethehook.Thisisdeclaredasfollows:APR_HOOK_STRUCT(APR_HOOK_LINK(do_something)...)ImplementthehookcallerThesourcefilethatexportsthehookhastoimplementafunctionthatwillcallthehook.Therearecurrentlythreepossiblewaystodothis.Inallcases,thecallingfunctioniscalledap_run_hookname().VoidhooksIfthereturnvalueofahookisvoid,thenallthehooksarecalled,andthecallerisimplementedlikethis:AP_IMPLEMENT_HOOK_VOID(do_something,(request_rec*r,intn),(r,n))Thesecondandthirdargumentsarethedummyargumentdeclarationandthedummyargumentsastheywillbeusedwhencallingthehook.Inotherwords,thismacroexpandstosomethinglikethis:voidap_run_do_something(request_rec*r,intn){... 第68页共49页do_something(r,n);}HooksthatreturnavalueIfthehookreturnsavalue,thenitcaneitherberununtilthefirsthookthatdoessomethinginteresting,likeso:AP_IMPLEMENT_HOOK_RUN_FIRST(int,do_something,(request_rec*r,intn),(r,n),DECLINED)Thefirsthookthatdoesn"treturnDECLINEDstopstheloopanditsreturnvalueisreturnedfromthehookcaller.NotethatDECLINEDisthetraditionApachehookreturnmeaning"Ididn"tdoanything",butitcanbewhateversuitsyou.Alternatively,allhookscanberununtilanerroroccurs.Thisboilsdowntopermittingtworeturnvalues,oneofwhichmeans"Ididsomething,anditwasOK"andtheothermeaning"Ididnothing".Thefirstfunctionthatreturnsavalueotherthanoneofthosetwostopstheloop,anditsreturnisthereturnvalue.Declaretheselikeso:AP_IMPLEMENT_HOOK_RUN_ALL(int,do_something,(request_rec*r,intn),(r,n),OK,DECLINED)Again,OKandDECLINEDarethetraditionalvalues.Youcanusewhatyouwant.CallthehookcallersAtappropriatemomentsinthecode,callthehookcaller,likeso:intn,ret;request_rec*r;ret=ap_run_do_something(r,n);HookingthehookAmodulethatwantsahooktobecalledneedstodotwothings. 第68页共49页ImplementthehookfunctionIncludetheappropriateheader,anddefineastaticfunctionofthecorrecttype:staticintmy_something_doer(request_rec*r,intn){...returnOK;}AddahookregisteringfunctionDuringinitialisation,Apachewillcalleachmoduleshookregisteringfunction,whichisincludedinthemodulestructure:staticvoidmy_register_hooks(){ap_hook_do_something(my_something_doer,NULL,NULL,HOOK_MIDDLE);}modeMODULE_VAR_EXPORTmy_module={...my_register_hooks/*registerhooks*/};ControllinghookcallingorderIntheexampleabove,wedidn"tusethethreeargumentsinthehookregistrationfunctionthatcontrolcallingorder.Therearetwomechanismsfordoingthis.Thefirst,rathercrude,method,allowsustospecifyroughlywherethehookisrunrelativetoothermodules.Thefinalargumentcontrolthis.Therearethreepossiblevalues:HOOK_FIRSTHOOK_MIDDLEHOOK_LAST 第68页共49页Allmodulesusinganyparticularvaluemayberuninanyorderrelativetoeachother,but,ofcourse,allmodulesusingHOOK_FIRSTwillberunbeforeHOOK_MIDDLEwhicharebeforeHOOK_LAST.Modulesthatdon"tcarewhentheyarerunshoulduseHOOK_MIDDLE.(IspacedtheseoutsopeoplecoulddostufflikeHOOK_FIRST-2togetinslightlyearlier,butisthiswise?-Ben)Notethattherearetwomorevalues,HOOK_REALLY_FIRSTandHOOK_REALLY_LAST.Theseshouldonlybeusedbythehookexporter.Theothermethodallowsfinercontrol.Whenamoduleknowsthatitmustberunbefore(orafter)someothermodules,itcanspecifythembyname.Thesecond(third)argumentisaNULL-terminatedarrayofstringsconsistingofthenamesofmodulesthatmustberunbefore(after)thecurrentmodule.Forexample,supposewewant"mod_xyz.c"and"mod_abc.c"torunbeforewedo,thenwe"dhookasfollows:staticvoidregister_hooks(){staticconstchar*constaszPre[]={"mod_xyz.c","mod_abc.c",NULL};ap_hook_do_something(my_something_doer,aszPre,NULL,HOOK_MIDDLE);}Notethatthesortusedtoachievethisisstable,soorderingsetbyHOOK_ORDERispreserved,asfarasispossible.BenLaurie,15thAugust1999NetworkWorkingGroupR.Rivest 第68页共49页RequestforComments:1321MITLaboratoryforComputerScienceandRSADataSecurity,Inc.April1992StatusofthisMemoThismemoprovidesinformationfortheInternetcommunity.ItdoesnotspecifyanInternetstandard.Distributionofthismemoisunlimited.AcknowlegementsWewouldliketothankDonCoppersmith,BurtKaliski,RalphMerkle,DavidChaum,andNoamNisanfornumeroushelpfulcommentsandsuggestions.TableofContents1.ExecutiveSummary12.TerminologyandNotation23.MD5AlgorithmDescription34.Summary65.DifferencesBetweenMD4andMD56References7APPENDIXA-ReferenceImplementation7SecurityConsiderations21Author"sAddress211.ExecutiveSummaryThisdocumentdescribestheMD5message-digestalgorithm.Thealgorithmtakesasinputamessageofarbitrarylengthandproducesasoutputa128-bit"fingerprint"or"messagedigest"oftheinput.Itisconjecturedthatitiscomputationallyinfeasibletoproducetwomessageshavingthesamemessagedigest,ortoproduceanymessagehavingagivenprespecifiedtargetmessagedigest.TheMD5algorithmisintendedfordigitalsignatureapplications,wherealargefilemustbe"compressed"inasecuremannerbeforebeingencryptedwithaprivate(secret)keyunderapublic-keycryptosystemsuchasRSA. 第68页共49页TheMD5algorithmisdesignedtobequitefaston32-bitmachines.Inaddition,theMD5algorithmdoesnotrequireanylargesubstitutiontables;thealgorithmcanbecodedquitecompactly.TheMD5algorithmisanextensionoftheMD4message-digestalgorithm1,2].MD5isslightlyslowerthanMD4,butismore"conservative"indesign.MD5wasdesignedbecauseitwasfeltthatMD4wasperhapsbeingadoptedforusemorequicklythanjustifiedbytheexistingcriticalreview;becauseMD4wasdesignedtobeexceptionallyfast,itis"attheedge"intermsofriskingsuccessfulcryptanalyticattack.MD5backsoffabit,givingupalittleinspeedforamuchgreaterlikelihoodofultimatesecurity.Itincorporatessomesuggestionsmadebyvariousreviewers,andcontainsadditionaloptimizations.TheMD5algorithmisbeingplacedinthepublicdomainforreviewandpossibleadoptionasastandard.ForOSI-basedapplications,MD5"sobjectidentifierismd5OBJECTIDENTIFIER::=iso(1)member-body(2)US(840)rsadsi(113549)digestAlgorithm(2)5}IntheX.509typeAlgorithmIdentifier[3],theparametersforMD5shouldhavetypeNULL.2.TerminologyandNotationInthisdocumenta"word"isa32-bitquantityanda"byte"isaneight-bitquantity.Asequenceofbitscanbeinterpretedinanaturalmannerasasequenceofbytes,whereeachconsecutivegroupofeightbitsisinterpretedasabytewiththehigh-order(mostsignificant)bitofeachbytelistedfirst.Similarly,asequenceofbytescanbeinterpretedasasequenceof32-bitwords,whereeachconsecutivegroupoffourbytesisinterpretedasawordwiththelow-order(leastsignificant)bytegivenfirst.Letx_idenote"xsubi".Ifthesubscriptisanexpression,wesurrounditinbraces,asinx_{i+1}.Similarly,weuse^forsuperscripts(exponentiation),sothatx^idenotesxtothei-th 第68页共49页power.Letthesymbol"+"denoteadditionofwords(i.e.,modulo-2^32addition).LetX<<.Theappendixalsoincludesthefollowingfile:mddriver.c--testdriverforMD2,MD4andMD5ThedrivercompilesforMD5bydefaultbutcancompileforMD2orMD4ifthesymbolMDisdefinedontheCcompilercommandlineas2or4.Theimplementationisportableandshouldworkonmanydifferentplaforms.However,itisnotdifficulttooptimizetheimplementationonparticularplatforms,anexerciselefttothereader.Forexample,on"little-endian"platformswherethelowest-addressedbyteina32-bitwordistheleastsignificantandtherearenoalignmentrestrictions,thecalltoDecodeinMD5Transformcanbereplacedwithatypecast.'