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

📄 motor.c

📁 keil c 文件 @@##%%…… &……源代码程序
💻 C
字号:
#include <reg52.h>
#include<absacc.h>
#include <intrins.h>
#include <math.h>

#include <stdio.h>                /* prototype declarations for I/O functions */


        
sbit cflag=ACC^7;

sbit L297_L_CW=P1^0;
sbit L297_L_CLK=P1^1;
sbit L297_L_HALF=P1^2;
sbit L297_L_RST=P1^3;
sbit L297_L_CTL=P1^4;
sbit L297_L_EN=P1^5;

sbit L297_R_CW=P1^6;
sbit L297_R_CLK=P1^7;
sbit L297_R_HALF=P3^0;
sbit L297_R_RST=P3^1;
sbit L297_R_CTL=P3^2;
sbit L297_R_EN=P3^4;



#define uchar unsigned char
#define uint unsigned int

#define STEP 26

#define SPEED 5

#define ctrl8279 XBYTE[0X0100]
#define data8279 XBYTE[0X0000]





    uchar x0,y0;
    unsigned int i,j;
    uchar k,eol;
    float mmx,mmy;
	float mx,my;
	int cr=25;
	int cx0=40,cy0=50;


/*********************************/

void msec(unsigned int x){
uchar j;
while(x--){
for(j=0;j<125;j++)
{;}
}
}

/*************************/
uchar code table[]={0x0fc,0x60,0x0da,0x0f2,0x66,0x0b6,0x0be,0x0e0,0x0fe,0x0f6,0x8e,0x02};
/****************************/
void wdat_8279(uchar d){
msec(1);
do
{ACC=ctrl8279;}
while (cflag==1);
data8279=d;
}


/*******************************************/

void wcom_8279(uchar c){
msec(1);
do
{ACC=ctrl8279;}
while (cflag==1);
ctrl8279=c;
}
/********************/

void init8279()
{
  //unsigned char i;
 ctrl8279=0x32;            //biancheng minglin shizhong :ale 18 fenping 00110010
 ctrl8279=0x00;            //8zifuxianshi you ru kou ,bianma sao miao jianpan,shuang jian suo
 ctrl8279=0xd0;            //xianshi ram qing 0,quan zhi 1;
 

 }
 /******************/



void display_xy(int x, int y , uchar ch){
    
    if (y<1) y=1;
    if (y>2) y=2;
    if (x<1) x=1;
    if (x>4) x=4;
    if (ch<0) ch=0;
    if (ch>15) ch=15;
    if (y==1) {
      switch (x) {
       case 1:  wcom_8279(0x87);      
                wdat_8279(table[ch]);
				break;
       case 2:  wcom_8279(0x83);      
                wdat_8279(table[ch]);
      			break;
       case 3:  wcom_8279(0x85);      
                wdat_8279(table[ch]);
				break;
       case 4:  wcom_8279(0x81);      
                wdat_8279(table[ch]);
      			break;
      } 
      
    }else {
	   switch (x) {
       case 1:  wcom_8279(0x86);      
                wdat_8279(table[ch]);
				break;
       case 2:  wcom_8279(0x82);      
                wdat_8279(table[ch]);
      			break;
       case 3:  wcom_8279(0x84);      
                wdat_8279(table[ch]);
				break;
       case 4:  wcom_8279(0x80);      
                wdat_8279(table[ch]);
      			break;
      } 
      
    }

}



void display2( int k){

    uint s=0,a=0,d=0, m=0,f=0,n=0,i;

	
	uint neg=0;
	 
	if(k>-999&&k<=9999)
     { 
     //	ctrl8279=0x00;
	     if (k<0) {
		   k=-k;
		   neg=1;
		 }
     	 s=k/1000;
         wcom_8279(0x86);      
         wdat_8279(table[s]);

     	 a=k%1000;
     	 d=a/100;
     	 wcom_8279(0x82); 
         i=0x80;
          wdat_8279(table[d]);
          //
     	 m=a%100;
     	 f=m/10;
     	 wcom_8279(0x84);
        i=0x80;
         wdat_8279(table[f]);
        
     	 n=m%10;
     	 
     	wcom_8279(0x80);
        wdat_8279(table[n]);  
    }
       if (neg) display_xy(1,2,11);

}
void display1( int k)
{ 
    uint s=0,a=0,d=0, m=0,f=0,n=0,i;

	uint neg=0;
	 
	if(k>-999&&k<=9999)
     { 
     //	ctrl8279=0x00;
	     if (k<0) {
		   k=-k;
		   neg=1;
		 }
     	 s=k/1000;
         wcom_8279(0x87);      
         wdat_8279(table[s]);

     	 a=k%1000;
     	 d=a/100;
     	 wcom_8279(0x83); 
         i=0x80;
          wdat_8279(table[d]);
          //
     	 m=a%100;
     	 f=m/10;
     	 wcom_8279(0x85);
        i=0x80;
         wdat_8279(table[f]);
        
     	 n=m%10;
     	 
     	wcom_8279(0x81);
       wdat_8279(table[n]);
       //
       }
      if (neg) display_xy(1,1,11);
	   
 }  
 /***********************/

 uchar key_pressed(void) //判断FIFO有键按下函数
{uchar k;
k=ctrl8279;
return(k&0x0f); //非0,有键按下
}


uchar keyin(void)
{uchar i,k;
while(key_pressed()==0);
wcom_8279(0x40); //读FIFO RAM命令
i=data8279;
k=0;
switch(i)
     {
          case 196:
          display1(0);
		  k=0;
          break;
          case 228:
          display1(1);
		  k=1;
          break;
          case 192:
          display1(2);
		  k=2;
          break;
          case 224:
          display1(3);
		  k=3;
          break;
          case 197:
          display1(4);
		  k=4;
          break;
          case 229:
          display1(5);
		  k=5;
          break;
          case 193:
          display1(6);
		  k=6;
          break;
          case 225:
          display1(7);
		  k=7;
          break;
          case 198:
          display1(8);
		  k=8;
          break;
          case 230:
          display1(9);
		   k=9;
          break;
          case 194:
          display1(10);
		 k=10;
          break;
          case 226:
          display1(11);
		 k=11;
          break;
          case 199:
          display1(12);
		 k=12;
          break;
          case 231:
          display1(13);
		  k=13;
          break;
          case 195:
          display1(14);
		 k=14;
          break;
          case 227:
          display1(15);
		  k=15;
          break;  
        }

return(k);

}
 /**************************/




void Rmotor(float L){
 int i,j;
    if (L<0){
    L297_L_CW=1;
	}else {
	L297_L_CW=0;
	}
    j=abs(STEP*L);
    for (i=0;i<j;i++){
     L297_L_CLK=0;
	 msec(SPEED);
	 L297_L_CLK=1;
	 msec(SPEED);
	}


}

void Lmotor(float L){

 int  i,j;
    if (L>0){
    L297_R_CW=1;
	}else {
	L297_R_CW=0;
	}
    j=abs(STEP*L);
	for (i=0;i<j;i++){
     L297_R_CLK=0;
	 msec(SPEED);
	 L297_R_CLK=1;
	 msec(SPEED);
	}
} 
 

void clear_led(){
 wcom_8279(0xd0);
}	  



void initL297(){

    L297_L_RST=0;
	msec(50);
	L297_L_RST=1;
	L297_L_CTL=1;
 	L297_L_EN=1;
	L297_L_HALF=0;   

    L297_R_RST=0;
	msec(50);
	L297_R_RST=1;
	L297_R_CTL=1;
 	L297_R_EN=1;
	L297_R_HALF=0;   


}

void test(){
  uchar i;
  initL297();
    for (i=0;i<200;i++){
     L297_R_CLK=0;
	 msec(SPEED);
	 L297_R_CLK=1;
	 msec(SPEED);
	}

	 for (i=0;i<200;i++){
     L297_L_CLK=0;
	 msec(SPEED);
	 L297_L_CLK=1;
	 msec(SPEED);
	}
}

float LL(float  x,  float  y){

   int r1;
   r1=sqrt((15+x)*(15+x)+(115-y)*(115-y));
   return r1;

} 

