注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
sunnyromg的个人空间 https://home.eeworld.com.cn/space-uid-147188.html [收藏] [复制] [分享] [RSS]
日志

基于AT89S52的悬挂物体控制系统

已有 892 次阅读2009-8-20 16:49 |个人分类:51|

#include <reg52.h>
 #include <math.h>
 #define h 115
 #define a 15
 #define b 95
 #define R 25
   sbit P0_0=P0^0;
   sbit P0_1=P0^1;
   sbit P0_2=P0^2;
   sbit P0_3=P0^3;
   sbit P0_4=P0^4;
   sbit m1=P3^6;
   sbit m2=P3^7;
 

  unsigned char code mov0[]={0x55,0x99,0xaa,0x66};/*M1和M2 正转  */
   unsigned char code mov1[]={0x65,0xa9,0x9a,0x56};/*M1正转和M2反转*/
   unsigned char code mov2[]={0x56,0x9a,0xa9,0x65};/*M1 反转M2正转*/
   unsigned char code mov3[]={0x66,0xaa,0x99,0x55};/*M1和M2 反转*/
 
   unsigned char code dispi[8]={0x00,0x10,0x20,0x30,0x40,0x50,0x60,0x70};
   unsigned char disp[8]={0,0,0,0,0,0,0,0};
  
   int set_x=40,set_y=40;
   float y[2];
   int x[2];
   float dlx,dly;
  
   int n1,n2,sg1,sg2;
   
   int j0=0,j1=0;
 
 
 int modle=0,gn_buf,go,i0,j0;
void dot_to_dot(void);
void draw_circle(void);
void disp_2(void);
void disp_1(void);
 
void delay(void)
    {unsigned char i,j;
  for(i=0;i<10;i++)
  for (j=0;j<249;j++);
     }
  
void suan(unsigned char q)
 { float dlx,dly;
  dlx=sqrt((h-y[q+1])*(h-y[q+1])+(a+x[q+1])*(a+x[q+1]))-sqrt((h-y[q])*(h-y[q])+(a+x[q])*(a+x[q]));
         dly=sqrt((h-y[q+1])*(h-y[q+1])+(b-x[q+1])*(b-x[q+1]))-sqrt((h-y[q])*(h-y[q])+(b-x[q])*(b-x[q]));

      if(dly<0)sg1=0;
   else sg1=1;
   n1=fabs(dly)*295/11.13;
     
      if(dlx<0)sg2=0;
   else sg2=1;
   n2=fabs(dlx)*295/11.13;
     }
void keyscan(void)
     {if (P0_0==0)
       {delay();
          if (P0_0==0)
           while(!P0_0)disp_1();
            gn_buf++;
           if(gn_buf==5)gn_buf=0;
         }
      
     if (P0_1==0)
        {delay();
           if (P0_1==0)
             while(!P0_1)disp_1();
              set_x++;
             if(set_x>=80)set_x=0;
          }
     
     if (P0_2==0)
        {delay();
          if (P0_2==0)
            while(!P0_2)disp_1();
            set_y++;
            if(set_y>=100)set_y=0;
         }
    
     if (P0_3==0)
        {delay();
         if (P0_3==0)
          while(!P0_3)disp_1();
         if(go){go=0; m1=0; m2=0;}
   else go=1;
         }
     if (P0_4==0)
        {delay();
         if(P0_4==0)
         while(!P0_4)disp_1();
         modle++;
         if(modle==4)modle=0;
         }
    }
void disp_1(void)
  {disp[0]=set_x%10;
   disp[1]=set_x/10;
   disp[2]=set_y%10;
   disp[3]=set_y/10;
          disp[4]=modle;
          disp[6]=go;
          disp[7]=gn_buf;
   P1=disp[i0]+dispi[i0];
   i0++;
   if(i0==8)i0=0;
 
  }
