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

📄 hh.asm

📁 单片机程序
💻 ASM
字号:
DIS2 EQU 30H
DIS3 EQU 31H
DIS0 EQU 32H
DIS1 EQU 33H

LED EQU  34H

SET0 EQU 35H ;SET VALUE
SET1 EQU 36H ;REAL VALUE

TM1 EQU 37H
TM2 EQU 38H

V1  EQU 3BH 
V2  EQU 3CH 
V3  EQU 3DH 
V4  EQU 3EH 
V5  EQU 3FH 
V6  EQU 40H 
V7  EQU 41H 

HP  EQU 42H 
VVL EQU 43H

TM3 EQU 44H ;调节时间
TM4 EQU 45H 

EK1  EQU 46H 
EK   EQU 47H 
EK2  EQU 48H 

FIRST BIT 49H ;检测加减是否第一次按下

EK_T    BIT 7AH ;EK符号标志位
EK1_T   BIT 79H 
EK2_T   BIT 78H 

KEY_TEST BIT 06H 
V_TEST BIT 00H ;是否测速,V_TEST=1表示测速

DIV_T BIT 01H
ADD_T BIT 02H
SUB_T BIT 03H

ATIME EQU 50H
STIME EQU 51H

RE_T  BIT 04H ;最后一个键按下的标志位

V_HIGN BIT 05H ;判断低速还是高速(0还是1)

KEY_1  BIT 06H

VV EQU 52H ;测速单元

LP EQU 53H

TMS EQU 54H ;闪烁时长

SHAN BIT 55H ;闪烁标志

JIA1 BIT 56H;单步加标志

LIANJIA BIT 57H;连加标志

JIAN1 BIT 58H;单步减标志

LIANJIAN BIT 59H;连减标志

ONPRESS BIT 5AH;判定ENTER键是否弹起标志

TM5 EQU 5BH;循环次数单元

CISHU EQU 5CH

ORG 0000H
SJMP MAIN

ORG 0013H ;INT1
LJMP VELOCITY ;速度测试中断服务程序

ORG 000BH ;T0
LJMP REGULATE ;PWM速度调节

ORG 001BH;T1
LJMP VLOW ;低速时T1中断服务程序

ORG 0030H
;**************主程序模块****************
MAIN:MOV SP,#70H
     MOV DPTR,#0FD00H  ;8155方式字
     MOV A,#03H
     MOVX @DPTR,A
     
     MOV DIS0,#15
     MOV DIS1,#15
     MOV DIS2,#12
     MOV DIS3,#13     
     
     MOV LED,#7FH
     
     MOV R0,#DIS0 ;32H->R0
     MOV VV,#0 ;测速单元初始为'0'
     CLR V_TEST
     
     MOV TM4,#40
     MOV TMOD,#12H  ;T1 MOD1,T0 MOD2
     
     MOV TH0,HP ;用T0作PWM调节
     MOV TL0,HP ;赋初值
     
     SETB TR0
     SETB ET0
     
     SETB IT1
     SETB EX1
     
;########PP#########
     MOV TM3,#20
     CLR RE_T    
     CLR EK_T
     CLR KEY_TEST
     CLR KEY_1
     CLR EK2_T
     MOV EK1,#0
     MOV ATIME,#10
     MOV STIME,#10
     
     MOV CISHU,#20
     
     CLR ADD_T
     CLR SUB_T
     
     SETB SHAN
     
     CLR 11H ;检测是否成功
     SETB FIRST
     
     CLR JIA1
     CLR LIANJIA
     CLR JIAN1
     CLR LIANJIAN
     CLR ONPRESS

M1: JB KEY_TEST,FLASH
    SJMP M3
FLASH: ACALL SHINE
	   SJMP M4
M3: ACALL DIS_C ;调用二进制-->十进制子程序
    ACALL DISP
M4:  ACALL DELAY
     ACALL M2
     DJNZ CISHU,M1;隔100ms刷新一下实测值
     MOV CISHU,#20
     ACALL SETTLE
     SJMP M1

;SHINE
SHINE:JB SHAN,LIANG;
	 DJNZ TMS,AN ;闪烁标志SHAN为1时调用DISP显示模
     CPL SHAN ;块显示当前设定值,闪烁时间到,将标志取
     MOV TMS,#25 ;反,并再次送入闪烁时长TMS.当闪烁标
     SJMP SHANRET;志为0时闪烁时间到先将DIS3, DIS2,
