单片机控制步进电机求汇编程序

分别用k1 (p1.4) 控制开始停止 k2(p1.5)加速k3(p1.6)减速 k4(p1.7) 正转反转。急求
。。。

ORG 00H
START: MOV DPTR , #TAB1
MOV R0, #03H
MOV R1 , #4H
MOV R4, #00H
MOV P0, #03H
WAIT: MOV P0, R0
MOV P0, #0FFH
JNB P3.4,TIZ ;P3.4有停止键按下时,跳到停止子程序
JNB P3.0,ZHENG ;P3.0有启动正转键按下时,跳到停止子程序
JNB P3.1,FAN
SJMP WAIT
ZHENG : ;正转子程序
MOV A,R4
MOVC A,@A+DPTR
ACALL DELAY
INC R4
AJMP KEY
FAN: ;反转子程序
MOV R4,#6
MOV A,R4
MOVC A,@A+DPTR
MOV P3,A ;
ACALL DELAY
AJMP KEY
KEY: MOV P3,#0FFH ;KEY检测,赋初值
JB P3.4,ZZ1
AJMP TIZ
TIZ: MOV P0,#00H ;停止子程序
AJMP KEY

ZZ1: JB P3.0,FZ1 ;正转按键检测,有键按下转到FZI
CJNE R4,#8,LOOPZ;循环次数是否为8,为8则清0
MOV R4,#0
LOOPZ: MOV A,R4 ;读电机状态显示
MOVC A,@A+DPTR
MOV P0,A ;赋给P0,显示1为正转,2为反转,3为加速,4为减速
SETB P1.1 ;赋高电平,关闭反向状态灯
CPL P1.0 ;开正转状态灯
JNB P3.2,JIASUZ ;加速子程序
JNB P3.3,JIANSUZ ;减速子程序
ACALL DELAY
INC R4
AJMP KEY
FZ1:
JB P3.1,KEY
CJNE R4,#255,LOOPF
MOV R4,#8
LOOPF: DEC R4
MOV A,R4
MOVC A,@A+DPTR ;读脉冲
MOV P0,A ;给步进电机输入脉冲
SETB P1.0
CPL P1.1
JNB P3.2,JIASUF ;加速按键检测
JNB P3.3,JIANSUF ;减速按键检测
ACALL DELAY
AJMP KEY ;跳转到KEY检测子程序
DELAY:MOV A,R1 ;延时子程序
MOV R6,A
DELAY2:MOV R5,#6H
DD2:MOV R7,#0
DD3:DJNZ R7,DD3
DJNZ R5,DD2
DJNZ R6,DELAY2
RET
DELAY1:
MOV R6,#20H
DD4: MOV R5,#02H
DD5: MOV R7,#0
DD6: DJNZ R7,DD6
DJNZ R5,DD5
DJNZ R6,DD4
RET
JIASUZ: ;加速的按键检测
ACALL DELAY1
CJNE R1,#02,L1
JMP L2
L1: DEC R1
L2: JMP LOOPZ
JIANSUZ: ;减速的按键检测
ACALL DELAY1
CJNE R1,#08H,L3
JMP L4
L3: INC R1
L4: JMP LOOPZ ;返回LOOPZ,循环
JIASUF: ;加速子程序
ACALL DELAY1
CJNE R1,#02H,L5
JMP L6
L5: DEC R1
L6: JMP LOOPF

JIANSUF: ;减速子程序
ACALL DELAY1
CJNE R1,#08H,L7
JMP L8
L7: INC R1
L8: JMP LOOPF

