⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 精确频率表.asm

📁 用汇编语言实现了精确频率计。实验已经通过
💻 ASM
字号:
;********************************************************************
;频率表量程为3000HZ以下,保留了一位小数,1000HZ以下可精确到个位,
;在1000HZ以上时误差会随着频率的增加而增大所以本表更适合1000HZ以下
;的频率测量。
; *******************************************************************
           ORG  0000H
           AJMP BEGIN
           ORG  0003H
           AJMP START
           ORG 0030H
   BEGIN:  MOV 10H,#0
           MOV 11H,#0
           MOV 12H,#0
           MOV 13H,#0
           MOV 14H,#0
           MOV 20H,#02H                ;位控清零
           MOV DPTR,#8003H
           MOV A,#80H
           MOVX @DPTR,A
           MOV R1,#30H
           MOV SP,#50H                ;堆栈初试化
           MOV DPTR,#0C003H           ;8253送控制字
           MOV A,#16H                 ;计数器0工作在方式3下
           MOVX @DPTR,A
           MOV A,#28H
           MOV DPTR,#0C000H           ;让t0产生一个周期为10us的方波信号作为t1的时钟信号
           MOVX @DPTR,A
           MOV DPTR,#0C003H           ;8253送控制字
           MOV A,#70H                 ;计数器1工作在方式0下
           MOVX @DPTR,A
           MOV A,#0FFH                ;计数器1低8位付初直
           MOV DPTR,#0C001H
           MOVX @DPTR,A
           MOV A,#0FFH                ;计数器1高8位付初直
           MOVX @DPTR,A
           MOV TCON,#01H              ;外中断int0,负边沿出触发
           SETB EA                    ;开所有中断


  RETURN: ACALL SCAN                  ;键盘扫描
          CJNE A,#0FFH,NEXT           ;如果有键按下则转移
