全国大学生电子设计大赛-两个步进电机画图

来源:互联网 发布:python httpadapter 编辑:程序博客网 时间:2024/05/16 06:49

这是两个步进电机画图的源程序,用keilc51编译,用单片机实现的

 

#include<reg52.h>
#include<math.h>

sbit cp1 = P1^0;
sbit cw1 = P1^1;
sbit cp2 = P1^2;
sbit cw2 = P1^3;

float step(float x1,float y1,float x2,float y2)
{
    float buj;
 float chd1;
 chd1 = sqrt((x1) * (x1) + y1 * y1) - sqrt((x2) * (x2) + y2 * y2);
  
 buj = chd1 / 0.01;
    return buj;
}

void delay(int i)
{
 while(i --);
}

void buj(float buj1,float buj2)
{
    int i,j,y,b;
  
    if(buj1 < 0)
 {
  cw1 = 1; 
  buj1 = -buj1;
 }
 else
  cw1 = 0;
  
 if(buj2 < 0)
 {
  cw2 = 1;
  buj2 = -buj2; 
 }
 else
  cw2 = 0;
   
    if(buj1 > buj2){
        b = buj1/buj2;
        y = buj1 - b * buj2;
        for(i = 1; i <= buj2; i ++){
            for(j = 1; j <= b; j ++){
                cp1 = 0;
                delay(100);
                cp1 = 1;
                delay(100);
            }
            cp2 = 0;
            delay(100);
            cp2 = 1;
            delay(100);  
       
            if(y != 0){
               
                cp1 = 0;
                delay(100);
                cp1 = 1;
                delay(100);
                y --;          
            }    
        }
    }
    else{
            b = buj2 / buj1;
            y = buj2 - buj1 * b;
            for(i = 1; i <= buj1; i ++){
                for(j = 1; j <= b; j ++){
                    cp2 = 0;
                    delay(100);
                    cp2 = 1;
                    delay(100);
                }
                cp1 = 0;
                delay(100);
                cp1 = 1;
                delay(100);  
       
                if(y != 0){
                   
                    cp2 = 0;
                    delay(100);
                    cp2 = 1;
                    delay(100);
                    y --;           
                }                   
         }  
    }
}

 

 

void delay10ms()
{
 unsigned int i,j;
 for(j = 10; j != 0; j --)
  for(i = 125; i != 0; i--);
}

void san() //玫瑰线
{
 r = 20 * sin(3 * (-1.5707963));
 x = 40 + r * cos(-1.5707963);
 y = 50 + r * sin(-1.5707963);
 for(i = -1.5707963; i <= 1.5707963; i = i + 3.1415926 / 180){
  r = 20 * sin(3 * (i));
     w = 40 + r * cos(i);
  v = 50 + r * sin(i);
  buj1 = step(x + 15,115 - y,w + 15,115 - v);
  buj2 = step(95 - x,115 - y,95 - w,115 - v);
  buj(buj1,buj2);
  x = w;
  y = v;
 }
}

void yuan(){//画圆
 r = 20;
 x = 40;
 y = 30;
 for(i = -1.5707963; i <= 4.85; i = i + 3.1415926 / 180){
     w = 40 + r * cos(i);
     v = 50 + r * sin(i);
  buj1 = step(x + 15,115 - y,w + 15,115 - v);
  buj2 = step(95 - x,115 - y,95 - w,115 - v);
  buj(buj1,buj2);
  x = w;
  y = v;
 }
}

void star()//星形线
{
 float a1,b1;
 r = 20;
 a1 = 60;
 b1 = 30;
 x = a1 + r * cos(1.7);
    y = b1 + r * sin(1.7);
 for(i = 1.7; i <= 3.1415926; i = i + 3.1415926 / 180)
 {
  w = a1 + r * cos(i);
     v = b1 + r * sin(i);
  buj1 = step(x + 15,115 - y,w + 15,115 - v);
  buj2 = step(95 - x,115 - y,95 - w,115 - v);
  buj(buj1,buj2);
  x = w;
  y = v;
 }
 a1 = 20;
 b1 = 30;
 for(i = 0; i <= 1.5707963; i = i + 3.1415926 / 180)
 {
  w = a1 + r * cos(i);
     v = b1 + r * sin(i);
  buj1 = step(x + 15,115 - y,w + 15,115 - v);
  buj2 = step(95 - x,115 - y,95 - w,115 - v);
  buj(buj1,buj2);
  x = w;
  y = v;
 }
 a1 = 20;
 b1 = 70;
 for(i = -1.5707963; i <= 0; i = i + 3.1415926 / 180)
 {
  w = a1 + r * cos(i);
     v = b1 + r * sin(i);
  buj1 = step(x + 15,115 - y,w + 15,115 - v);
  buj2 = step(95 - x,115 - y,95 - w,115 - v);
  buj(buj1,buj2);
  x = w;
  y = v;
 }
 a1 = 60;
 b1 = 70;
 for(i = 3.1415926; i <= 4.65; i = i + 3.1415926 / 180)
 {
  w = a1 + r * cos(i);
     v = b1 + r * sin(i);
  buj1 = step(x + 15,115 - y,w + 15,115 - v);
  buj2 = step(95 - x,115 - y,95 - w,115 - v);
  buj(buj1,buj2);
  x = w;
  y = v;
 }

}

void mysin()  //y = zhengfu * sin(pinlv * (x - xiangwei)) + pianzhi  //正弦线
{
 x = 20;
 y = 30;
 v = 20 + 1 / 0.13 * 6.6;
 r = 1 / 0.13 * 6.2831852 /360;
 for(i = 20; i <= v; i = i + r)
 {
  w = 15 * sin(0.13 * (i - 20)) + 30;
  buj1 = step(x + 15,115 - y,i + 15,115 - w);
  buj2 = step(95 - x,115 - y,95 - i,115 - w);
  buj(buj1,buj2);
  x = i;
  y = w;
 }
}

void list() //直线
{
    buj1 = step(54 + 15,115 - 50,40 + 15,115 - 30);
 buj2 = step(95 - 54,115 - 50,95 - 40,115 - 30);
 buj(buj1,buj2);
}

void main()

    bit flag;
    while(1)
    {
        do{
             while(key);
            delay10ms();
            if(key == 0)
            {  
                flag = 0;
                mysin();
            }
            else
                flag = 1;
        }while(flag);
       
        do{
             while(key);
            delay10ms();
            if(key == 0)
            {  
                flag = 0;
                star();
            }
            else
                flag = 1;
        }while(flag);
       
        do{
             while(key);
            delay10ms();
            if(key == 0)
            {  
                flag = 0;
                list();
            }
            else
                flag = 1;
        }while(flag);
      
        do{
             while(key);
            delay10ms();
            if(key == 0)
            {  
                flag = 0;
                yuan();
            }
            else
                flag = 1;
        }while(flag);
      
        do{
             while(key);
            delay10ms();
            if(key == 0)
            {  
                flag = 0;
                san();
            }
            else
                flag = 1;
        }while(flag);
    }
}