找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 3815|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

6數(shù)碼管頻率計匯編程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:34607 發(fā)表于 2016-11-27 13:39 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
6數(shù)碼管頻率計匯編程序注意:電路圖中,6個位驅(qū)動三極管型號是3CG,NPN型,P2口相應(yīng)位輸出低電平點亮.

;/***************************************************************************
;標(biāo)題:51頻率計.asm        20161127
;說明:通過對信號在1s內(nèi)的脈沖計數(shù)值求得頻率,并通過數(shù)碼管顯示結(jié)果
;      T0用于頻率計數(shù),T1用于1秒定時
;工作于:6數(shù)碼管板
;作者:LRY
;日期:2016年11月20日
;備注:使用12M晶振,頻率量程<1000000Hz
;******************************************************************************/  

T1_COUNT          EQU   48H    ;時間中斷數(shù)地址  

inm                equ                43h                ;T0計數(shù)中斷數(shù)存儲地址
inh                equ                41h
inl                equ                42h

T0_COUNT          EQU   49H                ;T0計數(shù)中斷數(shù)地址
KK                        EQU          40H        ;數(shù)據(jù)緩存地址

dm4        equ        36h
dm3        equ        37h
dm2        equ        38h
dm1        equ        39h
dm0        equ        3ah

;數(shù)據(jù)存放  
ORG 0100H
TABLE: DB 0C0h,0F9H,0A4H,0b0H,99H,92H,82H,0F8H,80H,90H,88h,83h,0c6h,0a1h,86h,8eh     ;共陽數(shù)碼管 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   ;定時器設(shè)置
LOOP:   
        JB  F0  ,LOOP1        ;1秒到,清F0才執(zhí)行下面行
        LCALL HEX2BCD_      
    LCALL DISPLAY              
LOOP1:
    JMP LOOP

;---------------------------------------------------------
;初始化程序
;---------------------------------------------------------  
PRO_init:        
        MOV A,#00H        ;A清0
        MOV B,#00H        ;B清0
        MOV P0,#0FFH                ;P0拉高,關(guān)段顯示
    MOV P1,#0FFH        
        MOV P2,#0ffH      ;P2拉高,關(guān)位顯示  
    MOV T1_COUNT,#00H        ;T1定時中斷數(shù)初始化
    MOV T0_COUNT,#00H        ;T0計數(shù)中斷數(shù)初始化
    SETB  P3.4             ;P3.4端口(T0)置輸入狀態(tài)
RET

;--------------------------------------------------------
;定時/計數(shù)器設(shè)置
;T0,T1均工作于方式1,T1用于定時,T0用于脈沖計數(shù)
;--------------------------------------------------------
TIM_set:
     MOV TMOD,#15H                ;T0定時,T1計數(shù),模式設(shè)置
    MOV TH1,#3CH      ;定時 50 MS,初值
    MOV TL1,#0B0H         
     MOV  TH0,#00H                 ;清T0計數(shù)器
     MOV  TL0,#00H
     MOV  IE,#8AH                  ;開總中斷,開T0中斷、T1中斷
     SETB  TR1                            ;計數(shù)器T1開始工作
     SETB  TR0                     ;計數(shù)器T0開始工作
RET

HEX2BCD_ :
;把TH0 TL0的數(shù)值轉(zhuǎn)成十進制, 分別存入R4(高位) R3 R2 R1 R0。
  mov r1,inl
  mov r0,inh
;------------------------------------------------------------------
     CALL HEX2BCD      ;調(diào)用子程序把R0 R1中的數(shù)字,轉(zhuǎn)換成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              

;------------------------------------------------------------------
;兩個字節(jié)的二進制數(shù)轉(zhuǎn)換成BCD碼的程序如下:
;功能:16位二進制數(shù)變換成為 BCD 碼;
;入口:R0 R1 中是 16 位二進制數(shù),其中R0中是高 8 位;
;出口:R2 R3 R4 中是 BCD 碼,其中R2中是萬位,R3中是千、百位,R4中是十、個位。
HEX2BCD:
     CLR A
     MOV R2, A            ;先清零
     MOV R3, A
     MOV R4, A
     MOV R5, #16          ;共轉(zhuǎn)換十六位數(shù)
