文章目录[隐藏]
一、实验目的
通过编写程序,掌握ADC0809的工作原理以及应用方法,掌握ADC0809初始化及应用的编程,实现计算机多点模拟量的采集并完成转换且能够将值实时的显示在外设上。在此基础上,掌握在计算机屏幕、七段数码管、LCD液晶屏等不同显示器件的显示编程。提高自身的编程能力。
二、实验设备与环境
硬件上,使用实验室的TPC-ZK-II硬件实验箱,系统由USB总线接口模块、TPC-ZK-II实验系统及集成开发环境软件组成。USB总线接口模块通过USB总线电缆与pc机相连,模块直接插在TPC-ZK-II实验系统上。具体硬件见使用指导书。
软件上,使用TPC-ZK-II集成开发环境。为用户提供了程序的编辑、汇编、调试、运行等功能。
三、实验内容与指标
3.1设计要求
在平台上利用ADC0809编程实现从IN0、IN1、IN2采集三路信号模拟量,并将转换后的数字量(保留1位小数)在计算机屏幕上实时显示出来。在此基础上,利用数码管、LED排灯来丰富模拟量的表现形式。更进一步的,能够利用LCD显示屏实时显示模拟量的变化波形。
3.2设计目标和性能指标
3.2.1基础功能
(1)在平台上利用ADC0809采集三路信号并转化后在计算机屏幕实时显示
解决这个问题可以将其分为两步:第一步是采集各个路的数据,第二步是将三路信号进行一个实时的显示。首先,对于第一步的实现,只需在不同时间选通不同的IN端口,便可以拿到数据,这时拿到的数据是一个二进制数据,还需要将其变为一个十进制的数字。具体方法是:由于拿到的是255(最大值)的二进制数,可以先将其乘2再除以100,这样就拿到了整数部分(近似),再将余数除10,就拿到了近似的一位小数,由此就拿到了十进制的小数并可以调用INT功能进行显示。第二步,对于实时显示,其实就是一个串行的显示,将每次拿到的数值都送出显示便可以做到实时的动态显示。
3.2.2扩展功能
(1)数码管显示
实现这一问题的原理在上边已经解释,即依托在处理好小数情况下的位码、段码的快速切换。
(2)LED的显示
这个功能也非常简单,只需在INT0通道采集到数据后将其送给PC口即可。
(3)LCD的显示
本次实验并未使用。
3.3硬件电路图
整体电路如下所示,主要芯片ADC0809、P8255。
四、程序流程图
整个程序的框架为串行结构,由于不存在判断转跳等问题,因此十分简单,对于数码管显示的位码段码切换等细节进行了忽略,原理与之前的实验是相同的。
五、方案设计与讨论
方案的整体架构是有两方法可以实现的,最开始是希望将所有数据都采集到并存入定义好的变量后再进行统一的输出,但这样做有两个坏处:其一,这相当于将数据刷新的时间堆在了一遍,而采集处理数据的时间堆在了另一边,会降低整个采集的实时性,此外,这种做法会加大LED输出二进制码的复杂度。在采集到IN0信号就进行输出是相对简单的。但这种方案也并不是没有优点,在处理采集数据的相对关系时,这种先采集、在处理的想法就变得非常有效,相比之下,串行输入输出会变得低效。
在本次采用方案的灵活性上,其实还可以继续增加。方案中一旦开始就只能结束再启动,并没有人为可控的判断在内,可以添加一些例如暂停、继续的选项以增加系统的灵活性。
在显示上,本次采用了数码管以及二进制显示的方法,但相比之下其实LCD的显示是更为直观的,也可以在此基础之上进行嵌入,LCD的基本思想在于动态的刷新屏幕,涉及到滚动等方法。
六、程序展示
;ADC:CS:280H~287H,IN0:0~5v,IN1:+5V,IN2:0V
;数码管位选:CS:288H,段选:P8255A,位选:P8255A
;LED排灯:P8255C串口
DATAS SEGMENT
P8255A EQU 288H
P8255B EQU 289H
P8255C EQU 28AH
P8255S EQU 28BH
ADI0 EQU 280H
ADI1 EQU 281H
ADI2 EQU 282H
NUM_LIST DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,0FEH,0F6H ;无小数点数字
NUMP_LST DB 0FDH,61H,0DBH,0F3H,67H,0B7H,0BFH,0E1H,0FFH,0F7H ;有小数点的数字
NUM1 DB ?
NUM2 DB ?
NUM3 DB ?
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
MOV DX,P8255S
MOV AL,80H ;8255初始化
OUT DX,AL
MAINLP:
CALL GNUM1
CALL PNUM1
CALL GNUM2
CALL PNUM2
CALL GNUM3
CALL PNUM3
JMP MAINLP
;==============================================================
GNUM1 PROC
MOV AL,00
MOV DX,ADI0
OUT DX,AL ;初始化数模转换器
NOP
NOP
NOP
NOP
MOV DX,ADI0
IN AL,DX
MOV NUM1,AL
MOV DX,P8255C ;显示LED排灯
OUT DX,AL
MOV BX,2
MUL BL
MOV BL,100
DIV BL
MOV CH,AL ;CH为采集数的整数部分
MOV CL,AH ;CL为采集数的小数部分
RET
GNUM1 ENDP
PNUM1 PROC
;数码显示整数
MOV DX,P8255A
MOV AL,00
OUT DX,AL ;数码管清零
MOV DX,P8255B
MOV AL,00000001B ;选位码
OUT DX,AL
MOV DX,P8255A
MOV BX,0000H
MOV BL,CH
MOV BH,0
MOV AL,NUMP_LST[BX] ;查表输出带小数点的数字,led显示
OUT DX,AL
;屏幕显示整数
MOV AL,CH
ADD AL,30H
MOV DL,AL
MOV AH,02H ;输出数字个位显示在屏幕上
INT 21H
MOV DL,46 ;输出小数点,显示在屏幕上
MOV AH,02H
INT 21H
;数码显示小数
MOV AL,CL
MOV BX,10
MUL BL
MOV BX,100
DIV BL
MOV CL,AL ;得到十分位数据
MOV DX,P8255A
MOV AL,00
OUT DX,AL
MOV DX,P8255B
MOV AL,00000010B
OUT DX,AL
MOV DX,P8255A
MOV BX,0000H
MOV BL,CL
MOV BH,0
MOV AL,NUM_LIST[BX] ;输出无小数点的数字,led显示
OUT DX,AL
;屏幕显示小数
MOV AL,CL
ADD AL,30H
MOV DL,AL
MOV AH,02H
INT 21H
MOV DL,32 ;输出空格
MOV AH,02H
INT 21H
RET
PNUM1 ENDP
GNUM2 PROC
MOV AL,00
MOV DX,ADI1
OUT DX,AL ;初始化数模转换器
NOP
NOP
NOP
NOP
MOV DX,ADI1
IN AL,DX
MOV NUM2,AL
MOV BX,2
MUL BL
MOV BL,100
DIV BL
MOV CH,AL ;CH为采集数的整数部分
MOV CL,AH ;CL为采集数的小数部分
RET
GNUM2 ENDP
PNUM2 PROC
;数码显示整数
MOV DX,P8255A
MOV AL,00
OUT DX,AL ;数码管清零
MOV DX,P8255B
MOV AL,00001000B ;选位码
OUT DX,AL
MOV DX,P8255A
MOV BX,0000H
MOV BL,CH
MOV BH,0
MOV AL,NUMP_LST[BX] ;查表输出带小数点的数字,led显示
OUT DX,AL
;屏幕显示整数
MOV AL,CH
ADD AL,30H
MOV DL,AL
MOV AH,02H ;输出数字个位显示在屏幕上
INT 21H
MOV DL,46 ;输出小数点,显示在屏幕上
MOV AH,02H
INT 21H
;数码显示小数
MOV AL,CL
MOV BX,10
MUL BL
MOV BX,100
DIV BL
MOV CL,AL ;得到十分位数据
MOV DX,P8255A
MOV AL,00
OUT DX,AL
MOV DX,P8255B
MOV AL,00010000B
OUT DX,AL
MOV DX,P8255A
MOV BX,0000H
MOV BL,CL
MOV BH,0
MOV AL,NUM_LIST[BX] ;输出无小数点的数字,led显示
OUT DX,AL
;屏幕显示小数
MOV AL,CL
ADD AL,30H
MOV DL,AL
MOV AH,02H
INT 21H
MOV DL,32 ;输出空格
MOV AH,02H
INT 21H
RET
PNUM2 ENDP
GNUM3 PROC
MOV AL,00
MOV DX,ADI2
OUT DX,AL ;初始化数模转换器
NOP
NOP
NOP
NOP
MOV DX,ADI2
IN AL,DX
MOV NUM2,AL
MOV BX,2
MUL BL
MOV BL,100
DIV BL
MOV CH,AL ;CH为采集数的整数部分
MOV CL,AH ;CL为采集数的小数部分
RET
GNUM3 ENDP
PNUM3 PROC
;数码显示整数
MOV DX,P8255A
MOV AL,00
OUT DX,AL ;数码管清零
MOV DX,P8255B
MOV AL,01000000B ;选位码
OUT DX,AL
MOV DX,P8255A
MOV BX,0000H
MOV BL,CH
MOV BH,0
MOV AL,NUMP_LST[BX] ;查表输出带小数点的数字
OUT DX,AL
;屏幕显示整数
MOV AL,CH
ADD AL,30H
MOV DL,AL
MOV AH,02H ;输出数字个位显示在屏幕上
INT 21H
MOV DL,46 ;输出小数点,显示在屏幕上
MOV AH,02H
INT 21H
;数码显示小数
MOV AL,CL
MOV BX,10
MUL BL
MOV BX,100
DIV BL
MOV CL,AL ;得到十分位数据
MOV DX,P8255A
MOV AL,00
OUT DX,AL
MOV DX,P8255B
MOV AL,10000000B
OUT DX,AL
MOV DX,P8255A
MOV BX,0000H
MOV BL,CL
MOV BH,0
MOV AL,NUM_LIST[BX] ;查表输出无小数点的数字
OUT DX,AL
;屏幕显示小数
MOV AL,CL
ADD AL,30H
MOV DL,AL
MOV AH,02H
INT 21H
MOV DL,32 ;输出空格
MOV AH,02H
INT 21H
MOV DL,0DH ;显示回车,进行实时显示
MOV AH,2
INT 21H
RET
PNUM3 ENDP
CODES ENDS
END START
七、实验结果与分析
首先,整个电路的实物连接如下:
观察数码管,可以看到可以随数值的变化而实时显示(由于手机快门过快,实际上人眼观察到的此时值为2.8V)
与此同时,观察屏幕的显示也进行着同步的更新。
再观察显示二进制数的LED排灯,这里以5V距离,可以看到它是全亮的(即达到最大幅值)
八、实验总结
本次的实现强化了对于ADC0809的使用,由于设计的整体架构较为简单,因此这次实验并没太多的困难,很顺利就可以实现。当然,对于LCD的显示问题也是一个可扩展的点,但线路复接是一个需要考虑的问题。
版权声明:本文为CSDN博主「尧呱呱」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_45555522/article/details/121969904
暂无评论