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

📄 new_zong.c

📁 本程序为单片机对四相步进电机的控制
💻 C
字号:
	#include <reg51.h>
#include <stdio.h>
#define uchar unsigned char 
#include <math.h> 

unsigned int tick,step;
uchar key_all=0;
uchar in_number=0;

uchar data12[9]={0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f};
int speed=4;int jieju;
int speed1;
const uchar data_void[9]={0x00,0x00,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f};

unsigned char     anticlock[8]={0xf4,0xf6,0xf2,0xf3,0x01,0xf9,0xf8,0xfc}; 

unsigned char     clock[8]={0xf8,0xf9,0x01,0xf3,0xf2,0xf6,0xf4,0xfc}; 


uchar in_status;
unsigned int  pos;
 unsigned  int temp;
   uchar m;

sbit DIN=P3^5;
sbit LOAD=P3^6;
sbit CLP=P3^7;

sbit P1_0=P1^0;	  //主线机的方向控制
sbit P1_1=P1^1;	  //主线机的脉冲

sbit P1_6=P1^6;	  //排线机方向控制
sbit P1_7=P1^7;	   //排线机脉冲输入
bit yes;
//sbit my=P1^7;


void delay(void);
void send(uchar add,uchar );
void s_seg(uchar *p);
void  keyscan(void);	  //键盘扫描函数
void clear_all(void);
void my_delay(void);

void zhengzhuan(int);
void fanzhuan(int) ;
void key_process(void);
void  initt1(void) ;
    void es_isr0 (void) ;

void main()
{  
 //uchar key_get=15;

 int i;
  in_status=0;
  initt1();
  tick=0;
  pos=0;

  step=1;
while(1)
{
	keyscan();
	key_process();
//	if(yes){	zhengzhuan(speed1);	 yes=0;}

	
  /* for (i=0;i<8;i++)
   {
	 P0=clock[i]; 
	  my_delay();
	}

  */
} 
}

 void  initt1(void) 
 {
		P1_0 =1;
 	P1_1 =1;
	TMOD=0X11;
	 TH0=0Xdd;
	TL0=0X00;

	 TR0=1;
	 ET0=1;

	 EA=0;

 }


void key_process(void)
  {

	//  in_number=0;
  
  
  if((key_all==13	)||( key_all==14)) 
{
	 if(key_all==13) in_status=1;
	 else 	in_status= 2;  
	 clear_all();
 }
	if((in_status!=0)&&(key_all>=1)&&(key_all<=10)) 
	{
		for(m=8;m>1;m--)
	{
	    data12[m]=data12[m-1];
	}	
	 	  data12[1]=key_all-1;
	 
				 in_number++;

				s_seg(data12);


	if(	in_number >7 )	  in_number=0;

	}
	if(key_all==11) 
	{
	   //	 EA=1;

		temp=0;

	for(m=1;m<=in_number;m++)
		{
	temp+=data12[m]*pow(10,(m-1));
	tick=temp;

		//	temp=data12[1];
		}

		switch(temp)
		{
			case 20: tick=0; if(0==(pos/2)) {P1_0=1;step=pos/2;EA=0;} if(0<(pos/2))  {P1_0=0;step=pos/2;EA=1;} break;
			case 26: tick=0; if(14>(pos/2)) {P1_0=1;step=14-pos/2;EA=1;}if(14<(pos/2)) {P1_0=0;step=pos/2-14;EA=1;}  break;
			case 34: tick=0; if(28>(pos/2)) {P1_0=1;step=28-pos/2;EA=1;}if(28<(pos/2)) {P1_0=0;step=pos/2-28;EA=1;}  break;
			case 40: tick=0; if(42>(pos/2)) {P1_0=1;step=42-pos/2;EA=1;}if(42<(pos/2)) {P1_0=0;step=pos/2-42;EA=1;}  break;
			case 47: tick=0; if(56>(pos/2)) {P1_0=1;step=56-pos/2;EA=1;}if(56<(pos/2)) {P1_0=0;step=pos/2-56;EA=1;}  break;
			case 52: tick=0; if(70>(pos/2)) {P1_0=1;step=70-pos/2;EA=1;}if(70<(pos/2)) {P1_0=0;step=pos/2-70;EA=1;}  break;
			case 60: tick=0; if(84>(pos/2)) {P1_0=1;step=84-pos/2;EA=1;}if(84<(pos/2)) {P1_0=0;step=pos/2-84;EA=1; }break;
			case 65: tick=0; if(98>(pos/2)) {P1_0=1;step=98-pos/2;EA=1;}if(98<(pos/2)) {P1_0=0;step=pos/2-98;EA=1;}  break; 
			case 70: tick=0; if(112>(pos/2)) {P1_0=1;step=112-pos/2;EA=1;}if(112<(pos/2)) {P1_0=0;step=pos/2-112;EA=1;} break; 
			case 77: tick=0; if(126>(pos/2)) {P1_0=1;step=126-pos/2;EA=1;}if(126<(pos/2)) {P1_0=0;step=pos/2-126;EA=1;}  break; 
			case 83: tick=0; if(140>(pos/2)) {P1_0=1;step=140-pos/2;EA=1;}if(140<(pos/2)) {P1_0=0;step=pos/2-140;EA=1;} break; 
			case 89: tick=0; if(154>(pos/2)) {P1_0=1;step=154-pos/2;EA=1;}if(154<(pos/2)) {P1_0=0;step=pos/2-154;EA=1;}  break; 
			case 95: tick=0; if(168>(pos/2)) {P1_0=1;step=168-pos/2;EA=1;}if(168<(pos/2)){P1_0=0;step=pos/2-168;EA=1;} break; 
			case 100:  tick=0; if(182>(pos/2)) {P1_0=1;step=182-pos/2;EA=1;}if(182<(pos/2)) {P1_0=0;step=pos/2-182;EA=1;} break; 
			case 105:  tick=0; if(196>(pos/2)) {P1_0=1;step=196-pos/2;EA=1;}if(196<(pos/2)) {P1_0=0;step=pos/2-196;EA=1;} break; 
			case 112:  tick=0; if(210>(pos/2)) {P1_0=1;step=210-pos/2;EA=1;}if(210<(pos/2)) {P1_0=0;step=pos/2-210;EA=1;}  break; 
			case 118:  tick=0; if(224>(pos/2)) {P1_0=1;step=224-pos/2;EA=1;}if(224<(pos/2)) {P1_0=0;step=pos/2-224;EA=1;}  break; 
			case 120:  tick=0; if(238>(pos/2)) {P1_0=1;step=238-pos/2;EA=1;}if(238<(pos/2)) {P1_0=0;step=pos/2-238;EA=1;}  break; 
			case 127:  tick=0; if(252>(pos/2)) {P1_0=1;step=252-pos/2;EA=1;}if(252<(pos/2)) {P1_0=0;step=pos/2-252;EA=1;} break; 
			case 133:  tick=0; if(266>(pos/2)) {P1_0=1;step=266-pos/2;EA=1;}if(266<(pos/2)) {P1_0=0;step=pos/2-266;EA=1;}  break; 
			case 138:  tick=0; if(280>(pos/2)) {P1_0=1;step=280-pos/2;EA=1;}if(280<(pos/2)) {P1_0=0;step=pos/2-280;EA=1;} break; 
			case 143: tick=0; if(294>(pos/2)) {P1_0=1;step=294-pos/2;EA=1;}if(294<(pos/2)) {P1_0=0;step=pos/2-294;EA=1;} break; 
			case 148: tick=0; if(308>(pos/2)) {P1_0=1;step=308-pos/2;EA=1;}if(308<(pos/2)) {P1_0=0;step=pos/2-308;EA=1;} break; 
			case 155:  tick=0; if(322>(pos/2)) {P1_0=1;step=322-pos/2;EA=1;}if(322<(pos/2)) {P1_0=0;step=pos/2-322;EA=1;} break; 
			default: break;

		}
		
	}
		if(key_all==12) 
		{
		clear_all();

		}

}
void clear_all(void)
{
  	 	uchar j;

	in_number=0;
	for( j=1;j<9;j++)
	{
		data12[j]=0x0f;	

	}	

		s_seg(data_void);

}
    void delay(void)	//延时函数
  {
        int i;
	    for (i=4800;i>0;i--);
   }

