基于AD的流量控制器的设计.docx
《基于AD的流量控制器的设计.docx》由会员分享,可在线阅读,更多相关《基于AD的流量控制器的设计.docx(28页珍藏版)》请在冰豆网上搜索。
![基于AD的流量控制器的设计.docx](https://file1.bdocx.com/fileroot1/2023-2/2/c0596126-00f8-4602-8232-61dc0535bd8c/c0596126-00f8-4602-8232-61dc0535bd8c1.gif)
基于AD的流量控制器的设计
合肥学院
计算机科学与技术系
微型计算机原理与接
口技术课程设计报告
2009~2010学年第一学期
课程
微型计算机原理与接口技术
课程设计名称
基于AD的流量控制器的设计
学生姓名
任远蓉
学号
0704012020
专业班级
07计本
(2)班
指导教师
何立新老师龙夏老师
2010年3月
一.题义分析及解决方案
1.题义需求分析
用STARES598PCI单板开发机设计一个模拟探流器。
用电压信号模拟流量信号,采用A/D转换对模拟电信号进行数字量转换,转换结果通过LED显示,并和预设的阀值相比较,当流量达到预设阀值1后,探测器发出低频率声音报警,当流量达到预设阀值2后,探测流发出高频声音报警。
根据本设计给定的内容和要求,可知:
1)输入的是0-5V模拟电压,最终检测出的输出电压是数字信号,这就需要一个A/D转换器(ADC0809)将模拟信号转换为数字信号。
2)转换结果需要通过LED显示,则可选用8255A作为微处理器的输入输出接口芯片,最后将8位数字信号量显示到LED显示器上。
3)要对信号进行阀值检测,可以自行设定阀值大小:
预设阀值1为2.0V,其所对应的数字量为((2.0/5)*255=102=66H);预设阀值2为4V,其所对应的数字量为((4/5)*255=204=0CCH),事先将其存储在某寄存器或存储单元中。
4)当流量达到预设阀值1后,探测器发出低频率声音报警,当流量达到预设阀值2后,探测流发出高频声音报警。
可用蜂鸣器发出报警声音。
2.解决问题方法及思路
1)硬件部分
ADC0809模数转换器一片(将采集到的模拟电压信号转换成数字信号输出)
可编程并行接口芯片8255一片(作为微处理器的输入输出接口芯片)
七段LED显示器(用来显示电压值)
蜂鸣器一个(用于发出报警声音)
8086通过8255与ADC0809相连,由电位器将模拟电压输入到ADC0809中,由8255采用查询工作方式控制ADC0809工作。
最后8086通过8255向报警系统蜂鸣器以及七段LED显示器发送控制信号。
显示转换后的电压值,并且达到不同的阈值可发出不同频率的报警声音。
2)软件部分
首先应对8255进行初始化设置,设置8255的工作方式和端口地址,为防止刚开始实验就报警,应对C口进行置。
位然后启动ADC0809的程序进行模/数转换,将输入的0-5V的模拟电压信号转换成数字信号并将其保存在AL寄存器中,并将其转换成十进制数存放于BL寄存器中。
然后比较BL的值与事先保存在AL寄存器中的阈值,如果是小于则继续进行采集电压信号并将其转换成十进制数,通过七段LED显示器显示出,当流量达到预设阀值1后,探测器发出低频率声音报警,当流量达到预设阀值2后,探测流发出高频声音报警,其中与蜂鸣器相连的PC1端口置低电平有效,即低电平时进行报警。
报警频率的大小可以通过循环程序的不同次数来实现。
二、硬件设计
1.ADC0809模数转换器
1)ADC0809的作用
利用ADC0809进行模/数转换,将采样结果电压转换8086能应用的数字量。
2)ADC0809的功能分析
模/数转换是指通过一定的电路将模拟量转变为数字量,由于模拟量是连续的,而数字量是离散的,所以,一般在某个范围中的模拟量对应于某一数字量,这就是说,在A/D转换时,模拟量和数字量之间并不是一一对应的关系,即从理论上,有一个转换精度的问题,转换精度反映了A/D转换器的实际输出接近理想输出的精确程度,A/D转换的精度通常是用数字量的最低有效位(LSB)来表示的,设数字量的最低度有效位与对应与模拟量△,这时,我们称△为数字量的最低有效位的当量,ADC0809采用的是逐位逼近A/D转换,逐位逼近A/D转换时,也用D/A转换器的输出电压来驱动运算放大器的反相端,不同的是用逐位式进行转换时,要用一个逐位逼近寄存器存放转换好的数字量,转换结束时,将数字量送到缓冲寄存器中,当启动信号由高电平变为低度电平时,逐位逼近寄存清零,这时D/A转换器输出电压V0也为0,当启动信号变为高电平时,转换开始,同时,逐位逼近寄存器进行计数。
逐位逼近寄存器通常工作是从最高位开始,通过设置试探值来计数,在第一个时钟脉冲时,控制电路反最高位送到逐位逼近寄存器,使它输出为10000000,则D/A转换器输出电压V0为满量程值128/255,若V0大与Vi,则作为比较器的运算放大器的输出成为低电平,控制电路据此清楚逐位寄存器中的最高位;若V0小于Vi,则比较器输出高电平,控制电路使最高位的1保留下来,如果最高位被保留,则值10000000下一个时钟脉冲使次高位D6为1,于是逐位逼近寄存器值为11000000,V0为满量程值192/255,此后,若V0大于Vi,则比较输出低电平,从而使次高位D6复位,如果V0小于Vi,则比较器输出高电平,从而保留高位D6为1,在下一个时钟脉冲D5置1,比较……直到D0为1,再与输入电压比较,经N次比较,寄存器中得到的值就是转换后的数据,转换以后,控制电路送出一个低电平作为结束信号,这个信号的下降沿将逐位逼近寄存器中的数字量送入缓冲寄存器,从而得到数字量输出。
ADC0809原理图如下所示:
3)ADC0809的技术参数
分辨率:
8位是指ADC对输入电压微小变化响应能力的量度,它是数字输出的最低位(LSB)所对应的模拟输入电平值。
若输入电压满刻度值为VFS,转换位数为N。
分辨率1/2NVFS当模拟电压低于此值时,ADC不予响应。
绝对精度:
是指在输出端产生给定的数字代码,实际需要的模拟输入值与理论上需求的模拟输入值之差。
相对精度:
是指满刻度值校准后,任意数字输出所对应的实际模拟输入值与理论值之差。
转换时间:
是指ADC完成一次转换所需时间,既从启动信号开始到转换结束并得到稳定的数字输出量所需时间,通常us级。
量程:
0-5V,指所能转换的输入电压范围。
4)ADC0809的主要性能
8位逐次逼近型A/D转换器,所有引脚的逻辑电平与TTL兼容;
带有锁存功能的8路模拟量转换开关,可对8路0~5V模拟量进行分时转换;
输出具有三态锁存/缓冲功能;
分辨率:
8位,转换时间:
100us;
不可调误差:
±1LSB,功耗:
15mW;
5)ADC0809的引脚功能
D7~D0:
8位数据输出线;
IN7~IN0:
8路模拟信号输入;
ADDC、ADDB、ADDA:
8路模拟信号输入通道的地址选择线;
6)ADC0809的内部结构
有模拟多路转换开关和A/D转换两大部分。
模拟多路转换开关由8路模拟开关和3位地址锁存与译码器组成,地址锁存允许信号ALE将三位地址信号ADDC、ADDB和ADDA进行锁存,然后由译码电路选通其中一路摸信号加到A/D转换部分进行转换。
A/D转换部分包括比较器、逐次逼近寄存器SAR、256R电阻网络、树状电子开关、控制与时序电路等,另外具有三态输出锁存缓冲器,其输出数据线可直接连CPU的数据总线。
2.选择芯片8255A
1)8255A的作用
利用8255将转换后的数字量传送到8086CPU,同时8255A也通过其某些输出量控制ADC0809工作,8255A也用来输出控制量来控制LED显示和报警系统发生报警。
2)8255A的功能分析
8255A是可编程并行接口,内部有3个相互独立的8位数据端口,即A口、B口和C口。
三个端口都可以作为输入端口或输出端口。
A口有三种工作方式:
即方式0、方式1和方式2,而B口只能工作在方式0或方式1下,而C口通常作为联络信号使用。
8255A的工作只有当片选CS有效时才能进行。
而控制逻辑端口实现对其他端口的控制。
CPU接口(数据总线缓冲器和读/写控制逻辑)
数据总线缓冲期:
这事一个8位双向三态缓冲器,三态是由读/写控制逻辑控制的。
这个缓冲器是8255A与CPU数据总线的接口。
所有数据的输入/输出,以及CPU用输出指令向8255A发出的控制字和用输入指令从8255A读入的外设状态信息,都是通过这个缓冲器传递的。
读/写控制逻辑:
它与CPU的6根控制线相连,控制8255A内部的各种操作。
控制线RESRT用来使8255A复位。
和地址线A1及A0用于芯片选择和通道寻址。
控制线和用来决定8位内部和外部数据总线上传送的方向,即控制把CPU的控制命令或输出的数据送到相应的通道,或把状态信息或输入数据送到CPU。
8255A的读/写控制逻辑的作用,是从CPU的地址和控制总线上接受输入的信号,转变成各种命令送到A组或B组控制电路进行相应的操作。
3)8255A的引脚信号
与外设相连的
PA7~PA0:
A口数据信号线
PB7~PB0:
B口数据信号线
PC7~PC0:
C口数据信号线
与CPU相连的
RESET:
复位信号。
当此信号来时,所有寄存器都被清除。
同时三个数据端口被自动置为输入端口。
D7~D0:
片选信号。
在系统中,一般根据全部接口芯片来分配若于地位地址(比如A5、A4、A3)组成各种芯片选择码,当这几位地址组成某一个低电平,于8255A被选中。
只有当有效时,读信号写才对8255A进行读写。
RD:
读信号。
当此信号有效时,CPU可从8255A中读取数据。
WR:
写信号。
当此信号有效时,CPU可向8255A中写入数据。
A1、A0:
端口选择信号。
8255A内部有3个数据端口和1个控制端口,共4个端口。
规定A1、A0:
为00时,选中A端口;为01时,选中B端口;为10时,选中C端口;为11时,选中控制口。
4)8255A的基本操作
WRCSA1A0RD功能
00001对端口A读
输入
00101对端口B读
01001对端口C读
01101非法,不能对D口读
00010对端口A写
输出
00110对端口B写
01010对端口C写
01110对端口D写
1××××数据缓冲器为三态
断开
×
××××1
1
8255A有三种工作方式,用户可以通过编程来设置。
本设计用到工作方式0。
5)8255A的技术参数
其中PER为peripheralport的缩写
输入最低电压:
min-0.5V,max-0.8V,输入最高电压:
2.0V。
输出最低电压:
0.45V。
输出最高电压:
2.4V。
6)8255A的方式控制字
8255A的控制字有两种:
一种是方式选择控制字,另一种是C口按位置位/复位控制字
1方式选择控制字
方式0的工作特点:
这种方式通常不用联络信号,不使用中断,三个通道中的每一个都有可以由程序选定作为输入或输出。
通道的功能为:
两个8位通道:
通道A和B。
两个四位通道:
通道C高4位和低四位,任何一个通道可以作输入/输出,输入是不锁存的,输出是锁存的,在方式0时各个通道的输入/输出可有16种不同的组合。
2C口按位置位/复位控制字
3.七段LED显示器
1)七段LED显示器作用
显示设定的界限值及输入的电压值
2)七段LED显示器的功能分析
七段LED显示器通过汇编语言的控制,可以控制在哪几个数位上,哪几个发光二极管亮,从而显示数字。
其工作原理:
如果发光二极管共阳极,则输入为0时亮,为1时不亮,反之如果发光共阴极,则输入1时亮,0时不亮。
发光二极管是一种外加电压超过额定电压时发生击穿,并因此能产生可发光的器件,数码显示器通常有多个发光二极管来组成七段或八段笔画显示器,当段组合发光时,便会显示某一个数码管或字符,七段代码的各位用作a~g和DP的输入。
3)七段LED显示的技术参数
表2-6七段LED显示的技术参数
PCW
LF
Vr
Ir
If
p
对应变量
散射颜色
BT235
70
25
5
≥1.5
≤2.5
200
SEL-10
红
BT144
100
40
5
≥0.5
≤2.5
565
绿
BT134
100
40
5
≥0.5
≤2.5
585
蓝
主要参数:
此时的驱动电流为25mA。
4)LED原理图
5)LED显示管段选码编码表
dp
g
f
e
d
c
b
a
显示数码
数值
1
0
1
1
1
1
1
1
0.
0BFH
1
0
0
0
0
1
1
0
1.
86H
1
1
0
1
1
0
1
1
2.
0DBH
1
1
0
0
1
1
1
1
3.
0CFH
1
1
1
0
0
1
1
0
4.
0E6H
1
1
1
0
1
1
0
1
5.
0EDH
1
1
1
1
1
1
0
1
6.
0FDH
1
0
0
0
0
1
1
1
7.
87H
1
1
1
1
1
1
1
1
8.
0FFH
1
1
1
0
1
1
1
1
9.
0EFH
0
0
1
1
1
1
1
1
0
3FH
0
0
0
0
0
1
1
0
1
06H
0
1
0
1
1
0
1
1
2
5BH
0
1
0
0
1
1
1
1
3
47H
0
1
1
0
0
1
1
0
4
66H
0
1
1
0
1
1
0
1
5
6DH
0
1
1
1
1
1
0
1
6
7DH
0
0
0
0
0
1
1
1
7
07H
0
1
1
1
1
1
1
1
8
7FH
0
1
1
0
1
1
1
1
9
6FH
4.蜂鸣器
图蜂鸣器原理图
1)蜂鸣器在本设计中的作用:
在本设计中,蜂鸣器用于电压值越界时声音报警。
2)蜂鸣器的功能分析:
扬声器是将电能转化成声能,并将声能辐射到空气中去的一种电声转换器件。
3)蜂鸣器的技术参数:
它一般包括灵敏度、频率响应、额定功率、额定阻抗、指向性、失真、音质听感评价等。
本实验电压范围为0-5V。
5.总硬件逻辑图及其说明
硬件总逻辑图如下图所示:
说明:
实验硬件原理图由8086CPU、8255A、ADC0809、七段LED显示器构成,8086CPU的地址线经锁存器后与各个芯片相连,A1、A2分别与8255A、ADC0809的A0、A1相连,CS1、CS2分别接8255A、ADC0809的CS端,ADC0809的IN0为通道输入信号,ADC0809转换后的数据从ADDA、ADDB、ADDC输出到A0、A1、A2口,8255A的A口作为二位七段LED的段选码,B口作为位选码,C口控制蜂鸣器。
三、控制程序设计
1.控制程序设计思路说明
本实验中,通过电位器输入的为模拟电压信号,必须通过ADC0809芯片将模拟信号转换成数字信号,并将其保存在BL寄存器中。
比较BL中值与预设阈值的大小,并通过8255控制LED显示出转换后的电压值和控制报警系统,实现越界提示报警。
因此先需要对8255A进行初始化,使A、B、C口均为输出口,C口置位,防止刚开始实验就报警。
然后启动ADC0809开始转换,等待0809转换完毕,将电压采集到al中,并转换为十进制数。
接着将转换后的电压值与事先所设置的阈值相比较,当采样电压值大于或等于阈值1时,系统将产生低频报警,大于等于阈值2时,系统将产生高频报警。
反之,则只是在LED显示,不产生报警。
其中通过8255对七段LED显示器位选、段选,将转换值以十进制形式输出。
报警系统的频率大小通过软件设计实现让让蜂鸣器实现低频和高频声音报警,PC1置为0,系统产生报警。
并且通过延时子程序控制报警时间。
2.控制程序流程图
主程序流程图如下图所示:
启动ADC0809开始转化的流程
如下图所示:
LED显示子程序的流程图如下所示:
3.控制程序
.MODELTINY
PCIBAR3EQU1CH;8位I/O空间基地址(它就是实验仪的基地址,也为DMA&32BITRAM板卡上的8237提供基地址)
Vendor_IDEQU10EBH;厂商ID号
Device_IDEQU8376;设备ID号
.STACK100
.DATA
IO_Bit8_BaseAddressDW?
msg0DB'BIOS不支持访问PCI$'
msg1DB'找不到StarPCI9052板卡$'
msg2DB'读8位I/O空间基地址时出错$'
COM_ADDDW00F3H
PA_ADDDW00F0H
PB_ADDDW00F1H
PC_ADDDW00F2H
ADDR_0809DW00E0H
X1DB66H
X2DB0CCH
BUFFERDB'$'
ADB?
BDB?
LEDDB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H;代码段
.CODE
START:
movax,@DATA
movds,ax
nop
callInitPCI
callModifyAddress;根据PCI提供的基地址,将偏移地址转化为实地址
movdx,COM_ADD
moval,80h;初始化8255,PA,PB,PC输出
outdx,al
moval,0ffh
movdx,PC_ADD;C口置位,防止刚开始实验就报警
outdx,al
START1:
movA,2
moval,00H
movdx,ADDR_0809;启动ADC0809开始转换
outdx,al
movdx,IO_Bit8_BaseAddress
movcx,50
DELAY1:
inal,dx
loopDELAY1;等待0809转换完毕
movdx,ADDR_0809
inal,dx;电压采集到al
pushax
xorah,ah
movbl,51;255/51(16进制的1=1/51V)
divbl
movBUFFER,al;整数部分
moval,10
mulah
divbl
movBUFFER+1,al;第一位小数
moval,10
mulah
divbl
movBUFFER+2,al;第二位小数
popbx
moval,X2
cmpbl,al;和阈值2比较
jaHIGH0
moval,X1
cmpbl,al;和阈值1比较
jaLOW0
movB,0
jmpdisplay1
HIGH0:
;高频报警
movB,2
jmpdisplay1
LOW0:
;低频报警
movB,1
jmpdisplay1
display1:
movcx,10
DISPLAY2:
;LED显示电压
movdx,PC_ADD
moval,a
outdx,al
movah,20
display3:
movbx,offsetLED
moval,BUFFER
xlat
movdx,PA_ADD;A口显示数字段码
oral,80h;显示小数点
outdx,al
movdx,PB_ADD;B口LED位选
moval,0FBH
outdx,al
callDELAY01;延时使人眼能分辨
moval,BUFFER+1
xlat
movdx,PA_ADD
outdx,al
movdx,PB_ADD
moval,0FDH
outdx,al
callDELAY01
moval,BUFFER+2
xlat
movdx,PA_ADD
outdx,al
movdx,PB_ADD
moval,0FEH
outdx,al
callDELAY01
decah
jedisplay3
moval,B
addA,al
loopDISPLAY2
jmpSTART1
DELAY01PROCNEAR
pushcx
movcx,65535;延时
loop1:
NOP
looploop1
popcx
ret
DELAY01endp
;******控制程序结束******;
InitPCIPROCNEAR
MOVAH,00H
MOVAL,03H
INT10H;清屏
MOVAH,0B1H
MOVAL,01H
INT1AH
CMPAH,0
JZInitPCI2
LEADX,msg0
InitPCI1:
MOVAH,09H
INT21H
JMPExit
InitPCI2:
MOVAH,0B1H
MOVAL,02H
MOVCX,Device_ID
MOVDX,Vendor_ID
MOVSI,0
INT1AH
JNCInitPCI3;是否存在StarPCI9052板卡
LEADX,msg1
JMPInitPCI1
InitPCI3:
MOVDI,PCIBAR3
MOVAH,0B1H
MOVAL,09H
INT1AH;读取该卡PCI9052基地址
JNCInitPCI4
LEADX,msg2
JMPInitPCI1
InitPCI4:
ANDCX,0FFFCH
MOVIO_Bit8_BaseAddress,CX
RET
InitPCIENDP
ModifyAddressPROCNEAR
ADDCOM_ADD,CX
ADDPA_ADD,CX
ADDPB_ADD,CX
ADDPC_ADD,CX
ADDADDR_0809,CX
RET
RET
ModifyAddressENDP
Exit:
MOVAH,4CH
INT21H
ENDSTART
四.上机调试过程
1.硬件调试
1)按照原来预习时所设计的实验原理图接好线后,装载程序完毕后运行,发现LED显示器显示的每一位数字都无法辨认出来于是我尝试将连接LED的两根排线重新换了新的排线;
2)实验刚开始我是用了8255A的PC0端口控制蜂鸣器的报警的,但是实验刚运行时就一直开始报警不停;
2.软件调试
1)原来编写的显示程序的子程序HIGH和LOW中用到的al和dx没有入栈保存,在调试过程中将其入栈保存起来了;
2)在调节电位器的电压过程中,当LED显示器显示的电压大于2V即开始低频报警时,LED显示的最后一位数字总是停留