LIANG:ACALL DISP ;送入#16,即全灭值,再调用DISP,再将标
      DJNZ TMS,SHANRET ;志位取反,重新装入时长TMS,这样就
      CPL SHAN ;能实现闪烁功能
      MOV TMS,#25
      SJMP SHANRET
  AN: MOV DIS1,#16
      MOV DIS0,#16
      ACALL DISP      
      MOV A,SET0      
      MOV B,#10      
      DIV AB      
      MOV DIS0,A      
      MOV DIS1,B      
SHANRET: RET
   
;******二进制转化十进制子程序*****
DIS_C:MOV A,SET0
      MOV B,#10
      DIV AB
      MOV DIS0,A
      MOV DIS1,B
      RET
      
;**********读键盘子程序***********
M2:  JNB P1.7,KEY      
      ACALL KK0
      RET
KEY:  MOV A,LED ;按过P1.7
      JB FIRST,PK1
      JNB ACC.0,KEY1
      JNB ACC.3,KEY4
      SJMP PK2
PK1:  JNB ACC.0,PKEY1
      JNB ACC.3,PKEY4
PK2:  JNB ACC.1,KEY2
      JNB ACC.2,KEY3
RET
      
;============特殊模块============
KEY1:
      SETB KEY_TEST  ;恢复set键按下的标志位
      SETB KEY_1
      CLR RE_T        ;清最后一个键按下的标志位      
	  RET
      
KEY2: JNB KEY_TEST,ENDKEY ;没按set,则直接返回
      ACALL ADD1       ;调用加子程序 
      ACALL SETT0       
      MOV A,DIS1      
      CJNE A,#10,ENDKEY
JIN1: MOV DIS1,#0 ;若低位满10则高位加1,并将低位变为0
      INC DIS0
      ACALL SETT0         
      ACALL DISP1       ;调用显示延时子程序,进行延时
      RET

SETT0:MOV A,DIS0
      MOV B,#10
      MUL AB
      ADD A,DIS1
      MOV SET0,A
      RET
;==========减键设定==========      
KEY3: JNB KEY_TEST,ENDKEY ;没按set,则直接返回
      MOV A,DIS1
      JZ PANGAO
   JJ:ACALL SUB1      ;第一次则调用减子程序
      ACALL SETT0
      ACALL DISP1     ;调用显示延时子程序,进行延时
      RET
PANGAO:MOV A,DIS0      ;低位减到0判断高位是否为0,
       JZ ENDKEY        ;是0则什么也不做,返回
JIE1:MOV DIS1,#9        ;若高位不为0则高位减1,低位置9
     DEC DIS0               
     SJMP JJ

KEY4: JB ONPRESS,ENDKEY
      CLR KEY_TEST     ;清第一个键按下的标志位
      SETB RE_T
      SETB EA             ;开中断
      RET
      
;==========设定密码时的设置和ENTER按键=============

PKEY1: SETB KEY_TEST
	   RET

PKEY4:JB 11H,SUCCESS
      MOV A,DIS1
      CJNE A,#5,ERROR ;判定输入密码的低位是否正确,不正确直接
      MOV A,DIS0 ;跳到输入密码状态,若正确,再看高位正确否
      CJNE A,#6,ERROR ;正确则跳到SUCCESS,否则也返回输入密码状态

SUCCESS:MOV DIS2,#12
        MOV DIS3,#13
		SETB 11H ;11H为判定密码成功与否标志
		JB 07H,FC ;输入成功密码第一次先跳到FC,测定初值 
		CLR FIRST ;设定完成,将输入密码标志清掉
		SETB TR1 ;定时器0和1打开
        SETB TR0
        SETB ONPRESS
  		SJMP PRET
FC:   
      CLR 07H ;07H是用于设定是否第一次设定
      SETB ONPRESS
      RET
ERROR: ACALL ALARM
	   MOV DIS2,#14
       MOV DIS3,#13
PRET:  RET
ENDKEY:RET

ALARM: MOV R2,#200
DV: CPL P1.0
ACALL DELY500
DJNZ R2,DV
SJMP EXIT

DELY500: MOV R7,#250
LOOP: NOP
DJNZ R7,LOOP
EXIT:RET

;***********加减子程序***********
ADD1:MOV R2,SET0;        设定值没到80?
      CJNE R2,#80,A1
      SJMP A2              ;加到80返回,不继续加
               ;没加到80则设定值加一
   
