四极管:区电子设计大赛 之 STM32简易绘图仪

 

C题 简易绘图仪

【本科组】

一、任务

设计并制作一个简易绘图仪。

二、要求

1、基本要求

(1) 自己设计制作绘图仪机械结构,控制系统;

(2) 绘图幅面:X轴方向25cmY轴方向25cm,图纸左下角为坐标原点;

(3) 绘图仪能进行自检,自动回到原点,然后在幅面内画一个以(12cm,12cm)为圆心直径为15cm的圆,并记录完成时间;

(4) 能键盘设定,画一个以[X6~24),Y6~24]中任一点为圆心,直径在(5~10cm)间任意设定的圆,并记录完成时间。

    2、发挥部分

(1) 通过键盘设定,画出2个周期的正弦波形,并记录完成时间。

(2) 通过键盘设定,画出“ABCDEFGH”中的一个英文字符,并记录完成时间。

(3) 通过键盘设定,画出“广西壮族自治区”中的一个汉字,并记录完成时间。

(4) 通过键盘设定字号大小,分四档设定,并记录完成时间。

(5) 其他。

三、说明

发挥部分中字体中心自定,不做要求。发挥部分第(1)项2个周期正弦波大小为10cm*5cm,发挥部分第(2)项测试时专家从8个英文字符中任选一个进行测试,发挥部分第(3)项测试时专家从七个字符中任选一个进行测试,发挥部分第(4)项字号大小从5cm*5cm20cm*20cm分四档设定字号大小。作品为单独作品不得与PC机联机,画图板水平放置。

四、评分标准

设计

报告

主要内容

分数

系统方案、理论分析与计算、电路与程序设计、结果分析、设计报告结构及规范性

50

基本

要求

完成基本部分(1)、(2)项

15

完成基本部分(3)项

15

完成基本部分(4)项

20

总分

50

发挥

部分

完成发挥部分第(1)项

10