LOOP2:
     CLR C
     MOV A,   R1           ;從待轉(zhuǎn)換數(shù)的高端移出一位到Cy
     RLC A
     MOV R1, A
     MOV A,   R0
     RLC A
     MOV R0, A
     MOV A,   R4           ;送到BCD碼的低端
     ADDC A,   R4           ;帶進位加。自身相加,相當(dāng)于左移一位
     DA   A                 ;十進制調(diào)整,變成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         ;共轉(zhuǎn)換十六位數(shù)
RET
;------------------------------------------------------------------

;--------------------------------------------------
;T0計數(shù)中斷
T0_interrupt:
        CLR TF0       
  INC T0_COUNT          ;T0計數(shù)中斷數(shù)加1
RETI

;-------------------------------------------------------
;定時器1中斷服務(wù)程序:T1用于定時,1秒到,關(guān)T1、關(guān)T0(用于計數(shù)),
;        取出計數(shù)值;
;-------------------------------------------------------
T1_interrupt:
        CLR TF1       
      MOV TL1,#0B0H       ;重新賦初值
      MOV TH1,#3CH      
      INC T1_COUNT          ;T1定時中斷數(shù)加1,1S,時間單位
      MOV A,T1_COUNT        ;查看數(shù)量值
      CJNE A,#20,T_END      ;如果沒有到1S返回
;1秒到,
      CLR  TR1                         ;關(guān)閉T1
      CLR  TR0                    ;關(guān)T0
      MOV T1_COUNT,#00H     ;到1S則清零
      MOV inl,TL0         ;取出計數(shù)值
      MOV inh,TH0
          MOV A,T0_COUNT                ;保存T0中斷數(shù)
          MOV inm,A
      MOV  TH0,#00H             ;清空T0數(shù)據(jù)
      MOV  TL0,#00H
      MOV  T0_COUNT,#00H          
        MOV KK,#255                ;顯示掃描次數(shù)
        CLR F0                ;計數(shù)之后,轉(zhuǎn)換數(shù)據(jù)、顯示
T_END:
RETI  

;-------------------------------------------------------
;數(shù)碼管顯示子程序
;顯示數(shù)據(jù)入口:段碼數(shù)據(jù):R5百千位,R4、R3、R2、R1、R0;
;顯示數(shù)據(jù)出口:段碼:P0口;位碼:P2口
;-------------------------------------------------------
DISPLAY:
    MOV DPTR,#TABLE
loop3:
        MOV A,inm                ;百千位數(shù)據(jù)送A
          MOVC A,@A+DPTR  ;獲得段碼
        MOV P0,A                ;輸出段碼
           CLR P2^0        ;十千位數(shù)碼管陽極控制腳,低電平亮
           LCALL DELAY                ;亮一會
           setb P2^0                 ;關(guān)位碼輸出





        MOV A,dm4                ;十千位數(shù)據(jù)送A
          MOVC A,@A+DPTR  ;獲得段碼
        MOV P0,A                ;輸出段碼
           CLR P2^1        ;十千位數(shù)碼管陽極控制腳,低電平亮
           LCALL DELAY                ;亮一會
           setb P2^1                 ;關(guān)位碼輸出

        MOV A,dm3                ;千位數(shù)據(jù)送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            ;十位數(shù)碼管
           LCALL DELAY
        setb P2^4  

        MOV A,dm0
        MOVC A,@A+DPTR
    MOV P0,A
        clr P2^5              ;個位數(shù)碼管
        LCALL DELAY
        setb P2^5   

  djnz kk, loop3        ;循環(huán)掃描
  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:單片機運行結(jié)果:
;1、無信號顯示6個0
;2、計數(shù)、顯示分時進行;
;3、音頻、超聲頻段可用,最高到65KHz,最高位是16進制碼;
;4、如最高位顯示1,則頻率=(最高位)*65536+后5位頻率數(shù)



;


評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表