TAB1:DB 02H,06H,04H,0CH
DB 08H,09H,01H,03H
END
温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-12-23
SPEED EQU 10H ;SPEED为转速等级标志,共7级,即1~7
  FX EQU 11H ;FX 为方向标志
  COUNT EQU 12H ;COUNT中断次数标志
  ORG 0000H
  AJMP MAIN
  ORG 0003H ;外部中断0入口地址,加速子程序
  AJMP UP
  ORG 0013H ;外部中断1入口地址,减速子程序
  AJMP DOWN
  ORG 000BH ;定时器0中断入口地址,控制中断次数来达到控制转速 AJMP ZDT0
  ORG 0030H
  MAIN: MOV SP,#60H
  MOV TMOD,#01H ;工作于定时、软件置位启动,模式1(16 位计时器)
  MOV TH0,#0CFH
  MOV TL0,#2CH
  MOV COUNT,#01H
  SETB ET0 ;定时/计数器允许中断
  CLR IT0 ;外部中断为电平触发方式,低电平有效
  CLR IT1
  SETB EX0 ;外部允许中断
  SETB EX1
  SETB EA ;开总中断
  MOV R1,#11H ;四相单四拍运行,共阳数码管方向显示8,速度值显示0
  MOV SPEED,#00H
  MOV FX,#00H
  XIANS: MOV A,SPEED
  MOV DPTR,#LED
  MOVC A,@A+DPTR ;查表获取等级对应数码管代码
  MOV P2,A ;第二个数码管显示转速等级
  MOV A,FX ;准备判断转向
  CJNE A,#11H,ELS
  MOV P0, #0F9H ;第一个数码管显示 1,表示正转
  AJMP QD
  ELS: CJNE A,#00H,ZHENG
  MOV P0,#0C0H ;第一个数码管显示 0,表示不转
  AJMP QD
  ZHENG: MOV P0,#0BFH ;第一个数码管显示-,表示反转
  QD: JB P3.4,DD ;P3.4 接启动开关 K1,P3.4=1 时启动
  CLR TR0 ;停止定时/计数器
  MOV P0,#0C0H ;第一个数码管显示 0,表示不转
  MOV P2,#0C0H ;第二个数码管显示 0,表示转速为 0
  MOV SPEED,#00H ;重新赋初值
  MOV FX,#00H
  AJMP QD
  DD: MOV A,SPEED
  JNZ GO ;A 不等于 0,即初始速度不为零,则转移到 GO
  CLR TR0 ;停止定时/计数器
  AJMP QD
  GO: SETB TR0 ;开启定时/计数器
  ACALL DELAY
  AJMP XIANS
  DELAY: MOV R6,#10 ;延时子程序
  DEL1: MOV R7,#250
  HERE1: DJNZ R7, HERE1
  DJNZ R6,DEL1
  RET
ZDT0: PUSH ACC
  PUSH DPH
  PUSH DPL
  MOV TH0,#0D8H
  MOV TL0,#0F0H
  DJNZ COUNT,EXIT
  JB P3.5,NIZHUAN ;查询方向标志,P3.5 接换向开关 K2
  MOV FX,#11H
  NIZHUAN:MOV A,FX
  CJNE A,#11H,FZ ;若A不等于11,即正转,则转移到 FZ
  MOV A,R1 ;R1 记录上一次电机脉冲状态
  MOV P1,A
  RR A ;循环右一位
  MOV R1,A
  MOV P1,A
  AJMP RE
  FZ: MOV A,R1
  MOV P1,A
  RL A ;循环左移一位
  MOV P1,A
  MOV R1,A
  RE: MOV A,SPEED
  MOV DPTR,#TAB
  MOVC A,@A+DPTR
  MOV COUNT,A ;把转速级别赋给 COUNT
  JB P3.5 ,FFX ;P3.5 接换向开关K2, 即换向位,若P3.5=1,则跳到 FFX
  MOV FX,#11H
  AJMP EXIT
  FFX: MOV FX,#0FEH;只要FX不等于11H,就可以通过循环左移或右移进行换向
  EXIT: POP DPL
  POP DPH
  POP ACC
  RETI
  ;以下 UP 为加速中断程序
  UP: PUSH ACC
  ACALL DELAY ;延时防抖
  JB P3.2,UPEX ;P3.2 为外部中断0位,接增速开关S2,低电平有效,若P3.2=1,则退出
  MOV A,SPEED
  CJNE A,#7,SZ ;最大等级为 7,若 A 不等于 7,则转移到 SZ
  AJMP UPEX ;若 A=7,则退出
  SZ: INC SPEED ;SPEED= SPEED+1
  UPEX: POP ACC
  HERE2: JNB P3.2,HERE2 ;本条指令为防止开关 S2 按下去后弹不起,导致一直产生中断
  RETI
  ;以下 DOWN 为减速中断程序
  DOWN: PUSH ACC
  ACALL DELAY
  JB P3.3,DEX ;P3.3 为外部中断1位,接减速开关S3,低电平有效,P3.3=1则退出
  MOV A,SPEED
  CJNE A,#0,SJ
  AJMP DEX
  SJ: DEC SPEED ;SPEED= SPEED-1
  DEX: POP ACC
  HERE3: JNB P3.3,HERE3
  RETI
  TAB: DB 0,60,40,35,30,28,25,21 ;经仿真,小于21时,由于脉冲太快,会出现失步 ;
  LED: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,98H
  END
第2个回答  2018-11-26
ORG 0000H
START: MOV DPTR,#TAB
MOV R0,#03H
MOV R1,#4H
MOV R4,#00H
MOV P0,#03H
WAIT: MOV P0,R0
MOV P0,#0FFH
JNB P3.4,TIZ;
JNB P3.0,ZHENG;
JNB P3.1,FAN
SJMP WAIT
ZHENG:
MOV A,R4
MOVC A,@A+DPTR
ACALL DELAY
INC R4
AJMP KEY
FAN:
MOV R4,#6
MOV A,R4
MOVC A,@A+DPTR
MOV P3,A;
ACALL DELAY
AJMP KEY
KEY: MOV P3,#0FFH
JB P3.4,ZZI
AJMP TIZ
TIZ: MOV P0,#00H
AJMP KEY
ZZI: JB P3.0,FZI
CJNE R4,#8,LOOPZ
MOV R4,#0
LOOPZ: MOV A,R4
MOVC A,@A+DPTR
MOV P0,A
SETB P1.1
CPL P1.0
JNB P3.2,JIASUZ
JNB P3.3,JIANSUZ
ACALL DELAY
INC R4
AJMP KEY
FZI:
JB P3.1,KEY
CJNE R4,#255,LOOPF
MOV R4,#8
LOOPF: DEC R4
MOV A,R4
MOVC A,@A+DPTR
MOV P0,A
SETB P1.0
CPL P1.1
JNB P3.2,JIASUF
JNB P3.3,JIANSUF
ACALL DELAY
AJMP KEY
DELAY: MOV A,R1
MOV R6,A
DELAY2:MOV R5,#6H
DD2: MOV R7,#0
DD3: DJNZ R7,DD3
DJNZ R5,DD2
DJNZ R6,DELAY2
RET
DELAY1:
MOV R6,#20H
DD4: MOV R5,#02H
DD5: MOV R7,#0
DD6: DJNZ R7,DD6
DJNZ R5,DD5
DJNZ R6,DD4
RET
JIASUZ:
ACALL DELAY1
CJNE R1,#02,L1
JMP L2
L1: DEC R1
L2: JMP LOOPZ
JIANSUZ:
ACALL DELAY1
CJNE R1,#05H,L3
JMP L4
L3: INC R1
L4: JMP LOOPZ
JIASUF:
ACALL DELAY1
CJNE R1,#02H,L5
JMP L6
L5: DEC R1
L6: JMP LOOPF
JIANSUF:
ACALL DELAY1
CJNE R1,#04H,L7
JMP L8
L7: INC R1
L8: JMP LOOPF
TAB: DB 02H,06H,04H,0CH
DB 08H,09H,01H,03H
END
我已经实现了功能
相似回答