完成发挥部分第(2

10

完成发挥部分第(3

15

完成发挥部分第(4

10

其他

5

总分

50

 

 

画圆核心代码:

四极管:画圆实现函数,类似于雕刻机算法(Plotter.c)

/*******************************************************************************
文件名:  Plotter.c
作   者: 杨琦
创建时间:2010-9-19  广西区电子设计大赛
函数功能:绘图功能函数
*********************************************************************************/
#ifndef __PLOTTER_C__
#define __PLOTTER_C__

#include <math.h>
#include "Statement.h"
#include "General_Data_Type.h"
#include "my_math.c"




#define PI  3.1415926     //宏定义PI
extern uint8 LED_MODE;
uint8 or_Y=0;	//用来判断第几次进入中断
uint8 X_or=0;	
char direction = 0;

char flag = 1;//抬笔标志 0为抬笔  1为落笔
/****************************************************
函数功能:短延时函数
参    数:n
返 回 值:无	  
****************************************************/
void delay_sudu(uint32 n)
{

while(n--);

}
/****************************************************
函数功能:Y轴控制臂驱动
参    数:方向 :Forward
          步进数:控制位移  n
返 回 值:无	  
****************************************************/
void Stepping_Motor_Y_Forward_run(uint32  n)
{
 
   uint32 i; 
   Step_Motor_Y_Forward;
   Step_Motor_Y_Run; 
   for (i = 0;i < n;i++ )
   {
   delay_sudu(50000);
   }
   Step_Motor_Y_stop;    
}
/****************************************************
函数功能:Y轴控制臂驱动
参    数:方向 :direction  控制
          步进数:控制速度关键函数
返 回 值:无	  
****************************************************/ 
void Stepping_Motor_Y_run(char direction,uint16 n)
{   uint32 i; 
   if(direction ==1 )
   {
   Step_Motor_Y_Back;
   Step_Motor_Y_Run; 
   }
   else
   {
   Step_Motor_Y_Forward;
   Step_Motor_Y_Run; 
   }
   for (i = 0;i < n;i++ )
   {
   delay_sudu(10000);
   }

   Step_Motor_Y_stop;    
}
/****************************************************
函数功能:X轴控制臂驱动
参    数:方向 :direction  控制
          步进数:控制位移
返 回 值:无	  
****************************************************/ 
void Stepping_Motor_X_run(char direction,uint16 n)
{   uint32 i; 
   if(direction ==1 )
   {
   Step_Motor_X_Right;
   Step_Motor_X_Run; 
   }
   else
   {
   Step_Motor_X_Left;
   Step_Motor_X_Run; 
   }
   for (i = 0;i < n;i++ )
   {
   delay_sudu(10000);
   }

   Step_Motor_X_stop; 
   
   
}
/****************************************************
函数功能:Y轴控制臂驱动
参    数:方向:Back
          步进数:控制位移
返 回 值:无	  
****************************************************/
void Stepping_Motor_Y_Back_run(uint32  n)
{
   
   uint32 i; 
   Step_Motor_Y_Back;
   Step_Motor_Y_Run; 
   for (i = 0;i < n;i++ )
   {
   delay_sudu(50000);
   }
   Step_Motor_Y_stop; 
   
   
} 
/****************************************************
函数功能:X轴控制臂驱动
参    数:方向:right
          步进数:控制位移
返 回 值:无	  
****************************************************/
void Stepping_Motor_X_Right_run(uint32 n)
{
   uint32 i; 
   Step_Motor_X_Right;
   Step_Motor_X_Run; 
   for (i = 0;i < n;i++ )
   {
   delay_sudu(50000);
   }
   Step_Motor_X_stop;

}
/****************************************************
函数功能:X轴控制臂驱动
参    数:方向:left
          步进数:控制位移
返 回 值:无	  
****************************************************/
void Stepping_Motor_X_left_run(uint32 n)
{
   uint32 i; 
   Step_Motor_X_Left;
   Step_Motor_X_Run; 
   for (i = 0;i < n;i++ )
   {
   delay_sudu(50000);
   }
   Step_Motor_X_stop;

}
/****************************************************
函数功能:Y轴控制臂停止运动
参    数:无
返 回 值:无	  
****************************************************/
void  Stepping_Motor_Y_stop(void)
{
   Step_Motor_Y_stop;

}
/****************************************************
函数功能:X轴控制臂停止运动
参    数:无
返 回 值:无	  
****************************************************/
void  Stepping_Motor_X_stop(void)
{
   Step_Motor_X_stop;

}


/***************************************
函数功能:1、自行检测,自动回到原点
参    数:无
返 回 值: 无
建立时间:2010-9-10   10:31
****************************************/
void Automatic_return_to_origin (void)
{

  /*预设当接触到原点时,Y轴控制电机为电机(Stepping_Motor_Y),X轴控制电机为电机(Stepping_Motor_Y).
  触点管脚分别为:PA0(Y轴控制臂到达原点时,PA0 = 0;)
                  PA1(X轴控制臂到达原点时,PA1 = 0;)
  */
  tibi(1);
  //先回X控制臂
  while(1)
 {
  if(X_or!=1)
  {
  Step_Motor_X_Left;
  Step_Motor_X_Run; 
   }
   if(or_Y!=1)
   {
  Step_Motor_Y_Forward;
  Step_Motor_Y_Run;
	}
  if(LED_MODE==4) {LED_MODE=0;X_or=1;Stepping_Motor_X_stop();}
  if(LED_MODE==2) {LED_MODE=0;or_Y=1;Stepping_Motor_Y_stop();} 
  if(X_or&or_Y==1)break; 
   }
}

/***********************************************
函数功能:到达临近点
参    数:uint x, uint y;
返 回 值:无
************************************************/
void goto_xy(int16 x0,int16 y0,int16 x,int16 y)
{
	//char direction = 0;//方向标志  
	if((x-x0)>0)	direction = 1 ;	//向右
	else			direction = 0 ;	//向左
	switch(x-x0)	     
		 {
		 case 1 : flag = 1;Stepping_Motor_X_run(direction,10);break;
		 case -1: flag = 1;Stepping_Motor_X_run(direction,10);break;
		 case 0:  flag = 1;break;
          
		 default: flag = 1;Stepping_Motor_X_run(direction,x-x0);break;

         }
	if((y-y0)>0)	direction = 1 ;
	else			direction = 0 ;	 
	switch(y-y0)
	     
		 {
		 case 1 : flag = 1;Stepping_Motor_Y_run(direction,10);break;//相邻点
		 case -1: flag = 1;Stepping_Motor_Y_run(direction,10);break;
		 case 0:  flag = 1;break;
          
		 default: flag = 1;Stepping_Motor_Y_run(direction,y-y0);break;//远离点
         }	
}


/***********************************************
函数功能:上
参    数:uint x, uint y;
返 回 值:无
************************************************/
void LineTo_xy_up(int32 x0,int32 y0,int32 x1,int32 y1)
{
	int32 y;		  //上
	double dx,dy,k,x;

	dx=x1-x0;
	dy=y1-y0;
	k=dx/dy;
	x=x0;

	for(y=y0;y<=y1;y++)
	{
		goto_xy(x0,y0,(int32)(x+0.5),y);
		y0 = y;
		x0 = (int32)(x+0.5);
		x = x+k;
	}
} 
/***********************************************
函数功能:下
参    数:uint x, uint y;
返 回 值:无
************************************************/ 
void LineTo_xy_down(int32 x0,int32 y0,int32 x1,int32 y1)
{
	int32 y;		  //下
	double dx,dy,k,x;

	dx=x1-x0;
	dy=y1-y0;
	k=dx/dy;
	x=x0;

	for(y=y0;y>=y1;y--)
	{
		goto_xy(x0,y0,(int32)(x+0.5),y);
		y0 = y;
		x0 = (int32)(x+0.5);
		x = x-k;
	}	
}
/***********************************************
函数功能:左
参    数:uint x, uint y;
返 回 值:无
************************************************/
void LineTo_xy_left(int32 x0,int32 y0,int32 x1,int32 y1)
{
	int32 x;		  //左
	double dx,dy,k,y;

	dx=x1-x0;
	dy=y1-y0;
	k=dy/dx;
	y=y0;

	for(x=x0;x>=x1;x--)
	{
		goto_xy(x0,y0,x,(int32)(y+0.5));
		x0 = x;
		y0 = (int32)(y+0.5);
		y = y-k;
	}	
}
/***********************************************
函数功能:右
参    数:uint x, uint y;
返 回 值:无
************************************************/
void LineTo_xy_right(int32 x0,int32 y0,int32 x1,int32 y1)
{
	int32 x;		  //右
	double dx,dy,k,y;

	dx=x1-x0;
	dy=y1-y0;
	k=dy/dx;
	y=y0;

	for(x=x0;x<=x1;x++)
	{
		goto_xy(x0,y0,x,(int32)(y+0.5));
		x0 = x;
		y0 = (int32)(y+0.5);
		y = y+k;
	}	
}
/***********************************************
函数功能:任意方向画直线(OK)
参    数:int32 x0,int32 y0,int32 x1,int32 y1
返 回 值:无
************************************************/
void LineTo_xy_finally(int32 x0,int32 y0,int32 x1,int32 y1)
{
	int32 udx,udy;
	char dx,dy; 
	if(x1>=x0) 	{udx = x1-x0; dx=1;}
	else		{udx = x0-x1; dx=0;}
	if(y1>=y0) 	{udy = y1-y0; dy=1;}
	else		{udy = y0-y1; dy=0;}
	
	if(udx>=udy)//x为基准
	{
		if(dx>0)  //右
		{
		  	LineTo_xy_right(x0,y0,x1,y1); 	
		}
		else	  //左
		{
		    LineTo_xy_left(x0,y0,x1,y1);
		}	
	}
	else 
	{
		if(dy>0)  //上
		{
		   	LineTo_xy_up(x0,y0,x1,y1);
		}
		else	   //下
		{
		  	LineTo_xy_down(x0,y0,x1,y1);
		}	
	}
}


/***************************************************************  
函数功能:2、画一个以(12cm,12cm)为圆心直径为15cm的圆,并记录完成时间
************************************************************************/

/**************************************************************************
函数功能:3、能键盘设定,画一个以[X(6~24),Y(6~24)]中任一点为圆心,直径在(5~10cm)
            间任意设定的圆,并记录完成时间
参    数:    uint  uint x0,y0,r     //通过键盘设定
返 回 值:  无 
*****************************************************************************/
void Draw_circle(uint16 x0,uint16 y0,uint16 r)    
{
	int32 x,y,x00=0,y00=0;
	float64 d;
	x=0;
	y=r;
	d=1.25-r;
	tibi(1);
	LineTo_xy_finally(x00,y00,2*(x+x0),y+y0);
	tibi(0); 
	tibi(1);
	LineTo_xy_finally(0,0,0,r);
	x00=x+x0;	  
	y00=y+y0;
	tibi(0);
	while(x<y)		    //第一象限上半圆
	{
		if(d<0)
		{
			d += x+x+3;
			x++;
		}
		else
		{
			d += x+x -y-y +5 ;
			x++;
			y--;
		}
		goto_xy(x00,y00,x+x0,y+y0);
		x00=x+x0;	  
		y00=y+y0;		
	}
	while(x>=y && y>0)	 //第一象限下半圆
	{
		if(d>0)
		{
			d += 3-y-y;
			y--;
		}
		else
		{
			d += x+x -y-y +5 ;
			x++;
			y--;
		}
		goto_xy(x00,y00,x+x0,y+y0);
		x00=x+x0;	  
		y00=y+y0;
		if(y==0)break;
	}

	while(x>=(0-y) && y<=0)	   //第二象限上半圆
	{
		if(d<0)
		{
			d += 3-y-y;
			y--;
		}
		else
		{
			d += 5-x-x-y-y ;
			y--;
			x--;
		}
		goto_xy(x00,y00,x+x0,y+y0);
		x00=x+x0;	  
		y00=y+y0;
		
	}
	while(x<=(0-y) && x>0)		 //第二象限下半圆
	{
		if(d>0)
		{
			d += -3-x-x;
			x--;
		}
		else
		{
			d += 5-x-x-y-y ;
			y--;
			x--;
		}
		goto_xy(x00,y00,x+x0,y+y0);
		x00=x+x0;	  
		y00=y+y0;
		
	}
	 while((0-x)<(0-y) && x<=0)		  //第三象限下半圆
	{
		if(d<0)
		{
			d += 3-x-x;
			x--;
		}
		else
		{
			d += 5-x-x+y+y ;
			y++;
			x--;
		}
		goto_xy(x00,y00,x+x0,y+y0);
		x00=x+x0;	  
		y00=y+y0;
		
	}

	while(y<0)				 //第三象限上半圆
	{
		if(d>0)
		{
			d += 3+y+y;
			y++;
		}
		else
		{
			d += 5-x-x+y+y ;
			y++;
			x--;
		}
		goto_xy(x00,y00,x+x0,y+y0);
		x00=x+x0;	  
		y00=y+y0;
		
	}
	while(y<(0-x) && y>=0)				 //第二象限下半圆
	{
		if(d<0)
		{
			d += 3+y+y;
			y++;
		}
		else
		{
			d += 5+x+x+y+y ;
			y++;
			x++;
		}
		goto_xy(x00,y00,x+x0,y+y0);
		x00=x+x0;	  
		y00=y+y0;
		
	}

		while(y>=(0-x) && x<0)				 //第二象限上半圆
	{
		if(d>0)
		{
			d += 3+x+x;
			x++;
		}
		else
		{
			d += 5+x+x+y+y ;
			y++;
			x++;
		}
		goto_xy(x00,y00,x+x0,y+y0);
		x00=x+x0;	  
		y00=y+y0;
		
	}	
	tibi(1);
}


 /***********************************************************************
函数功能:4、通过键盘设定,画出2个周期的正弦波形,并记录完成时间
参    数:uint x0,y0,
返 回 值:无
************************************************************************/
void Draw_Sine_wave(int16 x0,int16 y0,double high)
{ 
	
 int32 x  = 0,y = 0; double jiaodu;
 tibi(1);
 LineTo_xy_finally(0,0,0,high);
 tibi(0);
 for(x = 0;x<1000;x+=5)//
 {
 	jiaodu  = ((double)(4*PI*x)/1000) ;//720
	y = high * sin(jiaodu);
  	LineTo_xy_finally(x0,y0,x,y);
	x0=x;
	y0=y;
 }
 tibi(1);
}

/*************************************************************************
5、通过键盘设定,画出“A、B、C、D、E、F、G、H”中的一个英文字符,并记录完成时间
**************************************************************************/
/**************************************************************************
6、通过键盘设定,画出“广西壮族自治区”中的一个汉字,并记录完成时间。
*****************************************************************************/
/**************************************************************************
7、通过键盘设定字号大小,分四档设定,并记录完成时间
*****************************************************************************/


/****************************************************************************
函数功能:矢量字符方向确定函数
参    数:uint Path,x0,y0  //path为16个方向值
返 回 值;无
********************************************************************************/
void Direction(uint16 Path,uint16 x0,uint16 y0)
{											 
   
   int x = 0, y = 0;
   switch(Path)
   {
    case 0 : x = x0 + 2; y = y0 + 0;  goto_xy(x0,y0,x,y); break;
	case 1 : x = x0 + 2; y = y0 + 1;  goto_xy(x0,y0,x,y); break;
	case 2 : x = x0 + 2; y = y0 + 2;  goto_xy(x0,y0,x,y); break;
	case 3 : x = x0 + 1; y = y0 + 2;  goto_xy(x0,y0,x,y); break;
	case 4 : x = x0 + 0; y = y0 + 2;  goto_xy(x0,y0,x,y); break;
    case 5 : x = x0 - 1; y = y0 + 2;  goto_xy(x0,y0,x,y); break;
	case 6 : x = x0 - 2; y = y0 + 2;  goto_xy(x0,y0,x,y); break;
	case 7 : x = x0 - 2; y = y0 + 1;  goto_xy(x0,y0,x,y); break;
	case 8 : x = x0 - 2; y = y0 + 0;  goto_xy(x0,y0,x,y); break;
	case 9 : x = x0 - 2; y = y0 - 1;  goto_xy(x0,y0,x,y); break;
	case 10 : x = x0 - 2; y = y0 - 2; goto_xy(x0,y0,x,y); break;
	case 11 : x = x0 - 1; y = y0 - 2; goto_xy(x0,y0,x,y); break;
	case 12 : x = x0 + 0; y = y0 - 2; goto_xy(x0,y0,x,y); break;
	case 13 : x = x0 + 1; y = y0 - 2; goto_xy(x0,y0,x,y); break;
	case 14 : x = x0 + 2; y = y0 - 2; goto_xy(x0,y0,x,y); break;
	case 15 : x = x0 + 2; y = y0 - 1; goto_xy(x0,y0,x,y);break;
   
    default : break;
   
   }
  
}
/**************************************************************
函数功能:矢量字符法花字符和汉字
          高四位表示矢量长度 
		  低四位表示矢量方向
          其中字节2和字节1的高四位为0,是专用码,其意义分别是抬笔(2)和落笔(1);
参    数:	uint16 Unit_length,uint16 Vector,uint16 x0,uint16 y0,
返 回 值:无
***************************************************************/
void Draw_Chinese_character(int32 x0,int32 y0,int32 array_A[],int32 B)
{

   int32 dx = 0,dy = 0;  
   char i = 0,ti;
   for(i = 0; i < (array_A[0]/3) ; i++)
   {
     ti = array_A[i*3+1]-1;
	 tibi(ti);
//	 if(array_A[i*3+1]==1){}//抬笔
//	 if(array_A[i*3+1]==2){}//落笔
	 dx = array_A[i*3+2]*B;//
	 dy = array_A[i*3+3]*B;

 	 LineTo_xy_finally(0,0,dx,dy);
   }
   tibi(1);     
}
/*void Draw_Chinese_character(uint16 x0,uint16 y0)
{ 
  int i,j;
  flag = 1;
  uint16   Vector =0 ,Unit_length = 0;
  for(i = 1;i < array_A[1];i++)
  {      
    if(((array_A[i]&0xF0)>>4) < 0 && (array_A[i]&0x0F == 2) )   //
	   {
	   	  flag  = 0 ;//抬笔
	   }
	if(((array_A[i]&0xF0)>>4) < 0 && (array_A[i]&0x0F == 1) )   //
	   {
	   	  flag  = 1;//落笔
	   }
	Vector =  array_A[i]&0x0F;
    Unit_length  = 100*(array_A[i]&0xF0)>>4; 
    
     for(j = 0; j < Unit_length;j++)
     {
      Direction(Vector,x0,y0); 
     }
  }
    
}*/


#endif


 

转载请注明出处。作者:四极管,广西师范大学 电子工程学院大学生科技创新基地 邮箱: yangxingbo-0311@163.com。

还有我们团队的另外两位大神···菜头和超超,还有外挂的小红。。怎么说我们四天三夜也拿了个一等奖,不过郁闷的是工作都快一年了,学校要给的奖金现在都还没有到,哎··都不知道怎么说了,可爱的母校····

转载请注明出处:http://blog.csdn.net/yangxingbo0311/article/details/7201106

 

你可能感兴趣的:(vector,测试,Path,character,float,delay)