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

📄 pinlj.asm

📁 基于51单片机的频率计设计
💻 ASM
字号:
DisplayBuffer   EQU  40H   ;设置显示缓冲区的地址为40h-45h共6个字节
Disp1  EQU  35H            ;转换后的数据10(高位)
Disp2  EQU  36H
Disp3  EQU  37H

DIN1   EQU  31H             ;待转换的数据BCD(高位)
DIN2   EQU  32H
DIN3   EQU  33H

       ORG 0000H
       AJMP MAIN
       ORG 000BH       ;T0中断入口
       AJMP T0INT
       ORG 001BH       ;T1中断入口
       AJMP T1INT
       ORG 0100H
MAIN:
       MOV SP,#70H
       MOV IE,#8AH     ;开放T0、T1中断
       MOV TMOD,#51H ;T0定时,T1计数
       MOV TH0,#0D8H
       MOV TL0,#0FAH    ;定时10ms
       MOV 50H,#100    ;100*10ms=1s
       MOV TH1,#00H
       MOV TL1,#00H
       MOV DIN1,#0
       MOV DIN2,#0
       MOV DIN3,#0;存放采集到的频率
       MOV 40H,#0
       MOV 41H,#0
       MOV 42H,#0
       MOV 43H,#0
       MOV 44H,#0
       MOV 45H,#0
       SETB TR1
       SETB TR0
WAIT:  AJMP WAIT ;等待中断
T1INT: INC DIN1;计数器溢出则23H单元自增1
       RETI 
T0INT:               ;定时10ms产生中断
       DJNZ 50H,NEXT1
       CLR TR1
       CLR TR0
       MOV DIN2,TH1 ;1s时间到则采集数据
       MOV DIN3,TL1
       MOV TH1,#00H
       MOV TL1,#00H
       LCALL TRANS
       LCALL DIS
       MOV 50H,#100
       MOV DIN1,#0
       MOV DIN2,#0
       MOV DIN3,#0
       MOV TH0,#0D8H
       MOV TL0,#0FAH
       SETB TR0
       SETB TR1
       AJMP EXIT
NEXT1: MOV TH0,#0D8H ;继续定时
       MOV TL0,#0FAH
EXIT:  RETI
       
TRANS:CLR A
      MOV Disp1,A
      MOV Disp2,A
      MOV Disp3,A
      MOV 3AH,#18H         ;转换3字节十六进制整数
LOOP: MOV A,DIN3            ;移出待转换数的一位到CY中
      RLC A
      MOV DIN3,A
      MOV A,DIN2
      RLC A
      MOV DIN2,A
      MOV  A,DIN1
      RLC  A
      MOV  DIN1,A
      MOV  A,Disp3         ;BCD码带进位自身相加,相当于乘2 
      ADDC A,Disp3
      DA   A
      MOV  Disp3,A
      MOV  A,Disp2
      ADDC A,Disp2
      DA  A
      MOV Disp2,A
      MOV A,Disp1
      ADDC A,Disp1
      DA  A
      MOV Disp1,A          ;双字节十六进制数的万位数不超过6,不用调整
      DJNZ 3AH,LOOP        ;处理完16BIT
      RET

DIS:   MOV R0,#DisplayBuffer       ;分别取出每一位,放到DisplayBuffer
       MOV A,Disp1
       ANL A,#0F0H
       SWAP A
       MOV @R0,A
       INC R0
       MOV A,Disp1
       ANL A,#0FH
       MOV @R0,A
       INC R0
       MOV A,Disp2
       ANL A,#0F0H
       SWAP A
       MOV @R0,A
       INC R0
       MOV A,Disp2
       ANL A,#0FH
       MOV @R0,A
       INC R0
       MOV A,Disp3
       ANL A,#0F0H
       SWAP A
       MOV @R0,A
       INC R0
       MOV A,Disp3
       ANL A,#0FH
       MOV @R0,A
DISPLAY:
       MOV   R1,#DisplayBuffer       ;指向显示数据首址
       MOV   R4,#11111110b      ;扫描控制字初值
PLAY:  MOV   A,R4          ;扫描字放入A
       MOV   P2,A          ;从P2口输出
       MOV   A,@R1         ;取显示数据到A
       MOV   DPTR,#TAB     ;取段码表地址
       MOVC  A,@A+DPTR     ;查显示数据对应段码
       MOV   P1,A          ;段码放入P1口
       LCALL  Delay
       INC   R1            ;指向下一地址
       MOV   A,R4            ;扫描控制字放入A
       JNB   ACC.5,DISPLAY    ;扫到第六位时结束
       RL   A               ;A中数据循环左移
       MOV   R4,A            ;放回R5内
       AJMP  PLAY            ;跳回PLAY循环

TAB: DB 3FH,06H,5BH,4FH,66H
     DB 6DH,7DH,07H,7FH,6FH            ;"0""1""2" "3""4""5""6""7" "8""9""
     RET
Delay:
       MOV R6,#2
Del:
       MOV R7,#249
       DJNZ R7,$
       DJNZ R6,Del
       RET
       
       END

⌨️ 快捷键说明

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