单片机控制步进电机_四相八拍
- 格式:doc
- 大小:35.50 KB
- 文档页数:4
51单片机控制四相步进电机在这里介绍一下用51单片机驱动步进电机的方法。
这款步进电机的驱动电压12V,步进角为 7.5度 . 一圈 360 度 , 需要 48 个脉冲完成!!!该步进电机有6根引线,排列次序如下:1:红色、2:红色、3:橙色、4:棕色、5:黄色、6:黑色。
采用51驱动ULN2003的方法进行驱动。
ULN2003的驱动直接用单片机系统的5V电压,可能力矩不是很大,大家可自行加大驱动电压到12V。
接触单片机快两年了,不过只是非常业余的兴趣,实践却不多,到现在还算是个初学者吧。
这几天给自己的任务就是搞定步进电机的单片机控制。
以前曾看过有关步进电机原理和控制的资料,毕竟自己没有做过,对其具体原理还不是很清楚。
今天从淘宝网买了一个EPSON的UMX-1型步进电机,此步进电机为双极性四相,接线共有六根,外形如下图所示:拿到步进电机,根据以前看书对四相步进电机的了解,我对它进行了初步的测试,就是将5伏电源的正端接上最边上两根褐色的线,然后用5伏电源的地线分别和另外四根线(红、兰、白、橙)依次接触,发现每接触一下,步进电机便转动一个角度,来回五次,电机刚好转一圈,说明此步进电机的步进角度为360/(4×5)=18度。
地线与四线接触的顺序相反,电机的转向也相反。
如果用单片机来控制此步进电机,则只需分别依次给四线一定时间的脉冲电流,电机便可连续转动起来。
通过改变脉冲电流的时间间隔,就可以实现对转速的控制;通过改变给四线脉冲电流的顺序,则可实现对转向的控制。
所以,设计了如下电路图:C51程序代码为:代码一#include <AT89X51.h>static unsigned int count;static unsigned int endcount;void delay();void main(void){count = 0;P1_0 = 0;P1_1 = 0;P1_2 = 0;P1_3 = 0;EA = 1; //允许CPU中断TMOD = 0x11; //设定时器0和1为16位模式1 ET0 = 1; //定时器0中断允许TH0 = 0xFC;TL0 = 0x18; //设定时每隔1ms中断一次TR0 = 1; //开始计数startrun:P1_3 = 0;P1_0 = 1;delay();P1_0 = 0;P1_1 = 1;delay();P1_1 = 0;P1_2 = 1;delay();P1_2 = 0;P1_3 = 1;delay();goto startrun;}//定时器0中断处理void timeint(void) interrupt 1{TH0=0xFC;TL0=0x18; //设定时每隔1ms中断一次count++;}void delay(){endcount=2;count=0;do{}while(count<endcount);}将上面的程序编译,用ISP下载线下载至单片机运行,步进电机便转动起来了,初步告捷!不过,上面的程序还只是实现了步进电机的初步控制,速度和方向的控制还不够灵活,另外,由于没有利用步进电机内线圈之间的“中间状态”,步进电机的步进角度为18度。
四相八拍步进电机控制电路
步进电机在各种自动控制领域中有着广泛的应用,它通过精确的位置控制和简单的控制电路设计,实现了高效的运行。
在步进电机中,四相八拍步进电机是一种常见的类型,它具有结构简单、控制方便等特点,因此得到了广泛采用。
步进电机的控制原理基于控制电路对电机内部各个线圈的通断控制,从而实现单步运动。
四相八拍步进电机由四个线圈组成,按相间夹角为90度的顺序连接,每相均可单独控制。
常见的步进电机控制电路包括单片机控制、逻辑门控制等。
在设计四相八拍步进电机控制电路时,首先需要确定电机驱动方式。
常见的方式包括全步进驱动和半步进驱动。
全步进驱动中,电机每步转动一个完整的步进角度;而在半步进驱动中,电机每步转动半个步进角度。
选择不同的驱动方式可以实现不同的转动精度和速度要求。
控制电路中常用的元器件包括晶体管、电阻、电容等。
通过合理的连接和控制,可以使步进电机按照预先设定的步进序列运行。
在具体设计电路时,需要根据电机的参数和工作要求,选择合适的元器件和控制方式,并进行电路调试和优化。
为了确保步进电机的稳定运行,还需要注意电源稳定性和线圩的连接质量。
稳定的电源可以提供电机正常工作所需的能量,而良好的线圩连接可以减小电机运行时的噪音和振动,延长电机使用寿命。
总的来说,四相八拍步进电机控制电路是实现步进电机精准运动的关键,通过合理的设计和调试,可以有效地实现对电机位置的控制。
在实际应用中,可以根据具体要求进行电路的定制设计,以满足不同场景下步进电机的控制需求。
1。
四项八拍电机工作原理四项八拍电机工作原理一、引言四项八拍电机是一种常用的步进电机,广泛应用于各种自动化设备中。
本文将详细介绍四项八拍电机的工作原理,包括结构、控制方式、驱动方式等。
二、结构四项八拍电机由定子和转子两部分组成。
定子是由4个线圈组成的,分别称为A、B、C、D相。
转子是由8个磁极组成的,分别称为1~8号极。
三、控制方式四项八拍电机有两种控制方式:全步进和半步进。
1. 全步进控制方式全步进控制方式是指每次只使一个相通流,即只激励一个线圈。
具体来说,当A相通流时,转子向前移动一个磁极;当B相通流时,转子向前移动两个磁极;当C相通流时,转子向前移动三个磁极;当D相通流时,转子向前移动四个磁极。
通过不断重复这个过程就可以实现连续旋转。
2. 半步进控制方式半步进控制方式是指每次使两个相交替通流,并且每个相的电流大小不同。
具体来说,当A相通流时,转子向前移动半个磁极;当A相和B相同时通流,转子向前移动一个磁极;当B相通流时,转子向前移动半个磁极;当B相和C相同时通流,转子向前移动一个磁极;当C 相通流时,转子向前移动半个磁极;当C相和D相同时通流,转子向前移动一个磁极;当D相通流时,转子向前移动半个磁极;当D相和A相同时通流,转子向前移动一个磁极。
通过不断重复这个过程就可以实现更精细的控制。
四、驱动方式四项八拍电机有两种驱动方式:单片机驱动和直接驱动。
1. 单片机驱动单片机驱动是指通过单片机控制电机的运行。
具体来说,通过单片机输出不同的电平信号来控制四个线圈的开关状态,并且根据全步进或者半步进控制方式来决定每次激励哪两个线圈。
2. 直接驱动直接驱动是指通过外部电路直接控制电机的运行。
具体来说,通过外部电路输出不同的电平信号来控制四个线圈的开关状态,并且根据全步进或者半步进控制方式来决定每次激励哪两个线圈。
五、总结四项八拍电机是一种常用的步进电机,具有结构简单、控制方便等优点。
通过全步进或者半步进控制方式和单片机驱动或者直接驱动等方式,可以实现精细的控制和广泛的应用。
#include <reg51.h> //51芯片管脚定义头文件#include <intrins.h> //内部包含延时函数_nop_();#define uchar unsigned char#define uint unsigned intuchar code FFW[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //四相八拍正转编码uchar code REV[8]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01}; ////四相八拍反转编码sbit K1 = P3^2; //正转sbit K2 = P3^3; //反转sbit K3 = P3^4; //停止sbit BEEP = P3^6; //蜂鸣器/********************************************************//*/* 延时t毫秒/* 11.0592MHz时钟,延时约1ms/*/********************************************************/void delay(uint t){uint k;while(t--){for(k=0; k<125; k++){ }}}/**********************************************************/void delayB(uchar x) //x*0.14MS{uchar i;while(x--){for (i=0; i<13; i++){ }}}/**********************************************************/ void beep(){uchar i;for (i=0;i<100;i++){delayB(4);BEEP=!BEEP; //BEEP取反}BEEP=1; //关闭蜂鸣器}/********************************************************/ /*/*步进电机正转/*/********************************************************/ void motor_ffw(){uchar i;uint j;for (j=0; j<8; j++) //转1*n圈{if(K3==0){break;} //退出此循环程序for (i=0; i<8; i++) //一个周期转45度{P1 = FFW[i]; //取数据delay(2); //调节转速}}}/********************************************************/ /*/*步进电机反转/*/********************************************************/void motor_rev(){uchar i;uint j;for (j=0; j<8; j++) //转1×n圈{if(K3==0){break;} //退出此循环程序for (i=0; i<8; i++) //一个周期转45度{P1 = REV[i]; //取数据delay(2); //调节转速}}}/********************************************************** 主程序**********************************************************/main(){uchar r,N=64; //N 步进电机运转圈数while(1){if(K1==0){beep();for(r=0;r<N;r++){motor_ffw(); //电机正转if(K3==0){beep();break;} //退出此循环程序}}else if(K2==0){beep();for(r=0;r<N;r++){motor_rev(); //电机反转if(K3==0){beep();break;} //退出此循环程序}}elseP1 = 0xf0;}}/********************************************************/。
单片机课程设计单片机控制步进电机单片机课程设计:单片机控制步进电机单片机(Microcontroller)是一种集成了中央处理器、存储器和输入/输出接口的微型计算机。
而步进电机(Stepper Motor)是一种将电脉冲信号转换为机械角位移的电磁设备。
在单片机课程设计中,控制步进电机是一项常见的任务。
本文将介绍如何使用单片机来控制步进电机,并展示一个基于单片机的课程设计实例。
一、步进电机的原理及特点步进电机是一种将电脉冲信号转换为机械位移的设备,其主要特点包括精密定位、易控制、低成本、没有超额负荷等。
步进电机通常由定子和转子组成,定子上的绕组通电产生磁场,而通过改变绕组通电的顺序和时序,可以实现步进电机的运动控制。
二、单片机控制步进电机的原理为了实现对步进电机的控制,我们需要使用单片机来产生相应的控制信号。
步进电机通常由一个驱动器和若干相继续组成。
单片机通过发出适当的信号给驱动器,进而控制电机的运动。
具体而言,单片机需要控制步进电机的相序、步数和速度。
1. 步进电机的相序控制步进电机的相序控制是通过依次激活不同相继的绕组,实现转子的转动。
单片机通过输出对应的高低电平信号给驱动器,从而控制绕组的激活顺序。
常见的步进电机驱动方式包括全步进和半步进。
2. 步进电机的步数控制步进电机的步数控制是通过控制单片机输出的脉冲数,来实现电机的旋转角度。
根据电机的分辨率和精度需求,我们可以设定单片机输出的脉冲数,从而控制电机的步进角度。
3. 步进电机的速度控制步进电机的速度控制是通过调节单片机输出脉冲信号的频率来实现的。
频率越高,电机转动的速度越快;频率越低,则电机转动的速度越慢。
单片机可以通过定时器等方式产生相应的脉冲频率来控制步进电机的转速。
三、基于单片机的步进电机控制课程设计实例下面将展示一个基于单片机的步进电机控制课程设计实例,该设计基于C语言编程,使用Keil软件进行开发。
设计要求:设计一个步进电机控制系统,使步进电机以设定的转速顺时针旋转一定圈数,并能逆时针旋转一定圈数。
51单片机控制四相步进电机(上)我们研究组有一个纳米项目,现在要测量单根纳米线pn结,我们的方案是类似于原子力显微镜(AFM)一样,把电极探针放在一个微位移控制器上,粗逼近利用步进电机实现,细逼近利用压电陶瓷管实现。
虽然这样的控制器已经可以商品化了,但是我们想自己尝试做一个。
在网上看了些资料,感觉也不是很难,只要想做,花些时间应该可以实现。
先转一篇网上的文章,以后随时更新进展。
51单片机控制四相步进电机作者:易劲松QQ:371719025 Email:yijingsong@接触单片机快两年了,不过只是非常业余的兴趣,实践却不多,到现在还算是个初学者吧。
这几天给自己的任务就是搞定步进电机的单片机控制。
以前曾看过有关步进电机原理和控制的资料,毕竟自己没有做过,对其具体原理还不是很清楚。
今天从淘宝网买了一个EPSON的UMX-1型步进电机,此步进电机为双极性四相,接线共有六根,外形如下图所示:拿到步进电机,根据以前看书对四相步进电机的了解,我对它进行了初步的测试,就是将5伏电源的正端接上最边上两根褐色的线,然后用5伏电源的地线分别和另外四根线(红、兰、白、橙)依次接触,发现每接触一下,步进电机便转动一个角度,来回五次,电机刚好转一圈,说明此步进电机的步进角度为360/(4×5)=18度。
地线与四线接触的顺序相反,电机的转向也相反。
如果用单片机来控制此步进电机,则只需分别依次给四线一定时间的脉冲电流,电机便可连续转动起来。
通过改变脉冲电流的时间间隔,就可以实现对转速的控制;通过改变给四线脉冲电流的顺序,则可实现对转向的控制。
所以,设计了如下电路图:制作的实物图如下:C51程序代码为:代码一#include <AT89X51.h>static unsigned int count; static unsigned int endcount;void delay();void main(void){count = 0;P1_0 = 0;P1_1 = 0;P1_2 = 0;P1_3 = 0;EA = 1; //允许CPU中断TMOD = 0x11; //设定时器0和1为16位模式1 ET0 = 1; //定时器0中断允许TH0 = 0xFC;TL0 = 0x18; //设定时每隔1ms中断一次 TR0 = 1; //开始计数startrun:P1_3 = 0;P1_0 = 1;delay();P1_0 = 0;P1_1 = 1;delay();P1_1 = 0;P1_2 = 1;delay();P1_2 = 0;P1_3 = 1;delay();goto startrun;}//定时器0中断处理void timeint(void) interrupt 1{TH0=0xFC;TL0=0x18; //设定时每隔1ms中断一次count++;}void delay(){endcount=2;count=0;do{}while(count<endcount);}将上面的程序编译,用ISP下载线下载至单片机运行,步进电机便转动起来了,初步告捷!不过,上面的程序还只是实现了步进电机的初步控制,速度和方向的控制还不够灵活,另外,由于没有利用步进电机内线圈之间的“中间状态”,步进电机的步进角度为18度。
自动升降搬运机电子部分摘要:本设计采用一块AT89S52单片机对三个四相步进电机进行控制,使步进电机在安全温度内按输入的步数和转动的方向进行运行。
控制电机转动的方法采用四相八拍控制法。
本设计采用独立按键实现步进电机不同转动步数的输入以及转向的控制,还有用按键实现锁定和开锁的作用。
用ITR9608测速模块作为光电开关,实现极限停机的功能。
引言随着数字化技术发展,数字控制技术得到了广泛而深入的应用。
步进电机是一种将数字信号直接转换成角位移或线位移的控制驱动元件, 具有快速起动和停止的特点。
因为步进电动机组成的控制系统结构简单,价格低廉,性能上能满足工业控制的基本要求,所以广泛地应用于手工业自动控制、数控机床、组合机床、机器人、计算机外围设备、照相机,投影仪、数码摄像机、大型望远镜、卫星天线定位系统、医疗器件以及各种可控机械工具等等。
设计内容:采用单片机控制三个四相八拍的步进电机工作。
制作的自动升降搬运机。
要实现的功能:一、控制步进电机的正反转来实现自动升降搬运机的连续上升和下降,由独立按键输入信号控制。
二、控制自动升降搬运机的定点上升,定点下降。
三、控制自动神将搬运机在上升和下降过程中随时可以加速和减速。
四、自动升降搬运机上升(电机正转)到极限位置时自动停止上升,同样下降(电机反转)到极限位置时自动停止下降。
说明:自动停止是采用ITR9608测速模块作为对光开关,正常运行时开关处于开状态,当上升或下降到极限位置时光电开关立马处于关状态,就立刻停止上升或下降,如果是上升到极限位置时再按上升按钮或定点上升按钮则不能再启动上升,如果是下降到极限位置时再按下降按钮或定点下降按钮则不能再启动下降。
五、用一个步进电机控制上面的机械手来实现搬运过程,控制步进电机的正反转来实现机械手的前移和后移还有停止。
单片机控制电路系统框图程序编写//////////步进电机控制#include <reg51.h> //51芯片管脚定义头文件#include <intrins.h> //内部包含延时函数_nop_(); #define uchar unsigned char#define uint unsignedint///////////下面电机控制sbit K1 = P3^2; //正转sbit K2 = P3^3; //反转sbit K3 = P3^4; //停止sbit K4 = P3^5; //减速sbit K5 = P1^4; //加速sbit K6 = P1^5; //定点上升或下降sbit K7 = P1^6; //定点上升或下降sbit BEEP = P3^6; //蜂鸣器//////////上面电机控制sbit K8 = P3^0; //正转sbit K9 = P3^1; //反转sbit K10 = P3^7; //停止//////////光电模块//////////////////sbit E0=P0^0;//A0使能端sbit D0=P0^1;//00被遮置高电平sbit E1=P0^2;//A0使能端sbit D1=P0^3;//00被遮置高电平////////第一个电机///////////sbit p13=P1^3;sbit p12=P1^2;sbit p11=P1^1;sbit p10=P1^0;////////第二个电机///////////sbit p23=P2^3;sbit p22=P2^2;sbit p21=P2^1;sbit p20=P2^0;////////第三个电机///////////sbit p24=P2^4;//EN 下降沿sbit p25=P2^5;//DIR 正反转sbit p26=P2^6;//pul下降沿sbit p27=P2^7;bit p=0;//0倒转,1正转uint h=0,t=125,N=100;/************************************************** ******//*/* 延时t毫秒/* 11.0592MHz时钟,延时约1ms/*/************************************************** ******/void delay(uint t)//t为125转一圈{uint k;for(k=0; k<t; k++){ }}/************************************************** ********/voiddelayB(uchar x) //x*0.14MS{uchari;while(x--){for (i=0; i<13; i++){ }}}/************************************************** ********/void beep(){uchari;for (i=0;i<100;i++){delayB(4);BEEP=!BEEP; //BEEP取反}BEEP=1; //关闭蜂鸣器}void shangmiandianji(uint N)//上面步进电机正倒转,停止控制{uchar r;uint k;for(k=0;k<N;k++)//转N圈for(r=0;r<200;r++)//转1圈{p24=1;delay(40);p25=p;//0倒转,1正转p24=0;p26=0;delay(90);if(K10==0)//停止按键{beep();p24=1;p26=1;k=N;break;} //退出此循环程序}}void motor_rev(uint N)//步进电机正倒转,加速减速停止{uchar r;uint k;for(k=0;k<N;k++)//转N圈for(r=0;r<200;r++)//转1圈{p13=1;//低脉冲触发p12=p;//0倒转,1正转p10=1;p23=1;//低脉冲触发p22=p;//0倒转,1正转delay(t);//调节转速,T为125转一圈//delayB(h);p13=0;p23=0;//下降沿触发if(K3==0)//停止按键{beep();p10=0;p20=0;k=N;break;} //退出此循环程序if(D0==1||D1==1)//光电停止,使能关{beep();p10=0;p20=0;k=N;break;} //退出此循环程序if(K4==0)//减速{t++;t++;}if(K5==0)//加速{t--;t--;}}}void dingdian(uint N)//步进电机定点{uchar r;uint k;for(k=0;k<N;k++)//转N圈for(r=0;r<200;r++)//转1圈{p13=1;//低脉冲触发p12=p;//0倒转,1正转p10=1;p23=1;//低脉冲触发p22=p;//0倒转,1正转p20=1;delay(125);//调节转速,T为125转一圈//delayB(h);p13=0;p23=0;//下降沿触发if(K3==0)//停止按键{beep();p10=0;p20=0;k=N;break;} //退出此循环程序if(D0==1||D1==1)//光电停止,使能关{beep();p10=0;p20=0;k=N;break;} //退出此循环程序}}/************************************************** ******** 主程序**************************************************** ******/main(){E0=1;E1=1;//光电使能开while(1){if(K1==0){beep();p=0;//0倒转,1正转while(D1){motor_rev(3);}motor_rev(10000);//转N圈,加速,减速}else if(K2==0){beep();p=1;//0倒转,1正转while(D0){motor_rev(3);}motor_rev(10000);//转N圈,加速,减速}else if(K6==0)//上升,下降{beep();p=1;//0倒转,1正转while(D0){motor_rev(3);}dingdian(10);//转N圈}else if(K7==0)//上升,下降{beep();p=0;//0倒转,1正转while(D1){motor_rev(3);}dingdian(10);//转N圈}//************上面电机控制**************//else if(K8==0)//上升,下降{beep();p=0;//0倒转,1正转shangmiandianji(10000);//转N圈}else if(K9==0)//上升,下降{beep();p=1;//0倒转,1正转shangmiandianji(10000);//转N圈}}}/********************************************************/总结步进电机的控制可以用硬件,也可以用软件通过单片机实现。
基于51单片机的步进电机直线插补目录第1章概述............................................................................................. 错误!未定义书签。
第2章设计内容的介绍.. (2)2.1步进电机原理 (2)2.2步进电机的选择 (4)2.3直线插补原理 (5)2.4设计目标 (7)第3章设计思路具体内容 (7)3.1设计思路 (7)3.2单片机及其最小系统 (7)3.3 按键电路 (8)3.4 步进电机驱动电路 (9)3.5液晶显示 (9)第四章程序设计 (11)第五章总结 ............................................................................................ 错误!未定义书签。
参考文献 . (12)附录 (13)摘要本设计为基于51单片机,利用两个四相八拍步进电机,实现四个象限中直线插补的过程。
其中一个电机正反转实现X正负方向的插补,另一个电机正反转代表Y轴正负方向插补。
并对该插补算法的原理及其实现过程进行了阐述,通过按键启动插补过程,插补结束后电机自动停止。
通过LCD1602液晶实现插补过程中插补方向的显示,最终完成了步进电机的插补过程。
关键词步进电机直线插补液晶显示第1章概述数字控制是近代发展起来的一种自动控制技术,利用数字化信号对机床及其加工过程进行自动控制,主要用于数控机床、线切割机、焊接机、气割机以及低速小型数字绘图仪等。
数控机床可以加工形状复杂的零件,具有加工精度高、生产效率高、便于改变加工零件品种等众多优点,是实现机床自动化的一个重要发展方向。
逐点比较法是数控机床在加工曲线时常用的一种方法,是常用的脉冲增量插补方法。
它是以阶梯折线来逼近直线或圆弧等曲线,与规定的加工直线或圆弧之间的最大误差为一个脉冲当量,当脉冲当量足够小时,就可以达到相当高的加工精度。
#include <reg51.h> //51芯片管脚定义头文件
#include <intrins.h> //内部包含延时函数_nop_();
#define uchar unsigned char
#define uint unsigned int
uchar code FFW[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //四相八拍正转编码
uchar code REV[8]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01}; ////四相八拍反转编码
sbit K1 = P3^2; //正转
sbit K2 = P3^3; //反转
sbit K3 = P3^4; //停止
sbit BEEP = P3^6; //蜂鸣器
/********************************************************/
/*
/* 延时t毫秒
/* 11.0592MHz时钟,延时约1ms
/*
/********************************************************/
void delay(uint t)
{
uint k;
while(t--)
{
for(k=0; k<125; k++)
{ }
}
}
/**********************************************************/
void delayB(uchar x) //x*0.14MS
{
uchar i;
while(x--)
{
for (i=0; i<13; i++)
{ }
}
}
/**********************************************************/ void beep()
{
uchar i;
for (i=0;i<100;i++)
{
delayB(4);
BEEP=!BEEP; //BEEP取反
}
BEEP=1; //关闭蜂鸣器
}
/********************************************************/ /*
/*步进电机正转
/*
/********************************************************/ void motor_ffw()
{
uchar i;
uint j;
for (j=0; j<8; j++) //转1*n圈
{
if(K3==0)
{break;} //退出此循环程序
for (i=0; i<8; i++) //一个周期转45度
{
P1 = FFW[i]; //取数据
delay(2); //调节转速
}
}
}
/********************************************************/ /*
/*步进电机反转
/*
/********************************************************/
void motor_rev()
{
uchar i;
uint j;
for (j=0; j<8; j++) //转1×n圈
{
if(K3==0)
{break;} //退出此循环程序
for (i=0; i<8; i++) //一个周期转45度
{
P1 = REV[i]; //取数据
delay(2); //调节转速
}
}
}
/********************************************************
*
* 主程序
*
*********************************************************/
main()
{
uchar r,N=64; //N 步进电机运转圈数while(1)
{
if(K1==0)
{
beep();
for(r=0;r<N;r++)
{
motor_ffw(); //电机正转
if(K3==0)
{beep();break;} //退出此循环程序
}
}
else if(K2==0)
{
beep();
for(r=0;r<N;r++)
{
motor_rev(); //电机反转
if(K3==0)
{beep();break;} //退出此循环程序
}
}
else
P1 = 0xf0;
}
}
/********************************************************/。