A1:JB JIA1,S1
    SETB JIA1
    MOV TM5,#20
    SJMP S2
S1:JB LIANJIA,S2
   DJNZ TM5,ALLRET
   SETB LIANJIA
S2:INC DIS1
   ;JB LIANJIA,ALLRET

 A2:  RET

SUB1: JB JIAN1,S3
      SETB JIAN1
      MOV TM5,#20
      SJMP S4
S3:JB LIANJIAN,S4
   DJNZ TM5,ALLRET
   SETB LIANJIAN
S4:DEC DIS1
   ;JB LIANJIAN,ALLRET
   RET

;============判断键是否弹起===========

KK0:MOV A,LED
    JB ACC.2,KK1;
    CLR JIAN1 ;why?
    CLR LIANJIAN
    RET

KK1:MOV A,LED
    JB ACC.1,KK2
    CLR JIA1
    CLR LIANJIA
    RET

KK2:MOV A,LED
    JB ACC.3,ALLRET ;why?
    CLR ONPRESS ;why?
    RET

ALLRET:RET

;*******************显示子程序*************************              
DISP:
      MOV DPTR,#0FD02H    ;指向PB口      
      MOV A,LED            ;左移一位
      RL A
      JB ACC.4,D1
      MOV A,#0FEH          ;移出则重设初始值
      MOV R0,#DIS2
  D1: MOV LED,A
      MOVX @DPTR,A
      MOV A,@R0           ;取显示RAM中的数据
      MOV DPTR,#TAB
      MOVC A,@A+DPTR      ;换码操作
      MOV DPTR,#0FD01H
      MOVX @DPTR,A
      INC R0
      RET

DELAY:MOV TM2,#5           ;5ms延时程序
 DEL2:MOV TM1,#255
 DEL1:DJNZ TM1,DEL1
      DJNZ TM2,DEL2
      RET

DISP1:MOV B,#3             ;延时显示子程序(有什么用?)
MM2: ACALL DISP
     ACALL DELAY
     DJNZ B,MM2
     RET
  
;********************速度测试中断服务程序********************
VELOCITY:PUSH ACC
         PUSH B
         PUSH PSW
         
         JB V_TEST,VV1          ;是否测速,测则转到vv1
         MOV A,SET1
         CJNE A,#20,VV4       ;  判高低速
   VV4:  JNC VV2
         CLR V_HIGN
         MOV TL1,#0CH ;         低速则赋T1初值FE0CH
         MOV TH1,#0FEH
         SETB ET1           ;    T1开中断
         SJMP VV3         
   VV2:  SETB V_HIGN          ;高速则赋T1初值0000H
         MOV TL1,#00H
         MOV TH1,#00H
         CLR ET1             ;   T1关中断
   VV3:  SETB TR1          ;    开T1
          SETB V_TEST
          SJMP V00
     VV1: CLR TR1            ;   测速就关闭T1
          CLR V_TEST
          ACALL VALUE        ; 调用求转速值子程序
     V00: POP PSW
          POP B
          POP ACC
          RETI
  
;*****************低速时T1中断服务程序****************
VLOW:INC VV
     MOV TL1,#0CH
     MOV TH1,#0FEH
     RETI

;******************求转速子程序************************          
VALUE:JB V_HIGN,VA1
      MOV V1,VV           ;低速赋vv给除数
      MOV VV,#0         ;vv清0
      ACALL DIVIDE1      ;调用16/8位子程序
      DJNZ TM4,VA0 ;           
      MOV TM4,#20
      SJMP VA2
 VA1: ACALL DIVIDE;高速调用32/16位子程序
 VA2: MOV A,SET1            ;显示测试值
      MOV B,#10
      DIV AB
      MOV DIS2,A
      MOV DIS3,B
  VA0:RET

;*******************除法子程序************************
DIVIDE:MOV V2,#00H  ;被除数500,000
       MOV V3,#07H
       MOV V4,#0A1H
       MOV V5,#20H
       MOV V6,TH1   ; 除数TH1,TL1
       MOV V7,TL1
       MOV R3,V6
       CJNE R3,#0,DDV0
       SJMP DDV5
  DDV0:MOV B,#16
  DDV1:CLR C
       MOV A,V5
       RLC A
       MOV V5,A
       MOV A,V4
       RLC A
       MOV V4,A
       MOV A,V3
       RLC A
       MOV V3,A
       XCH A,V2
       RLC A
       XCH A,V2
       MOV DIV_T,C ;DIV_T为标志位
       CLR C
       SUBB A,V7
       MOV V1,A
       MOV A,V2
       SUBB A,V6
       JB DIV_T,DDV2
       JC DDV3
  DDV2:MOV V2,A
       MOV A,V1
       MOV V3,A
       INC V5
  DDV3:DJNZ B,DDV1
       MOV VVL,V5 ;?
       MOV SET1,V5 ;?
  DDV5:RET
  
