设计者:杨剑锋 桂林理工大学机械控制与控制工程学院
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 页