微机原理频率测试仪
发布时间:2019-09-20 07:21:01
发布时间:2019-09-20 07:21:01
源程序:
DATA SEGMENT
S1 DB 0DH,0AH,0AH,'f = ','$'
s2 DB 'Hz',0,0,0,0,'TIME:','$'
s3 DB '/','$'
s4 DB ':','$'
S5 DB 0,0,0,0,'$'
S6 DB 0,0,0,'go on ?(y/n)','$'
S7 DB 'ERROR! ','$'
S8 DB 0DH,0AH,0AH,'Please input right choice y or n !','$'
S9 DB 0DH,0AH,0,0,0,0,0,0,0,0,0,0,'Welcome to this system(measuring range :0-9999Hz) !',0DH,0AH,0AH,0,0,0,0,0,0,0,0,0,0,'Designer:XXX ',0DH,0AH,0AH,'$'
S10 DB 0,0,0,0,'Waiting 6s...','$'
S11 DB '********************************************************************************','$'
S12 DB 0DH,0AH,0AH,'Press any key to continue !','$'
B_H DW ? ;开辟存储器空间,保护数据
B_H2 DW ?
PORT8253 EQU 240BH ;8253控制寄存器地址
PORT8255 EQU 2403H ;8255控制寄存器地址
PORT0 EQU 2408H ;8253 0通道的地址
PORT1 EQU 2409H
PORT2 EQU 240AH
PORTA EQU 2400H ;8255 A口的地址
DATA ENDS
STAK SEGMENT
DB 100 DUP(?)
TOP DB ?
STAK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STAK
START: MOV AX,DATA
MOV DS,AX
MOV AX,STAK
MOV SS,AX
MOV SP,OFFSET TOP ;初始化堆栈段指针寄存器
CALL SJ ;显示欢迎界面及开发者
MOV DX,PORT8255
MOV AL,10010000B ;初始化8255,A口0方式输入
KS: CALL CSH ;8253的初始化程序
J_C: MOV DX,PORTA
IN AL,DX
TEST AL,1
JZ J_C ;检测6s时间是否到,没到则持续检测PA0,PA0与OUT2 连接
MOV DX,PORT8253
MOV AL,0
OUT DX,AL ;6s时间到,将0通道的计数值所存在锁存器中
MOV DX,PORT0
IN AL,DX
MOV BL,AL
IN AL,DX
MOV AH,AL
MOV AL,BL ;将锁存器中的值读入AX中,先低后高
MOV B_H,AX ;保护AX,存入存储器中
CMP AX,6
JB CW
CMP AX,60000
JA CW
MOV DX,PORTA ;PA7与OUT0相接,检测OUT0是否输出高电平
IN AL,DX
TEST AL,80H
JNZ CW ;判断是否超出量程
MOV AX,B_H ;从存储器中将AX读出来
MOV BX,60000
SUB BX,AX
MOV AX,BX
MOV DX,0 ;扩展位数,AX扩展到DX:AX
MOV CX,6
DIV CX ;频率值存入AX中
MOV B_H,AX
LEA DX,S1
MOV AH,09H
INT 21H ;显示S1
MOV AX,B_H
CALL XS ;调用XS子程序,将AX中的值显示出来
LEA DX,S2
MOV AH,09H
INT 21H ;显示S2
CALL RQ ;调用RQ子程序,显示当前的日期时间
JMP GO
CW: LEA DX,S1 ;显示错误ERROR
MOV AH,09H
INT 21H ;显示S1
LEA DX,S7
MOV AH,09H
INT 21H ;显示S7
LEA DX,S2
MOV AH,09H
INT 21H ;显示S2
CALL RQ
GO: LEA DX,S6
MOV AH,09H
INT 21H ;显示S6
MOV AH,01H
INT 21H ;从键盘接收一个字符
CALL PD
CMP AL,1 ;判断是否继续测量
JNE EXIT
JMP KS
EXIT: MOV AH,4CH ;返回DOS
INT 21H
XS PROC ;显示4位数的子程序
MOV BX,AX
CMP AX,1000 ;判断AX的值是否小于1000,小于则跳到百位
JB BAI
MOV CX,1000
MOV DX,0
DIV CX
MOV BX,DX
ADD AL,30H
MOV DL,AL
MOV AH,02H
INT 21H ;显示千位
BAI: CMP AX,100
JB SHI
MOV AX,BX
MOV CX,100
MOV DX,0
DIV CX
MOV BX,DX
ADD AL,30H
MOV DL,AL
MOV AH,02H
INT 21H ;显示百位
SHI: CMP AX,10
JB G_E
MOV AX,BX
MOV CX,10
MOV DX,0
DIV CX
MOV BX,DX
ADD AL,30H
MOV DL,AL
MOV AH,02H
INT 21H ;显示十位
G_E: MOV DX,BX
ADD DL,30H
MOV AH,02H
INT 21H ;显示个位
RET
XS ENDP
RQ PROC ;日期显示子程序
MOV AH,2AH
INT 21H ;取日期到CX,DX
MOV B_H,DX
MOV AX,CX
CALL XS
LEA DX,S3
MOV AH,09H
INT 21H
MOV DX,B_H
MOV B_H,DX ;显示年
MOV AL,DH
MOV AH,0
CALL XS
LEA DX,S3
MOV AH,09H
INT 21H
MOV DX,B_H ;显示月
MOV AL,DL
MOV AH,0
CALL XS ;显示日
LEA DX,S5
MOV AH,09H
INT 21H
MOV AH,2CH
INT 21H
MOV B_H,DX
MOV B_H2,CX ;获取时间
MOV AL,CH
MOV AH,0
CALL XS
LEA DX,S4
MOV AH,09H
INT 21H
MOV CX,B_H2 ;显示时
MOV AL,CL
MOV AH,0
CALL XS
LEA DX,S4
MOV AH,09H
INT 21H
MOV DX,B_H ;显示分
MOV AL,DH
MOV AH,0
CALL XS ;显示秒
RET
RQ ENDP
CSH PROC ;8253初始化子程序
LEA DX,S10
MOV AH,09H
INT 21H ;显示S10
MOV DX,PORT8253
MOV AL,00110000B
OUT DX,AL
MOV DX,PORT0
MOV AX,60000
OUT DX,AL
MOV AL,AH
OUT DX,AL ;初始化0#通道,方式0,用于测量脉冲数
MOV DX,PORT8253
MOV AL,01110110B
OUT DX,AL
MOV DX,PORT1
MOV AX,1000
OUT DX,AL
MOV AL,AH
OUT DX,AL ;初始化1#通道,方式3,用于将1MHZ分频为1KHZ,1MHZ/1000=1KHZ
MOV DX,PORT8253
MOV AL,10110000B
OUT DX,AL
MOV DX,PORT2
MOV AX,6000
OUT DX,AL
MOV AL,AH
OUT DX,AL ;初始化2#通道,方式0,用于6s定时
RET
CSH ENDP
PD PROC ;判断子程序,判断输入是否正确
HL: CMP AL,'y'
JE OK
CMP AL,'n'
JE NOK
LEA DX,S8
MOV AH,09H
INT 21H ;显示S8
LEA DX,S6
MOV AH,09H
INT 21H ;显示S6
MOV AH,01H
INT 21H ;从键盘接收一个字符
JMP HL
OK: MOV AL,1 ;输入正确,返回1到AL
RET
NOK: MOV AL,0
RET
PD ENDP
SJ PROC ;菜单子程序
LEA DX,S11
MOV AH,09H
INT 21H ;显示S11
LEA DX,S9
MOV AH,09H
INT 21H ;显示S9
LEA DX,S11
MOV AH,09H
INT 21H ;显示S11
LEA DX,S12
MOV AH,09H
INT 21H ;显示S12
MOV AH,08H
INT 21H ;从键盘接收一个字符
RET
ENDP
CODE ENDS
END START