1、打印CO改进版目 录第1章 绪论 11.1 课题研究的目的意义 11.2 国内外研究现状 21.2.1 一氧化碳检测的现状 21.2.2 我国CO检测的发展 21.2.3 各国一氧化碳检测的发展 31.3 CO传感器 31.3.1 电化学传感器 31.3.2 本设计CO传感器的选择 4第2章 总体设计方案 52.1 设计思路 52.2 主要算法 52.2.1 初步考虑的算法 52.2.2 实际应用的算法 6第3章 软件设计 73.1 主程序设计 73.2 A/D转换程序的设计 83.2.1 ADC0809简介 83.2.2 A/D转换子程序 93.2.3 A/D转换程序流程图 103.3 报警
2、子程序 113.4 显示程序设计 123.5 十六进制转BCD码 17第4章 Keil软件的运用 184.1 Keil工程的建立 184.1.1 源文件的建立 184.1.2 建立工程文件 184.2 工程的详细设置 204.3 编译、连接 234.4 Keil C51软件与Proteus软件的结合 234.4.1 编译、调试 234.4.2 Proteus ISIS与Keil的接口 244.4.3 Proteus软件的介绍 244.4.4 Proteus缺点和不足 26第5章 系统调试及仿真 275.1 软件调试 275.2 现场调试 285.3 系统仿真结果显示 29第6章 结论与展望 3
3、26.1 结论 326.2 展望 32参考文献 34致 谢 35附录A 外文资料翻译 36附录B 源程序 47第2章 总体设计方案2.1 设计思路本设计是由软件和硬件的配合来实现的,我的主要工作就是软件的设计,在了解电路设计原理后,根据原理和目的画出程序流程图,用汇编语言进行编程,如A/D转换程序,报警程序,显示程序及所用到的进制转换程序,即十六进制转换成十进制。系统工作时,首先进行初始化等准备工作。然后进行数据采集,经过硬件的放大滤波处理后,送至单片机进行数据的处理。单片机根据输入的信号进行浓度计算,最后得到浓度值。系统软件采取模块化结构,主程序分别调用初始化程序,A/D采样程序,LED显示
4、程序(声光报警和外围控制程序),结果存储程序等,来完成整个传感器输出信号的智能量化过程。设计中用到了keil编译软件,其作用是对编写好的程序进行编译,产生HEX文件,此格式的文件可以用于proteus环境中的仿真。第3章 软件设计3.1 主程序设计主程序是软件的主体框架,它的主要任务是首先完成系统初始化,然后循环判断各个标志,一旦满足条件就进入相应的子功能模块中,当处理完后再返回到主循环中。CO检测的主程序流程如下图所示。为了便于调试、连接和扩展,采用模块化程序设计技术,模块间任务划分明确、耦合清晰,避免了重复设计,彼此间具有相对的独立性。系统上电后,首先对单片机自身初始化,包括设置堆栈指针、
5、中断禁止及优先级的决定、设置各个定时器/计数器的工作方式等,然后对A/D初始化。A/D初始化后系统开始工作,首先采样CO浓度并显示,超过安全值报警。图3-1 主程序流程图单片机初始化程序: ORG 0000HAJMP MAINORG 0003H ; 外部中断 0 地址入口AJMP INTDATAORG 000BH ; 定时器0的中断向量地址AJMP TINT0ORG 0100HMAIN:MOV SP,#70H ; 把堆栈起始地址设在70HMOV TMOD,#11H ; 设T0、T1为16位定时器MOV TH0,#0FFHMOV TL0,#0F7H ;T0定时器初值 提供大约250K HZ的频率
6、给 ADC0809 的 CLOCKSETB TR0 ; 开启T0定时器SETB ET0 ; 允许T0中断3.2 A/D转换程序的设计3.2.1 ADC0809简介ADC0809是采样频率为8位的、以逐次逼近原理进行模数转换的器件。其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8个单段模拟输入信号中的一个进行A/D转换6。1.主要特性:(1)8路8位A/D转换器,即分辨率8位。 (2)具有转换起停控制端。 (3)转换时间为100s。(4)单个5V电源供电。(5)模拟输入电压范围05V,不需零点和满刻度校准。 (6)工作温度范围为-4085。(7)低功耗,约15mW。2.内部
7、结构:ADC0809是CMOS单片型逐次逼近式A/D转换器,它由8路模拟开关、地址锁存与译码器、比较器、8位开关树型A/D转换器、逐次逼近。 3.外部特性(引脚功能):ADC0809芯片有28条引脚,采用双列直插式封装。下面说明各引脚功能。 IN0IN7:8路模拟量输入端。OUT1OUT7:8位数字量输出端。ADDA、ADDB、ADDC:3位地址输入线,用于选通8路模拟输入中的一路。ALE:地址锁存允许信号,输入,高电平有效。 START: A/D转换启动信号,输入,高电平有效。 EOC: A/D转换结束信号,输出,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)。 OE:数据输
8、出允许信号,输入,高电平有效。当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。CLK:时钟脉冲输入端。要求时钟频率范围是10-1280kHz。 REF(+)、REF(-):基准电压。 Vcc:电源,单一5V。 GND:地。 ADC0809的工作过程是:首先输入3位地址,并使ALE=1,将地址存入地址锁存器中。此地址经译码选通8路模拟输入之一到比较器。START上升沿将清除内部寄存器。下降沿启动 A/D转换,之后EOC输出信号变低,指示转换正在进行。直到A/D转换完成,EOC变为高电平,指示A/D转换结束,结果数据已存入锁存器,这个信号可用作中断申请。当OE输入高电平时,
9、输出三态门打开,转换结果的数字量输出到数据总线上7。3.2.2 A/D转换子程序SETB EA ;开启总中断CLR F0 ;清F0MOV DPTR,#6FF8HMOVX DPTR,A ;启动ADSETB IT0 ;设为下降沿有效SETB EX0 ;开外中断0允许CLR P2.4SETB P2.5SETB P2.6 ;报警电路复位LOOP:JNB F0,LOOP ;等待AD转换结束,电压值的十六进制数读到40H里面3.2.3 A/D转换程序流程图在启动A/D转换时,由写信号/WR和P2.7控制ADC0809的地址锁存和转换启动;在读取转换结果时,由读信号/RD和P2.7控制ADC0809的OE信
10、号。令P2.7=0,A0、A1、A2给出被选择的模拟通道的地址,令A0A1A2=000,这时的ADC0809的地址是6FF8H,且指向通道0(IN0)。3.3 报警子程序程序流程图:报警程序:ALARM:MOV A,40H ;当40H里面的电压值大于53H某个数时报警SUBB A,53HJC OUT1CLR P2.5MOV A,40H ;当40H里面的电压值大于54H某个数时报警SUBB A,54HJC OUT1CLR P2.6MOV A,40H ;当40H里面的电压值大于55H某个数时报警SUBB A,55HJC OUT1SETB P2.4OUT1:RET3.4 显示程序设计在单片机系统中,
11、通常用LED数码显示器来显示各种数字或符号。由于它具有显示清晰、亮度高、使用电压低、寿命长的特点,因此使用非常广泛。LED显示是用发光二极管显示字段的显示器件,也可称为数码管,其外形结构如图所示,由图可见它由8个发光二极管构成,通过不同的组合可用来显示09、AF及小数点。 图3-4 “8”字型数码管 图3-5 共阴极数码管与共阳极数码管LED显示器分为共阴极和共阳极,共阴极是将8个发光二极管阴极连接在一起作为公共端,而共阳极是将8个发光二极管的阳极连接在一起作为公共端。我们这次就是采用的共阳极LED,所以这里要介绍共阳极数码管。LED显示器有静态和动态显示两种方式,静态显示是将共阴极联到一起接
12、地,每位的显示段(a-dp)分别与一个8位的锁存器输出相连。由于显示的各位可以相互独立,各位可以互相显示,只要在该位的段选线上保持段选码电平,该位就能保持相应的显示字符。并且由于各位由一个8位锁存器控制段选线,故在同一时间内每一位显示的字符可以不同,这种方式占用锁存器较多。动态显示是将所有位的段选线相应的并联在一起,由一个8位的I/O口控制,形成段选线的多路复用。而各位的阴极分别由相应的I/O口控制,实现各位的分时选通。要LED能够显示相应的字符,就必须采用动态扫描方式,只要每位显示的时间足够短,则可造成多位同时显示的假象,达成显示的目的。在数字电路中常常要把数据或运算结果通过半导体数码管、液
13、晶数码和荧光数码管,用十进制数显示出来。发光二极管的工作电压为1.5-3.0V,工作电流为几毫安到几十毫安,寿命很长。半导体数码管将十位数分成七个字段,每段为一个发光二极管,其字形结构如上图所示,选择不同的字段发光,可显示出不同的字型。例如:当a,b,c,d,e,f,g七个字段同时亮时,显示b、c 段亮时,显示出1。共阳极:把发光二极管的阳极连在一起构成共阳极。使用时公共端接Vcc,当某阳极为低电平时,该发光二极管就导通发光。输出一个段码就可以控制LED显示器的字型。LED显示器工作在静态显示时,其公共阳极(或阴极)接Vcc(GND),一直处于显示有效状态,所以每一位的显示内容必须由锁存器加以
14、锁存,显示各位相互独立。静态显示时,LED的亮度高,容易控制,但消耗大,所需口线多。若显示位数增多,则静态显示方式很难适应。故本设计采用动态显示方式,LED为共阳极8。表2-2 共阳极七段LED显示字型编码表显示字符共阳极段选码显示字符共阳极段选码0C0HBC6H1F9HCA1H2A4HD86H3B0HE8EH499HF8CH592HPC1H682HUCEH7F8HR91H880HY89H990H8.C7HA88H不显示FFH显示子程序:CLR P2.0CLR P2.1CLR P2.2CLR P2.3 ;关所有数码管MOV A,3AHMOV P1,ASETB P2.3 ;置P2.3高位 ACA
15、LL DELAY ;显示最低位CLR P2.0CLR P2.1CLR P2.2CLR P2.3 ;关所有数码管MOV A,3BHMOV P1,ASETB P2.2 ;置P2.2高位 ACALL DELAY ;显示2位CLR P2.0CLR P2.1CLR P2.2CLR P2.3 ;关所有数码管MOV A,3CHMOV P1,ASETB P2.1 ;置P2.1高位 ACALL DELAY ;显示3位CLR P2.0CLR P2.1CLR P2.2CLR P2.3 ;关所有数码管MOV A,3DHMOV P1,ASETB P2.0 ;置P2.0高位 ACALL DELAY ;显示4位CLR P2
16、.0CLR P2.1CLR P2.2CLR P2.3 ;关所有数码管RETTAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,8CHEND显示流程图:3.5 十六进制转BCD码我们所设计的CO测试仪检测的CO气体的浓度数据由数码管显示出来,数码管显示的数据为十进制,而程序中的运算值为十六进制数,因此需要将程序中的十六进制转换为十进制BCD码。以下这两段程序就是我所设计的转换程序。程序设计思路:先将十六进制的数除以100,商为百位的BCD码;再将余数除以10,商为十位的BCD码,余数为个位数的BCD码。把低三位的十六进制转换为十进制BCD码:H
17、BCD:MOV A,51H ;将低三位数赋给AMOV B,#100 ;B取值100DIV AB MOV 32H,A ;将百位的BCD码放在32HMOV A,#10 ;A取值10XCH A,B ;交换A,BDIV ABMOV 31H,A ;将十位BCD码放于31HMOV 30H,B ;将个位BCD码放于30HRET把高三位的十六进制转换为十进制BCD码:HBCD1:MOV A,52H ;将高三位数赋给AMOV B,#100 ;B取值100DIV ABMOV 35H,A ;将百位的BCD码放在35HMOV A,#10 ;A取值10XCH A,B ;交换A,BDIV ABMOV 34H,A ;将十位
18、BCD码放于34HMOV 33H,B ;将个位BCD码放于33HRET第5章 系统调试及仿真单片机应用系统的调试是系统开发的重要环节。当完成了单片机应用系统的硬件、软件设计和硬件组装后,便可进入应用系统调试阶段。系统调试的目的是查出系统中硬件设计和软件设计中存在的错误及可能出现的不协调的问题,以便修改设计,最终使系统能正确地工作。系统调试包括软件调试、硬件调试及软硬件联调。根据调试环境不同,系统调试又分为模拟调试与现场调试。各种调试所起的作用是不同的,他们所处的时间段也不一样,但他们的目标是一致的,都是为了查出系统中潜在的错误11。5.1 软件调试软件调试与所选用的软件结构和程序设计技术有关。
19、如果采用模块程序设计技术,则逐个模块调好以后,再进行系统程序总调试。如果采用实时多任务操作系统,一般是逐个任务,下面进一步予以说明。对于模块结构程序,要一个个子程序分别调试。调试子程序时,一定要符合现场环境,即入口条件和出口条件。调试的手段可采用单步运行方式和断点运行方式,通过检查用户系统CPU的现场、RAM的内容和I/O口的状态,检测程序执行结果是否符合设计要求。通过检测,可以发现程序中的死循环错误、机器码错误及转移地址的错误,同时也可以发现用户系统中的硬件故障、软件算法及硬件设计错误。在调试过程中不断调整用户系统的软件和硬件,逐步通过一个个程序模块。各程序模块通过后,可以把各功能块联合起来
20、一起进行整体程序综合调试。在这阶段若发生故障,可以考虑各子程序在运行时是否破坏现场,缓冲单元是否发生冲突,零位的建立和清除在设计上有否失误,堆栈区域有否溢出,输入设备的状态是否正常,等等。若用户系统是在开发系统的监控程序下运行时,还要考虑用户缓冲单元是否和监控程序的工作单元发生冲突。单步和断点调试后,还应进行连续调试,这是因为单步运行只能验证程序的正确与否,而不能确定定时精度、CPU的实时响应等问题。待全部完成后,应反复运行多次,除了观察稳定性之外,还要观察用户系统的操作是否符合原始设计要求、安排的用户操作是否合理等,必要时还要作适当修正。对于实时多任务操作系统的调试方法与上述方法有很多相似之
21、处,只是实时多任务操作系统的应用程序是由若干个任务程序组成,一般是逐个任务进行调试,在调试某一个任务时,同时也调试相关的子程序、中断服务程序和一些操作系统的程序。逐个任务调试好以后,再使各个任务同时运行,如果操作系统中没有错误,一般情况下系统就能正常运转。在全部调试和修改完成后,将用户软件固化于EPROM中,插入用户样机后,用户系统即能脱离开发机独立工作,至此系统研制完成。系统调试是指让用户系统的软件在其硬件上运行,进行软硬件联合调试,从中发现硬件错误或软件错误。系统调试主要解决以下问题:(1) 系统的软、硬件能否按预定的要求配合工作;(2) 系统运行中是否有潜在的设计时难以预料的错误;(3)
22、 系统的动态性能指标是否满足设计要求。系统联调时,首先采用单步、断点、连续运行方式调试与硬件相关的各段程序,即可检验这些程序段的正确性,又可在各功能独立的情况下,查验软、硬件的配合情况。然后,将软、硬件按系统工作要求进行综合运行,解决在系统总体运行情况下软、硬件的协调,以提高系统动态性能。在具体操作中,用户系统在开发系统环境下,先借用仿真器的单片机、存储器等资源进行工作。若发现问题,按上述软、硬件调试方法准确定位错误,分析错误原因,找出解决办法。调试需要一定的技巧,在keil软件环境中用F10键可单步调试,需要很多时间,因此可以通过人为改变定时器里的TH0和TL0值减少执行的次数,也可以在程序
23、中改变TH0和TL0,不过在程序中改变必须重新编译后再调试;在使用I/O端口的同时,也可以直接在对话框中改变端口的值,从而模拟简单的信号输入,最主要的是可以通过人为改变P3口的值调用中断和模拟时钟输入,还可以模拟I/O端口的输出和外部I/O设备。在实际中充分利用u Vision 3软件的仿真功能,可以大大节省时间。5.2 现场调试一般情况下,通过系统联调后,用户系统就可以按照设计目标正常工作了。但在某些情况下,由于用户系统运行环境较为复杂(如环境干扰较为严重工作现场有腐蚀性气体)在现场实际工作之前,环境对系统的影响无法预料,只能通过现场运行调试来发现问题,找出相应的解决方法;或者虽然已经在系统
24、设计时考虑到抗干扰的对策,但是否行之有效,还必须通过用户系统在实际现场的运行来加以验证。另外,有些用户系统的调试是在模拟设备代替实际检测、控制对象的情况下进行的,这就更有必要的过程,只有经过现场调试的用户系统才能可靠工作。现场调试仍需利用开发系统来完成,其调试方法与前述类似12。5.3 系统仿真结果显示以下三幅图是仿真过程中,三个不同的报警门限电压所对应的CO浓度的数码显示值,因为现实中CO浓度的超标值分几个不同等级,设计中我取200,400,600 ppm三个标度值。当浓度超过200,就意味着CO浓度已经超标,对人体会产生不良影响;当浓度显示值超过400,人们对此会有较严重的反应;当CO浓度
25、超过600 ppm时,短期内便会引起窒息死亡。设计中的三个门限电压,是在报警子程序之前制定的,即MOV 53H,#19H ;设报警门限电压1为19HMOV 54H,#32H ;设报警门限电压2为32HMOV 55H,#4BH ;设报警门限电压3为4BH(1)当CO浓度值超过200时,红色报警指示灯D40开始闪烁,以示报警。如下图所示,红色报警灯开始工作。图5-1 仿真结果显示1(2)当CO浓度值超过400时,蓝色报警指示灯D41开始闪烁,以示报警。这时红色指示灯D40和蓝色指示灯D41同时闪烁。如下图所示,红色报警灯和蓝色指示灯同时开始工作。图5-2 仿真结果显示2(3)当CO浓度超过600时
26、,报警喇叭LS1也开始工作。这种情况是最严重的报警状态,两个报警灯和报警喇叭同时工作。如下图所示,三个报警装置同时开始工作。图5-3 仿真结果显示3说明:系统仿真毕竟是在不考虑干扰因素的前提下进行的,所以和现实肯定存在差异。其差异的主要来源就是实际环境中的温度,湿度等因素的影响及人为操作上的失误。虽然如此,仿真结果仍是设计成败的一个最有利的说明,仿真成功后才可以进行下一步的实物设计。附录B 源程序ORG 0000HAJMP MAINORG 0003H ; 外部中断0地址入口AJMP INTDATAORG 000BH ; 定时器0的中断向量地址AJMP TINT0ORG 0100HMAIN:MO
27、V SP,#70H ; 把堆栈起始地址设在70HMOV TMOD,#11H ; 设T0、T1为16位定时器MOV TH0,#0FFHMOV TL0,#0F7H ;提供大约250HZ的频率给 ADC0808 的 CLOCKSETB TR0 ; 开启T0定时器SETB ET0 ; 允许T0中断SETB EA ; 开总中断允许CLR F0MOV DPTR,#6FF8HMOVX DPTR,A ; 启动ADSETB IT0 ; 设为下降沿触发SETB EX0 ; 开外中断0允许CLR P2.4SETB P2.5SETB P2.6 ;报警电路复位LOOP:JNB F0,LOOP ;等待AD转换结束,电压值
28、的十六进制数读到40H里面MOV 50H,#2 ; 存浓度计算比例系数KMOV 51H,#0MOV 52H,#0 ;浓度初始值为 0 ppmMOV 53H,#19H ;设报警门限电压1为19HMOV 54H,#32H ;设报警门限电压2为32HMOV 55H,#4BH ;设报警门限电压3为4BHXUNHUAN:ACALL NDJSACALL HBCDACALL HBCD1 ;十六进制转换成BCD码ACALL JISUANACALL FONTLOOP1:ACALL ALARMACALL DELAYACALL DSPYSJMP MAIN ;转主程序INTDATA:CLR EA ; 关中断MOV D
29、PTR,#6FF8H MOVX A,DPTR ; 外部数据送A (数据采样)MOV R0,#40HMOV R0,ASETB F0SETB EA ; 开总中断允许RETI ;从中断返回指令TINT0:CLR EA MOV TH0,#0FFHMOV TL0,#0FFHCPL P3.0 ;取反SETB EARETINDJS: ;AD转换的基准电压为5V,则每01H代表约20mvMOV A,50HMOV B,#04HMUL ABMOV B,40HMUL ABMOV 51H,AMOV 52H,BRETALARM:MOV A,40H ;当40H里面的电压值大于53H某个数时报警SUBB A,53HJC O
30、UT1CLR P2.5MOV A,40H ;当40H里面的电压值大于54H某个数时报警SUBB A,54HJC OUT1CLR P2.6MOV A,40H ;当40H里面的电压值大于55H某个数时报警SUBB A,55HJC OUT1SETB P2.4OUT1:RETDSPY:CLR P2.0CLR P2.1CLR P2.2CLR P2.3MOV A,3AHMOV P1,ASETB P2.3 ACALL DELAY ;显示最低位CLR P2.0CLR P2.1CLR P2.2CLR P2.3MOV A,3BHMOV P1,ASETB P2.2 ACALL DELAY ;显示2位CLR P2.0CLR P2.1CLR P2.2CLR P2.3MOV A,3CHMOV P1,ASETB P2.1 ACALL DELAY ;显示3位CLR P2.0CLR P2.1CLR P2.2CLR P2.3MOV A,3DHMOV
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1