C题 简易绘图仪
【本科组】
一、任务
设计并制作一个简易绘图仪。
二、要求
1、基本要求
(1) 自己设计制作绘图仪机械结构,控制系统;
(2) 绘图幅面:X轴方向25cm,Y轴方向25cm,图纸左下角为坐标原点;
(3) 绘图仪能进行自检,自动回到原点,然后在幅面内画一个以(12cm,12cm)为圆心直径为15cm的圆,并记录完成时间;
(4) 能键盘设定,画一个以[X(6~24),Y(6~24)]中任一点为圆心,直径在(5~10cm)间任意设定的圆,并记录完成时间。
2、发挥部分
(1) 通过键盘设定,画出2个周期的正弦波形,并记录完成时间。
(2) 通过键盘设定,画出“A、B、C、D、E、F、G、H”中的一个英文字符,并记录完成时间。
(3) 通过键盘设定,画出“广西壮族自治区”中的一个汉字,并记录完成时间。
(4) 通过键盘设定字号大小,分四档设定,并记录完成时间。
(5) 其他。
三、说明
发挥部分中字体中心自定,不做要求。发挥部分第(1)项2个周期正弦波大小为10cm*5cm,发挥部分第(2)项测试时专家从8个英文字符中任选一个进行测试,发挥部分第(3)项测试时专家从七个字符中任选一个进行测试,发挥部分第(4)项字号大小从5cm*5cm至20cm*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