📄 controller.asm
字号:
TBLOCK DATA 20H
RBLOCK DATA 30H
CYCLE DATA 40H
PACE DATA 44H
DIVDD DATA 47H
MIDL DATA 4BH
MIDH DATA 4CH
REMDR DATA 4EH
COUNT DATA 52H
STEP EQU 32H
INUM EQU 04H
TCP EQU 00H
RCMD EQU 0FFH
TCMD EQU 00FH
ORG 0000H
JMP START
ORG 0003H
LJMP ADINT
ORG 000BH
LJMP OUTPUT
ORG 0013H
LJMP KEYINT
ORG 001BH
ORG 0023H
LJMP SERINT
ORG 0080H
START: MOV SP,#57H
MOV R7,#INUM ;/* 初始化AD接口 */
MOV P2,#0BFH
MOV A,#0F7H
ADD A,R7
MOV R0,A
MOVX @R0,A
MOV DPTR,#7FFFH ;/* 初始化8279 */
MOV A,#0D1H
MOVX @DPTR,A ;/* 清除RAM和FIFO */
NOP
NOP
LOOP: MOVX A,@DPTR
JB ACC.7,LOOP ;/* 测试清除完毕?*/
MOV A,#34H
MOVX @DPTR,A ;/* 设置时钟为20分频 */
MOV A,#0
MOVX @DPTR,A ;/* 设置键盘方式 */
MOV IE,#86H ;/* 中断系统设置(只有键盘及输出功能,开通所有功能应设为#97H) */
MOV TMOD,#20H ;/* 定时器工作方式设置,T1方式2,T0方式0,13位计数器 */
MOV SCON,#50H ;/* 串口方式设置 */
MOV R1,#DIVDD ;/* 常量初始化 */
MOV @R1,#0F0H
INC R1
MOV @R1,#49H
INC R1
MOV @R1,#2
MOV R6,#STEP
MOV R5,#4
MOV R3,#01H ;/* 定时初值初始化 */
MOV R4,#0D7H ;/* 此定时初值对应转速230r/min,可保证CYCLE为两字节 */
MOV TL1,#0FDH ;/* 串口通讯的波特率设置 =9.6K */
MOV TH1,#0FDH
SETB TR1
MOV R2,#4
MAIN: ;/* 键盘响应程序,循环执行 */
MOV A,R2
MOV DPTR,#PTAB
MOVC A,@A+DPTR ;/* 查表并转相应响应程序 */
JMP @A+DPTR
PTAB: DB ERR-PTAB ;/* 键盘响应分支程序表 */
DB ACCE-PTAB
DB STARTUP-PTAB
DB QUERY-PTAB
DB KEEP-PTAB
DB DECE-PTAB
;/* 各路分支程序 */
ERR: NOP
LJMP MAIN
ACCE: INC R3 ;/* 加速 */
CJNE R3,#20H,NEXT
MOV R3,#0
INC R4
CJNE R4,#0FFH,NEXT ;/* 上限9400r/min,达到则转保持*/
MOV R2,#4
JMP NEXT
STARTUP:
NOP ;/* 启动&停止*/
MOV TL0,R3
MOV TH0,R4
CPL TR0
LJMP MAIN
QUERY: NOP ;/* 查询 */
LJMP MAIN
KEEP: NOP ;/* 保持 */
LJMP MAIN
DECE: DEC R3 ;/* 减速 */
CJNE R3,#0FFH,NEXT
MOV R3,#1FH
DEC R4
NEXT: NOP
CALL CALC
CALL DISPY
LJMP MAIN
ADINT: ;/* AD转换中断子程序 */
PUSH PSW ;/* 将选中通道的采样值处理后保存到指定单元 */
PUSH ACC
PUSH DPL
PUSH DPH
MOV P2,#0BFH
MOV A,#TBLOCK
ADD A,R7
DEC A
MOV R0,A
MOVX A,@R0
MOV @R0,A
DJNZ R7,NEXT0
MOV R7,#INUM
NEXT0: MOV A,#0F7H
ADD A,R7
MOV R0,A
MOVX @R0,A
POP DPH
POP DPL
POP ACC
POP PSW
OUTPUT: ;/* 输出中断子程序 */
PUSH PSW ;/* 根据输出状态寄存器R5值将输出时序表中相应内容送P1口 */
PUSH ACC
PUSH DPL
PUSH DPH
DJNZ R6,NEXT1
MOV R6,#STEP
MOV DPTR,#STAB
MOV A,R5
MOVC A,@A+DPTR ;/* 查表输出 */
MOV P1,A
DJNZ R5,NEXT1
MOV R5,#4
NEXT1: MOV TL0,R3 ;/* 重载定时初值并返回 */
MOV TH0,R4
POP DPH
POP DPL
POP ACC
POP PSW
RETI
KEYINT: ;/* 按键检测及识别中断子程序 */
PUSH PSW ;/* 读扫描键值并转换成有序码,存储到指定状态寄存器R2 */
PUSH ACC
PUSH DPL
PUSH DPH
MOV DPTR,#7FFFH
MOV A,#40H
MOVX @DPTR,A ;/* 寻址,写读数据命令 */
MOV DPTR,#6FFFH
MOVX A,@DPTR ;/* 读扫描键值 */
ANL A,#3FH
MOV DPTR,#KTAB ;/* 查表转换成有序码 */
MOVC A,@A+DPTR
MOV R2,A ;/* 保存到指定状态寄存器R2 */
POP DPH
POP DPL
POP ACC
POP PSW
RETI
SERINT: ;/* 串口通讯中断子程序 */
PUSH PSW
PUSH ACC
MOV A,SBUF
CJNE A,#TCP,QUIT
CLR RI
CLR ES
JNB RI,$
MOV A,SBUF
CJNE A,#RCMD,NEXT2
RECV: MOV R1,#RBLOCK ;/* 接收程序块 */
MOV SCON,#40H
MOV SBUF,#0FFH
MOV SCON,#50H
JNB TI,$
CLR TI
CLR RI
LOOP0: JNB RI,$
CLR RI
MOV A,SBUF
MOV @R1,A
INC R1
CJNE R1,#20H,LOOP0
JMP QUIT
NEXT2: CJNE A,#TCMD,QUIT
SEND: MOV SCON,#40H ;/* 发送程序块 */
MOV R0,#TBLOCK
MOV SBUF,#7FH
JNB TI,$
CLR TI
LOOP1: MOV A,@R0
MOV SBUF,A
INC R0
JNB TI,$
CLR TI
CJNE R0,#10H,LOOP1
MOV SCON,#50H
QUIT: SETB ES ;/* 中断返回 */
POP ACC
POP PSW
RETI
CALC: ;/* 转速计算子程序 */
MOV MIDL,R3 ;/* 计算转速,并转换成BCD码,存储到固定单元PACE */
MOV MIDH,R4 ;/* 参数传递 */
MOV A,MIDL
RL A ;/* 低字节左移3位 */
RL A
RL A
MOV MIDL,A
MOV COUNT,#3
LOOP2: CLR C ;/* 整体右移3位 */
MOV A,MIDH
RRC A
MOV MIDH,A
MOV A,MIDL
RRC A
MOV MIDL,A
DJNZ COUNT,LOOP2
CLR C ;/* 满溢值 - 初值 */
CLR A
SUBB A,MIDL
MOV MIDL,A
MOV A,#20H
SUBB A,MIDH
MOV MIDH,A
MOV R1,#MIDL ;/* 乘以步长,将结果保存到CYCLE中 */
MOV A,@R1
MOV B,#STEP
MUL AB
MOV R0,#CYCLE
MOV @R0,A
INC R0
INC R1
MOV @R0,B
MOV A,@R1
MOV B,#STEP
MUL AB
ADDC A,@R0
MOV @R0,A ;/* 以上计算一次状态改变所用的时间并保存到CYCLE中 */
MOV R1,#DIVDD ;/* 被除数值传递 */
MOV R0,#REMDR
MOV COUNT,#3
LOOP3: MOV A,@R1
MOV @R0,A
INC R1
INC R0
DJNZ COUNT,LOOP3
MOV B,#8 ;/* 除法计算,移位相减法,三字节除以两字节 */
DIVL: CLR C
MOV R0,#REMDR
MOV A,@R0
RLC A
MOV @R0,A
INC R0
MOV A,@R0
RLC A
MOV @R0,A
INC R0
XCH A,@R0
RLC A
XCH A,@R0
MOV F0,C
CLR C
MOV R1,#CYCLE
SUBB A,@R1
MOV MIDL,A
INC R1
MOV A,@R0
SUBB A,@R1
JB F0,DVME
JC DMDE
DVME: MOV @R0,A
MOV A,MIDL
DEC R0
MOV @R0,A
INC REMDR
DMDE: DJNZ B,DIVL
CLR F0
MOV R1,#PACE
MOV A,REMDR
MOV B,#10
DIV AB
MOV @R1,A
INC R1
MOV @R1,B
RET
DISPY: ;/* 显示子程序 */
MOV DPTR,#7FFFH ;/* 将固定转速单元PACE中内容送到8279显示RAM */
MOV A,#90H
MOVX @DPTR,A
MOV DPTR,#6FFFH
MOV R0,#PACE
MOV A,@R0
MOVX @DPTR,A
INC R0
MOV A,@R0
MOVX @DPTR,A
RET
KTAB: DB 01H 02H 03H 00H 00H ;/* 键的有序数码转换表 */
DB 00H 00H 00H 04H 05H
STAB: DB 0FFH 55H 99H 0AAH 66H ;/* 输出时序表,倒序 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -