1.设计内容
此次课程设计的基础内容为设计一个可精确到小数点后两位的电压表,作为拓展并加入了电压报警功能,该功能实现一个对超过额定电压就会发出蜂鸣声,进行报警。
它主要是通过采集实验箱提供的0~5V的电压; 当输入电压在额定值4V以内,用数码管显示其实际电压值;当输入电压超过额定值4V,数码管显示“E.O”,并发出报警音,用来提示用户修正电压值。
2. 设计要求
(1)硬件构成:PC机,计数器/定时器芯片,并行接口芯片,4位8 段数码管单元,模数转换单元,蜂鸣器。
(2)程序功能:显示电压,报警。
3.芯片选择
在本系统中,主要采用的芯片有8254可编程计数/定时器芯片、8255并行接口芯片和A/D转换接口芯片ADC0809。
8254可编程计数/定时器芯片:用来控制蜂鸣器。
8255并行接口芯片:用来连接数码管显示单元和控制8254。
ADC0809A/D转换单元:将模拟信号转换为数字信号。
4.硬件连线
4.1 8254可编程定时/计数器芯片接线图
在本系统中,8254门控信号输入引脚GATE0与8255的PA0和PA1相连,时钟输入信号CLK0与系统总线的CLK相连,OUT0与蜂鸣器相连,当门控信号GATE0接收到从8255的PA0和PA1传来的高电平,则蜂鸣器会发出报警声,具体接线图如下(图3-1):
4.23.2 8255并行接口芯片接线图
8255的D0-D7连接系统总线的XD0-XD7,RD,WR,CS分别连接系统总线的XIOR,XIOW,IOY0。8255的A口低两位PA0,PA1控制8254可编程计数/定时器芯片。8255的B口的PB0-PB7和C口的低四位PC0-PC3来控制数码的显示。
8255除了连接系统总线之外,还要连接数码管,数码管显示引脚是A,B,C,D,E,F,G,DP分别连接8255的PB0-PB7,数码管选择引脚X1,X2,X3,X4分别连接8255的PC0-PC3,具体接线图如下:
4.3 A/D转换接口芯片接线图
在电压报警功能中,ADC0809的CS片选信号连接系统总线的IOY2端口,CLK连接系统总线CLK,WR,RD分别连接系统总线的XIOW和XIOR,具体接线图如下:
4.4 数码管连线图
数码管显示引脚是A,B,C,D,E,F,G,DP分别连接8255的PB0-PB7,数码管选择引脚X1,X2,X3,X4分别连接8255的PC0-PC4,具体接线图如下
5.软件实现
5.1 模块流程图
5.1.1 主程序流程图
5.1.2 电压转换模块流程图
5.1.3 电压显示模块流程图
5.1.4 电压报警模块流程图
5.2 代码设计
5.2.1 主程序代码
主程序主要由电压转换模块和电压报警模块组成,首先给8255写方式控制字,然后初始化8255,再启动A/D转换,将转换后的值读入AL中,最后再在电压转换模块中处理转换后的数据,然后检测数据的大小看是否需要报警,具体代码如下:
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
5.2.2 电压转换模块代码
在电压转换模块中,主要是对A/D转换后的数据进行处理,A/D转换后的数据范围是0-255,但是电压要求范围是0-5V,所以这里需要对转换后的数据进行缩小。缩小后,还需要精确到小数点,于是这里需要将除后的余数保留,并且将余数扩大10倍,在一次除以33H,则可以获得小数点后面的数字,具体代码如下:
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
5.2.3数码管显示模块代码
8255并行接口芯片连接数码管,用高低电平来控制数码管的显示,具体代码如下:
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 ;结束子程序
5.2.4 电压报警模块代码
电压报警模块中,主要是对电压值的大小进行判断,若大于3.0V,则蜂鸣器工作,发出一定频率的声音,并在数码管显示E.0,若小于3.0V,则显示当前电压值,具体代码如下:
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
5.2.5 蜂鸣器模块
蜂鸣器模块,设置8254的控制方式字,设置初始值,产生一个方波,送往蜂鸣器spk端口,产生警报响铃。
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
6.实验结果
6.1实验箱连线图
6.2 程序运行结果
6.2.1 显示电压
采样实验箱的电压,当电压处于标定的正常范围(0—4V),数码管显示相应的电压值(精确到百分位),此时在输出窗口显示safe
6.2.2 报警
当实验箱的电压超过标定的正常范围即4V,数码管显示E.O,在输出窗口显示dangerous,并且蜂鸣器报警。
7.课设心得与体会
本此课程设计的内容为设计一个显示精确度到百分位的数字电压表,并且加以扩展,增加了一个电压报警功能,当超过额定电压值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实现程序的退出。经过不懈的努力,我们终于实现了电压报警系统。
通过这次课程设计,我们对各个模块的数据的输入内容,以及如何控制,和输出的数据,有了更加清楚的认识,对它们之间的数据和信号传输的方式有了进一步的了解,对于微机原理与接口技术这门课程掌握的更加透彻。
8.附录完整代码如下:
;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