📄 程序原.asm
字号:
ED_DATA EQU 40H ;显示数据区,共4个单元,存储格式
;1234
DELAY_TIME_H EQU 46H ;延时控制位,用于决定电机的转速
DELAY_TIME_L EQU 45H
TIME_SETP_H EQU 00H ;每次步进的长度
TIME_SETP_L EQU 0C8H
MAX_DELAY_H EQU 0ECH ;延时上限
MAX_DELAY_L EQU 78H
MIN_DELAY_H EQU 8AH ;延时下限
MIN_DELAY_L EQU 0D0H
COUNT EQU 48H ;决定输出步序,
FLAG EQU 49H
SPEED EQU 50H ;速度等级
ORG 0000H
JMP MAIN
ORG 0003H ;外中断0
JMP Int
NOP
NOP
CALL Err ;软件陷阱
ORG 000BH ;定时中断0
JMP Timer0
NOP
NOP
CALL Err ;软件陷阱
ORG 0013H ;外中断1
JMP Int3
NOP
NOP
CALL Err ;软件陷阱
ORG 001BH ;定时器中断1
JMP Timer1
NOP
NOP
CALL Err ;软件陷阱
;//////////////////////////////////////////////////////////////////////////
ORG 0080H
MAIN:
CALL Init
CALL Int
CALL Int3
JMP $
;////////////////////////////中断服务程序区////////////////////
Timer0:
RETI
Timer1: ;为保证输出的连续,用中断来输出
CLR TR1 ;停止计数
MOV TH1,DELAY_TIME_H ;置计数器初值
MOV TL1,DELAY_TIME_L
MOV A,FLAG
JNZ Timer1_Loop1
INC COUNT ;加一
INC COUNT
Timer1_Loop1:
DEC COUNT ;减一
MOV A,COUNT ;范围限制
CJNE A,#06H,Timer1_Loop2
MOV COUNT,#00H
Timer1_Loop2:
CJNE A,#0FFH,Timer1_Loop3
MOV COUNT,#05H
Timer1_Loop3:
MOV A,COUNT
MOV DPTR,#DATA_CODE ;查表
MOVC A,@A+DPTR ;读控制码
ANL P1,#0F0H ;输出
ORL P1,A
SETB TR1 ;开计数器
RETI
Int: ;电机加速,即增大计数器初值
CLR ET0 ;关外部中断0
INC SPEED ;查表显示转速
CALL JUDEG ;判断范围
CALL LED_SHOW ;改变速度等级显示
MOV A,SPEED
RL A ;A x 2
MOV DPTR,#SPEED_CODE
PUSH Acc
MOVC A,@A+DPTR ;取延时高位
MOV R7,A
INC DPTR
POP Acc
MOVC A,@A+DPTR ;取延时低位
MOV R6,A
MOV A,SPEED
JNZ Int_Loop1
MOV R5,#1 ;减速
JMP Int_Loop2
Int_Loop1:
MOV R5,#0 ;加速
Int_Loop2:
CALL Chang_Speed
;等待按键释放
INT_Wait:
JB P3.2,INT_END
CALL Delay
JMP INT_Wait
INT_END:
SETB ET0 ;开中断
RETI
;电机减速,即减小计数器初值
Int3:
CLR ET1
DEC SPEED
CALL JUDEG ;判断范围
CALL LED_SHOW ;改变速度等级显示
MOV A,SPEED
RL A ;A x 2
MOV DPTR,#SPEED_CODE
PUSH Acc
MOVC A,@A+DPTR ;取延时高位
MOV R7,A
INC DPTR
POP Acc
MOVC A,@A+DPTR ;取延时低位
MOV R6,A
MOV A,SPEED
CJNE A,#05H,Int3_Loop1
MOV R5,#0 ;加速
JMP Int3_Loop2
Int3_Loop1:
MOV R5,#1 ;减速
Int3_Loop2:
CALL Chang_Speed
;等待按键释放
INT3_Wait:
JB P3.3,INT3_END
CALL Delay
JMP INT3_Wait
INT3_END:
SETB ET1
RETI
Err:
MOV A,#00H ;返回
PUSH Acc
PUSH Acc
RET
;/////////////////////////////普通函数区/////////////////////
;初始化函数
Init:
MOV SP,#60H ;设定堆栈
MOV TMOD,#10H ;选用定时器1,工作方式1
MOV TH1,#8AH ;置计数器初值,初始化为延时
MOV TL1,#0D0H
MOV FLAG,#00H ;正传控制
MOV COUNT,#00H
MOV DELAY_TIME_H,#00H ;写延时控制字
MOV DELAY_TIME_L,#00H
MOV SPEED,#00H ;速度等级1
MOV TCON,#00H ;设置中断触发方式为低电平触发
MOV IP,#08H ;设定Timer1的中断优先级为最高
;MOV IE,#8AH
MOV IE,#8FH ;开除串行中断外的所有中断,开总中断
SETB TR1 ;开始计数
CALL LED_SHOW
MOV A,SPEED
RL A ;A x 2
MOV DPTR,#SPEED_CODE
PUSH Acc
MOVC A,@A+DPTR ;取延时高位
MOV R7,A
INC DPTR
POP Acc
MOVC A,@A+DPTR ;取延时低位
MOV R6,A
MOV R5,#00H
CALL Chang_Speed
RET
JUDEG:
PUSH Acc
MOV A,SPEED;
CJNE A,#06H,JUDEG_NEXT1
MOV SPEED,#00H
JUDEG_NEXT1:
CJNE A,#0FFH,JUDEG_NEXT2
MOV SPEED,#05H
JUDEG_NEXT2:
POP Acc
RET
;显示转速程序
LED_SHOW:
PUSH Acc
MOV A,SPEED
INC A
MOV DPTR,#LED_CODE0
MOVC A,@A+DPTR ;查表显示速度等级
MOV P2,A
POP Acc
RET
;最终速度值放在R7/R6中,R7为高位 ,R5=0速度增加,R5=1速度减小
Chang_Speed:
PUSH Acc
Chang_Speed_Loop:
MOV A,R5
JZ Chang_Speed_Loop1
CALL Dec_Speed ;减速
CALL Delay ;延时
CLR C
MOV A,R6
SUBB A,DELAY_TIME_L
MOV A,R7
SUBB A,DELAY_TIME_H
JC Chang_Speed_Loop
JMP Chang_Speed_Loop2
Chang_Speed_Loop1:
CALL Add_Speed
CALL Delay ;延时
CLR C
MOV A,R6
SUBB A,DELAY_TIME_L
MOV A,R7
SUBB A,DELAY_TIME_H
JNC Chang_Speed_Loop
Chang_Speed_Loop2:
MOV DELAY_TIME_L,R6 ;确保最终速度稳定
MOV DELAY_TIME_H,R7
POP Acc
RET
Add_Speed:
PUSH Acc
MOV A,DELAY_TIME_L ;改变延时值
ADD A,#TIME_SETP_L
MOV DELAY_TIME_L,A
MOV A,DELAY_TIME_H
ADDC A,#TIME_SETP_H
MOV DELAY_TIME_H,A
POP Acc
RET
Dec_Speed:
PUSH Acc
CLR C
MOV A,DELAY_TIME_L ;改变延时值
SUBB A,#TIME_SETP_L
MOV DELAY_TIME_L,A
MOV A,DELAY_TIME_H
SUBB A,#TIME_SETP_H
MOV DELAY_TIME_H,A
POP Acc
RET
Delay: ;延时
PUSH Acc
MOV R0,#64H
LOOP_LEDW:
MOV A,0FFH
loop_led:
DEC A
NOP
JNZ loop_led
DJNZ R0,LOOP_LEDW
POP Acc
RET
;///////////////////////////DATA///////////////////////////////
DATA_CODE: DB 01h,03h,02h,06h,04h,05h ;电机控制代码
NOP
NOP
CALL Err ;软件陷阱
LED_CODE0: ;共阳极代码
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH
NOP
NOP
CALL Err ;软件陷阱
LED_CODE1: ;共阴极代码
DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,00H
NOP
NOP
CALL Err ;软件陷阱
SPEED_CODE:
DB 08AH,0D0H ;1档转速的延时值,高位在前
DB 09EH,058H ; 2档转速的延时值
DB 0B1H,0E0H ; 3档转速的延时值
DB 0C5H,068H ; 4档转速的延时值
DB 0D8H,0F0H ; 5档转速的延时值
DB 0ECH,077H ; 6档转速的延时值
ORG 0300H
NOP
NOP
CALL Err ;软件陷阱
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -