📄 精确频率表.asm
字号:
;********************************************************************
;频率表量程为3000HZ以下,保留了一位小数,1000HZ以下可精确到个位,
;在1000HZ以上时误差会随着频率的增加而增大所以本表更适合1000HZ以下
;的频率测量。
; *******************************************************************
ORG 0000H
AJMP BEGIN
ORG 0003H
AJMP START
ORG 0030H
BEGIN: MOV 10H,#0
MOV 11H,#0
MOV 12H,#0
MOV 13H,#0
MOV 14H,#0
MOV 20H,#02H ;位控清零
MOV DPTR,#8003H
MOV A,#80H
MOVX @DPTR,A
MOV R1,#30H
MOV SP,#50H ;堆栈初试化
MOV DPTR,#0C003H ;8253送控制字
MOV A,#16H ;计数器0工作在方式3下
MOVX @DPTR,A
MOV A,#28H
MOV DPTR,#0C000H ;让t0产生一个周期为10us的方波信号作为t1的时钟信号
MOVX @DPTR,A
MOV DPTR,#0C003H ;8253送控制字
MOV A,#70H ;计数器1工作在方式0下
MOVX @DPTR,A
MOV A,#0FFH ;计数器1低8位付初直
MOV DPTR,#0C001H
MOVX @DPTR,A
MOV A,#0FFH ;计数器1高8位付初直
MOVX @DPTR,A
MOV TCON,#01H ;外中断int0,负边沿出触发
SETB EA ;开所有中断
RETURN: ACALL SCAN ;键盘扫描
CJNE A,#0FFH,NEXT ;如果有键按下则转移
DONGTAI: JNB 00H,RETURN ;当00H中为0时动态显示响应!
MOV @R1,#0E0H ;动态显示数据显示输入时由右向左显示频率
MOV A,10H
XCHD A,@R1
MOV DPTR,#6000H
MOV A,@R1
MOVX @DPTR,A
MOV @R1,#0D0H
MOV A,11H
XCHD A,@R1
MOV DPTR,#6000H
MOV A,@R1
MOVX @DPTR,A
MOV @R1, #0B0H
MOV A,12H
XCHD A,@R1
MOV DPTR,#6000H
MOV A,@R1
MOVX @DPTR,A
MOV @R1,#70H
MOV A,13H
XCHD A,@R1
MOV DPTR,#6000H
MOV A,@R1
MOVX @DPTR,A
MOV A,#0F0H
MOV DPTR,#6000H
MOVX @DPTR,A
MOV A,14H
ACALL TEXT
MOV A,R0
MOV DPTR,#8000H
MOVX @DPTR,A
SJMP RETURN
NEXT: CJNE A,#00H,NEXT1 ;判断键型
LCALL DELAY200MS ;延时以待键盘反应
JB 00H,TT1 ;开动态显示
SETB 00H
SETB EX0
NEXT1: AJMP RETURN ;继续扫描
TT1: CLR 00H
CLR EX0
AJMP RETURN ;继续扫描
START: JB 01H,START1
PUSH DPH
PUSH DPL
PUSH A
PUSH 01H
MOV DPTR,#0C001H ;采集计数器1中的数据
MOVX A,@DPTR
MOV 08H,A ;数据底8位放在 08h 中
MOVX A,@DPTR
MOV 09H,A ;数据高8位放在 09h 中
CLR C
MOV A,#0FFH ;检测所计脉冲的个数
SUBB A,08H
MOV 08H,A ;测量的数据低位放在08h中
MOV A,#0FFH
SUBB A,09H
MOV 09H,A ;测量的数据高位放在09h中
MOV A,08H
JNZ COMPUT
MOV A,09H
JZ ERROR
COMPUT: MOV R5,#0 ;计算结果
MOV R6,#0
MOV R4,#0C3H ;用此数除所测量的数据就是频率值
MOV R3,#50H
MOV R1,08H
MOV R2,09H
MOV R7,#16
START1: JB 01H,START2 ;无实际意义,用来连接下面的START2
SETB 01H
ACALL LOOP0
MOV 0DH,R3 ;保护数据
MOV 0EH,R4 ;保护数据
MOV A,R5 ;余数乘10后再被除便得第一位小数
MOV B,#10
MUL AB
MOV R3,A
MOV R4,B
MOV A,R6
MOV B,#10
MUL AB
ADD A,R4
MOV R4,A
MOV R5,B
MOV R6,#0
MOV R7,#16
MOV R1,08H
MOV R2,09H
MOV R7,#16
ACALL LOOP0 ;利用除法将小数第一位求出
MOV 10H,R3 ;小数放到动态显示小数位显示
MOV R4,0EH ;取千位的数值
MOV R3,0DH
MOV R6,#0
MOV R5,#0
MOV R1,#0E8H ;1000为除数
MOV R2,#03H
MOV R7,#16
ACALL LOOP0
MOV 14H,R3 ;千位数字放到14H中保存先
MOV A,R6 ;接下来求百位数字
MOV R4,A
MOV A,R5
MOV R3,A
MOV R6,#0
MOV R5,#0
MOV R1,#64H
MOV R2,#0
MOV R7,#16
ACALL LOOP0
MOV 13H,R3 ;百位数字进13H中,动态显示第4位
MOV A,R5 ;接下来求个位和十位数字
MOV B,#10
DIV AB
MOV 12H,A
MOV 11H,B
ERROR: SETB 01H
SJMP LAST
START2: PUSH DPH
PUSH DPL
PUSH A
PUSH 01H
CLR 01H
MOV A,#0FFH ;8253送数据底八位
MOV DPTR,#0C001H
MOVX @DPTR,A
MOV A,#0FFH ;送高八位
MOVX @DPTR,A
LAST: POP 01H
POP A
POP DPL
POP DPH
CLR IE0
RETI
DISPLAY: MOV DPTR,#8000H
MOVX @DPTR,A
RET
TEXT: CJNE A,#00H,KK1 ; 查字型码子程序入口为A
MOV R0,#3FH ; 出口为R0
RET
KK1:CJNE A,#01H,KK2
MOV R0,#06H
RET
KK2:CJNE A,#02H,KK3
MOV R0,#5BH
RET
KK3:CJNE A,#03H,KK4
MOV R0,#4FH
RET
KK4:CJNE A,#04H,KK5
MOV R0,#66H
RET
KK5:CJNE A,#05H,KK6
MOV R0,#6DH
RET
KK6:CJNE A,#06H,KK7
MOV R0,#7DH
RET
KK7:CJNE A,#07H,KK8
MOV R0,#07H
RET
KK8:CJNE A,#08H,KK9
MOV R0,#7FH
RET
KK9:CJNE A,#09H,JJ
MOV R0,#6FH
JJ:RET
SCAN: CLR P1.0 ;键盘扫描子程序**********************************************
CLR P1.1 ; 占用资源RO,A,字型码出口为
CLR P1.2 ; 数字出口为A. 堆栈2字节
CLR P1.3 ; **********************************************
MOV A,P1
ANL A,#0F0H
CJNE A,#0F0H,KEYSCAN ;如有键按下则转移
SJMP EXIT
KEYSCAN:ACALL DLY20MS ;延时
MOV R0,#00H ;列数用R0来记录
CLR P1.0
SETB P1.1
SETB P1.2
SETB P1.3
MOV A,P1
ANL A,#0F0H
CJNE A,#0F0H,TTTT1 ;若在本行则转移
EXIT: MOV A,#0FFH ;如无键按下则推退出
SJMP DONE
TTTT1: JB P1.4,TTTT2 ;如按键不在本行则转移
MOV A,#00H ;在则将0放热A 中
AJMP TTTT5
TTTT2: JB P1.5,TTTT3 ;如按键不在本行则转移
MOV A,#01H ;在则将1放热A 中
AJMP TTTT5
TTTT3: JB P1.6,TTTT4 ;如按键不在本行则转移
MOV A,#02H ;在则将2放热A 中
AJMP TTTT5
TTTT4: JB P1.7,TTTT5 ;如按键不在本行则转移
MOV A,#03H ;在则将3放热A 中
AJMP TTTT5
TTTT5: ADD A,R0
DONE: RET
DLY20MS: MOV 22H,#70H ; 延时20毫秒子程序 *******占用资源22h,23h****************
DY1: MOV 23H,#69H
DY2: DJNZ 23H,DY2
DJNZ 22H,DY1
RET
DELAY200MS: MOV 22H,#25 ;延时0.5秒子程序 *****占用资源22h,23h,24h************
DL333: MOV 23H,#100
DL222: MOV 24H,#49
DL111: DJNZ 24H,DL111
DJNZ 23H,DL222
DJNZ 22H,DL333
RET
LOOP0: CLR C ;以下为将测量数据转换成数码管可显示的形式
MOV A,R3
RLC A
MOV R3,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R5
RLC A
MOV R5,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R5
MOV PSW.5,C
CLR C
SUBB A,R1
MOV 0FH,A ;余数送0Fh单元保护
MOV A,R6
SUBB A,R2
JB PSW.5,LOOP2
JC LOOP1
LOOP2: MOV R6,A ;余数高字节进r6
MOV R5,0FH ;低字节进r5
INC R3 ;结果进r3
LOOP1: DJNZ R7,LOOP0 ;若没完成数据处理则继续
CLR PSW.5
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -