基于单片机的步进电机控制器设计

设计者:杨剑锋 桂林理工大学机械控制与控制工程学院

LCALL KUNM_SUB ORL A, #0FH CJNE A, #0FFH, KE_LOOP1

MOV R7, #10 LCALL DEL_SUB DJNZ R7, KE_NEXT1 MOV DPTR, #IN_TAB MOV R7, #0

KE_LOOP2:

MOV A, R7 MOVC A, @A+DPTR CJNE A, KONZ, KE_NEXT2 LJMP KE_NEXT3

KE_NEXT2:

INC R7 LJMP KE_LOOP2

KE_NEXT3:

MOV A, R7

CJNE A, #9, KE_NEXT4 LJMP B_SET

KE_NEXT4:

JC B_SET CJNE A, #12, KE_NEXT5 LJMP DJ_SET

KE_NEXT5:

JC DJ_SET CJNE A, #13, KE_NEXT7 MOV A, SD CJNE A, #7, KE_NEXT6 LJMP KE_NEXT

KE_NEXT6:

INC SD LJMP KE_NEXT

KE_NEXT7:

MOV A, SD CJNE A, #0, KE_NEXT8 LJMP KE_NEXT

KE_NEXT8:

DEC SD LJMP KE_NEXT

B_SET:

MOV BWB, SWB MOV SWB, WB MOV WB, QB MOV QB, BB MOV BB, SB

;再次调用键盘扫描程序 ;键盘输入状态高四位置1

;若(A)=0FFH,键已释放,执行去抖动,否 ;则转KE_LOOP1再次判断 ;延时10ms去抖动 ;调用延时1ms程序 ;

;DPTR指向键号查询表首地址 ;从0号键开始扫描

;取键号

;查表取出相应键号状态码 ;与输入状态相比较,若

;相等,则为该号键按下,转取键号 ;否则取下一键号 ;转再次扫描

;取按下键键号

;若键号=9,转设置步数 ;否则转判断是否<9

;若键号<9,转设置步数,否则顺序判断 ;若键号≠12,

;否则转电机控制设置

;若键号<12,转电机控制设置,否则继续判断 ;若键号≠13,转减速设置, ;则顺序设置加速 ;取当前速度

;若当前速度≠7,转速度加1档

;否则当前速度为最大值,转子程序返回 ;当前速度增加1档 ;转子程序返回

;取当前速度

;若当前速度≠0,转速度减1档

;否则当前速度为最小值,转子程序返回 ;当前速度减1档 ;转子程序返回 ;步数十万位移至百万位 ;步数万位移至十万位 ;步数千位移至万位 ;步数百位移至千位 ;步数十位移至百位

第 11 页 共 25 页

设计者:杨剑锋 桂林理工大学机械控制与控制工程学院

MOV SB, GB ;步数个位移至十位 MOV GB, A ;步数新数移至个位 LJMP KE_NEXT ;转子程序返回

DJ_SET:

MOV DPTR, #SRDS_TAB ;DPTP指向控制与显示表首地址 MOVC A, @A+DPTR ;取控制状态 MOV JK, A ;控制状态存入控制单元

KE_NEXT:

RET ;子程序返回

IN_TAB: DB 77H, B7H ,D7H, E7H,7BH ,BBH ,DBH ,EBH ;输入键键号查询表

DB 7DH, BDH ,DDH ,EDH,7EH ,BEH ,DEH

SRDS_TAB: DB C0H, F9H ,A4H, B0H,99H ,92H

DB 82H ,F8H, 80H, 90H ,1, 2,3 ;电机启/停控制和显示段选码表

键盘扫描程序代码: KUNM_SUB:

MOV P1, #0FFH ;键盘输入口置1 CLR P1.4 ;扫描第一列 MOV A, P1 ;读入输入状态 SETB P1.4 ;关闭扫描第一列 CLR P1.5 ;扫描第二列 MOV A, P1 ;读入输入状态 SETB P1.5 ;关闭扫描第二列 CLR P1.6 ;扫描第三列 MOV A, P1 ;读入输入状态 SETB P1.6 ;关闭扫描第三列 CLR P1.6 ;扫描第四列 MOV A, P1 ;读入输入状态 SETB P1.6 ;关闭扫描第四列 RET ;子程序返回

3.3显示程序