void keyscan(void)	  //键盘扫描函数
   {
         uchar scan,tep;

		 key_all=0;
//		 EA=0;

		 P2=0xf0;
 	     if((P2&0xf0)!=0xf0)	  //若有键盘按下
		 {
			  delay();
		      if((P2&0xf0)!=0xf0)	  //若有键盘按下

			{
			 P2=0xfe;	           // 发全0扫描码
	 
	       if((P2&0xf0)!=0xf0)	  //若有键盘按下
	        { 
			  delay();
		      if((P2&0xf0)!=0xf0)	  //若有键盘按下
	            {
				   scan=P2&0xf0;
				   switch( scan)
				   {
				   case 0xe0:	 key_all= 1;break;
				   case 0xd0:	 key_all= 2;break;
				   case 0xb0:	 key_all= 3;break;
				   case 0x70:	 key_all= 4;break;
				   }
				 while((P2&0xf0)!=0xf0);

	  			 }
			return ;
			}

		 P2=0xfd;	           // 发全0扫描码
	 
	       if((P2&0xf0)!=0xf0)	  //若有键盘按下
	        { 
			  delay();
		      if((P2&0xf0)!=0xf0)	  //若有键盘按下
	            {
				   scan=P2&0xf0;
				   switch( scan)
				   {
				   case 0xe0:	 key_all= 5;break;
				   case 0xd0:	 key_all= 6;break;
				   case 0xb0:	 key_all= 7;break;
				   case 0x70:	 key_all= 8;break;
				   }
				  				    while(( P2&0xf0)!=0xf0);


	  			  }
				return ;
			}
		 P2=0xfb;	           // 发全0扫描码
	 
	       if((P2&0xf0)!=0xf0)	  //若有键盘按下
	        { 
			  delay();
		      if((P2&0xf0)!=0xf0)	  //若有键盘按下
	            {
				   scan=P2&0xf0;
				   switch( scan)
				   {
				   case 0xe0:	 key_all= 9;break;
				   case 0xd0:	 key_all= 10;break;
				   case 0xb0:	 key_all= 11;break;
				   case 0x70:	 key_all= 12;break;
				   }
									    while(( P2&0xf0)!=0xf0);

	  			 }
			return;
			}
		 P2=0xf7;	           // 发全0扫描码
	 
	       if((P2&0xf0)!=0xf0)	  //若有键盘按下
	        { 
			  delay();
		      if((P2&0xf0)!=0xf0)	  //若有键盘按下
	            {
				   scan=P2&0xf0;
				   switch( scan)
				   {
				   case 0xe0:	 key_all= 13;break;
				   case 0xd0:	 key_all= 14;break;
				   case 0xb0:	 key_all= 15;break;
				   case 0x70:	 key_all= 16;break;
				   }
					 				    while(( P2&0xf0)!=0xf0);

	  			 }
				 return;
			}
		  }
		  }
}

    void send(uchar add,uchar dat)
{
   	uchar ADS,i,j;
   	CLP=0;
	LOAD=0;
	DIN=0;
   	i=4;
   	while(i<16)
   	{
     	 if(i<8)
	  	{
	  		ADS=add;
		}
	  else
	  	{
			ADS=dat;
		}
	  for(j=8;j>=1;j--)
	  	{

			if((ADS&0x80)==0)
			{	DIN=0 ;}
			else 
			{	DIN=1;}
	  	  	ADS=ADS<<1;
		
		CLP=1;
		CLP=0;	
	 	 }
	  i=i+8;
   }
   LOAD=1;
}

void s_seg(uchar *p)
{
	 send(0x0c,0x01);//正常状态
   send(0x0b,0x07);//设置扫描范围DIG0-7
	 send(0x0a,0x05);//设置亮度11/32
   send(0x09,0xff);//采用译码方式

   send(0x01,p[8]);
   send(0x02,p[7]);
   send(0x03,p[6]);
   send(0x04,p[5]);
   send(0x05,p[4]);
   send(0x06,p[3]);
   send(0x07,p[2]);
   send(0x08,p[1]);	
}





/*void zhengzhuan(int step)
{
   int i; unsigned char pos;

   for (i=0;i<step;i++)
   {
      if(pos>7)	pos=0;
	  P1=clock[pos];
	  pos++;
	  my_delay();
	}
}
void fanzhuan(int step)
{
   int i; unsigned char pos;
		   	  my_delay();


   for (i=0;i<step;i++)
   {
      if(pos>7)	pos=0;
	  P1=anticlock[pos];
	  pos++;
	  my_delay();
	}
}
*/

void zhengzhuan(int step)	  //排线机number 为1, 	主线机
{
   int i; unsigned char pos;
 for (pos=0;pos<step;pos++)
   {

   for (i=0;i<8;i++)
   {
	  
	   P1=clock[i]; 
	  my_delay();
	}
	}
}
void fanzhuan(int step)
{
   int i; unsigned char pos;
 for (pos=0;pos<step;pos++)
   {

   for (i=0;i<8;i++)
   {
	 P1=anticlock[i]; 
	  my_delay();
	}
	}
}




void my_delay(void)
{
    int i,j;
	for (i=0;i<5000;i++);
	{ 
	   for(j=0;j<1000;j++);
	}
}



  void es_isr0 (void) interrupt 1 //定时器0断服务函数
 {
	// EA=0;
	 TF0=0;
	 TR0=0;
	  tick++;
	TL0=0x01;
	TH0=0x88;

if((tick/2)<=step)
{
	  P1_1=!P1_1;  if(P1_0) pos++;else { if(pos==0)	 pos=0;else  pos--;	 }
	  if(pos<0) pos=0;
	  }
else EA=0;

//	 EA=1;
	 TR0=1;


 }









⌨️ 快捷键说明

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