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位频率数
;
|