微机原理(完美版)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

;--------------------------------------------------------------------------
; 课程设计: 数据采集控制与数字电压表
;--------------------------------------------------------------------------
A8255 EQU 0600H ;8255端口地址:PA0~PA7-->L0~L7
B8255 EQU 0602H ;PB0~PB7-->A~G.DP 段码口
C8255 EQU 0604H ;PC0~PC3-->X1~X4,PC4.PC5-->EOC
CON8255 EQU 0606H ;PC1-->K0电压表,PC0-->K1开机
A8254 EQU 0640H ;8254端口地址
B8254 EQU 0642H
C8254 EQU 0644H
CON8254 EQU 0646H
AD EQU 0680H ;ADC0809端口地址

;--------------------------------------------------------------------------
DATA SEGMENT
VRBUF DB 10 DUP(0) ;AD转换结果缓冲区数据段
VR DB ? ;AD转换结果数据段
VALUE DB 3 DUP(0) ;电压值数据段000

LED DB 3FH,06H,5BH,4FH ;数码管段码表0-15
DB 66H,6DH,7DH,07H
DB 7FH,6FH,77H,7CH
DB 39H,5EH,79H,71H
DATA ENDS
;--------------------------------------------------------------------------
SSTACK SEGMENT STACK
DW 50 DUP(0)
SSTACK ENDS
;--------------------------------------------------------------------------
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:SSTACK
START: MOV AX,DATA ;当前数据段址送DS
MOV DS,AX
;--------------------------------------------------------------------------
; 系统初始化及启动程序
;--------------------------------------------------------------------------
MOV DX,CON8255 ;8255控制字:PA7~PA0显示AD转换值
MOV AL,10001000B ;A口.B口,PC0~PC3输入,PC4~PC7输出
OUT DX,AL
;--------------------------------------------------------------------------
BEGIN: MOV DX,A8255 ;L0~L7灯全灭
MOV AL,00H
OUT DX,AL
MOV DX,B8255 ;LED数码管全灭
MOV AL,00H
OUT DX,AL
MOV DX,CON8254 ;启动秒计数
MOV AL,00100111B
OUT DX,AL
;--------------------------------------------------------------------------
K7: MOV DX,C8255
IN AL,DX
TEST AL,10000000B
JZ BEGIN
;--------------------------------------------------------------------------
; 数据采集程序
;--------------------------------------------------------------------------
MOV SI,OFFSET VRBUF
MOV CX,10
ALEST: MOV DX,AD ;选择通道,启动转换
MOV AL,00H ;选择端口IN0
OUT DX,AL
EOC: MOV DX,C8255 ;检测EOC状态,判断转换是否结束
IN AL,DX
TEST AL,0011000B
JZ EOC
MOV DX,AD ;转换结束,取AD转换结果
IN AL,DX
MOV [SI],AL ;AD转换结果存入VRBUF
INC SI
LOOP ALEST
;-------------------------------------------------------------------------
;--------------------------------------------------------------------------

MOV BX,0000 ;数据和清零
MOV DH,00 ;最大值
MOV DL,0FFH ;最小值
MOV SI,OFFSET VRBUF
MOV CX,10
NEXT: MOV AL,[SI]
CMP AL,DH ;比较最大值-->DH
JBE NEXT1
MOV DH,AL
NEXT1: CMP AL,DL ;比较最小值-->DL
JAE NEXT2
MOV DL,AL
NEXT2: MOV AH,00 ;求数据和

ADD BX,AX
INC SI ;指向下一单元
LOOP NEXT ;完了吗?
MOV AX,BX
MOV BH,0 ;减去最大值
MOV BL,DH
SUB AX,BX
MOV BH,0 ;减去最小值
MOV BL,DL
SUB AX,BX
MOV CL,8 ;求出平均值-->VR
DIV CL
MOV VR,AL
;-------------------------------------------------------------------------
MOV DX,A8255 ;显示AD转换结果
OUT DX,AL
;-------------------------------------------------------------------------
MOV DX,C8255 ;判别K6状态:K6=0为数据控制
IN AL,DX
TEST AL,01000000B
JZ KZ ;K6=0为数据控制
JMP DYB ;K6=1为数字电压表

;--------------------------------------------------------------------------
; 数据控制程序
;--------------------------------------------------------------------------
KZ: MOV AL,VR ;数据采集控制
CMP AL,33H
JBE DDZT ;<=1V,转单灯左跳程序
CMP AL,66H
JBE SDYT ;<=2V,转双灯右跳程序
CMP AL,99H
JBE SZJL ;<=3V,转向左渐亮程序
CMP AL,0CCH
JBE SYJM ;<=4V,转向右渐灭程序
JMP BJ ;>4V,转闪动显示A/D值.报警处理程序
;-------------------------------------------------------------------------
DDZT: MOV AL,1 ;显示"1"
CALL DISP
MOV CX,8
MOV DX,A8255 ;单灯左跳程序
MOV AL,01H
DDZT1: OUT DX,AL
CALL DELAY
CALL DELAY
ROL AL,1
LOOP DDZT1
JMP K7
;-------------------------------------------------------------------------
SDYT: MOV AL,2 ;显示"2"
CALL DISP
MOV CX,8
MOV DX,A8255 ;双灯右跳程序
MOV AL,0C0H
SDYT1: OUT DX,AL
CALL DELAY
CALL DELAY
ROR AL,1
LOOP SDYT1
JMP K7
;--------------------------------------------------------------------------
SZJL: MOV AL,3 ;显示"3"
CALL DISP
MOV CX,9
MOV DX,A8255 ;向左渐亮程序
MOV AL,00H
SZJL1: OUT DX,AL
CALL DELAY
CALL DELAY
STC
RCL AL,1
LOOP SZJL1
JMP K7
;--------------------------------------------------------------------------
SYJM: MOV AL,4 ;显示"4"
CALL DISP
MOV CX,9
MOV DX,A8255 ;向右渐灭程序
MOV AL,0FFH
SYJM1: OUT DX,AL
CALL DELAY
CALL DELAY
SHR AL,1
LOOP SYJM1
JMP K7
;--------------------------------------------------------------------------
BJ: MOV AL,5 ;显示"5"
CALL DISP
MOV DX,CON8254 ;启动秒计数
MOV AL,00100111B
OUT DX,AL
MOV DX,A8254
MOV AL,10H
OUT DX,AL
MOV DX,CON8254
MOV AL,01100111B
OUT DX,AL
MOV DX,B8254
MOV AL,10H
OUT DX,AL
MOV CX,10 ;L0~L7闪动显示A/D值
MOV AL,VR
MOV AH,00H
SD: MOV DX,A8255
OUT DX,AL
CALL DELAY
XCHG AL,AH
LOOP SD
MOV DX,CON8254 ;关报警
MOV AL,01100111B
OUT DX,AL
JMP K7
;-------------------------------------------------------------------------
DISP: MOV DX,B8255 ;数码管显示程序
MOV BX,OFFSET LED ;BX指向数码管七段显示码缓冲区首址
XLAT
OUT DX,AL
MOV DX

,C8255
MOV AL,11111011B
OUT DX,AL
RET
;-------------------------------------------------------------------------
DELAY: PUSH CX ;延时程序1
MOV CX,0FFFFH
DELAY1: LOOP DELAY1
POP CX
RET
;-------------------------------------------------------------------------

DYB: CALL CLEAR
MOV SI,OFFSET VALUE ;指向电压值
MOV AL,VR ;将2进制数转化成十进制电压值
MOV AH,00
MOV CL,51
DIV CL
MOV [SI],AL ;电压值个位数
INC SI
MOV AL,AH
MOV CL,10
MUL CL
MOV CL,51
DIV CL
MOV [SI],AL ;电压值小数点后第一位数
INC SI
MOV AL,AH
MOV CL,10
MUL CL
MOV CL,51
DIV CL
MOV [SI],AL ;电压值小数点后第二位数
CALL DIS
CALL CLEAR
JMP K7
;--------------------------------------------------------------------------
CLEAR: MOV DX,B8255 ;清屏子程序
MOV AL,00H ;将段码置为全0输出到B口
OUT DX,AL
RET
;--------------------------------------------------------------------------
DIS: ;显示子程序
MOV SI,OFFSET VALUE ;SI指向电压值个位数
MOV BX,OFFSET LED ;BX指向数码管七段显示码缓冲区首址
MOV DX,C8255
MOV AL,11111101B ;AL为显示11111101(X2选中)
OUT DX,AL ;选中显示位
MOV AL,[SI] ;取出电压值个位数
XLAT ;根据数值取得对应的数码管七段显示码
OR AL,80H ;加上小数点
MOV DX,B8255
OUT DX,AL ;输出七段显示码
CALL DALLY ;延时,数码管显示

INC SI ;SI指向电压值十分位数
MOV DX,C8255
MOV AL,11111011B ;AL为显示11111011(X3选中)
OUT DX,AL ;选中显示位
MOV AL,[SI] ;取出电压值十分位数
XLAT ;根据数值取得对应的数码管七段显示码
MOV DX,B8255
OUT DX,AL ;输出七段显示码
CALL DALLY ;延时,数码管显示

INC SI ;SI指向电压值百分位数
MOV DX,C8255
MOV AL,11110111B ;AL为显示11110111(X4选中)
OUT DX,AL ;选中显示位
MOV AL,[SI] ;取出电压值百分位数
XLAT ;根据数值取得对应的数码管七段显示码
MOV DX,B8255
OUT DX,AL ;输出七段显示码
CALL DALLY ;延时,数码管显示

RET ;返回
;--------------------------------------------------------------------------
DALLY: PUSH CX ;延时子程序2
MOV CX,000FH
T1: MOV AX,009FH
T2: DEC AX
JNZ T2
LOOP T1
POP CX
RET
;-------------------------------------------------------------------------
CODE ENDS
END START
;-------------------------------------------------------------------------

相关文档
最新文档