基于單片機的簡易數(shù)字頻率計
想知道主電路圖是怎么樣的
下面是單片機匯編源程序。。
- A1 EQU 40H ;現(xiàn)場數(shù)據(jù)低位
- A2 EQU 41H ;現(xiàn)場數(shù)據(jù)高位
- DBUF EQU 30H ;顯示緩沖區(qū)
- FL EQU 50H ;頻率值低位
- FM EQU 51H ;頻率值中位
- FH EQU 52H ;頻率值高位
- CLK BIT P1. 6 ;164的時鐘信號
- FRE BIT P1.7 ;164的數(shù)據(jù)信號
- INPUT BIT P3.4 ;頻率輸入端
- ;除法中用到的標志位
- FLAG BIT 00H
- ;被除數(shù)單元,商也放在這里
- BCSL EQU 3CH
- BCSM EQU 3DH
- BCSH EQU 3EH
- ;除數(shù)單元
- CSL EQU 42H
- CSM EQU 43H
- CSH EQU 44H
- ;余數(shù)單元
- YSL EQU 3FH
- YSM EQU 40H
- YSH EQU 41H
- ;除法運算中的暫存單元
- BUF1 EQU 45H
- BUF2 EQU 46H
- BUF3 EQU 47H
- ;除法中的計算次數(shù)
- TIMES1 EQU 48H
- CALC_TIMES EQU 49H
- ORG 0000H
- LJMP MAIN
- ORG 000BH
- LJMP T0_INT
- ORG 001BH
- LJMP T1_INT
- ORG 0100H
- MAIN:
- MOV A1, #00H
- MOV A2, #00H
- MOV R2, #00H
- MOV R3, #00H
- CLR PSW.5
- MOV R0, #DBUF
- MOV R7,#06H
- LOOP1:
- MOV @R0,#00H
- INC R0
- DJNZ R7,LOOP1
- LCALL DISPLAYM
- SETB EA
- SETB ET0
- SETB ET1 ;中斷初始化
- LOOP2:
- LCALL JISHU ;計數(shù)法初測
- LCALL COMPARE ;測量結(jié)果比較
- JB PSW.5,NEXT1 ;<1000轉(zhuǎn)用測周法
- LCALL DECI ;頻率轉(zhuǎn)為十進制
- LCALL DISAPP ;分離顯碼和消隱
- LCALL DISPLAYM ;顯示
- SJMP NEXT2 ;循環(huán)
- NEXT1:
- CLR PSW.5 ;清空標志位
- LCALL CEZHOU ;用測周法重測
- LCALL MENDT ;計算頻率轉(zhuǎn)10進制
- LCALL DISAPP ;分離顯碼和消隱
- LCALL DISPLAYT ;顯示
- NEXT2:LCALL DY50MS ;延時 50MS
- SJMP LOOP2;
- JISHU:
- MOV TMOD,#15H ;T1定時1S,T0計數(shù)
- MOV TH1,#3CH
- MOV TL1,#0B0H
- MOV TH0,#00H
- MOV TL0,#00H
- SETB TR0
- SETB TR1
- NEXTT2:CJNE R2,#14H,[ DISCUZ_CODE_1 ]nbsp; ;等待一秒計時結(jié)束
- MOV R2,#00H
- MOV R3,#00H
- CLR TR0
- CLR TR1
- MOV A1,TL0 ;存頻率低位
- MOV A2,TH0 ;存頻率高位
- RET
- T0_INT:INC R3
- MOV TH0,#00H
- MOV TL0,#00H
- RETI
- T1_INT: INC R2
- MOV TH1,#3CH
- MOV TL1,#0B0H ; 定時50ms
- RETI
- ;T0中計數(shù)值與3E8H比較大小,若大于或等于3E8H(1000)
- ;則用高頻計數(shù)法,且置標志位為0;否則用低頻測周法,且置標志位為1
- COMPARE:
- MOV A,A2
- CJNE A,#03H,NEXTC3
- MOV A,A1
- CJNE A,#0E8H,NEXTC5
- NEXTC3:JC NEXTC1 ;低頻計數(shù)法不可用
- SJMP NEXTC4
- CLR C
- NEXTC5:JNC NEXTC4 ;低頻計數(shù)法不可用
- NEXTC1:SETB PSW.5
- SJMP BACKC
- NEXTC4:CLR PSW.5
- BACKC:RET
- ;入口參數(shù) A1&2 出口參數(shù)FL&2&3
- DECI:
- MOV R6,A2 ;高位
- MOV R7,A1 ;低位
- LCALL H_BCD ;轉(zhuǎn)BCD
- MOV FH,R3 ;高位
- MOV FM,R4
- MOV FL,R5 ;低位
- RET
- ;分離顯碼&消隱
- DISAPP:
- MOV R7,#06H
- MOV R0,#DBUF
- MOV R1,#FL
- LOOPD1:MOV A,@R1
- PUSH ACC
- ANL A,#0FH
- MOV @R0,A
- INC R0
- POP ACC
- SWAP A
- ANL A,#0FH
- MOV @R0,A
- INC R1
- INC R0
- DJNZ R7,LOOPD1 ;分離顯碼結(jié)束
- MOV R7,#03H
- MOV R0,#DBUF
- MOV A,R0
- ADD A,#05H
- MOV R0,A ;R0 指向顯示緩沖區(qū)最高位
- LOOPD2:
- CJNE @R0,#00H,BACKD
- MOV @R0,#10H
- DEC R0
- DJNZ R7,LOOPD2
- BACKD: RET
- DISPLAYM:
- MOV R0,#DBUF
- MOV R7,#06H
- LOOPM2:
- MOV A,@R0
- MOV DPTR,#TAB
- MOVC A,@A+DPTR
- INC R0
- MOV R6,#08H
- LOOP3:
- RRC A
- JC LP1
- CLR CLK
- CLR FRE
- SETB CLK
- SJMP LP2
- LP1:
- CLR CLK
- SETB FRE
- SETB CLK
- LP2: DJNZ R6,LOOP3
- DJNZ R7,LOOPM2
- RET
- TAB:DB 42H,0F6H,13H,92H
- DB 0A6H,8AH,0AH,0F2H
- DB 02H,82H,22H,0EH
- DB 4BH,16H,03H,2BH,0FFH
- CEZHOU:
- MOV R3,#00H
- MOV TMOD,#01H
- MOV TH0,#00H
- MOV TL0,#00H
- JNB INPUT,$
- JB INPUT,$
- SETB TR0
- JNB INPUT,$
- JB INPUT,$
- CLR TR0
- MOV A1,TL0 ;時間低位
- MOV A2,TH0 ;時間高位
- RET
- ;入口參數(shù)r3A2A1&出口參數(shù)FL23
- MENDT:
- MOV BCSL,#40H
- MOV BCSM,#42H
- MOV BCSH,#0FH
- MOV CSL,A1
- MOV CSM,A2
- MOV CSH,R3
- LCALL DIV33 ;計算頻率
- MOV R6,BCSM
- MOV R7,BCSL
- LCALL H_BCD
- MOV FM,R5 ;低位
- MOV FH,R4 ; 把商的整數(shù)部分轉(zhuǎn)換為BCD碼
- ;并存入FM、FH
- MOV R1,#YSL
- MOV R7,#03H
- ACALL LOOP10
- MOV BCSL,YSL
- MOV BCSM,YSM
- MOV BCSH,YSH
- LCALL DIV33
- MOV A,BCSL
- SWAP A
- MOV FL,A ;頻率的小數(shù)部分
- MOV R1,#YSL
- MOV R7,#03H
- ACALL LOOP10
- MOV BCSL,YSL
- MOV BCSM,YSM
- MOV BCSH,YSH
- LCALL DIV33
- MOV A,BCSL
- ORL FL,A
- RE
- DISPLAYT:
- MOV R0,#DBUF
- MOV R7,#06H
- LOOP12:
- MOV A,@R0
- CJNE R0,#32H,NEXTDI1 ;如果是由低位數(shù)的第三位加小數(shù)點
- MOV DPTR,#TAB1
- MOVC A,@A+DPTR
- SJMP NEXTDI2
- NEXTDI1:
- MOV DPTR,#TAB
- MOVC A,@A+DPTR
- NEXTDI2:
- INC R0
- MOV R6,#08H
- LOOP13:
- RRC A
- JC LP3
- CLR CLK
- CLR FRE
- SETB CLK
- SJMP NEXT11
- LP3:
- CLR CLK
- SETB FRE
- SETB CLK
- NEXT11:DJNZ R6,LOOP13
- DJNZ R7,LOOP12
- RET
- TAB1:DB 40H,0F4H,11H,90H
- DB 0A4H,88H,08H,0F0H
- DB 00H,80H,20H,0CH
- DB 49H,14H,01H,29H
- H_BCD: ;入口地址:R6R7 出口地址:R3R4R5
- HB2:CLR A ;BCD碼初始化
- MOV R3,A
- MOV R4,A
- MOV R5,A
- MOV R2,#10H ;轉(zhuǎn)換雙字節(jié)十六進制整數(shù)
- HB3:MOV A,R7 ;從高端移出待轉(zhuǎn)換數(shù)的一位到CY中
- RLC A
- MOV R7,A
- MOV A,R6
- RLC A
- MOV R6,A
- MOV A,R5 ;BCD碼帶進位自身相加,相當于乘2
- ADDC A,R5
- DA A ;十進制調(diào)整
- MOV R5,A
- MOV A,R4
- ADDC A,R4
- DA A
- MOV R4,A
- MOV A,R3
- ADDC A,R3
- MOV R3,A ;雙字節(jié)十六進制數(shù)的萬位數(shù)不超過6,不用調(diào)整
- DJNZ R2,HB3 ;處理完16bit
- RET
- DIV33:
- MOV TIMES1,#06H
- MOV A,CSL
- ORL A,CSM
- ORL A,CSH
- JNZ DIVD0
- cpl p1.1
- SETB OV
- RET
- DIVD0: MOV YSL,#00H
- MOV YSM,#00H
- MOV YSH,#00H
- MOV B,#24
- MOV R0,#BCSL
- MOV TIMES1,#06H
- DIVD1: CLR C
- LPDIV33:
- MOV A,@R0
- RLC A
- MOV @R0,A
- INC R0
- DJNZ TIMES1,LPDIV33
- MOV R0,#BCSL
- MOV TIMES1,#06H
- MOV FLAG,C
- CLR C
- MOV A,YSL
- SUBB A,CSL
- MOV BUF1,A
- MOV A,YSM
- SUBB A,CSM
- MOV BUF2,A
- MOV A,YSH
- SUBB A,CSH
- MOV BUF3,A
- ANL C,/FLAG
- JC DIVD2
- MOV YSL,BUF1
- MOV YSM,BUF2
- MOV YSH,BUF3
- INC BCSL
- DIVD2: DJNZ B,DIVD1
- CLR OV
- RET
- LOOP10:
- CLR C
- MOV R2,#00H
- LP10: MOV A,@R1
- MOV B,#0AH
- MUL AB
- ADDC A,R2
- MOV @R1,A
- MOV R2,B
- INC R1
- DJNZ R7,LP10
- MOV @R1,B
- RET
- DY50MS:
- MOV R6,#32H
- LOOPDY1:MOV R0,#0FAH
- LOOPDY2:MOV R7,#70H
- DJNZ R0,LOOPDY2
- DJNZ R6,LOOPDY1
- RET
- END
復制代碼
|