DONGTAI:  JNB 00H,RETURN              ;当00H中为0时动态显示响应!
          MOV @R1,#0E0H               ;动态显示数据显示输入时由右向左显示频率
          MOV A,10H
          XCHD A,@R1
          MOV DPTR,#6000H
          MOV A,@R1
          MOVX @DPTR,A
          MOV @R1,#0D0H
          MOV A,11H
          XCHD A,@R1
          MOV DPTR,#6000H
          MOV A,@R1
          MOVX @DPTR,A
          MOV @R1, #0B0H
          MOV A,12H
          XCHD A,@R1
          MOV DPTR,#6000H
          MOV A,@R1
          MOVX @DPTR,A
          MOV @R1,#70H
          MOV A,13H
          XCHD A,@R1
          MOV DPTR,#6000H
          MOV A,@R1
          MOVX @DPTR,A
          MOV A,#0F0H
          MOV DPTR,#6000H
          MOVX @DPTR,A
          MOV A,14H
          ACALL TEXT
          MOV A,R0
          MOV DPTR,#8000H
          MOVX @DPTR,A
          SJMP RETURN
  NEXT:  CJNE A,#00H,NEXT1       ;判断键型
         LCALL DELAY200MS        ;延时以待键盘反应
         JB 00H,TT1              ;开动态显示
         SETB 00H
         SETB EX0
  NEXT1: AJMP RETURN             ;继续扫描
  TT1:   CLR 00H
         CLR EX0
         AJMP RETURN             ;继续扫描




  START:   JB 01H,START1
           PUSH DPH
           PUSH DPL
           PUSH A
           PUSH 01H
           MOV DPTR,#0C001H            ;采集计数器1中的数据
           MOVX A,@DPTR
           MOV 08H,A                   ;数据底8位放在 08h 中
           MOVX A,@DPTR
           MOV 09H,A                   ;数据高8位放在 09h 中
           CLR C
           MOV A,#0FFH                 ;检测所计脉冲的个数
           SUBB A,08H
           MOV 08H,A                   ;测量的数据低位放在08h中
           MOV A,#0FFH
           SUBB A,09H
           MOV 09H,A                   ;测量的数据高位放在09h中
           MOV A,08H
           JNZ COMPUT
           MOV A,09H
           JZ ERROR
  COMPUT:  MOV R5,#0                   ;计算结果
           MOV R6,#0
           MOV R4,#0C3H                ;用此数除所测量的数据就是频率值
           MOV R3,#50H
           MOV R1,08H
           MOV R2,09H
           MOV R7,#16
   START1: JB 01H,START2               ;无实际意义,用来连接下面的START2
           SETB 01H
           ACALL LOOP0
           MOV 0DH,R3                  ;保护数据
           MOV 0EH,R4                  ;保护数据
           MOV A,R5                    ;余数乘10后再被除便得第一位小数
           MOV B,#10
           MUL AB
           MOV R3,A
           MOV R4,B
           MOV A,R6
           MOV B,#10
           MUL AB
           ADD A,R4
           MOV R4,A
           MOV R5,B
           MOV R6,#0
           MOV R7,#16
           MOV R1,08H
           MOV R2,09H
           MOV R7,#16
           ACALL LOOP0                 ;利用除法将小数第一位求出
           MOV 10H,R3                  ;小数放到动态显示小数位显示
           MOV R4,0EH                  ;取千位的数值
           MOV R3,0DH
           MOV R6,#0
           MOV R5,#0
           MOV R1,#0E8H                ;1000为除数
           MOV R2,#03H
           MOV R7,#16
           ACALL LOOP0
           MOV 14H,R3                  ;千位数字放到14H中保存先
           MOV A,R6                    ;接下来求百位数字
           MOV R4,A
           MOV A,R5
           MOV R3,A
           MOV R6,#0
           MOV R5,#0
           MOV R1,#64H
           MOV R2,#0
           MOV R7,#16
           ACALL LOOP0
           MOV 13H,R3                 ;百位数字进13H中,动态显示第4位
           MOV A,R5                   ;接下来求个位和十位数字
           MOV B,#10
           DIV AB
           MOV 12H,A
           MOV 11H,B
   ERROR:  SETB 01H 
           SJMP LAST
   START2: PUSH DPH
           PUSH DPL
           PUSH A
           PUSH 01H
           CLR 01H
           MOV A,#0FFH                ;8253送数据底八位
           MOV DPTR,#0C001H
           MOVX @DPTR,A
           MOV A,#0FFH                ;送高八位
           MOVX @DPTR,A
   LAST:   POP 01H
           POP A
           POP DPL
           POP DPH
           CLR IE0
           RETI

  DISPLAY: MOV DPTR,#8000H
           MOVX @DPTR,A
           RET



  TEXT:   CJNE A,#00H,KK1               ; 查字型码子程序入口为A
           MOV R0,#3FH                  ; 出口为R0
           RET
       KK1:CJNE A,#01H,KK2
           MOV R0,#06H
           RET
       KK2:CJNE A,#02H,KK3
           MOV R0,#5BH
           RET
       KK3:CJNE A,#03H,KK4
           MOV R0,#4FH
           RET
       KK4:CJNE A,#04H,KK5
           MOV R0,#66H
           RET
       KK5:CJNE A,#05H,KK6
           MOV R0,#6DH
           RET
       KK6:CJNE A,#06H,KK7
           MOV R0,#7DH
           RET
       KK7:CJNE A,#07H,KK8
           MOV R0,#07H
           RET
       KK8:CJNE A,#08H,KK9
           MOV R0,#7FH
           RET
       KK9:CJNE A,#09H,JJ
           MOV R0,#6FH
        JJ:RET

  SCAN:   CLR P1.0              ;键盘扫描子程序**********************************************
          CLR P1.1              ;                 占用资源RO,A,字型码出口为
          CLR P1.2              ;                 数字出口为A. 堆栈2字节
          CLR P1.3              ;              **********************************************
          MOV A,P1

          ANL A,#0F0H
          CJNE A,#0F0H,KEYSCAN   ;如有键按下则转移
          SJMP EXIT
  KEYSCAN:ACALL DLY20MS          ;延时
          MOV R0,#00H            ;列数用R0来记录
          CLR P1.0
          SETB P1.1
          SETB P1.2
          SETB P1.3
          MOV A,P1
          ANL A,#0F0H
          CJNE A,#0F0H,TTTT1     ;若在本行则转移
  EXIT:   MOV A,#0FFH            ;如无键按下则推退出
          SJMP DONE
  TTTT1:  JB P1.4,TTTT2          ;如按键不在本行则转移
          MOV A,#00H             ;在则将0放热A 中
          AJMP TTTT5
  TTTT2:  JB P1.5,TTTT3          ;如按键不在本行则转移
          MOV A,#01H             ;在则将1放热A 中
          AJMP TTTT5
  TTTT3:  JB P1.6,TTTT4          ;如按键不在本行则转移
          MOV A,#02H             ;在则将2放热A 中
          AJMP TTTT5
  TTTT4:  JB P1.7,TTTT5          ;如按键不在本行则转移
          MOV A,#03H             ;在则将3放热A 中
          AJMP TTTT5
  TTTT5:  ADD A,R0
   DONE:  RET

DLY20MS: MOV 22H,#70H            ; 延时20毫秒子程序       *******占用资源22h,23h****************
    DY1: MOV 23H,#69H
    DY2: DJNZ 23H,DY2
         DJNZ 22H,DY1
         RET
DELAY200MS: MOV 22H,#25         ;延时0.5秒子程序         *****占用资源22h,23h,24h************
   DL333:   MOV 23H,#100
   DL222:   MOV 24H,#49
   DL111:   DJNZ 24H,DL111
            DJNZ 23H,DL222
            DJNZ 22H,DL333
            RET

  LOOP0:   CLR C                ;以下为将测量数据转换成数码管可显示的形式
           MOV A,R3
           RLC A
           MOV R3,A
           MOV A,R4
           RLC A
           MOV R4,A
           MOV A,R5
           RLC A
           MOV R5,A
           MOV A,R6
           RLC A
           MOV R6,A
           MOV A,R5
           MOV PSW.5,C
           CLR C
           SUBB A,R1
           MOV 0FH,A            ;余数送0Fh单元保护
           MOV A,R6
           SUBB A,R2
           JB PSW.5,LOOP2
           JC LOOP1
  LOOP2:   MOV R6,A             ;余数高字节进r6
           MOV R5,0FH           ;低字节进r5
           INC R3               ;结果进r3
    LOOP1: DJNZ R7,LOOP0        ;若没完成数据处理则继续
           CLR PSW.5
           RET








⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -