找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3197|回复: 0
打印 上一主题 下一主题
收起左侧

6数码管频率计汇编程序

[复制链接]
跳转到指定楼层
楼主
ID:34607 发表于 2016-11-27 13:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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位频率数



;


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表