微机原理与接口技术课程设计——数字电压表的设计(含完整代码与实验连接图)

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

  • 37
    点赞
  • 242
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
微机原理接口技术课程设计是一个综合性的课程设计,其目的是培养学生对微机原理接口技术的理解和应用能力。这门课程设计通常包括三个部分:文档、原型和代码。 首先,课程设计的文档是对整个设计过程的详细说明和分析。文档中应包括对设计目标和需求的定义、设计方案的选择和说明、设计的过程和方法、设计的功能和模块划分以及设计的测试和优化等内容。文档的撰写需要准确、清晰地描述设计的各个方面,以便其他人能够理解和复现。 其次,原型课程设计的重要组成部分。原型是用于展示设计的系统结构和各个模块之间的关系的形表示。原型应包括系统的整体结构、各个模块的功能和接口以及数据流等。原型的绘制需要准确地表达设计的结构和功能,并且能够清晰地呈现给其他人。 最后,代码是课程设计中的核心部分。代码的编写需要按照设计要求和功能规范进行,保证代码的正确性和高效性。代码应包括设计的各个模块的实现以及模块之间的接口和数据传递的部分。代码的编写需要符合代码规范,注重代码的可读性和可维护性,以方便后期的修改和优化。 总的来说,微机原理接口技术课程设计需要综合运用文档、原型和代码三个方面,以实现设计目标和需求。这样的设计过程能够培养学生的系统设计和实践能力,帮助学生更好地理解和应用微机原理接口技术

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值