DIVIDE1:MOV R5,#08H   ;被除数1,000
        MOV V2,#03H
        MOV V3,#0E8H
        MOV A,V1      ; 除数V1
        CLR C
        SUBB A,#03
        JNC D22
        SJMP D55
   D22:CLR C
       MOV A,V3
       RLC A
       MOV V3,A
       MOV A,V2
       RLC A
       MOV V2,A
       MOV DIV_T,C
       CLR C
       SUBB A,V1
       JB DIV_T,D33
       JC D44
   D33:MOV V2,A
       INC V3
   D44:DJNZ R5,D22
       MOV SET1,V3 ;?
   D55:RET

;************************PWM速度调节(T0)************************
REGULATE: PUSH ACC
          PUSH PSW
          CPL P1.2      ;P1.2取反
     RE0 :JNB P1.2,RE1
          MOV TH0,HP  ;高电平赋HP给TH0
          SJMP RE2
     RE1: MOV TH0,LP ;低电平赋LP给TH0
     RE2 :POP PSW
          POP ACC
          RETI

;******************速度调节子程序*************************
SETTLE:JNB RE_T,ST0   ;最后一个键没按过,则返回
       DJNZ TM3,ST0  ;调节时间没到,则返回
       MOV TM3,#40    ;重置调节时间
       JNB P1.4,ST1   ;P1.4高电平,调用PP调节
       ACALL PP       ;P1.4低电平,调用PI调节
       SJMP ST0
   ST1:ACALL PI
   ST0:MOV A,#0FFH   ;求得PWM调节时赋给低电平的值
       CLR C
       SUBB A,HP ;高电平
       MOV LP,A
       RET   
 
;*************PP调节法*****************************
PP:    MOV A,SET0
       CLR C
       SUBB A,SET1       ;求得EK
       JZ PP00             ;EK=0,直接返回
       JNC PP1            ;EK>0,跳到PP1
       SETB EK_T         ;将EK符号标志位
       CPL A              ;EK<0 
       INC A
       MOV EK,A         ; EK取补后赋给EK
       MOV A,HP
       CLR C
       SUBB A,EK          ;HP=HP-|EK|
       MOV HP,A
       JNC PP0
       MOV HP,#00H       ; HP<0,则赋给HP零
       SJMP PP0
   PP1:CLR EK_T          ;EK>0
       MOV EK,A          ;HP=HP+EK
       ADD A,HP         
       MOV HP,A
       JNC PP0
       MOV HP,#0FFH      ;HP溢出,则赋0FFH给HP
       JNB P1.4,PP00      ;PI调节,跳到PP2
       PP0:MOV EK1,EK      ;  PP调节,将EK赋给EK1
   PP00:RET 

;***********PI调节法***********************
PI:   ACALL PP           ; 调用PP调节,求得EK
      MOV A,EK           ; EK=0,直接返回
      JZ PI00
      CLR C
      SUBB A,EK1;          EK2=EK-EK1
      JNC PI1 
      SETB EK2_T ;          EK2<0,EK2取补后赋给EK2
      CPL A            
      INC A
      SJMP PI1
      CLR EK2_T ;           
PI1:  MOV EK2,A             
      JB EK_T,PI2            ;EK>0,HP=HP+EK2
      MOV A,HP               
      ADD A,EK2
      JNC PI0
      MOV A,#0FFH           ;HP溢出,则赋0FFH给HP
      SJMP PI0
PI2:  MOV A,HP;              EK<0,HP=HP-EK2
      CLR C
      SUBB A,EK2
      JNC PI0                
      MOV A,#00H            ;HP<0,则赋给HP零
PI0:  MOV HP,A
      MOV EK1,EK 
      MOV C,EK_T
      MOV EK1_T,C   
PI00: RET
     
;********TABLE**********************************     
TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH
     DB 07H,7FH,6FH,7EH,38H
     DB 73H,77H,79H,40H,00H;P,R(A),E,-,灭  12-16
     END 
      

⌨️ 快捷键说明

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