
探测机器人系统的设计电机控制程序.doc
5页电机控制程序org 00hajmp startorg 30hSTART: ; 检测键盘状态的程序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 startQIDONG. ;启动程序,默认为顺时针转动,转速为2000RPMLCALL YANSHI ;调用延时子程序,目的:软件消除按键抖动JNB P0.0,QILJMP 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,将速度设定为2000RPMlcall XIANSHI ;显示设定速度LJMP START ;执行完启动程序后,回到检测按键状态程序FANZHUAN: ;反转程序,也即逆时针转动LCALL YANSHI ;调用延时子程序,目的:软件消除按键抖动JNB P0.1,FANLJMP START ;软件消抖后,若p0.0为1,则认为按键未按下,回到检测按键状态程序FAN: clr p2.3 ;接通BRK端,使电机急停lcall PANTING ;调用判停程序,能从判停程序中返回,说明机已停setb p2.3 ;断开BRK端,解除急停状态clr p0.7 ;接通DIR端,使电机逆时针转动lcall XIANSHI ;显示设定速度LJMP START ;执行完启动程序后,回到检测按键状态程序;急停程序LCALL YANSHI ;调用延时子程序,目的:软件消除按键抖动JNB P0.2,JILJMP START ;软件消抖后,若p0.0为1,则认为按键未按下,回到检测按键状态程序JI: clr p2.3 ;接通BRK端,使电机急停lcall PANTING ;调用判停程序,若能从中返回,说明电机已停LJMP START ;执行完启动程序后,回到检测按键状态程序JIASU: ;加速程序,每按一次键,加速500rpmLCALL YANSHI ;调用延时子程序,目的:软件消除按键抖动JNB P0.3,JIALJMP START ;软件消抖后,若p0.0为1,则认为按键未按下,回到检测按键状态程序JIA: mov a,p2 ;将p2的值复制到累加器a中anl a,#07h ;取ch3ch2ch1的值,并放到累加器a中 jz START ;若a中值为0,则速度已经最大,不再加速,回到检测按键状态程序 mov r0,p2dec r0mov p2,r0 ;加速500rpm(参考电机驱动器说明中的多段速度选择部分)lcall XIANSHI ;显示设定的速度 LJMP START ;执行完启动程序后,回到检测按键状态程序JIANSU: ;减速程序,每按一次键,减速500rpmLCALL YANSHI ;调用延时子程序,目的:软件消除按键抖动JNB P0.4,JIANLJMP 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,P2inc a mov P2,a ;减速500rpm(参考电机驱动器说明中的多段速度选择部分)lcall XIANSHI ;显示设定的速度 ljmp START ;执行完启动程序后,回到检测按键状态程序TINGZHI: ; 停止程序LCALL YANSHI ;调用延时子程序,目的:软件消除按键抖动JNB P0.5,TINGLJMP START ;软件消抖后,若p0.0为1,则认为按键未按下,回到检测按键状态程序TING: setb p0.6 ;p0.6接R/S端,为1,则与COM端断开lcall PANTING ;调用判停程序,若能从中返回,说明电机已停LJMP START ;执行完启动程序后,回到检测按键状态程序YANSHI: ;延时10ms,这是一个子程序,功能是延时10毫秒mov a,#0 ;对累加器a置零,延时用y: mov r1,#00h ;对寄存器r1置零,延时用inc r1cjne r1,#0ffh,y ;延时1msinc acjne a,#10,y ;延时10×1=10msretPANTING: ;判停程序,这是一个子程序,若能从判停程序中返回,则说明电机已停jnb p2.4,yanshi250ms ;若speed端为0,则进入延时程序ajmp PANTING ;若speed端为1,则返回PANTING,等待speed端出现0电平yanshi250ms:clr p2.6 ;允许对计数器置数mov p3,#08h ;对计数器置入数8setb p2.6 ;计数器开始计数mov a,#0 ;对累加器a置零,延时用y250: mov r1,#00h ;对寄存器r1置零,延时用inc r1jb p2.5,PANTING ;若期間Tc为1,则电机未停,返回PANTING,继续判断cjne r1,#0ffh,y250 ;延时1msinc acjne a,#250,y250 ;延时250ms,ret ;若至延时结束Tc一直不改变状态,则说明speed端口无脉冲输出,认为电机停转,程序;返回。
在电机停转之前,单片机不响应按键状态的改变XIANSHI: ;显示程序,这是一个子程序mov a,p2 ;将当前的速度设定值读入a中anl a,#07h ;取ch3ch2ch1的值,存入a中mov b,#4mul ab ;取得低位速度值对应的相对地址,存入a中add a,r3 ;得到低位字符地址,放在a中mov scon,#00h ;初始化串行口方式0mov 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 ;发送四个字符 rettab: db 03h,03h,49h,0dh db 03h,03h,03h,0d。