void main(void)
    {
     TMOD=0x11;
     TH0=(65536-5000)/256;
     TL0=(65536-5000)%256;
     TH1=(65536-5000)/256;
     TL1=(65536-5000)%256;
     ET1=1;
     ET0=1;
     EA=1;
     while(1)
       {keyscan();
        disp_1();
         if(go)
          {
      if(gn_buf==0) // //手动调零
             {TR0=1;
     TR1=0;
     m1=1;
     m2=1;
              }
           
   
    else if(gn_buf==1) //画弧线
             {TR0=1;
      TR1=0;
      m1=1;
      m2=0;
         }
       else if(gn_buf==2)
              {dot_to_dot();
               /*  TR1=0;
     x[0]=0;
     y[0]=0;
     x[1]=set_x;
     y[1]=set_y;
     suan(0);
     TR1=1;
     m1=1;
     m2=1;
     while(n1||n2)*/
                gn_buf=4; }
        else if(gn_buf==3)
              {  draw_circle(); gn_buf=4; }
            }
  else {TR0=0;TR1=0;}
      }
    }
void timer0(void) interrupt 1 using 0
 {TH0=(65536-5000)/256;
         TL0=(65536-5000)%256;
   if(gn_buf==0)
      {
   if (modle==0)
     P2=mov0[j0];
   if (modle==1)
     P2=mov1[j0];
          if (modle==2)
     P2=mov2[j0];
   if (modle==3)
     P2=mov3[j0];}
   if(gn_buf==1)
     P2=mov0[j0];
   j0++;
   if (j0==4)
   {j0=0;}
  }
void timer1(void) interrupt 3 using 1
    {TH1=(65536-5000)/256;
     TL1=(65536-5000)%256;
 
     if(sg1==0&&sg2==0)P2=mov0[j1];
     if(sg1==0&&sg2==1)P2=mov1[j1];
     if(sg1==1&&sg2==0)P2=mov2[j1];
     if(sg1==1&&sg2==1)P2=mov3[j1];
     j1++;
     if (j1==4)
       {j1=0;
         if(n1>0)n1--;
         if(n2>0)n2--;
         }
     if (n1==0)m1=0;
     if (n2==0)m2=0;
   
 
      }
void dot_to_dot(void)//(0,0)到 (set_x,set_y)移?
  
     {       TR1=0;
  TR0=0; 
  x[0]=0,y[0]=0;x[1]=0;
  while(x[1]!=set_x) //if it is not  finished  ,then go on
  { 
             x[1]=x[1]+2;
       y[1]=(float)(x[1])*set_y/set_x;
   suan(0);
             x[0]=x[1],y[0]=y[1];
   TR1=1;
   m1=1;
               m2=1;
             while(n1||n2)  disp_2();  //等待电机执行完毕
                 TR1=0;
    }
           m1=0;
     m2=0;
              TR1=0;
        TR0=0;  
         
   }
void draw_circle(void)
       {   TR1=0;
       TR0=0;
       x[0]=0,y[0]=0;
       x[1]=x[0],y[1]=y[0];
 
       while(x[1]!=set_x-R) // 移动到水平作图点
        { 
              x[1]=x[1]+1;
    y[1]=(float)(x[1])*set_y/(set_x-R);
    suan(0);
               x[0]=x[1],y[0]=y[1];
      TR1=1;
      m1=1;
               m2=1;
             while(n1||n2)  disp_1();  //等待电机执行完毕
             TR1=0;   
    }
  
         while(x[1]!=(R+set_x) )//作上半周
   {
    x[1]=x[1]+2;
    y[1]=set_y+sqrt(R*R-(set_x-x[1])*(set_x-x[1]));
   suan(0);
   x[0]=x[1];y[0]=y[1];
         TR1=1;
      m1=1;
               m2=1;
             while(n1||n2)  disp_2();  //等待电机执行完?
    TR1=0;
   }
         
         while(x[1]!=(set_x-R) )//作下半周
      {
    x[1]=x[1]-2;
    y[1]=set_y-sqrt(R*R-(x[1]-set_x)*(x[1]-set_x));
   suan(0);
   x[0]=x[1];y[0]=y[1];
         TR1=1;
      m1=1;
               m2=1;
             while(n1||n2)  disp_2();  //等待电机执行完?
    TR1=0;
   }
    }
      void disp_2(void)
  {disp[0]=set_x%10;
   disp[1]=set_x/10;
   disp[2]=set_y%10;
   disp[3]=set_y/10;
      disp[4]=(int)x[0]%10;
      disp[5]=(int)x[0]/10;
      disp[6]=(int)y[0]%10;
      disp[7]=(int)y[0]/10;
   P1=disp[i0]+dispi[i0];
   i0++;
   if(i0==8)i0=0;
 
  }
 
评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章