6數碼管頻率計匯編程序注意:電路圖中,6個位驅動三極管型號是3CG,NPN型,P2口相應位輸出低電平點亮.
;/***************************************************************************
;標題:51頻率計.asm 20161127
;說明:通過對信號在1s內的脈沖計數值求得頻率,并通過數碼管顯示結果
; T0用于頻率計數,T1用于1秒定時
;工作于:6數碼管板
;作者:LRY
;日期:2016年11月20日
;備注:使用12M晶振,頻率量程<1000000Hz
;******************************************************************************/
T1_COUNT EQU 48H ;時間中斷數地址
inm equ 43h ;T0計數中斷數存儲地址
inh equ 41h
inl equ 42h
T0_COUNT EQU 49H ;T0計數中斷數地址
KK EQU 40H ;數據緩存地址
dm4 equ 36h
dm3 equ 37h
dm2 equ 38h
dm1 equ 39h
dm0 equ 3ah
;數據存放
ORG 0100H
TABLE: DB 0C0h,0F9H,0A4H,0b0H,99H,92H,82H,0F8H,80H,90H,88h,83h,0c6h,0a1h,86h,8eh ;共陽數碼管 0-f
ORG 0000H
LJMP START
ORG 001BH ;T1中斷001BH
JMP T1_interrupt
ORG 000BH ;T0中斷000BH
JMP T0_interrupt
ORG 0200H
;-------------------------------------------------------------
;主程序
;-------------------------------------------------------------
START:
MOV KK,#255
SETB F0 ;
LCALL PRO_init ;程序初始化
LCALL TIM_set ;定時器設置
LOOP:
JB F0 ,LOOP1 ;1秒到,清F0才執行下面行
LCALL HEX2BCD_
LCALL DISPLAY
LOOP1:
JMP LOOP
;---------------------------------------------------------
;初始化程序
;---------------------------------------------------------
PRO_init:
MOV A,#00H ;A清0
MOV B,#00H ;B清0
MOV P0,#0FFH ;P0拉高,關段顯示
MOV P1,#0FFH
MOV P2,#0ffH ;P2拉高,關位顯示
MOV T1_COUNT,#00H ;T1定時中斷數初始化
MOV T0_COUNT,#00H ;T0計數中斷數初始化
SETB P3.4 ;P3.4端口(T0)置輸入狀態
RET
;--------------------------------------------------------
;定時/計數器設置
;T0,T1均工作于方式1,T1用于定時,T0用于脈沖計數
;--------------------------------------------------------
TIM_set:
MOV TMOD,#15H ;T0定時,T1計數,模式設置
MOV TH1,#3CH ;定時 50 MS,初值
MOV TL1,#0B0H
MOV TH0,#00H ;清T0計數器
MOV TL0,#00H
MOV IE,#8AH ;開總中斷,開T0中斷、T1中斷
SETB TR1 ;計數器T1開始工作
SETB TR0 ;計數器T0開始工作
RET
HEX2BCD_ :
;把TH0 TL0的數值轉成十進制, 分別存入R4(高位) R3 R2 R1 R0。
mov r1,inl
mov r0,inh
;------------------------------------------------------------------
CALL HEX2BCD ;調用子程序把R0 R1中的數字,轉換成BCD碼,送到R2 R3 R4
;-------下面,把萬千百十個位,分別存入R4 R3 R2 R1 R0
MOV A, R4
MOV B, #16
DIV AB ;除以16,目的是分離出高、低四位
MOV R1, A ;存放十位
MOV R0, B ;存放個位
MOV A, R2
MOV R4, A ;存放萬位
MOV A, R3
MOV B, #16
DIV AB
MOV R3, A
MOV R2, B
mov dm4,r4
mov dm3,r3
mov dm2,r2
mov dm1,r1
mov dm0,r0
RET
;------------------------------------------------------------------
;兩個字節的二進制數轉換成BCD碼的程序如下:
;功能:16位二進制數變換成為 BCD 碼;
;入口:R0 R1 中是 16 位二進制數,其中R0中是高 8 位;
;出口:R2 R3 R4 中是 BCD 碼,其中R2中是萬位,R3中是千、百位,R4中是十、個位。
HEX2BCD:
CLR A
MOV R2, A ;先清零
MOV R3, A
MOV R4, A
MOV R5, #16 ;共轉換十六位數
LOOP2:
CLR C
MOV A, R1 ;從待轉換數的高端移出一位到Cy
RLC A
MOV R1, A
MOV A, R0
RLC A
MOV R0, A
MOV A, R4 ;送到BCD碼的低端
ADDC A, R4 ;帶進位加。自身相加,相當于左移一位
DA A ;十進制調整,變成BCD碼
MOV R4, A
MOV A, R3
ADDC A, R3
DA A
MOV R3, A
MOV A, R2
ADDC A, R2
MOV R2, A
DJNZ R5, LOOP2 ;共轉換十六位數
RET
;------------------------------------------------------------------
;--------------------------------------------------
;T0計數中斷
T0_interrupt:
CLR TF0
INC T0_COUNT ;T0計數中斷數加1
RETI
;-------------------------------------------------------
;定時器1中斷服務程序:T1用于定時,1秒到,關T1、關T0(用于計數),
; 取出計數值;
;-------------------------------------------------------
T1_interrupt:
CLR TF1
MOV TL1,#0B0H ;重新賦初值
MOV TH1,#3CH
INC T1_COUNT ;T1定時中斷數加1,1S,時間單位
MOV A,T1_COUNT ;查看數量值
CJNE A,#20,T_END ;如果沒有到1S返回
;1秒到,
CLR TR1 ;關閉T1
CLR TR0 ;關T0
MOV T1_COUNT,#00H ;到1S則清零
MOV inl,TL0 ;取出計數值
MOV inh,TH0
MOV A,T0_COUNT ;保存T0中斷數
MOV inm,A
MOV TH0,#00H ;清空T0數據
MOV TL0,#00H
MOV T0_COUNT,#00H
MOV KK,#255 ;顯示掃描次數
CLR F0 ;計數之后,轉換數據、顯示
T_END:
RETI
;-------------------------------------------------------
;數碼管顯示子程序
;顯示數據入口:段碼數據:R5百千位,R4、R3、R2、R1、R0;
;顯示數據出口:段碼:P0口;位碼:P2口
;-------------------------------------------------------
DISPLAY:
MOV DPTR,#TABLE
loop3:
MOV A,inm ;百千位數據送A
MOVC A,@A+DPTR ;獲得段碼
MOV P0,A ;輸出段碼
CLR P2^0 ;十千位數碼管陽極控制腳,低電平亮
LCALL DELAY ;亮一會
setb P2^0 ;關位碼輸出
MOV A,dm4 ;十千位數據送A
MOVC A,@A+DPTR ;獲得段碼
MOV P0,A ;輸出段碼
CLR P2^1 ;十千位數碼管陽極控制腳,低電平亮
LCALL DELAY ;亮一會
setb P2^1 ;關位碼輸出
MOV A,dm3 ;千位數據送A
MOVC A,@A+DPTR ;獲得段碼
MOV P0,A ;輸出段碼
clr P2^2
LCALL DELAY
setb P2^2
MOV A,dm2
MOVC A,@A+DPTR
MOV P0,A
clr P2^3
LCALL DELAY
setb P2^3
MOV A,dm1
MOVC A,@A+DPTR
MOV P0,A
clr P2^4 ;十位數碼管
LCALL DELAY
setb P2^4
MOV A,dm0
MOVC A,@A+DPTR
MOV P0,A
clr P2^5 ;個位數碼管
LCALL DELAY
setb P2^5
djnz kk, loop3 ;循環掃描
clr inm
setb tr0
setb tr1
setb f0
RET
;-------------------------------------------------------
;延時子程序
;-------------------------------------------------------
DELAY: ;1MS@12.000MHz
PUSH 30H
PUSH 31H
MOV 30H,#2
MOV 31H,#234
NEXT:
DJNZ 31H,NEXT
DJNZ 30H,NEXT
POP 31H
POP 30H
RET
END
;161125:單片機運行結果:
;1、無信號顯示6個0
;2、計數、顯示分時進行;
;3、音頻、超聲頻段可用,最高到65KHz,最高位是16進制碼;
;4、如最高位顯示1,則頻率=(最高位)*65536+后5位頻率數
;
|