📄 hh.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 + -