📄 ttt.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
EK_T BIT 7AH
EK1_T BIT 79H
EK2_T BIT 78H
KEY_TEST BIT 06H
V_TEST BIT 00H
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
KEY_1 BIT 06H
VV EQU 52H
LP EQU 53H
ORG 0000H
SJMP MAIN
ORG 0013H
LJMP VELOCITY
ORG 000BH
LJMP REGULATE
ORG 001BH
LJMP VLOW
ORG 0030H
;***********主程序模块****************
MAIN:MOV SP,#60H
MOV DPTR,#0FD00H ;8155方式字
MOV A,#03H
MOVX @DPTR,A
MOV DIS0,#14
MOV DIS1,#15
MOV DIS2,#12
MOV DIS3,#13
MOV LED,#7FH
MOV R0,#DIS0
MOV VV,#0
CLR V_TEST
MOV TM4,#40
MOV TMOD,#12H ;T1 MOD1,T0 MOD2
MOV TH0,HP ;用T0作PWM调节,
MOV TL0,HP ;T0赋初值
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
CLR ADD_T
CLR SUB_T
;###################
M1: JB KEY_1,M2
SJMP M3
M2: ACALL DIS_C
M3: ACALL DISP
ACALL DELAY
ACALL KEY
ACALL SETTLE
SJMP M1
;*********二进制转化十进制子程序*****
DIS_C:MOV A,SET0
MOV B,#10
DIV AB
MOV DIS0,A
MOV DIS1,B
RET
;*******读键盘子程序***************
KEY: JB P1.7,M44; P1.7没按过,返回
MOV A,LED ; 按过P1.7
M00: JB ACC.0,M11 ; SET没按,查下一个键
SETB KEY_TEST ;置set键按下的标志位
ACALL PPP1
PPP3: SETB KEY_1
CLR RE_T ; 清最后一个键按下的标志位
SJMP M44 ; 返回
M11: JNB KEY_TEST,M44 ;没按set,则直接返回
JB ACC.1,M22 ;没按加键,查下一个键
ACALL ADD1 ; 调用加子程序
ACALL DISP1 ; 调用显示延时子程序,进行延时
SJMP M44
M22: JNB KEY_TEST,M44 ; 没按set,则直接返回
JB ACC.2,M33 ; 没按减键,查下一个键
ACALL SUB1 ; 第一次则调用减子程序
ACALL DISP1 ; 调用显示延时子程序,进行延时
SJMP M44
M33: JB ACC.3,M44 ; 置最后一个键按下的标志位
CLR KEY_TEST ; 清的一个键按下的标志位
ACALL PPP2
PPP4: SETB RE_T
SETB EA ; 开中断
M44: RET
PPP1: SETB P1.6
CLR P1.5
ACALL PPP3
RET
PPP2: CLR P1.6
SETB P1.5
ACALL PPP4
RET
;***** *加减子程序***********
ADD1: MOV R2,SET0 ; 设定值没到80?
CJNE R2,#80,A1
SJMP A2 ; 加到80返回,不继续加
A1:INC SET0 ; 没加到80则设定值加一
A2:RET
SUB1: MOV R4,SET0; ; 设定值减到0?
CJNE R4,#00,S1
SJMP S0 ; 加到0返回,不继续减
S1:DEC SET0 ; 没减到0则设定值减一
S0: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,#2 ; 2ms延时程序
DEL2:MOV TM1,#255
DEL1:DJNZ TM1,DEL1
DJNZ TM2,DEL2
RET
DISP1:MOV B,#48 ; 延时显示子程序
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 ;被除数600000
MOV V3,#07H
MOV V4,#0A1H
MOV V5,#20H
MOV V6,TH1 ; 除数TH1TL1
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
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 ;被除数1000
MOV V2,#3
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速度调节************************
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 给TL0
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 CY
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 79H,71H,77H,37H;E,F,A,N 12-15
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -