📄 jianxiangqi.asm
字号:
ORG 0000H
AJMP HEND
ORG 0003H
AJMP FIRST
ORG 0013H
AJMP SECOND
ORG 0030H
HEND: MOV SP,#50H
MOV R1,#40H
CLR 00H
MOV TCON,#05H ;外部中断用负边沿触发
MOV IE,#80H ;开中断
MOV TMOD,#11H ;T0,T1均为定时器
MOV TH0,#0 ;T0用来计时信号的周期
MOV TL0,#0
MOV TH1,#0 ;T1用来计时信号相位的相差时间
MOV TL1,#0
MOV 14H,#0EH ;动态显示的驱动位在开机时的状态
MOV 15H,#0FH ;即只显示个位
MOV 16H,#0FH
MOV 17H,#0FH
LOOP: CLR P1.0 ; 设置行编码"1110"
SETB P1.1
SETB P1.2
SETB P1.3
JB P1.4,NEXT1 ;判断"1"键是否按下
ACALL DLY20MS ; 延时去抖
K0: JB P1.4,K00 ; 等待"1"键释放
AJMP K0
K00: JB 00H,PUTOFF ;电压表的开关
SETB 00H
CLR IE0
SETB EX0 ;开关开后,中断INT0便开
NEXT1: JNB 00H,BACK ;当00H位为1时,动态显示开
MOV @R1,14H ;动态显示数据显示输入时由右向左显示频率
MOV A,10H
XCHD A,@R1
MOV DPTR,#6000H
MOV A,@R1
MOVX @DPTR,A
MOV @R1,15H
MOV A,11H
XCHD A,@R1
MOV DPTR,#6000H
MOV A,@R1
MOVX @DPTR,A
MOV @R1, 16H
MOV A,12H
XCHD A,@R1
MOV DPTR,#6000H
MOV A,@R1
MOVX @DPTR,A
MOV @R1,17H
MOV A,13H
XCHD A,@R1
MOV DPTR,#6000H
MOV A,@R1
MOVX @DPTR,A
MOV A,#0F0H
MOV DPTR,#6000H
MOVX @DPTR,A
BACK: SJMP LOOP
PUTOFF: CLR 00H
CLR EX1 ;开关关后,中断也关
CLR EX0 ;开关关后,中断也关
SJMP LOOP
FIRST: JB 01H,BESIDE2 ;中断服务,若是第二个下降沿则转移
SETB TR0 ;在第一个下降沿时T0开始计数
SETB 01H
RETI
BESIDE2:SETB TR1 ;在第二个下降沿到时开T1计数器
CLR TR0 ;关TR0计数器
CLR EX0 ;关外中断0
CLR IE1 ;控制它在中断0执行后第二路波的第一个下降沿中断
SETB EX1 ;开外中断1
CLR 01H
RETI
SECOND: PUSH A ;保护数据
CLR TR1 ;停计数器1的计数
MOV A,TH0 ;取出信号的周期
MOV 0CH,A
MOV A,TL0
MOV 0DH,A
MOV A,TH1 ;取出两路信号的时间差
MOV R2,A
MOV A,TL1
MOV R3,A
MOV R6,#01H ;将360度送进R6,R7中
MOV R7,#68H
MOV A,R3 ;计算R3乘R7
MOV B,R7
MUL AB
MOV R4,B ; 暂存部分积
MOV R5,A
MOV A,R3 ;计算R3乘R6
MOV B,R6
MUL AB
ADD A,R4 ;累加部分积
MOV R4,A
CLR A
ADDC A,B
MOV R3,A
MOV A,R2 ;计算R2乘R7
MOV B,R7
MUL AB
ADD A,R4 ;累加部分积
MOV R4,A
MOV A,R3
ADDC A,B
MOV R3,A
CLR A
RLC A
XCH A,R2 ;计算R2乘R6
MOV B,R6
MUL AB
ADD A,R3 ;累加部分积
MOV R3,A
MOV A,R2
ADDC A,B
MOV R2,A ;程序结果存在R2,R3,R4,R5中
MOV R6,0CH ;将信号周期进R6,R7中
MOV R7,0DH
MOV 08H,#16
ACALL LOOP0
MOV 0AH,R5 ;将整数部分数据保护起来
MOV 0BH,R4
MOV A,R3 ;余数低位进A
MOV B,#10
MUL AB
MOV R5,A
MOV R4,B
MOV A,R2 ;余数高位进A
MOV B,#10
MUL AB
ADD A,R4
MOV R4,A
MOV R3,B
MOV R2,#0
MOV R6,0CH
MOV R7,0DH
MOV 08H,#16
ACALL LOOP0 ;求出小数部分
MOV 10H,R5
MOV R5,0AH ;求百位
MOV R4,0BH
MOV R2,#0
MOV R3,#0
MOV 08H,#16
MOV R7,#64H
MOV R6,#0
ACALL LOOP0
MOV 13H,R5 ;将百位送动态显示的百位上
MOV A,R3 ;求十位和个位
MOV B,#10
DIV AB
MOV 12H,A
MOV 11H,B
SETB EX0 ;开外中断0,继续跟踪信号,进行下一次的鉴相
CLR IE0 ;剔除可能产生的中断标志
CLR IE1
MOV TH0,#0 ;计数器从新计数
MOV TL0,#0
MOV TH1,#0
MOV TL1,#0
MOV 15H,#0B0H
MOV 16H,#70H
POP A
RETI
LOOP0: CLR C ;以下为将测量数据转换成数码管可显示的形式
MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
MOV A,R3
MOV PSW.5,C
CLR C
SUBB A,R7
MOV 0FH,A ;余数送0Fh单元保护
MOV A,R2
SUBB A,R6
JB PSW.5,LOOP2
LOOP2: JC LOOP1
MOV R2,A ;余数高字节进r2
MOV R3,0FH ;低字节进r3
INC R5 ;结果进r5
LOOP1: DJNZ 08H,LOOP0 ;若没完成数据处理则继续
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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -