⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 key.c

📁 步进电机控制 设计硬件电路和单片机程序
💻 C
字号:
#include<math.H>
#define resetB 0xf2  //返回零度标志
#define enterB 0xf1  //确定标志
#define shiftB 0xe3  //切换标志
#define baiB   0xb3  //百位标志
#define shiB   0xd3  //十位标志
#define geB    0x73  //个位标志

#define speed0 {TR0=0;}  //停止
#define speed1 {TH0=0x02;TL0=0x18;}  //一档,定时为65ms,最慢
#define speed2 {TH0=0x3c;TL0=0xb0;}  //二档,定时为50ms,很慢
#define speed3 {TH0=0x63;TL0=0xc0;}  //三档,定时为40ms,较慢
#define speed4 {TH0=0x8a;TL0=0xd0;}  //四档,定时为30ms,中等
#define speed5 {TH0=0xd8;TL0=0xf0;}  //五档,定时为10ms,很快
#define speed6 {TH0=0xec;TL0=0x78;}  //六档,定时为5ms,较快
#define speed7 {TH0=0xfc;TL0=0x18;}  //七档,定时为1ms,最快

uchar reset=0;
uchar enter=0;
uchar shift=0;  //shift=0正向,shift=1反向.shift=2速度
uchar baiwei=0;
uchar shiwei=0;
uchar gewei_s=4;
uchar gewei_a=0;

uint dis=0;
uint tmp_angle=0;
uint angle0=0,angle=0;//输入向量角
int delta1=0,delta2=0;//角度变化量,delta1为变化量,delta2为其360-delta1
uint final_angle=0;   //实际要转的角度
uint run_step=0;
uchar v=4;
bit derect=0;         //方向位
bit alwaysgo=0;
uint miss_step=0;

#define KPort P3

void KeyDelay(void)
{unsigned char i=10,j=10;
 while(i--)
      while(j--);
}
void speed(uchar vin)
{
 if(vin==0)speed0;
 if(vin==1)speed1;
 if(vin==2)speed2;
 if(vin==3)speed3;
 if(vin==4)speed4;
 if(vin==5)speed5;
 if(vin==6)speed6;
 if(vin==7)speed7;
}
void run(void)
{
if(angle>360)
  {
  if(shift==1)derect=1;            //显示负号是反转
  if(shift==0)derect=0;            //正转
  alwaysgo=1;
  TR0=1;
  }                                //按设定的速度无角度的旋转
else
  {
  alwaysgo=0;
  delta1=angle-angle0;         
   delta2=360-abs(angle-angle0);
   angle0=angle;                   //重新设定初值
   if(delta1!=0&&delta1!=360)      //如果设定的角度不为当前角度,则执行一下语句
      {
	   if(abs(delta1)<=abs(delta2))//若delta1较小,则以delta1为标准角转动
	      {if(delta1>0){final_angle=delta1;derect=0;TR0=1;}           //正转delta1度
		   else        {final_angle=-delta1;derect=1;TR0=1;}          //反转delta1度
		  }
	   else                        //若delta2较小,则以delta2为标准角转动
	      {if(delta2>0){final_angle=delta2;derect=1;TR0=1;}           //反转delta2度
		   else        {final_angle=-delta2;derect=0;TR0=1;}           //正转delta2度
		  }
		}
	else final_angle=0;
   }
run_step=final_angle*10/9; //步进电机每步走0.9度,要走x度角,则应走x*10/9步
}
void KeyScan(void)
{
 unsigned char temp=0;
 KPort=0xff;
 temp=KPort&0xf3;
 if(temp!=0xf3)
   {
    KeyDelay();
    KPort=0xff;
    temp=KPort&0xf3;
      if(temp!=0xf3)
       {
       KPort=0xff;
	   temp=KPort&0xf3;
       }
        switch(temp)
        {
         case resetB:reset=1;angle0=angle0+miss_step*9/10;miss_step=0;angle=0;run();break;
         case enterB:reset=0;
		            if(shift==0||shift==1){angle=tmp_angle;run();}
					else                  {v=gewei_s;speed(v);}
					break;
         case shiftB:shift++ ;if(shift>2)shift=0  ;reset=0;break;
         case baiB  :if(shift!=2)baiwei++;if(baiwei>4)baiwei=0;reset=0;break;
         case shiB  :if(shift!=2)shiwei++;if(shiwei>9)shiwei=0;reset=0;break;
         case geB   :
					if(shift==2)            //为速度调节时            
					  {gewei_s++;if(gewei_s>7) gewei_s=0;}
					else                    //为角度调节时
					  {gewei_a++;if(gewei_a>9) gewei_a=0;}
					reset=0;
					break;
	     default:reset=0;break;
   }
  }
  if(shift==2)
     dis=gewei_s;
  else 
     {if(reset==1){baiwei=0;shiwei=0;gewei_a=0;dis=0;}
	  else 
      dis=baiwei*100+shiwei*10+gewei_a;
      tmp_angle=dis;
	 }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -