START: MOV AX,DATA ;初始化寄存器
MOV DS,AX
MOV DX,MY8255_MODE ;8255初始化
MOV AL,80H ;工作方式为0,A口,B口都为输出
OUT DX,AL
MOV DX,OFFSET STR0
MOV AH,09H ;显示STR0的内容
INT 21H
START1:
MOV DX,ADC0809
MOV AL,0
OUT DX,AL ;启动A/D转换,通过ADC0809输出
MOV CL,AL ;将A/D转换后的值送到CL当中去
MOV DX,ADC0809 ;读出转换结果
IN AL,DX
MOV CL,AL
CALL TRANSFORM ;调用电压转换
CALL ALARM ;调用电压报警
MOV AH,01H
INT 16H ;判断是否有按键按下
JNE QUIT
JMP START1
TRANSFORM PROC
CHANGE:
MOV SI,2000H
MOV AL,CL
MOV BL,33H
MOV AH,00H ;屏蔽高四位
DIV BL ;整除,默认为AX/BL
MOV DS:[SI],AL ;
MOV CL,AL
MOV AL,AH
MOV BL,10
MUL BL ;余数扩大十倍
MOV BL,33H
DIV BL
MOV DS:[SI+1],AL ;2000H存入第一位小数
MOV CH,AL
MOV AL,AH
MOV BL,10
MUL BL ;余数扩大十倍
MOV BL,33H
DIV BL
MOV DS:[SI+2],AL ;2001H存入第二位小数
RET
TRANSFORM ENDP
DISPLAY0 PROC ;数码管显示子程序
SHOW: MOV DX,MY8255_C ;写C口
MOV AL,1011B ;让整数部分数码管亮
OUT DX,AL
MOV AL,CL
MOV BX,offset DTABLE1 ;通过偏移地址寻地址
XLAT
MOV DX,MY8255_B ;读B端口地址
OUT DX,AL
CALL DALLY
MOV DX,MY8255_C ;写C口
MOV AL,0111B ;让小数部分数码管亮
OUT DX,AL
MOV AL,CH
MOV BX,offset DTABLE0
XLAT
MOV DX,MY8255_B ;读B端口地址
OUT DX,AL
CALL DALLY
RET
DISPLAY0 ENDP ;结束子程序
ALARM PROC ;调用报警子程序
CMP CL,3 ;判断整数部分是否小于3
JB SHOW2 ;小于3则跳转到SHOW2
CMP CL,3 ;断整数部分是否等于3
JZ SHOW3 ;等于3则跳转到SHOW3
JMP SHOW1 ;否则跳转到SHOW1
SHOW3: CMP CH,0 ;判断小数部分是否等于3
JZ SHOW2 ;等于则跳转到SHOW2
JMP SHOW1 ;否则跳转到SHOW1
SHOW1: MOV DX,OFFSET STR1
MOV AH,09H ;显示STR1的内容
INT 21H ;报警
CALL XIANG
CALL DELAY
MOV AH,01H
INT 16H ;判断是否有按键按下
JNE QUIT
JMP START1
SHOW2: MOV AX,00502H
MOV DX,MY8254_C0
OUT DX,AL
MOV AL,AH
OUT DX,AL
CALL DALLY
MOV DX,MY8255_A
MOV AL,00000000B ;gate信号置0
OUT DX,AL
MOV DX,OFFSET STR2
MOV AH,09H ;显示STR2的内容,不报警
INT 21H
CALL DISPLAY0
;调用电压显示
MOV AH,01H
INT 16H ;判断是否有按键按下
JNE QUIT
JMP START1
ALARM ENDP
XIANG PROC
MOV DX,MY8254_MODE ;设置8254的控制字
MOV AL,36H
OUT DX,AL
PLAY:
MOV AX,00502H
MOV DX,MY8254_C0
OUT DX,AL ;向计数器0送初值,产生方波
MOV AL,AH
OUT DX,AL
CALL DALLY
MOV DX,MY8255_C ;左边数码管显示E.
MOV AL,1011B
OUT DX,AL
MOV AL,0F9H
MOV DX,MY8255_B
OUT DX,AL
CALL DALLY
MOV DX,MY8255_C ;右边数码管显示0
MOV AL,0111B
OUT DX,AL
MOV AL,03FH
MOV DX,MY8255_B
OUT DX,AL
CALL DALLY
MOV DX,MY8255_A ;gate信号置1
MOV AL,00000011B
OUT DX,AL
RET
XIANG ENDP
本此课程设计的内容为设计一个显示精确度到百分位的数字电压表,并且加以扩展,增加了一个电压报警功能,当超过额定电压值4.00时就进行报警,并显示“E.O”,若没有超过则显示当前电压值就显示正常的电压值。
在课程设计的开始,在硬件连线时,由于要用到多个芯片与系统总线的XD0-XD7相连,而系统总线只提供两个插槽,不知道怎么操作,然后发现试验箱的有一个转换单元上有四个接口并且是等同的,想到可不可以通过它进行扩充系统总线接口。还有我们需要将针接口p0与孔接口GATE0相连,应该也可以通过转换单元进行连线。我们向老师请教验证了我们的想法。于是我们使用转换单元,解决了这个问题。另外在硬件连接时,没有注意到芯片的高低位,导致数码管不能正常显示。
编代码时,在采样时,由于之前做过实验,知道采集到的是00-FFH的数,我们要把这个数除以33H将整数位AL中的值存到CL中,将模乘以10,除以33H后将小数位AL,存到CH中。我们的数码管左边要显示闪烁带小数点的,所以还要采用两个不同的段码表,左边的显示偏暗,后来我们加了clear清屏模块,把我们延时的时间进行了调整,才解决了数码管显示的问题。我们通过8254计时器0方式3产生一个方波,送往蜂鸣器产生报警信号,通过gate信号控制报警是否结束。通过8255向gate写值来控制gate,但是用一位写最低位就没用,至少需要写两位来控制。最后通过BIOS层功能调用01H,通过键盘控制ZF标志位,然后通过DOS层4CH实现程序的退出。经过不懈的努力,我们终于实现了电压报警系统。
通过这次课程设计,我们对各个模块的数据的输入内容,以及如何控制,和输出的数据,有了更加清楚的认识,对它们之间的数据和信号传输的方式有了进一步的了解,对于微机原理与接口技术这门课程掌握的更加透彻。
;8255
IOY0 EQU 0600H
MY8255_A EQU IOY0+00H*2
MY8255_B EQU IOY0+01H*2
MY8255_C EQU IOY0+02H*2
MY8255_MODE EQU IOY0+03H*2
;8254
IOY1 EQU 0640H
MY8254_C0 EQU IOY1+00H*2
MY8254_C1 EQU IOY1+01H*2
MY8254_C2 EQU IOY1+02H*2
MY8254_MODE EQU IOY1+03H*2
;A/D转换
IOY2 EQU 0680H
ADC0809 EQU IOY2+00H*2
DATA SEGMENT
DTABLE0 DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
DTABLE1 DB 0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H,0FFH,0EFH
STR0 DB 'The voltmeter starts working! $'
STR1 DB 'dangerous! $'
STR2 DB 'safe! $'
DATA ENDS
STACK1 SEGMENT STACK
DW 256 DUP(?)
STACK1 ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
;主程序代码
START:
MOV AX,DATA;初始化寄存器
MOV DS,AX
MOV DX,MY8255_MODE;8255初始化
MOV AL,80H
OUT DX,AL
MOV DX,OFFSET STR0 ;提示电压表开始工作
MOV AH,09H
INT 21H
START1:
MOV DX,ADC0809 ;0809初始化
MOV AL,0
OUT DX,AL
MOV CL,AL
MOV DX,ADC0809
IN AL,DX
MOV CL,AL ;读取转换结果存入CL
START2:
CALL TRANSFORM
CALL ALARM
MOV AH,01H
INT 16H
;JNE QUIT
JMP START1
QUIT: MOV AH,4CH ;退出
INT 21H
;电压转换
TRANSFORM PROC
CHANGE:
MOV SI,2000H
MOV AL,CL
MOV BL,33H
MOV AH,00H ;屏蔽高四位
DIV BL ;整除,默认为AX/BL
MOV DS:[SI],AL ;
MOV CL,AL
MOV AL,AH
MOV BL,10
MUL BL ;余数扩大十倍
MOV BL,33H
DIV BL
MOV DS:[SI+1],AL ;2000H存入第一位小数
MOV AL,AH
MOV BL,10
MUL BL ;余数扩大十倍
MOV BL,33H
DIV BL
MOV DS:[SI+2],AL ;2001H存入第二位小数
MOV AL,AH
MOV BL,10
MUL BL ;余数扩大十倍
MOV BL,33H
DIV BL
MOV DS:[SI+3],AL ;2001H存入第二位小数
RET
TRANSFORM ENDP
ALARM PROC ;电压报警
CMP CL,4
JB SHOW2
CMP CL,4
JZ SHOW3
JMP SHOW1
SHOW3:
CMP CH,0
JZ SHOW2
JMP SHOW1
SHOW1:
MOV DX,OFFSET STR1
MOV AH,09H
INT 21H
CALL XIANG
MOV AH,01H
INT 16H
JNE QUIT
JMP START1
SHOW2:
MOV AX,00502H
MOV DX,MY8254_C0
OUT DX,AL
MOV AL,AH
OUT DX,AL
CALL DALLY
MOV DX,MY8255_A
MOV AL,00000000B
OUT DX,AL
MOV DX,OFFSET STR2
MOV AH,09H
INT 21H
CALL DISPLAY0
CALL CLEAR
MOV AH,01H
INT 16H
;JNE QUIT
JMP START1
ALARM ENDP
XIANG PROC ;蜂鸣器报警和电子管显示
MOV DX,MY8254_MODE
MOV AL,36H
OUT DX,AL
PLAY:
MOV AX,00502H
MOV DX,MY8254_C0
OUT DX,AL
MOV AL,AH
OUT DX,AL
CALL DALLY
MOV DX,MY8255_C
MOV AL,1110B
OUT DX,AL
MOV AL,0F9H
MOV DX,MY8255_B
OUT DX,AL
CALL DALLY
MOV DX,MY8255_C
MOV AL,1101B
OUT DX,AL
MOV AL,079H
MOV DX,MY8255_B
OUT DX,AL
CALL DALLY
MOV DX,MY8255_C
MOV AL,1011B
OUT DX,AL
MOV AL,079H
MOV DX,MY8255_B
OUT DX,AL
CALL DALLY
MOV DX,MY8255_C
MOV AL,0111B
OUT DX,AL
MOV AL,079H
MOV DX,MY8255_B
OUT DX,AL
CALL DALLY
MOV DX,MY8255_A
MOV AL,00000011B
OUT DX,AL
RET
XIANG ENDP
DISPLAY0 PROC ;数码管显示模块代码
SHOW:
MOV DX,MY8255_C
MOV AL,1110B
OUT DX,AL
MOV AL,DS:[SI]
MOV BX,OFFSET DTABLE1
XLAT
MOV DX,MY8255_B
OUT DX,AL
CALL DALLY
MOV DX,MY8255_C
MOV AL,1101B
OUT DX,AL
MOV AL,DS:[SI+1]
MOV BX,OFFSET DTABLE0
XLAT
MOV DX,MY8255_B
OUT DX,AL
CALL DALLY
MOV DX,MY8255_C
MOV AL,1011B
OUT DX,AL
MOV AX,DS:[SI+2]
MOV BX,OFFSET DTABLE0
XLAT
MOV DX,MY8255_B
OUT DX,AL
CALL DALLY
MOV DX,MY8255_C
MOV AL,0111B
OUT DX,AL
MOV AX,DS:[SI+3]
MOV BX,OFFSET DTABLE0
XLAT
MOV DX,MY8255_B
OUT DX,AL
CALL DALLY
RET
DISPLAY0 ENDP
DALLY PROC ;延时子程序
PUSH CX
PUSH AX
MOV CX,000FH
D1: MOV AX,009FH
D2: DEC AX
JNZ D2
LOOP D1
POP AX
POP CX
RET
DALLY ENDP
CLEAR: ;清屏子程序
MOV DX,MY8255_B
MOV AL,00H
OUT DX,AL
RET
CODE ENDS
END START