打印CO改进版.docx
《打印CO改进版.docx》由会员分享,可在线阅读,更多相关《打印CO改进版.docx(34页珍藏版)》请在冰豆网上搜索。
打印CO改进版
目录
第1章绪论1
1.1课题研究的目的意义1
1.2国内外研究现状2
1.2.1一氧化碳检测的现状2
1.2.2我国CO检测的发展2
1.2.3各国一氧化碳检测的发展3
1.3CO传感器3
1.3.1电化学传感器3
1.3.2本设计CO传感器的选择4
第2章总体设计方案5
2.1设计思路5
2.2主要算法5
2.2.1初步考虑的算法5
2.2.2实际应用的算法6
第3章软件设计7
3.1主程序设计7
3.2A/D转换程序的设计8
3.2.1ADC0809简介8
3.2.2A/D转换子程序9
3.2.3A/D转换程序流程图10
3.3报警子程序11
3.4显示程序设计12
3.5十六进制转BCD码17
第4章Keil软件的运用18
4.1Keil工程的建立18
4.1.1源文件的建立18
4.1.2建立工程文件18
4.2工程的详细设置20
4.3编译、连接23
4.4KeilC51软件与Proteus软件的结合23
4.4.1编译、调试23
4.4.2ProteusISIS与Keil的接口24
4.4.3Proteus软件的介绍24
4.4.4Proteus缺点和不足26
第5章系统调试及仿真27
5.1软件调试27
5.2现场调试28
5.3系统仿真结果显示29
第6章结论与展望32
6.1结论32
6.2展望32
参考文献34
致谢35
附录A外文资料翻译36
附录B源程序47
第2章总体设计方案
2.1设计思路
本设计是由软件和硬件的配合来实现的,我的主要工作就是软件的设计,在了解电路设计原理后,根据原理和目的画出程序流程图,用汇编语言进行编程,如A/D转换程序,报警程序,显示程序及所用到的进制转换程序,即十六进制转换成十进制。
系统工作时,首先进行初始化等准备工作。
然后进行数据采集,经过硬件的放大滤波处理后,送至单片机进行数据的处理。
单片机根据输入的信号进行浓度计算,最后得到浓度值。
系统软件采取模块化结构,主程序分别调用初始化程序,A/D采样程序,LED显示程序(声光报警和外围控制程序),结果存储程序等,来完成整个传感器输出信号的智能量化过程。
设计中用到了keil编译软件,其作用是对编写好的程序进行编译,产生HEX文件,此格式的文件可以用于proteus环境中的仿真。
第3章软件设计
3.1主程序设计
主程序是软件的主体框架,它的主要任务是首先完成系统初始化,然后循环判断各个标志,一旦满足条件就进入相应的子功能模块中,当处理完后再返回到主循环中。
CO检测的主程序流程如下图所示。
为了便于调试、连接和扩展,采用模块化程序设计技术,模块间任务划分明确、耦合清晰,避免了重复设计,彼此间具有相对的独立性。
系统上电后,首先对单片机自身初始化,包括设置堆栈指针、中断禁止及优先级的决定、设置各个定时器/计数器的工作方式等,然后对A/D初始化。
A/D初始化后系统开始工作,首先采样CO浓度并显示,超过安全值报警。
图3-1主程序流程图
单片机初始化程序:
ORG0000H
AJMPMAIN
ORG0003H;外部中断0地址入口
AJMPINTDATA
ORG000BH;定时器0的中断向量地址
AJMPTINT0
ORG0100H
MAIN:
MOVSP,#70H;把堆栈起始地址设在70H
MOVTMOD,#11H;设T0、T1为16位定时器
MOVTH0,#0FFH
MOVTL0,#0F7H;T0定时器初值提供大约250KHZ的频率给ADC0809的CLOCK
SETBTR0;开启T0定时器
SETBET0;允许T0中断
3.2A/D转换程序的设计
3.2.1ADC0809简介
ADC0809是采样频率为8位的、以逐次逼近原理进行模数转换的器件。
其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8个单段模拟输入信号中的一个进行A/D转换[6]。
1.主要特性:
(1)8路8位A/D转换器,即分辨率8位。
(2)具有转换起停控制端。
(3)转换时间为100μs。
(4)单个+5V电源供电。
(5)模拟输入电压范围0~+5V,不需零点和满刻度校准。
(6)工作温度范围为-40~+85℃。
(7)低功耗,约15mW。
2.内部结构:
ADC0809是CMOS单片型逐次逼近式A/D转换器,它由8路模拟开关、地址锁存与译码器、比较器、8位开关树型A/D转换器、逐次逼近。
3.外部特性(引脚功能):
ADC0809芯片有28条引脚,采用双列直插式封装。
下面说明各引脚功能。
IN0~IN7:
8路模拟量输入端。
OUT1~OUT7:
8位数字量输出端。
ADDA、ADDB、ADDC:
3位地址输入线,用于选通8路模拟输入中的一路。
ALE:
地址锁存允许信号,输入,高电平有效。
START:
A/D转换启动信号,输入,高电平有效。
EOC:
A/D转换结束信号,输出,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)。
OE:
数据输出允许信号,输入,高电平有效。
当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输入高电平时,输出三态门打开,转换结果的数字量输出到数据总线上[7]。
3.2.2A/D转换子程序
SETBEA;开启总中断
CLRF0;清F0
MOVDPTR,#6FF8H
MOVX@DPTR,A;启动AD
SETBIT0;设为下降沿有效
SETBEX0;开外中断0允许
CLRP2.4
SETBP2.5
SETBP2.6;报警电路复位
LOOP:
JNBF0,LOOP;等待AD转换结束,电压值的十六进制数读到40H里面
3.2.3A/D转换程序流程图
在启动A/D转换时,由写信号/WR和P2.7控制ADC0809的地址锁存和转换启动;在读取转换结果时,由读信号/RD和P2.7控制ADC0809的OE信号。
令P2.7=0,A0、A1、A2给出被选择的模拟通道的地址,令A0A1A2=000,这时的ADC0809的地址是6FF8H,且指向通道0(IN0)。
3.3报警子程序
程序流程图:
报警程序:
ALARM:
MOVA,40H;当40H里面的电压值大于53H某个数时报警
SUBBA,53H
JCOUT1
CLRP2.5
MOVA,40H;当40H里面的电压值大于54H某个数时报警
SUBBA,54H
JCOUT1
CLRP2.6
MOVA,40H;当40H里面的电压值大于55H某个数时报警
SUBBA,55H
JCOUT1
SETBP2.4
OUT1:
RET
3.4显示程序设计
在单片机系统中,通常用LED数码显示器来显示各种数字或符号。
由于它具有显示清晰、亮度高、使用电压低、寿命长的特点,因此使用非常广泛。
LED显示是用发光二极管显示字段的显示器件,也可称为数码管,其外形结构如图所示,由图可见它由8个发光二极管构成,通过不同的组合可用来显示0~9、A~F及小数点。
图3-4“8”字型数码管
图3-5共阴极数码管与共阳极数码管
LED显示器分为共阴极和共阳极,共阴极是将8个发光二极管阴极连接在一起作为公共端,而共阳极是将8个发光二极管的阳极连接在一起作为公共端。
我们这次就是采用的共阳极LED,所以这里要介绍共阳极数码管。
LED显示器有静态和动态显示两种方式,静态显示是将共阴极联到一起接地,每位的显示段(a-dp)分别与一个8位的锁存器输出相连。
由于显示的各位可以相互独立,各位可以互相显示,只要在该位的段选线上保持段选码电平,该位就能保持相应的显示字符。
并且由于各位由一个8位锁存器控制段选线,故在同一时间内每一位显示的字符可以不同,这种方式占用锁存器较多。
动态显示是将所有位的段选线相应的并联在一起,由一个8位的I/O口控制,形成段选线的多路复用。
而各位的阴极分别由相应的I/O口控制,实现各位的分时选通。
要LED能够显示相应的字符,就必须采用动态扫描方式,只要每位显示的时间足够短,则可造成多位同时显示的假象,达成显示的目的。
在数字电路中常常要把数据或运算结果通过半导体数码管、液晶数码和荧光数码管,用十进制数显示出来。
发光二极管的工作电压为1.5-3.0V,工作电流为几毫安到几十毫安,寿命很长。
半导体数码管将十位数分成七个字段,每段为一个发光二极管,其字形结构如上图所示,选择不同的字段发光,可显示出不同的字型。
例如:
当a,b,c,d,e,f,g七个字段同时亮时,显示b、c段亮时,显示出1。
共阳极:
把发光二极管的阳极连在一起构成共阳极。
使用时公共端接Vcc,当某阳极为低电平时,该发光二极管就导通发光。
输出一个段码就可以控制LED显示器的字型。
LED显示器工作在静态显示时,其公共阳极(或阴极)接Vcc(GND),一直处于显示有效状态,所以每一位的显示内容必须由锁存器加以锁存,显示各位相互独立。
静态显示时,LED的亮度高,容易控制,但消耗大,所需口线多。
若显示位数增多,则静态显示方式很难适应。
故本设计采用动态显示方式,LED为共阳极[8]。
表2-2共阳极七段LED显示字型编码表
显示字符
共阳极段选码
显示字符
共阳极段选码
0
C0H
B
C6H
1
F9H
C
A1H
2
A4H
D
86H
3
B0H
E
8EH
4
99H
F
8CH
5
92H
P
C1H
6
82H
U
CEH
7
F8H
R
91H
8
80H
Y
89H
9
90H
8.
C7H
A
88H
不显示
FFH
显示子程序:
CLRP2.0
CLRP2.1
CLRP2.2
CLRP2.3;关所有数码管
MOVA,3AH
MOVP1,A
SETBP2.3;置P2.3高位
ACALLDELAY;显示最低位
CLRP2.0
CLRP2.1
CLRP2.2
CLRP2.3;关所有数码管
MOVA,3BH
MOVP1,A
SETBP2.2;置P2.2高位
ACALLDELAY;显示2位
CLRP2.0
CLRP2.1
CLRP2.2
CLRP2.3;关所有数码管
MOVA,3CH
MOVP1,A
SETBP2.1;置P2.1高位
ACALLDELAY;显示3位
CLRP2.0
CLRP2.1
CLRP2.2
CLRP2.3;关所有数码管
MOVA,3DH
MOVP1,A
SETBP2.0;置P2.0高位
ACALLDELAY;显示4位
CLRP2.0
CLRP2.1
CLRP2.2
CLRP2.3;关所有数码管
RET
TAB:
DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,8CH
END
显示流程图:
3.5十六进制转BCD码
我们所设计的CO测试仪检测的CO气体的浓度数据由数码管显示出来,数码管显示的数据为十进制,而程序中的运算值为十六进制数,因此需要将程序中的十六进制转换为十进制BCD码。
以下这两段程序就是我所设计的转换程序。
程序设计思路:
先将十六进制的数除以100,商为百位的BCD码;再将余数除以10,商为十位的BCD码,余数为个位数的BCD码。
把低三位的十六进制转换为十进制BCD码:
HBCD:
MOVA,51H;将低三位数赋给A
MOVB,#100;B取值100
DIVAB
MOV32H,A;将百位的BCD码放在32H
MOVA,#10;A取值10
XCHA,B;交换A,B
DIVAB
MOV31H,A;将十位BCD码放于31H
MOV30H,B;将个位BCD码放于30H
RET
把高三位的十六进制转换为十进制BCD码:
HBCD1:
MOVA,52H;将高三位数赋给A
MOVB,#100;B取值100
DIVAB
MOV35H,A;将百位的BCD码放在35H
MOVA,#10;A取值10
XCHA,B;交换A,B
DIVAB
MOV34H,A;将十位BCD码放于34H
MOV33H,B;将个位BCD码放于33H
RET
第5章系统调试及仿真
单片机应用系统的调试是系统开发的重要环节。
当完成了单片机应用系统的硬件、软件设计和硬件组装后,便可进入应用系统调试阶段。
系统调试的目的是查出系统中硬件设计和软件设计中存在的错误及可能出现的不协调的问题,以便修改设计,最终使系统能正确地工作。
系统调试包括软件调试、硬件调试及软硬件联调。
根据调试环境不同,系统调试又分为模拟调试与现场调试。
各种调试所起的作用是不同的,他们所处的时间段也不一样,但他们的目标是一致的,都是为了查出系统中潜在的错误[11]。
5.1软件调试
软件调试与所选用的软件结构和程序设计技术有关。
如果采用模块程序设计技术,则逐个模块调好以后,再进行系统程序总调试。
如果采用实时多任务操作系统,一般是逐个任务,下面进一步予以说明。
对于模块结构程序,要一个个子程序分别调试。
调试子程序时,一定要符合现场环境,即入口条件和出口条件。
调试的手段可采用单步运行方式和断点运行方式,通过检查用户系统CPU的现场、RAM的内容和I/O口的状态,检测程序执行结果是否符合设计要求。
通过检测,可以发现程序中的死循环错误、机器码错误及转移地址的错误,同时也可以发现用户系统中的硬件故障、软件算法及硬件设计错误。
在调试过程中不断调整用户系统的软件和硬件,逐步通过一个个程序模块。
各程序模块通过后,可以把各功能块联合起来一起进行整体程序综合调试。
在这阶段若发生故障,可以考虑各子程序在运行时是否破坏现场,缓冲单元是否发生冲突,零位的建立和清除在设计上有否失误,堆栈区域有否溢出,输入设备的状态是否正常,等等。
若用户系统是在开发系统的监控程序下运行时,还要考虑用户缓冲单元是否和监控程序的工作单元发生冲突。
单步和断点调试后,还应进行连续调试,这是因为单步运行只能验证程序的正确与否,而不能确定定时精度、CPU的实时响应等问题。
待全部完成后,应反复运行多次,除了观察稳定性之外,还要观察用户系统的操作是否符合原始设计要求、安排的用户操作是否合理等,必要时还要作适当修正。
对于实时多任务操作系统的调试方法与上述方法有很多相似之处,只是实时多任务操作系统的应用程序是由若干个任务程序组成,一般是逐个任务进行调试,在调试某一个任务时,同时也调试相关的子程序、中断服务程序和一些操作系统的程序。
逐个任务调试好以后,再使各个任务同时运行,如果操作系统中没有错误,一般情况下系统就能正常运转。
在全部调试和修改完成后,将用户软件固化于EPROM中,插入用户样机后,用户系统即能脱离开发机独立工作,至此系统研制完成。
系统调试是指让用户系统的软件在其硬件上运行,进行软硬件联合调试,从中发现硬件错误或软件错误。
系统调试主要解决以下问题:
(1)系统的软、硬件能否按预定的要求配合工作;
(2)系统运行中是否有潜在的设计时难以预料的错误;
(3)系统的动态性能指标是否满足设计要求。
系统联调时,首先采用单步、断点、连续运行方式调试与硬件相关的各段程序,即可检验这些程序段的正确性,又可在各功能独立的情况下,查验软、硬件的配合情况。
然后,将软、硬件按系统工作要求进行综合运行,解决在系统总体运行情况下软、硬件的协调,以提高系统动态性能。
在具体操作中,用户系统在开发系统环境下,先借用仿真器的单片机、存储器等资源进行工作。
若发现问题,按上述软、硬件调试方法准确定位错误,分析错误原因,找出解决办法。
调试需要一定的技巧,在keil软件环境中用F10键可单步调试,需要很多时间,因此可以通过人为改变定时器里的TH0和TL0值减少执行的次数,也可以在程序中改变TH0和TL0,不过在程序中改变必须重新编译后再调试;在使用I/O端口的同时,也可以直接在对话框中改变端口的值,从而模拟简单的信号输入,最主要的是可以通过人为改变P3口的值调用中断和模拟时钟输入,还可以模拟I/O端口的输出和外部I/O设备。
在实际中充分利用uVision3软件的仿真功能,可以大大节省时间。
5.2现场调试
一般情况下,通过系统联调后,用户系统就可以按照设计目标正常工作了。
但在某些情况下,由于用户系统运行环境较为复杂(如环境干扰较为严重工作现场有腐蚀性气体)在现场实际工作之前,环境对系统的影响无法预料,只能通过现场运行调试来发现问题,找出相应的解决方法;或者虽然已经在系统设计时考虑到抗干扰的对策,但是否行之有效,还必须通过用户系统在实际现场的运行来加以验证。
另外,有些用户系统的调试是在模拟设备代替实际检测、控制对象的情况下进行的,这就更有必要的过程,只有经过现场调试的用户系统才能可靠工作。
现场调试仍需利用开发系统来完成,其调试方法与前述类似[12]。
5.3系统仿真结果显示
以下三幅图是仿真过程中,三个不同的报警门限电压所对应的CO浓度的数码显示值,因为现实中CO浓度的超标值分几个不同等级,设计中我取200,400,600ppm三个标度值。
当浓度超过200,就意味着CO浓度已经超标,对人体会产生不良影响;当浓度显示值超过400,人们对此会有较严重的反应;当CO浓度超过600ppm时,短期内便会引起窒息死亡。
设计中的三个门限电压,是在报警子程序之前制定的,即
MOV53H,#19H;设报警门限电压1为19H
MOV54H,#32H;设报警门限电压2为32H
MOV55H,#4BH;设报警门限电压3为4BH
(1)当CO浓度值超过200时,红色报警指示灯D40开始闪烁,以示报警。
如下图所示,红色报警灯开始工作。
图5-1仿真结果显示1
(2)当CO浓度值超过400时,蓝色报警指示灯D41开始闪烁,以示报警。
这时红色指示灯D40和蓝色指示灯D41同时闪烁。
如下图所示,红色报警灯和蓝色指示灯同时开始工作。
图5-2仿真结果显示2
(3)当CO浓度超过600时,报警喇叭LS1也开始工作。
这种情况是最严重的报警状态,两个报警灯和报警喇叭同时工作。
如下图所示,三个报警装置同时开始工作。
图5-3仿真结果显示3
说明:
系统仿真毕竟是在不考虑干扰因素的前提下进行的,所以和现实肯定存在差异。
其差异的主要来源就是实际环境中的温度,湿度等因素的影响及人为操作上的失误。
虽然如此,仿真结果仍是设计成败的一个最有利的说明,仿真成功后才可以进行下一步的实物设计。
附录B源程序
ORG0000H
AJMPMAIN
ORG0003H;外部中断0地址入口
AJMPINTDATA
ORG000BH;定时器0的中断向量地址
AJMPTINT0
ORG0100H
MAIN:
MOVSP,#70H;把堆栈起始地址设在70H
MOVTMOD,#11H;设T0、T1为16位定时器
MOVTH0,#0FFH
MOVTL0,#0F7H;提供大约250HZ的频率给ADC0808的CLOCK
SETBTR0;开启T0定时器
SETBET0;允许T0中断
SETBEA;开总中断允许
CLRF0
MOVDPTR,#6FF8H
MOVX@DPTR,A;启动AD
SETBIT0;设为下降沿触发
SETBEX0;开外中断0允许
CLRP2.4
SETBP2.5
SETBP2.6;报警电路复位
LOOP:
JNBF0,LOOP;等待AD转换结束,电压值的十六进制数读到40H里面
MOV50H,#2;存浓度计算比例系数K
MOV51H,#0
MOV52H,#0;浓度初始值为0ppm
MOV53H,#19H;设报警门限电压1为19H
MOV54H,#32H;设报警门限电压2为32H
MOV55H,#4BH;设报警门限电压3为4BH
XUNHUAN:
ACALLNDJS
ACALLHBCD
ACALLHBCD1;十六进制转换成BCD码
ACALLJISUAN
ACALLFONT
LOOP1:
ACALLALARM
ACALLDELAY
ACALLDSPY
SJMPMAIN;转主程序
INTDATA:
CLREA;关中断
MOVDPTR,#6FF8H
MOVXA,@DPTR;外部数据送A(数据采样)
MOVR0,#40H
MOV@R0,A
SETBF0
SETBEA;开总中断允许
RETI;从中断返回指令
TINT0:
CLREA
MOVTH0,#0FFH
MOVTL0,#0FFH
CPLP3.0;取反
SETBEA
RETI
NDJS:
;AD转换的基准电压为5V,则每01H代表约20mv
MOVA,50H
MOVB,#04H
MULAB
MOVB,40H
MULAB
MOV51H,A
MOV52H,B
RET
ALARM:
MOVA,40H;当40H里面的电压值大于53H某个数时报警
SUBBA,53H
JCOUT1
CLRP2.5
MOVA,40H;当40H里面的电压值大于54H某个数时报警
SUBBA,54H
JCOUT1
CLRP2.6
MOVA,40H;当40H里面的电压值大于55H某个数时报警
SUBBA,55H
JCOUT1
SETBP2.4
OUT1:
RET
DSPY:
CLRP2.0
CLRP2.1
CLRP2.2
CLRP2.3
MOVA,3AH
MOVP1,A
SETBP2.3
ACALLDELAY;显示最低位
CLRP2.0
CLRP2.1
CLRP2.2
CLRP2.3
MOVA,3BH
MOVP1,A
SETBP2.2
ACALLDELAY;显示2位
CLRP2.0
CLRP2.1
CLRP2.2
CLRP2.3
MOVA,3CH
MOVP1,A
SETBP2.1
ACALLDELAY;显示3位
CLRP2.0
CLRP2.1
CLRP2.2
CLRP2.3
MOVA,3DH
MOV