基于单片机的步进电机控制程序(有没有玩过这块的大神,帮帮我这个菜鸟)
时间:10-02
整理:3721RD
点击:
这里只粘贴了部分代码,但是基本上能看出作用。这个代码的作用是根据定义的四个独立按键来控制电机的正转,反转,加速和减速。现在我做的比较简单(因为是新手,还在逐渐摸索中)。我采用的定时中断对键盘进行实时扫描,但是出现了一个问题,按下一个键,比如K1的时候,如果不放的话程序就会停止运行,这就意味着电机在这个时候不会转。哪位大神帮我看看,这个问题怎么解决?
/*****************独立键盘按键扫描函数**********************/
void Key_Selfscan()
{
if(K1==0) //检测按键K1是否按下
{
Delay(2); //消除抖动
if(K1==0)
{
Direction = 1; //正转方向标识
}
while((i<50)&&(K1==0)) //检测按键是否松开
{
Delay(2);
i++;
}
i=0;
}
if(K2==0) //检测按键K2是否按下
{
Delay(2);
if(K2==0)
{
Direction = 2; //反转方向标识
}
while((i<50)&&(K2==0))
{
Delay(2);
i++;
}
i=0;
}
if(K3==0) //检测按键K3是否按下
{
Delay(2);
if(K3==0)
{
Speed = Speed+2; //加速
}
while((i<50)&&(K3==0))
{
Delay(2);
i++;
}
i=0;
}
if(K4==0) //检测按键K4是否按下
{
Delay(2);
if(K4==0)
{
Speed = Speed-2; //减速
}
while((i<50)&&(K4==0))
{
Delay(2);
i++;
}
i=0;
}
}
/*******************电机旋转函数****************/
void Motor_Whirl()
{ for(i=0;i<4;i++)
{ if(Direction==1)
{Motor = Double_pos[i]; //取正转链表
if(Direction==2)
{ Motor = Double_rev[i]; //取反转链表}
Delay(Speed); //调节转速
} }
/******************定时中断****************/
void Timer_Configuration()
{ TMOD = 0x01;//选择工作方式1
TH0 = 0x3c; //设置初始值,定时50ms
TL0 = 0xb0;
EA =1; //打开总中断
ET0 = 1; //打开定时器0中断
TR0 = 1;//启动定时器0
}
void Timer0() interrupt 1
{ TH0 = 0x3c;
TL0 = 0xb0;
Key_Selfscan();
}
/***************主函数********************/
void main(void)
{ Speed=100;
P2=0xf0; //电机端口初始化
Timer_Configuration();
while(1)
{
Motor_Whirl();
}
}
/*****************独立键盘按键扫描函数**********************/
void Key_Selfscan()
{
if(K1==0) //检测按键K1是否按下
{
Delay(2); //消除抖动
if(K1==0)
{
Direction = 1; //正转方向标识
}
while((i<50)&&(K1==0)) //检测按键是否松开
{
Delay(2);
i++;
}
i=0;
}
if(K2==0) //检测按键K2是否按下
{
Delay(2);
if(K2==0)
{
Direction = 2; //反转方向标识
}
while((i<50)&&(K2==0))
{
Delay(2);
i++;
}
i=0;
}
if(K3==0) //检测按键K3是否按下
{
Delay(2);
if(K3==0)
{
Speed = Speed+2; //加速
}
while((i<50)&&(K3==0))
{
Delay(2);
i++;
}
i=0;
}
if(K4==0) //检测按键K4是否按下
{
Delay(2);
if(K4==0)
{
Speed = Speed-2; //减速
}
while((i<50)&&(K4==0))
{
Delay(2);
i++;
}
i=0;
}
}
/*******************电机旋转函数****************/
void Motor_Whirl()
{ for(i=0;i<4;i++)
{ if(Direction==1)
{Motor = Double_pos[i]; //取正转链表
if(Direction==2)
{ Motor = Double_rev[i]; //取反转链表}
Delay(Speed); //调节转速
} }
/******************定时中断****************/
void Timer_Configuration()
{ TMOD = 0x01;//选择工作方式1
TH0 = 0x3c; //设置初始值,定时50ms
TL0 = 0xb0;
EA =1; //打开总中断
ET0 = 1; //打开定时器0中断
TR0 = 1;//启动定时器0
}
void Timer0() interrupt 1
{ TH0 = 0x3c;
TL0 = 0xb0;
Key_Selfscan();
}
/***************主函数********************/
void main(void)
{ Speed=100;
P2=0xf0; //电机端口初始化
Timer_Configuration();
while(1)
{
Motor_Whirl();
}
}
问题出在while()上,它的意思就是判断你是否释放按键,也就是你没释放按键将停留在此处。几个办法,第一,把你电机的驱动程序写进中断里,优先级最高高于按键的定时器中断。第二,就是去掉while(),但是前面的延时加稍微长一点点。第三,去掉while,增加释放按键消抖。
改成!K1试试。
你这个是 按键松手 的问题,可以看看其他大神 怎么写的按键 扫描程序!
while(K1==0);
谢谢啊,问题就是出在while()上,取消掉while之后,就没出现这个问题了
今天也遇到这个问题了,谢谢小编
mark
学习中,望一起
对对对