步进电机的的控制以及数码管显示档位和转速.docx
《步进电机的的控制以及数码管显示档位和转速.docx》由会员分享,可在线阅读,更多相关《步进电机的的控制以及数码管显示档位和转速.docx(12页珍藏版)》请在冰点文库上搜索。
![步进电机的的控制以及数码管显示档位和转速.docx](https://file1.bingdoc.com/fileroot1/2023-4/30/88e8b82b-f330-4334-a11b-2044d7eb168a/88e8b82b-f330-4334-a11b-2044d7eb168a1.gif)
步进电机的的控制以及数码管显示档位和转速
//**********本例程主要实现步进电机的的控制以及数码管显示档位和转速**********
//****************S6档位调节S7暂停并且查看转速S8正转S9逆转**********
//*********************数码管第一位显示档位后四位显示转速**********
//*******************发现的问题:
由于数码管显示的延时过多,如果让数码管同步显示转速,会出现一闪一闪的现象。
我将会考虑用中断定时解决这个问题。
#include
typedefunsignedcharuchar;
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.49rpm
uchartemp,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;x>0;x--)
for(y=110;y>0;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;i<8;i++)//一轮通电
{
P1=table0[i];
delay(grade);//通过延时改变速度
}
}
while(!
clockwise&startstop)//反转
{
keyscan();
for(r=0;r<8;r++)
{
P1=table1[r];
delay(grade);
}
}
}
//***********************主函数**************************
voidmain()
{
while
(1)
{
keyscan();//如果单单是这里加键盘扫描,当进入电机运转程序后,会进入while的死循环段,将无法进行键盘扫描
stepmotor();
display();//实时显示速度
}
}