PLAY1:
CLR P2.6
CLR P2.5
CLR P2.4
CLR P2.3
MOV R1,#50H ;显示数据首地址
MOV P1,#0FFH ;清除原来的数据
SETB P2.3 ;显示最低位
MOV A,@R1
MOV DPTR ,#TAB
MOVC A,@A+DPTR
MOV P1,A
LCALL DL1MS ;数据显示1ms
CLR P2.3
MOV P1,#0FFH
INC R1
SETB P2.4 ;显示次低位
MOV A,@R1
MOV DPTR ,#TAB
MOVC A,@A+DPTR
ANL A,#7FH ;小数固定显示
MOV P1,A
LCALL DL1MS
CLR P2.4
MOV P1,#0FFH
INC R1
SETB P2.5 ;显示次高位
MOV A,@R1
MOV DPTR ,#TAB
MOVC A,@A+DPTR
MOV P1,A
LCALL DL1MS
CLR P2.5
MOV P1,#0FFH
INC R1
SETB P2.6 ;显示最高位
MOV A,@R1
JZ NODISPLAY ;若A=0,则不显示
MOV DPTR ,#TAB
MOVC A,@A+DPTR
MOV P1,A
LCALL DL1MS
CLR P2.6
MOV P1,#0FFH
NODISPLAY:
MOV P1,#0FFH
AJMP PLAY1
RET
L1:CLR C ;十进制转换
MOV R5,#00H
MOV R4,#00H
MOV R3,#08H
NEXT1:RLC A
MOV R2,A
MOV A,R5
ADDC A,R5
DA A
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
MOV A,R2
DJNZ R3,NEXT1
RET
TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH
DL1MS:
MOV R6,#14H
DL1:MOV R7,#19H
DL2:DJNZ R7,DL2
DJNZ R6,DL1
RET
3.2.6 输出频率测试计算及显示子程序部分
⑴.频率测试计算子程序部分
SA828带有频率输出端口,将其与单片机的中断INT0口相接,如原理图所示。本例中所使用的中断源有2个:T0中断和 中断。 中断的功能是计算ZPPR输出的调制波频率。由于调制波频率可能比较低,因此用T0溢出中断来记录一个ZPPR周期中T0溢出的次数,这个溢出次数保存到70H中。这样,在一个 中断间隔里,所用的时间(即ZPPR周期)是3个字节的数(1个字节的T0溢出次数,2个字节的T0值)。
因为AT89C52使用12MHZ的时钟频率,一个机器周期是 ,所以调制波频率的计算公式为:
=0F4240H,也是一个3字节的数,因此 是一个3字节除法运算。如果对精度要求不高, 的分子分母可以舍掉最低字节来简化运算,这样就成为双字节除法运算。所以,当 中断时,只取TH0,将其存放到71H中除法运算的整数商存放到72H、73H中,小数商存放到75H中,以便频率显示程序中调用。
中断子程序及流程图如下:
SUANPIN: CLR EA ;关中断
CLR TR0
PUSH ACC ;保存现场
PUSH B
PUSH DPL
PUSH DPH
PUSH PSW
PUSH 50H
PUSH 51H
PUSH 52H
PUSH 53H
PUSH 60H
PUSH 61H
PUSH 62H
PUSH 63H
PUSH 6AH
SETB PSW.3
MOV 70H,#00H ;
MOV TL0,#00H ;TL0清0
MOV 71H,TH0 ;取TH0值
MOV
TH0,#00H ;TH0清0
MOV A,71H ;检查除数是否为0
ORL A,70H ;不会溢出,高位永远为零
JZ ABC ;除数为0则退出
MOV R2,#00H ;输入被