微机原理频率测试仪

发布时间: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,A0方式输入

KS: CALL CSH ;8253的初始化程序

J_C: MOV DX,PORTA

IN AL,DX

TEST AL,1

JZ J_C ;检测6s时间是否到没到则持续检测PA0,PA0OUT2 连接

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 ;PA7OUT0相接检测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分频为1KHZ1MHZ/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 ;输入正确返回1AL

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

微机原理频率测试仪

相关推荐