实现功能:根据转速控制单元SD和步数控制单元GB(个位)、SB(十位)、BB(百位)、QB(千位)、WB(万位)、SWB(十万位)、BWB(百万位)的内容查询SRKS_TAB取相应显示段码送相应显示位显示。电机启/停控制和显示段选码表SRDS_TAB见程序所用到的查询表及其说明部分表4-3;程序流程图如图3-4所示;

8位八段数码管显示方法:由硬件结构可知,步数显示7位八段数码管和速度显示1位数码管的段选线并联在一起由单片机P2口控制,而各位的共阴极点分别由相应的P3口控制,实现各位的分时选通,构成8位的动态显示。根据实际情况,每位显示的字符不同,因此软件设计必须采用扫描显示方式,即在每一个瞬间只使某一位显示相应字符。在此瞬间,段选码由控制P2口输出需显示的段码,位选P3口输出位选码选通该位显示相应字符。如此轮流,使每一位显示该应显示的字符,并延时一段时间,这里延时3ms,以造成视觉暂留效果。

第 12 页 共 25 页

设计者:杨剑锋 桂林理工大学机械控制与控制工程学院

显示代码如下: DISP_SUB:

MOV P2, #0FFH MOV P3, #00H MOV R7, #8 MOV R0, GB MOV DPTR, #SRDS_TAB MOV A, #01H PUSH ACC MOV A, @R0 MOVC A, @A+DPTR MOV P2, A POP ACC MOV P3, A

DLOOP2:

MOV R6, #3

;显示子程序

;关显示

;设置显示位数

;取步数个位显示数字

;DPTR指向控制与显示段码表首地址 ;取步数位显示控制字 ;保护步数位显示控制字 ;取步数显示数字 ;取显示段码 ;送显示

;取出位显示控制字 ;打开位显示 ;延时3ms

第 13 页 共 25 页

设计者:杨剑锋 桂林理工大学机械控制与控制工程学院

LCALL DEL_TAB ;调用延时1ms程序 DJNZ R6, DLOOP2 ;判断时是否到,未到刚返回延时,否则往下执行 RL A ;取下一位显示控制字 INC R0;R0 ;指向下一位显示数字存储地址

DJNZ R7, DLOOP1;若(R7)-1=0,八位显示完成,往下执行,否则转显示下一位 MOV P2, #0FFH ; MOV P3, #00H ;关显示 RET ;子程序返回

SRDS_TAB: DB C0H, F9H ,A4H, B0H,99H ,92H

DB 82H ,F8H, 80H, 90H ,1, 2,3 ;电机启/停

控制和显示段选码表

3.4 电机控制程序

实现功能:根据地址单元JK的内容控制电机的正转、反转和停止。时间初值查询表SD_TAB见程序所用到的查询表及其说明部分表4-1;单片机输出控制字查询表MQ_TAB见程序所用到的查询表及其说明部分表4-4;程序流程图如图3-5所示:

第 14 页 共 25 页

设计者:杨剑锋 桂林理工大学机械控制与控制工程学院

电机控制程序代码如下: KT0_INT:

MOV DPTR,#SD_TAB MOV A,SD MOVC A,@A+DPTR MOV TL0,A MOV A,SD ADD A,#10 DA A MOVC A,@A+DPTR MOV TH0,A MOV R7, #7 MOV R0, #GB

KLOOP1:

MOV A, @R0 CJNE A, #0, KNEXT1 INC R0 DJNZ R7, KLOOP1 LJMP KNEXT

KNEXT1:

MOV A, JK CJNE A, #1, KNEXT2

;电机控制程序中断服务程序 ;DPRT指向转速查询表首地址 ;取转速查询表偏移量 ;取定时器低位初值 ;装入定时器低位初值 ;取转速查询表偏移量

;调整转速查询表偏移量,为取T0高位做准备 ;十进制数调整 ;取定时器高位初值 ;装入定时器高位初值

;循环7次,分别判断7位步数是否为0 ;R0指向步数个位

;取位步数

;若位步数=0,判断下一位,否则转判断电机控制状态 ;R0指向步数下一位地址

;若(R7)-1=0,则步数每一位均为0,转 ;程序返回

;取电机控制状态

;若电机控制状态=1,电机正转,否则判断是否反转

第 15 页 共 25 页

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4