一、项目概述:用步进电机作为X-Y移动平台的执行机构,实现开环位置控制。采用四相步进电机,一相激励时步距角为1.8°,由步进电机驱动器接受控制器的控制信号,采用单四拍方式,每拍为一步,可正反转。步进电机的转动带动丝杆,将旋转运动转换为直线运动,步进电机的每一走步传递到X或Y方向的移动距离为0.02mm.系统中步进电机工作频率为500Hz--4KHz。运动要求是:(1)当按键K1按下时,X方向步进电机正向运转,X正向移动1mm;当按键K2按下时,X方向步进电机反向运转,X反向移动1mm;当按键K3按下时,Y方向步进电机正向运转,Y正向移动1mm;当按键K4按下时,Y方向步进电机反向运转,Y反向移动1mm;(2)按键按住不放,连续运动直到按键释放,停止运转。(3)控制器实时显示步进电机转过的步数和X或Y向移动的距离。(4)系统供电电源为36VDC。二、系统设计:设计思想:1、用两台步进电机分别控制x、y方向的运动;2、采用动态显示方式,实时显示步数和距离;3、采用4个并行口输出控制信号以及采集开关输入信号。总体方案:采用AT89C51作为控制器:P0口读入开关输入信号;P1口接步进电机驱动器ULN2003A;P2、P3口控制动态显示电路。三、硬件设计:1、AT89C51晶振电路和手动复位电路:晶振电路:采用12MHz的晶振,其中电容C1,C2可在5—60pF之间选择,这两个电容的大小对振荡频率有微小的影响,可起频率微调的作用。复位电路:当按键弹起时,相当于一个上电复位电路;当按键压下时,相当于RST端通过电阻与+5V的电源相连,提供足够宽度的阈值电压完成复位。2、开关量读入:由P0口的低4位读入开关量信号。3、步进电机控制电路:其中ULN2003A为步进电机驱动器,两台步进电机分别由P1口的低4位和高4位控制,并分别带动x,y方向的运动。ULN2003A:输入高时,输出为低,COM端与步进电机中间两根线一起接高电平。四相步进电机:采用单四拍方式通电,除去中间两根线,分别给每一相定子通电,磁场力带动转子转动。从左上开始顺时针通电为正转;逆时针为反转。4、动态显示电路:左边LED显示距离,右边显示步数。P2口低4位输出压缩型BCD码:当步数为i时,用以下程序分别求出千位、百位、十位和个位。并用TAB表转化为压缩型BCD码。unsignedcharTAB[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};i1=i/1000;千位i2=(i%1000)/100;百位i3=((i%1000)%100)/10;十位i4=((i%1000)%100)%10;个位i5=(i*2)/1000;距离的十位(mm)i6=((i*2)%1000)/100;距离的个位i7=(((i*2)%1000)%100)/10;距离的小数点后一位i8=(((i*2)%1000)%100)%10;距离的小数点后两位分别选通P2.4—P2.7,输出i1,i2,i3,i4;分别选通P3.0—P3.3,输出i5,i6,i7,i8;当显示左边LED第二根管时,使P3.4为低,显示小数点。4511:输入为压缩型BCD码,输出为对应LED显示码。5、总电路图:四、软件设计:#includereg51.h1、变量定义:sbitk1=P0^0;//开关输入sbitk2=P0^1;sbitk3=P0^2;sbitk4=P0^3;unsignedcharxzz[]={0xfe,0xfd,0xfb,0xf7};//x方向正转控制字unsignedcharxfz[]={0xfb,0xfd,0xfe,0xf7};//x方向反转控制字unsignedcharyzz[]={0xef,0xdf,0xbf,0x7f};//y方向正转控制字unsignedcharyfz[]={0xbf,0xdf,0xef,0x7f};//y方向反转控制字unsignedcharTAB[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};//将一位数转化为压缩型BCD码unsignedintbushu;//步数2、延时子程序;voidDelayMs(unsignedintn)//毫秒级延时子程序{unsignedinti=0,j=0;for(i=0;in;i++)for(j=0;j123;j++);}3、实时显示子程序:采集步数——运算出步数的千、百、十、个位以及距离的各个位数——置循环初值j=0——选通P2.4为低电平,输出i1的压缩型BCD码,延时5ms——选通P2.5为低电平,输出i2的压缩型BCD码,延时5ms——选通P2.6为低电平,输出i3的压缩型BCD码,延时5ms——选通P2.7为低电平,输出千位的压缩型BCD码,延时5ms——选通P3.0为低电平,输出i5的压缩型BCD码,延时5ms——选通P3.1为低电平,输出i6的压缩型BCD码,延时5ms——选通P3.2为低电平,输出i7的压缩型BCD码,延时5ms——选通P3.8为低电平,输出i8的压缩型BCD码,延时5ms——判断j是否小于等于5,不是则完成循环。voidDisplayss(unsignedinti)//实时显示子程序{unsignedinti1,i2,i3,i4,j,i5,i6,i7,i8;i1=i/1000;i2=(i%1000)/100;i3=((i%1000)%100)/10;i4=((i%1000)%100)%10;i5=(i*2)/1000;i6=((i*2)%1000)/100;i7=(((i*2)%1000)%100)/10;i8=(((i*2)%1000)%100)%10;for(j=0;j=5;j++){P3=0xff;P2=0xe0;P2=P2|TAB[i1];DelayMs(5);P3=0xff;P2=0xd0;P2=P2|TAB[i2];DelayMs(5);P3=0xff;P2=0xb0;P2=P2|TAB[i3];DelayMs(5);P3=0xff;P2=0x70;P2=P2|TAB[i4];DelayMs(5);P3=0xee;P2=0xf0;P2=P2|TAB[i5];DelayMs(5);P3=0xfd;P2=0xf0;P2=P2|TAB[i6];DelayMs(5);P3=0xeb;P2=0xf0;P2=P2|TAB[i7];DelayMs(5);P3=0xe7;P2=0xf0;P2=P2|TAB[i8];DelayMs(5);}}4、稳定显示子程序:将实时显示的循环改为死循环,当再次按下开关则跳出。voidDisplay(unsignedinti)//稳定显示子程序{unsignedinti1,i2,i3,i4,i5,i6,i7,i8;i1=i/1000;i2=(i%1000)/100;i3=((i%1000)%100)/10;i4=((i%1000)%100)%10;i5=(i*2)/1000;i6=((i*2)%1000)/100;i7=(((i*2)%1000)%100)/10;i8=(((i*2)%1000)%100)%10;while(1){P3=0xff;P2=0xe0;P2=P2|TAB[i1];DelayMs(5);P3=0xff;P2=0xd0;P2=P2|TAB[i2];DelayMs(5);P3=0xff;P2=0xb0;P2=P2|TAB[i3];DelayMs(5);P3=0xff;P2=0x70;P2=P2|TAB[i4];DelayMs(5);P3=0xee;P2=0xf0;P2=P2|TAB[i5];DelayMs(5);P3=0xfd;P2=0xf0;P2=P2|TAB[i6];DelayMs(5);P3=0xeb;P2=0xf0;P2=P2|TAB[i7];DelayMs(5);P3=0xe7;P2=0xf0;P2=P2|TAB[i8];DelayMs(5);if(k1==0)break;if(k2==0)break;if(k3==0)break;if(k4==0)break;}}5、x、y方向正反转子程序:置初始步数为0,当有按键按下则触发相应运转子程序。步数小于50则继续运行到50步(1mm);若按住按键不放,电机继续运转直到按键释放。以x方向正转为例:置初始步数为0——判断k1是否为0(按下为0)或步数是否小于50否跳出循环,结束子程序是将正转控制子送入P1口——步数+1——实时显示——延时10msvoidxzhengzhuan()//x方向正转子程序{bushu=0;while(k1==0||bushu50){P1=xzz[bushu%4];bushu++;Displayss(bushu);DelayMs(10);}}voidxfanzhuan()//x方向反转子程序{bushu=0;while(k2==0||bushu50){P1=xfz[bushu%4];bushu++;Displayss(bushu);DelayMs(10);}}voidyzhengzhuan()//y方向正转子程序{bushu=0;while(k3==0||bushu50){P1=yzz[bushu%4];bushu++;Displayss(bushu);DelayMs(10);}}voidyfanzhuan()//y方向反转子程序{bushu=0;while(k4==0||bushu50){P1=yfz[bushu%4];bushu++;Displayss(bushu);DelayMs(10);}}6、主程序:置初值bushu=0,P2=0xf0,P3=0xff否判断k1是否为0是执行xzhengzhuan子程序否判断k2是否为0是执行xfanzhuan子程序否判断k3是否为0是执行yzhengzhuan子程序否判断k4是否为0是执行yfanzhuan子程序判断步数是否不为0是执行Display子程序(稳定显示)voidmain()//主函数{bushu=0;P3=0xff;P2=0xf0;if(k1==0)xzhengzhuan();if(k2==0)xfanzhuan();if(k3==0)yzhengzhuan();if(k4==0)yfanzhuan();if(bushu!=0)Display(bushu);}五、系统仿真及调试:一旦有开关按下则连续走50步;按住按键不放,持续运转到按键释放。六、总结通过这次课程设计使我更加熟悉了C51程序的编写,单片机并行口的运用以及动态显示电路的组成和显示原理。同时学习了步进电机的结构和工作原理。单片机课程设计