ADC0809单通道模拟电压采集电路.docx
《ADC0809单通道模拟电压采集电路.docx》由会员分享,可在线阅读,更多相关《ADC0809单通道模拟电压采集电路.docx(16页珍藏版)》请在冰豆网上搜索。
ADC0809单通道模拟电压采集电路
微型计算机技术
课程设计
指导教师:
程世旭刘元超
学生班级:
计科10606班
学生姓名:
古莹
学号:
6
班内序号:
4
课设日期:
2009年9月14日~2009年9月27日
一.设计目的
二.实验平台和所用器材
三.设计内容
四.设计原理
五.程序流程图
六.调试分析
七.原理图设计
八.程序清单
九.收获、体会和建议
一设计目的
1.通过本设计,使学生综合运用《微型计算机技术》、《汇编语言程序设计》以及电子技术等课程的内容,为以后从事计算机检测与控制工作奠定一定的基础。
2.主要掌握并行I/O接口芯片8253、8255A、ADC0809及中断控制芯片8259A等可编程器件的使用,掌握译码器74LS138的使用。
3.学会用汇编语言编写一个较完整的实用程序。
4.掌握微型计算机技术应用开发的全过程:
分析需求、设计原理图、选用元器件、布线、编程、调试、撰写报告等步骤。
二实验平台和所用器材
本实验是在windowsXP操作系统上实现的,程序的开发环境是用实验室的课设平台,所用到的器材如下:
1一块实验面包版(内含时钟电路)。
2可编程芯片8253、8255A、ADC0809和译码器芯片74LS138、74LS245各一片。
3可调电位器4.7KΩ一个、发光二极管8个、74LS06芯片2个。
4导线若干。
5示波器、万用表、常用工具等。
三设计内容
采用ADC0809设计一个单通道模拟电压采集电路,要求对所接通道的变化的模拟电压值进行采集,采集来的数字量一路送至发光二极管指示,一路送至计算机显示到屏幕上,每行显示5个数据,采集完100个数据后停止采集过程,采集过程中按下ESC键也可中断采集过程。
首先要求我们定义出选择菜单,给出显示界面。
1.8255的自检测
这部分要求我们初始化8255,为了能够正确的看出8255已经初始化,当8255初始化后向B口送数据0FH到发光二管上显示,如果能够正确显示就说明8255已经被初始化。
并且可以说明74LS245,8255,74LS06能够正常工作,并且他们的连线都正确。
1.8253的自检测
这部分要求我们初始化8253,8253初始化后可以通过示波器观察输出的波形是否满足要求。
3.进行A/D转换
这部分是本次课设的关键部分,在做此之前,必须保证8255和8253都被正确的初始化,通过8255的C口控制ADC0809对模拟数据的采集,然后从A口读取转换后的数据,一路送发光二极管显示,一路送显示器上显示,模拟量由电位器得到。
2.退出系统
如果用户需要结束程序,从菜单上选择此菜单即可退出程序.
四设计原理
1、使用Protues或Protel设计出正确电路原理图,设计原理如下:
,一端接地,调节电位器得到变化的模拟电压,该电压接至ADC0809的某一通道输入端(如IN0),ADC0809的时钟为500KHz,由8253对面包板上时钟1MHz或2MHz分频后得到,8253的端口地址:
300H~303H。
b.编程启动ADC0809转换(ADC0809完成一次转换的时间大约为120μs),将ADC0809的EOC引脚信号作为中断信号,若转换结束则进入中断服务程序。
在中断服务程序中读入模数转换结果,一路送至发光二极管显示,一路送至计算机显示到屏幕上。
c.8255A用做CPU和ADC0809间的接口芯片,ADC0809的控制信号(如OE、ALE、START等)可由8255A的PC口提供,模数转换后的数字量可经8255A的PA口读入,经8255A的PB口输出到发光二极管。
8255A端口地址:
304H~307H。
d.译码电路由74LS138提供。
74LS245用于总线和8255A之间的数据的双向传输和隔离。
◆MFPTPCI总线驱动板逻辑结构如图所示
◆芯片简介
(1)74LS245的功能表
●74LS245数据总路线缓冲器
●74LS245的功能表
(2)ADC0809简介
◆引脚信号
Ø提供一个8通道的多路开关和寻址逻辑
●IN0~IN7:
8个模拟电压输入端
●ADDA、ADDB、ADDC:
3个地址输入线
●ALE:
地址锁存允许信号
ØALE的上升沿用于锁存3个地址输入的状态,然后由译码器从8个模拟输入中选择一个模拟输入端进行A/D转换。
◆ADC0809的外部特性
◆
◆ADC0809的数字输出
ADC0809内部锁存转换后的数字量
具有三态数字量输出端D0~D7
配合输出允许信号OE
当输出允许信号OE为高电平有效时,将三态锁存缓冲器的数字量从D0~D7输出
注:
其它的芯片查阅微型计算机技术的书。
(3)8255A与ADC0809的连接
(4)8253定时/计数器
Ø对8253进行编程,定时100ms后,产生中断,该定时信号(OUT0)送入到系统预留给用户的IRQ2(或IRQ10)引脚产生中断,在中断服务子程序中,启动一次ADC0809模数转换,ADC0809采用查询方式工作。
IRQ10中断向量号为72H
Ø8253的时钟(CLK0)取自MFID实验平台。
2、编写程序初始化8255和8253
(1)初始化8255:
8255有四个寄存器,地址为300h-303h,分别为A口,B口,C口,和控制口,首先要向C口写入控制字,控制字格式如下:
●工作方式控制
D7D6D5D4D3D2D1D0
特征位
1
A组方式选择
端口A输入/输出
C口高四位输入/输出
B组方式选择
端口B输入/输出
端口C低四位输入/输出
●C端口置位/复位控制
D7D6D5D4D3D2D1D0
特征位0
任意
位选择
置位/复位0为复位,1为置位
可用如下代码初始化8255:
MOVDX,307H;给8055控制口,初始化8255
MOVAL,98H;AL=10010000,写8255控制字,A口输入,B口输出,C口高/低四位输出
OUTDX,AL
(2)初始化8253
8253控制字格式如下:
D7D6D5D4D3D2D1D0
计数器选择
读写格式
工作方式
计数方式
MOVDX,303H;给8053控制字口
MOVAL,00010100B;计数器0工作在方式2,只低八位,用二进制
OUTDX,AL
MOVDX,300H;给计数器0初值2
MOVAL,2
OUTDX,AL
3、编写中断服务子程序
首先要设置好中断向量,这里是调用72H号中断,在里面写入A/D转换的中断服务子程序地址,所以要保存原来72H中断向量表里面的内容,最后在程序完成时要恢复72H里的内容,在执行这些操作的时候是不容许中断的,所以要关中断,操作完成后要开中断,可以用以下指令来完成:
MOVAX,3572H;获取原中断向量
INT21H
MOVINT0A_OFF,BX;保存x中断向量
MOVBX,ES
MOVINT0A_SEG,BX
CLI;关中断
MOVAX,2572H
MOVDX,SEGLEDLIGHT;设置新的中断向量
PUSHDS
MOVDS,DX
MOVDX,OFFSETLEDLIGHT
INT21H
POPDS
STI;开中断
要想启动0809进行转换,首先必须有一个start信号,该信号为:
数据采集之后,恢复中断向量,部分程序如下:
MOVAX,2572H;恢复中断向量
MOVDX,INT0A_SEG
PUSHDS
MOVDS,DX
MOVDX,INT0A_OFF
INT21H
POPDS
INAL,0A1H;屏蔽IRQ10
ORAL,04H
OUT0A1H,AL
MOVAX,4C00H;程序退出
INT21H
LEDLIGHTPROCFAR;中断服务程序
PUSHSI
PUSHAX
PUSHDX
CLI;关中断
MOVDX,307H
MOVAL,5H;AL=00000101使PC2口为高,读取转换结果到PA口
OUTDX,AL
MOVDX,304;从A口读取数据
INAL,DX
PUSHAX;先保存数据
SHOW:
ANDAL,0F0H;显示高四位
MOVCL,04
SHRAL,CL
CMPAL,9
JAHEX
ADDAL,30H
JMPNEXT
HEX:
ADDAL,37H
NEXT:
MOVDL,AL
MOVAH,2;输出显示高四位
INT21H
POPAX
ANDAL,0FH;显示低四位
CMPAL,9
JAHEX1
ADDAL,30H
JMPNEXT1
HEX1:
ADDAL,37H
NEXT1:
MOVDL,AL;输出数据
MOVAH,02H
INT21H
MOVDL,13;输入回车换行符
MOVAH,2
INT21H
MOVDL,10
MOVAH,2
INT21H
MOVAH,09H
MOVDX,OFFSETERROR
INT21H
NEXT2:
MOVAL,62H;发中断结束命令
MOVDX,0A0H
OUTDX,AL;向从片8259发EOI命令
OUT020H,AL;向主片8259发EOI命令
STI;开中断
POPDX
POPAX
POPSI
IRET
五.程序流程图
六.调试分析
进入主菜单后选择1进行8255的初始化,这时候会发现在实验板上的一半灯亮,一半灭;选择2后进入8253的初始化,可以用示波器观察输出的波形,选择3后进入A/D转换,将转换来的数据一路送二极管显示,一路送显示器。
七.原理图设计
八.程序清单
;在本程序中,8253的地址是H-303H,8355A的地址是H-307H,和KS4电路图对应
DATASEGMENT
INT0A_OFFDW(?
)
INT0A_SEGDW(?
)
COUNTDB(5)
SUMDB(0)
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
DELAYPROC
PUSHCX
PUSHBX
MOVBX,0FFFH
LOOP2:
MOVCX,0FFFFH
LOOP1:
LOOPLOOP1
DECBX
JNZLOOP2
POPBX
POPCX
RET
DELAYENDP
DISPPROC
pushax
show:
andal,0f0h;显示高位
shral,4
cmpal,9
jahex
addal,30h
jmpnext
hex:
addal,37h
next:
movdl,al
movah,2
int21H
popax
andal,0fh;显示低位
cmpal,9
jahex1
addal,30h
jmpnext1
hex1:
addal,37h
next1:
movdl,al;输出信号
movah,2
int21h
movah,2;输出空格
movdl,0
int21h
;INCSUM
;MOVAL,SUM
;CMPAL,100
;JZPROEND
DECCOUNT
MOVAL,COUNT
CMPAL,0
JNZDISPEND
MOVCOUNT,5
movdl,13;向屏幕送回车符
movah,2
int21h
movdl,10;向屏幕送换行符
movah,2
int21h
DISPEND:
RET
;PROEND:
;MOVAX,4C00H
;INT21H
DISPENDP
START:
MOVAX,DATA
MOVDS,AX
MOVDX,307H;初始化
MOVAL,80H
OUTDX,AL
MOVDX,305H;LED灯熄灭
MOVAL,0FFH
OUTDX,AL
MOVAX,3572H;获取原中断向量
INT21H
MOVINT0A_OFF,BX;保存原中断向量
MOVBX,ES
MOVINT0A_SEG,BX
CLI;关中断
MOVAX,2572H
MOVDX,SEGLEDLIGHT;设置新的中断向量
PUSHDS
MOVDS,DX
MOVDX,OFFSETLEDLIGHT
INT21H
POPDS
STI;开中断
INAL,0A1H;打开IRQ10
ANDAL,0FBH
OUT0A1H,AL
INAL,21H;打开IRQ2
ANDAL,0FBH
OUT21H,AL
MOVDX,303H;对实验板上的MHZ信号进行分频,为ADC0809提供转换时钟信号CLOCK
MOVAL,00010100B
OUTDX,AL
MOVDX,300H
MOVAL,2
OUTDX,AL
;这条指令可去掉,因为在电路中ADDA/ADDB/ADDC都已接地,固定使用通道
begin:
;movdx,307h;初始化状态字,A口输出,
;moval,80h
;outdx,al
;movdx,304h;送通道号至A口
;moval,0
;outdx,al
movdx,307h
moval,3h;00000011,使PC1为
outdx,al;PC1置进行地址锁存
movdx,307h
moval,90h
outdx,al;重写方式字,A口输入,B口输出,C口低四位输出
L1:
MOVAH,0BH;检查是否有Esc键按下
INT21H
INCAL
JNZNEXT0;若无键按下,则程序往下执行
MOVAH,08H;如有Esc键按下,则程序退出
INT21H
CMPAL,27
JZEXIT
NEXT0:
CALLDELAY
lop:
movdx,307h;使PC0置高发启动信号
moval,1h;00000001,先使PC0为
outdx,al
movcx,0f00h;delay
lop1:
looplop1
movdx,307h
moval,0h;00000000,延时后使PC0为发启动信号
outdx,al
JMPL1
EXIT:
MOVAX,2572H;恢复中断向量
MOVDX,INT0A_SEG
PUSHDS
MOVDS,DX
MOVDX,INT0A_OFF
INT21H
POPDS
INAL,0A1H;屏蔽IRQ10
ORAL,04H
OUT0A1H,AL
INAL,21H;屏蔽IRQ2
ORAL,04H
OUT21H,AL
MOVAX,4C00H;程序退出
INT21H
LEDLIGHTPROCFAR;中断服务程序
PUSHAX
PUSHDX
CLI;关中断
movdx,307h
moval,5h;00000101,使PC2为高,发出OE
outdx,al
movdx,304h;从A口读数据
inal,dx
MOVDX,305H;从B口向LED输出数据
OUTDX,AL
CALLDISP;向屏幕输出数据
MOVAL,62H;发中断结束命令
MOVDX,0A0H
OUTDX,AL;向从片发EOI命令
OUT020H,AL;向主片发EOI命令
STI;开中断
POPDX
POPAX
IRET
LEDLIGHTENDP
CODEENDS
ENDSTART
九.收获、体会和建议
过这次课程设计,我学到了很多东西,在电路设计和具体连线方面有了很大进步,对汇编语言程序设计加深了理解和掌握,对芯片也有了更清楚的认识。
在试验是我们连个人分工合作,一人主要做软件、另一个主要负责硬件。
当我们连好线的时候用程序测试失败了。
一直检查线路也没有错误,然后那老师对8255的测试程序来测试,居然也不行,起初以为是8255的芯片的问题换了一个还是不行,检查线路没有问题,怎么查也查不到问题,后来找老师问原因,老师说不只是8255,也可能是74138或245的问题,通过老师的指导我们又开始查那些线路和芯片,果然是新片的问题,换上芯片就好了,程序终于可以执行了,当时我真的很高兴。
我懂得了调试程序找出问题比设计电路连线更麻烦。
在调试问题中我学到了很多解决问题的方法
1、发光二极管在开电源的时候不亮
解决办法:
电源连线时接错位置,改接+5V即可
2、屏幕上没有数据显示
解决办法:
a.用以下代码检测8255连线是否正确
Codesegment
Assumecs:
code
Start:
MOVDX,307h
Moval,1001000b
Outdx,al
Movdx,305h
Moval,00001111b
Outdx,al
CODEENDS
ENDSTART
结果:
LED四个亮四个灭,说明8255连线正确
b.将0809的CLOCK信号线接总线的0.5MHZ,检测8253连线是否正确
结果:
采集数据正常,LED也随数据的不同而变化,说明8253时钟信号有问题
C.用万用表检测8253的引脚是否连通
结果:
8253的OUT2导线接触不良,更正后问题解决
通过这次试验我收获了很多,它使我把以前忘记的知识又复习了一遍,也是我了解了很多知识的重要性,更知道自己懂得的太少,还要努力获取更多的知识,更谢谢老师给我们这次机会使我更加了解自己的不足。
我对这方面很感兴趣,我会继续努力的。