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

📄 频率计.asm

📁 AT89S52单片机程序50例(00-50)
💻 ASM
字号:
;频率计
;计数频率范围1-65535Hz

      VALUEH EQU 20H  ;暂存TH1的值
      VALUEL EQU 21H  ;暂存TL1的值
      DATE0 EQU	22H  ;暂存计数值的BCD码
      DATE1 EQU	23H
      DATE2 EQU	24H
      DATE3 EQU	25H
      DATE4 EQU	26H
      COUNT EQU 30H  ;COUNT为溢出计数,当COUNT=20时,计满1s

      ORG 0000H  ;程序起始地址
      SJMP START  ;跳转至START
      ORG 001BH  ;定时/计数器T1中断矢量地址
      LJMP TIMER1  ;跳转至TIMER1

START:MOV DPTR,#TABLE  ;取TABLE的有效地址给DPTR
      
      MOV 20H,#00H  ;存储空间初始化
      MOV 21H,#00H
      MOV 22H,#00H
      MOV 23H,#00H
      MOV 24H,#00H
      MOV 25H,#00H
      MOV 26H,#00H
      MOV 30H,#00H

;定时/计数器T1工作在定时方式1;定时/计数器T0工作在计数方式1    
      MOV TMOD,#15H
      MOV TH1,#3CH  ;定时/计数器T1赋初值为3CB8H,即49.992ms
      MOV TL1,#0B8H
      MOV TH0,#00H  ;定时/计数器T0赋初值为00H
      MOV TL0,#00H
      MOV IE,#8AH

;按键为低电平时,开始计数
WAIT:SETB TR0  ;启动定时/计数器T0
     SETB TR1  ;启动定时/计数器T1
  W1:LCALL DISP  ;显示计数值
     AJMP W1

;定时/计数器T1中断服务子程序
TIMER1:MOV TH1,#3CH  ;重新初始化定时/计数器T1的初值
       MOV TL1,#0B8H

       INC COUNT  ;COUNT加1
       MOV A,COUNT  
       CJNE A,#20,RETUNE  ;是否计满1秒,否的话,跳转至RETUNE
       MOV COUNT,#00H  ;是的话,COUNT清零
       CLR TR0  ;关闭定时器T0
       CLR TR1  ;关闭计数器T1
       
       MOV VALUEL,TL0  ;存放计数值
       MOV VALUEH,TH0
       LCALL HTOD
RETUNE:RETI

;将VALUEH/VALUEL中的16进制数转成10进制并且把5位数依次存入DATE0至DATE4
 HTOD:MOV R2,VALUEH
      MOV R3,VALUEL
      CLR A
      MOV R4,A  ;R4、R5、R6清零
      MOV R5,A
      MOV R6,A
      MOV R7,#10H  ;R7赋值为10H,即循环左移16位
LOOP1:CLR C  ;清零进位位
      
      MOV A,R3  
      RLC A
      MOV R3,A
      
      MOV A,R2
      RLC A
      MOV R2,A
      
      MOV A,R6
      ADDC A,R6
      DA A
      MOV R6,A

      MOV A,R5
      ADDC A,R5
      DA A
      MOV R5,A

      MOV A,R4
      ADDC A,R4
      DA A
      MOV R4,A

      DJNZ R7,LOOP1

   CZ:MOV R0,#DATE4
      MOV A,R6
      ANL A,#0FH
      MOV @R0,A
      DEC R0
      MOV A,R6
      SWAP A
      ANL A,#0FH
      MOV @R0,A
      DEC R0
      MOV A,R5
      ANL A,#0FH
      MOV @R0,A
      DEC R0
      MOV A,R5
      SWAP A
      ANL A,#0FH
      MOV @R0,A
      DEC R0
      MOV A,R4
      ANL A,#0FH
      MOV @R0,A
  RET

;显示子程序
DISP:MOV A,DATE4
     MOVC A,@A+DPTR
     MOV P2,#0FFH

     CLR P2.3
     MOV P1,A
     LCALL DL1MS
     
     SETB P2.3
  
     MOV A,DATE3
     MOVC A,@A+DPTR
 
     MOV P2,#0EFH
     MOV P1,A
     LCALL DL1MS
     MOV P2,#0FFH

     MOV A,DATE2
     MOVC A,@A+DPTR

     MOV P2,#0DFH
     MOV P1,A
     LCALL DL1MS
     MOV P2,#0FFH

     MOV A,DATE1
     MOVC A,@A+DPTR

     MOV P2,#0BFH
     MOV P1,A
     LCALL DL1MS
     MOV P2,#0FFH

     MOV A,DATE0
     MOVC A,@A+DPTR
     MOV P2,#7FH

     MOV P1,A
     LCALL DL1MS
     MOV P2,#0FFH

 RET

;1ms延时子程序
DL1MS:MOV R6,#14H
  DL1:MOV R7,#19H
  DL2:DJNZ R7,DL2
      DJNZ R6,DL1
   RET

;0-9的共阴极数码管的段码值
TABLE:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH

END

⌨️ 快捷键说明

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