float LR(float x, float  y){

    int r2;
    r2=sqrt((95-x)*(95-x)+(115-y)*(115-y));
    return r2;

}


void move( float x0, float y0, float x1 ,float y1){

    float Ll0,Lr0,Ll1,Lr1;

    
	Ll0=LL(x0,y0);
	Lr0=LR(x0,y0);



	Ll1=LL(x1,y1);
	Lr1=LR(x1,y1);

	Lmotor(Ll1-Ll0);
	Rmotor(Lr1-Lr0);


	
}

void move_xy(){
	   

       move(x0,y0,mx,my);
	   x0=mx;
	   y0=my;

}


void drawcircle(){


    mmx=cx0;
	  mmy=cy0+cr;
	  move(x0,y0,mmx,mmy);
    for (i=1;i<360;i++){
      
	  mx=cx0+28*(sin(3.1415926*i/180));
	  my=cy0+25*(cos(3.1415926*i/180));
	  move(mmx,mmy,mx,my);
	  display1(mx);
	  display2(my);
	  mmx=mx;
	  mmy=my;
      

}

}
bit int_flag;



    

main() {



  IT1=1;
  IE=0X84;
  init8279();
	display1(1234);
	display2(5678);
	msec(1500);
	clear_led();
	for(i=1;i<3;i++)
	 {for(j=1;j<5;j++) {
     display_xy(j,i,2);
     msec(100);
	 clear_led();
	}
	}
    display1(0000);
    display2(0000);
    initL297();
    
    test();
    while (1) {
    i=0;
    
	   while (!int_flag) ;
	   int_flag=0;
	   k=keyin();
    
	if (k==14) {
       test();
	}
	
	
	
	
	if (k==12) {
     cx0=40;
	   cy0=50;
	   cr=25;
     drawcircle();

   }
  	
   if (k==13) {

      move(0,0,20,20);
	    move(20,20,30,50);
	    move(30,50,60,60);
	    move(60,60,70,90);

   }
   
   if (k==10) { 
	      display1(0000);
		    msec(1000);
		    clear_led();
	      display1(0000);
		    msec(1000);
		    clear_led();
	      display1(0000);
		    msec(1000);
		    clear_led();
		    eol=0;
	    while (!eol) {
          while (!int_flag);
	      int_flag=0;
	      k=keyin();
		    if (k<10)
		    mx=mx*10+k;
			  display1(mx);
		  if (k==15) eol=1;
	   }


	    eol=0;
	    while (!eol) {
          while (!int_flag);
	      int_flag=0;
	      k=keyin();
		    if (k<10)
		    my=my*10+k;
			display2(my);
		  if (k==15) eol=1;
	   }

         move_xy();
	 }

  if (k==11) { 
	    display1(8888);
		msec(1000);
		clear_led();
	    display2(8888);
		msec(1000);
		clear_led();
	    display1(8888);
		msec(1000);
		clear_led();
	    eol=0;

	    while (!eol) {
          while (!int_flag);
	      int_flag=0;
	      k=keyin();
		    if (k<10)
		    cx0=cx0*10+k;
			display1(cx0);
		  if (k==15) eol=1;
	   }
 
 	    display1(7777);
		msec(1000);
		clear_led();
	    display2(7777);
		msec(1000);
		clear_led();
	    display1(7777);
		msec(1000);
		clear_led();
	    eol=0;      	 

	    while (!eol) {
          while (!int_flag);
	      int_flag=0;
	      k=keyin();
		    if (k<10)
		    cy0=cy0*10+k;
			display2(cy0);
		  if (k==15) eol=1;
	   }	   	
				
	    display1(6666);
		msec(1000);
		clear_led();
	    display2(6666);
		msec(1000);
		clear_led();
	    display1(6666);
		msec(1000);
		clear_led();
	    eol=0;


		
		while (!eol) {
          while (!int_flag);
	      int_flag=0;
	      k=keyin();
		    if (k<10)
		    cr=cr*10+k;
			display2(cr);
		  if (k==15) eol=1;
	   }
       
	    
	    drawcircle();

	 }


  
	

}

   
while (1);


}



void int1() interrupt 2{
 int_flag=1;
 }



⌨️ 快捷键说明

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