您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 酒店餐饮 > 步进电机的的控制以及数码管显示档位和转速
//**********本例程主要实现步进电机的的控制以及数码管显示档位和转速**********//****************S6档位调节S7暂停并且查看转速S8正转S9逆转**********//*********************数码管第一位显示档位后四位显示转速**********//*******************发现的问题:由于数码管显示的延时过多,如果让数码管同步显示转速,会出现一闪一闪的现象。我将会考虑用中断定时解决这个问题。#includereg52.htypedefunsignedcharuchar;typedefunsignedintuint;#definet5#defineone2//这里只是用了简单的延时函数,一般用中断比较准确//************根据延时算转速:本电机的的步距角为5.625度,减速比为64,设定为ONE时,算出转速:延时为2ms,即2ms/脉冲//************所以60000ms/30000个脉冲即1分钟/30000个脉冲,由于一个脉冲一个步距角,即1分钟/30000*5.625度=168780度//**************即1分钟/168780/360圈,所以468.83圈/分钟(内部),所以(外部)真正看到转速应为468.83/64圈=7.32圈/分钟#definetwo5//计算得转速为2.93rpm#definethree10//计算得转速为1.46rpm#definefour30//计算得转速为0.49rpmuchartemp,num,grade=5;//设定档bitclockwise=1;//设定顺时针bitstartstop=0;//设定停止位sbitdula=P2^6;sbitwela=P2^7;unsignedcharcodetable0[]={0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08};//正转表unsignedcharcodetable1[]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09};//反转表ucharcodetable2[]={0x06,0x07,0x80,0x4f,0x5b};//一档ucharcodetable3[]={0x5b,0x5b,0x80,0x6f,0x4f};//二档ucharcodetable4[]={0x4f,0x06,0x80,0x66,0x7d};//三档ucharcodetable5[]={0x66,0x3f,0x80,0x66,0x6f};//四档//******************延时函数MS**************************voiddelay(unsignedcharz){unsignedintx,y;for(x=z;x0;x--)for(y=110;y0;y--);}//******************数码管显示**************************voiddisplay(){if(grade==2)//一档{dula=1;P0=table2[0];dula=0;P0=0xfe;wela=1;delay(5);P0=0xff;wela=0;dula=1;P0=table2[1];dula=0;P0=0xfb;wela=1;delay(5);P0=0xff;wela=0;dula=1;P0=table2[2];dula=0;P0=0xf7;wela=1;delay(5);P0=0xff;wela=0;dula=1;P0=table2[3];dula=0;P0=0xef;wela=1;delay(5);P0=0xff;wela=0;dula=1;P0=table2[4];dula=0;P0=0xdf;wela=1;delay(5);P0=0xff;wela=0;}if(grade==5)//二档{dula=1;P0=table3[0];dula=0;P0=0xfe;wela=1;delay(5);P0=0xff;wela=0;dula=1;P0=table3[1];dula=0;P0=0xfb;wela=1;delay(5);P0=0xff;wela=0;dula=1;P0=table3[2];dula=0;P0=0xf7;wela=1;delay(5);P0=0xff;wela=0;dula=1;P0=table3[3];dula=0;P0=0xef;wela=1;delay(5);P0=0xff;wela=0;dula=1;P0=table3[4];dula=0;P0=0xdf;wela=1;delay(5);P0=0xff;wela=0;}if(grade==10)//三档{dula=1;P0=table4[0];dula=0;P0=0xfe;wela=1;delay(5);P0=0xff;wela=0;dula=1;P0=table4[1];dula=0;P0=0xfb;wela=1;delay(5);P0=0xff;wela=0;dula=1;P0=table4[2];dula=0;P0=0xf7;wela=1;delay(5);P0=0xff;wela=0;dula=1;P0=table4[3];dula=0;P0=0xef;wela=1;delay(5);P0=0xff;wela=0;dula=1;P0=table4[4];dula=0;P0=0xdf;wela=1;delay(5);P0=0xff;wela=0;}if(grade==30)//四档{dula=1;P0=table5[0];dula=0;P0=0xfe;wela=1;delay(5);P0=0xff;wela=0;dula=1;P0=table5[1];dula=0;P0=0xfb;wela=1;delay(5);P0=0xff;wela=0;dula=1;P0=table5[2];dula=0;P0=0xf7;wela=1;delay(5);P0=0xff;wela=0;dula=1;P0=table5[3];dula=0;P0=0xef;wela=1;delay(5);P0=0xff;wela=0;dula=1;P0=table5[4];dula=0;P0=0xdf;wela=1;delay(5);P0=0xff;wela=0;}}//*****************键盘扫描**************************voidkeyscan(){P3=0xfe;//扫描第一行temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(t);temp=P3;temp=temp&0xf0;if(temp!=0xf0){temp=P3;switch(temp){case0xee://调节档速num++;if(num==1)grade=one;if(num==2)grade=two;if(num==3)grade=three;if(num==4){grade=four;num=0;}break;case0xde:startstop=0;break;//停止case0xbe:clockwise=1;startstop=1;break;//正转case0x7e:clockwise=0;startstop=1;break;//逆转}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}}//***********************电机运转方式*****************voidstepmotor(){chari,r;while(clockwise&startstop)//正转{keyscan();for(i=0;i8;i++)//一轮通电{P1=table0[i];delay(grade);//通过延时改变速度}}while(!clockwise&startstop)//反转{keyscan();for(r=0;r8;r++){P1=table1[r];delay(grade);}}}//***********************主函数**************************voidmain(){while(1){keyscan();//如果单单是这里加键盘扫描,当进入电机运转程序后,会进入while的死循环段,将无法进行键盘扫描stepmotor();display();//实时显示速度}}
本文标题:步进电机的的控制以及数码管显示档位和转速
链接地址:https://www.777doc.com/doc-5488342 .html