📄 zhiliudianji.txt
字号:
org 00h
ajmp start
org 30h
;**********检测键盘状态的程序****************
START:
mov p0,#0ffh ;置p0为输入口,将P0口置为1,用于检查按键是否按下
jnb p0.0,QIDONG ;按键S2按下,p0.0为0,进入启动(正转)程序
jnb p0.1,FANZHUAN ;按键S3按下,p0.1为0,进入反转程序
jnb p0.2,JITING ;按键S4按下,p0.2为0,进入急停程序
jnb p0.3,JIASU ;按键S5按下,p0.3为0,进入加速程序
jnb p0.4,JIANSU ;按键S6按下,p0.4为0,进入减速程序
jnb p0.5,TINGZHI ;按键S7按下,P0.5为0,进入停止程序
ajmp start
;************启动程序,默认为顺时针转动,转速为2000RPM***********
QIDONG:
LCALL YANSHI ;调用延时子程序,目的:软件消除按键抖动
JNB P0.0,QI
LJMP START ;软件消抖后,若p0.0为1,则认为按键未按下,回到检测按键状态程序
QI:
clr p0.6 ;p0.6接电机R/S端,将其清零表示电机可以运行
setb p0.7 ;p0.7接DIR端,为1,则与COM端断开,电机正转
mov p2,#0Bh ;p2.0接CH1,p2.1接CH2,p2.2接CH3,将速度设定为2000RPM
lcall XIANSHI ;显示设定速度
LJMP START ;执行完启动程序后,回到检测按键状态程序
;***************反转程序,也即逆时针转动*****************
FANZHUAN:
LCALL YANSHI ;调用延时子程序,目的:软件消除按键抖动
JNB P0.1,FAN
LJMP START ;软件消抖后,若p0.0为1,则认为按键未按下,回到检测按键状态程序
FAN:
clr p2.3 ;接通BRK端,使电机急停
lcall PANTING ;调用判停程序,能从判停程序中返回,说明机已停
setb p2.3 ;断开BRK端,解除急停状态
clr p0.7 ;接通DIR端,使电机逆时针转动
lcall XIANSHI ;显示设定速度
LJMP START ;执行完启动程序后,回到检测按键状态程序
;*****************急停程序*********************
JITING:
LCALL YANSHI ;调用延时子程序,目的:软件消除按键抖动
JNB P0.2,JI
LJMP START ;软件消抖后,若p0.0为1,则认为按键未按下,回到检测按键状态程序
JI:
clr p2.3 ;接通BRK端,使电机急停
lcall PANTING ;调用判停程序,若能从中返回,说明电机已停
LJMP START ;执行完启动程序后,回到检测按键状态程序
;***************加速程序,每按一次键,加速500rpm****************
JIASU:
LCALL YANSHI ;调用延时子程序,目的:软件消除按键抖动
JNB P0.3,JIA
LJMP START ;软件消抖后,若p0.0为1,则认为按键未按下,回到检测按键状态程序
JIA:
mov a,p2 ;将p2的值复制到累加器a中
anl a,#07h ;取ch3ch2ch1的值,并放到累加器a中
jz START ;若a中值为0,则速度已经最大,不再加速,回到检测按键状态程序
mov r0,p2
dec r0
mov p2,r0 ;加速500rpm(参考电机驱动器说明中的多段速度选择部分)
lcall XIANSHI ;显示设定的速度
LJMP START ;执行完启动程序后,回到检测按键状态程序
;********************减速程序,每按一次键,减速500rpm****************
JIANSU:
LCALL YANSHI ;调用延时子程序,目的:软件消除按键抖动
JNB P0.4,JIAN
LJMP START ;软件消抖后,若p0.0为1,则认为按键未按下,回到检测按键状态程序
JIAN:
mov a,p2
anl a,#07h ;取ch3ch2ch1的值
cjne a,#07h,JS ;若a中数值为07h,则速度已为0,
ljmp START ;若速度为0,则程序回到开始程序,不再减速,以防出错
JS:
mov a,P2
inc a
mov P2,a ;减速500rpm(参考电机驱动器说明中的多段速度选择部分)
lcall XIANSHI ;显示设定的速度
ljmp START ;执行完启动程序后,回到检测按键状态程序
;********************停止程序***********************
TINGZHI:
LCALL YANSHI ;调用延时子程序,目的:软件消除按键抖动
JNB P0.5,TING
LJMP START ;软件消抖后,若p0.0为1,则认为按键未按下,回到检测按键状态程序
TING:
setb p0.6 ;p0.6接R/S端,为1,则与COM端断开
lcall PANTING ;调用判停程序,若能从中返回,说明电机已停
LJMP START ;执行完启动程序后,回到检测按键状态程序
;*****************延时10ms,这是一个子程序,功能是延时10毫秒*************
YANSHI:
mov a,#0 ;对累加器a置零,延时用
y:
mov r1,#00h ;对寄存器r1置零,延时用
inc r1
cjne r1,#0ffh,y ;延时1ms
inc a
cjne a,#10,y ;延时10×1=10ms
ret
;*******判停程序,这是一个子程序,若能从判停程序中返回,则说明电机已停********
PANTING:
jnb p2.4,yanshi250ms ;若speed端为0,则进入延时程序
ajmp PANTING ;若speed端为1,则返回PANTING,等待speed端出现0电平
yanshi250ms:
clr p2.6 ;允许对计数器置数
mov p3,#08h ;对计数器置入数8
setb p2.6 ;计数器开始计数
mov a,#0 ;对累加器a置零,延时用
y250:
mov r1,#00h ;对寄存器r1置零,延时用
inc r1
jb p2.5,PANTING ;若期間Tc为1,则电机未停,返回PANTING,继续判断
cjne r1,#0ffh,y250 ;延时1ms
inc a
cjne a,#250,y250 ;延时250ms,
ret
;若至延时结束Tc一直不改变状态,则说明speed端口无脉冲输出,认为电机停转,程序
;返回。
;在电机停转之前,单片机不响应按键状态的改变。
;*******************显示程序,这是一个子程序**************************
XIANSHI:
mov a,p2 ;将当前的速度设定值读入a中
anl a,#07h ;取ch3ch2ch1的值,存入a中
mov b,#4
mul ab ;取得低位速度值对应的相对地址,存入a中
add a,r3 ;得到低位字符地址,放在a中
mov scon,#00h ;初始化串行口方式0
mov r2,#0 ;利用r2来控制显示字符数
mov dptr,#tab ;字形表的入口地址
mov r3,a ;低位速度值地址存入r3
x: add a,r2 ;利用a与r2的和获得字符地址
movc a,@a+dptr ;查表获得字型码,放在a中
mov sbuf,a ;串口显示
l: jnb ti,l ;等待发送完毕
clr ti ;发送标志ti清零
inc r2
mov a,r3
cjne r2,#4,x ;发送四个字符
ret
tab: db 03h,03h,49h,0dh
db 03h,03h,03h,0dh
db 03h,03h,49h,27h
db 03h,03h,03h,27h
db 03h,03h,49h,9fh
db 03h,03h,03h,9fh
db 03h,03h,49h,0ffh
db 03h,0ffh,0ffh,0ffh
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -