#include<iom8v.h>
#include<macros.h>
#include<math.h>
#define uint unsigned int
#define uchar unsigned char
#define mclk 7372800
#define pai 3.1415926
#define step_l 0.00375
#define step_r 0.00375
uint a,b,c,d=0;
uint i,rdata,flag,num=0;
uint line_done =0,circularity_done=0;
float right_flag=0,left_flag=0; //正反转标志
uint left_number=0,right_number=0; //脉冲个数
int left_index=0,right_index=0; // 步进八相的索引
const uchar step[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};
const uchar fstep[]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};
/*****************************************************
该模块为串口通讯
*****************************************************/
/****
void uart_init(uint baud)
{
UCSR1B|=(1<<RXEN1)|(1<<TXEN1)|(1<<RXCIE1);
baud=mclk/16/baud-1;
UBRR1L=baud;
UBRR1H=baud>>8;
UCSR1C=(1<<UCSZ11)|(1<<UCSZ10);
SEI();
}
void uart_sendbyte(uint sdata)
{
while(!UCSR1A&(1<<UDRE1));
UDR1=sdata;
while(!UCSR1A&(1<<TXC1));
UCSR1A&=~(1<<TXC1);
}
#pragma interrupt_handler uart_RX:31
void uart_RX()
{
UCSR1A&=~(1<<RXCIE1);
rdata=UDR1;
num=num+1;
switch(num)
{
case 1:a=rdata;break;
case 2:b=rdata;break;
case 3:c=rdata;break;
case 4:d=rdata;break;
default:break;
}
flag=1;
UCSR1A|=(1<<RXCIE1);
}
***/
/*********************************************************************/
void delay(int x)
{
int i,j;
for(i=0;i<x;i++)
for(j=0;j<950;j++);
}
void bujin_init(void)
{
DDRB=0XFF;
PORTB=0XFF;
DDRC=0XFF;
PORTC=0XFF;
}
/**********************************************************************
函数名称:deal_data
函数类型:void
函数功能:左边步进动
**********************************************************************/
void left_run(void)
{
if(left_flag > 0)
{
PORTB=step[left_index];
delay(2);
PORTB=0;
}
else
{
PORTB=fstep[left_index];
delay(2);
PORTB=0;
}
left_index+=1;
if(left_index==8)
{
left_index=0;
}
}
/**********************************************************************
函数名称:deal_data
函数类型:void
函数功能:右边步进动
**********************************************************************/
void right_run(void)
{
if(right_flag > 0 )
{
PORTC=fstep[right_index];
delay(1);
PORTC=0;
}
else
{
PORTC=step[right_index];
delay(1);
PORTC=0;
}
right_index+=1;
if(right_index==8)
{
right_index=0;
}
}
/*******画点*******************************************/
void drive_motor(float left_legth,float right_legth)
{
left_flag = left_legth;
right_flag = right_legth;
if(right_legth < 0)
{
right_legth = 0- right_legth;
}
if(left_legth < 0)
{
left_legth = 0 - left_legth;
}
while(1)
{
left_run();
//delay(1);
left_number++;
if(left_number >=(left_legth ))
{
left_number =0;
break;
}
}
while(1)
{
right_run();
//delay(1);
right_number++;
if(right_number >= (right_legth ) )
{
right_number =0;
break;
}
}
}
/**画直线*********************/
void draw_line(float x0,float y0,float x1,float y1) //(x0,y0):起点坐标,(x0,y0):停止点坐标
{
float ll,inc_x,inc_y,xx,yy,L_l0,L_r0,L_l,L_r,inc_Ll,inc_Lr,xxx ;
//kk:斜率 cc:初点始常数(yy=kk*xx+cc)
int count_ll,count_l,count_r,i ; //(x0,y0):画直线起点坐标
ll=sqrt((x1-x0)*(x1-x0)+(y1-y0)*(y1-y0)) ; //ll:斜边长度
count_ll=ll/0.5+0.5 ; //count_ll:步数 0.5为像素
inc_x=(x1-x0)/count_ll ; //inc_x:x方向步长
inc_y=(y1-y0)/count_ll ; //inc_y:y方向步长
L_l0=sqrt((x0)*(x0)+(y0)*(y0)) ;//L_l0为左轮绳子的初始长度
L_r0=sqrt((110-x0)*(110-x0)+(y0)*(y0)) ;//L_r0为右轮绳子的初始长度
for(i=1; i<=count_ll; i++)
{xx=inc_x*i+x0 ; //xxx=xx ;//(xx,yy)为画直线中的动态坐标
yy=inc_y*i+y0 ;
L_l=sqrt((xx)*(xx)+(yy)*(yy)) ;//L_l0为左轮绳子的最后长度
L_r=sqrt((110-xx)*(110-xx)+(yy)*(yy)) ;//L_r0为右轮绳子的最后长度
inc_Ll=L_l-L_l0 ;//左绳长度变化值(一小段弧长)
inc_Lr=L_r-L_r0 ;//右绳长度变化值(一小段弧长)
count_l=inc_Ll/step_l+(inc_Ll>=0 ?0.5:-0.5) ;//步进电机每步弧长(厘米)
count_r=inc_Lr/step_r+(inc_Lr>=0 ?0.5:-0.5) ;//右步进电机每步弧长(厘米)
drive_motor(count_l,count_r) ;
delay(50) ; //延时50ms test: x0,y0,x1,y1=10,10,40,40
L_l0=L_l ;
L_r0=L_r ;
}
line_done =1; //直线画完标志
}
/**画圆*********************/
void draw_circularity(float rr,float x0,float y0) //rr:半径,(x0,y0):圆心坐标
{
float L_l,L_r,L_l0,L_r0,inc_Ll,inc_Lr,xx,yy,xxx ;
int count_l,count_r,i ;
L_l0=sqrt((x0+rr)*(x0+rr)+(y0)*(y0)) ;//(x0+rr,y0):画圆起点坐标
L_r0=sqrt((110-x0-rr)*(110-x0-rr)+(y0)*(y0)) ;
for(i=1;i<=360;i++)
{xx=rr*cos(pai*i/180)+x0 ;
//xxx=xx;
yy=rr*sin(pai*i/180)+y0 ;
L_l=sqrt((xx)*(xx)+(yy)*(yy)) ;
L_r=sqrt((110-xx)*(110-xx)+(yy)*(yy)) ;
inc_Ll=L_l-L_l0 ;
inc_Lr=L_r-L_r0 ;
count_l=inc_Ll/step_l+(inc_Ll>=0 ?0.5:-0.5) ; // 左步进电机每步弧长(厘米)
count_r=inc_Lr/step_r+(inc_Lr>=0 ?0.5:-0.5) ; // 右步进电机每步弧长(厘米)
drive_motor(count_l,count_r) ;
delay(3) ; //延时50ms
L_l0=L_l ;
L_r0=L_r ;
}
circularity_done = 1; // 圆画完标志
}
/**********************************************************************
函数名称:deal_data
函数类型:void
函数功能:左边步进动
**********************************************************************/
void main(void)
{
//uart_init(19200);
bujin_init();
while(1)
{
/* if(line_done !=1)
{
draw_line(80,35,60,15) ; //(x0,y0):起点坐标,(x0,y0):停止点坐标
//draw_circularity( a,b,c);
//draw_line(50,45,60,35) ; //(x0,y0):起点坐标,(x0,y0):停止点坐标
//draw_line(60,15,40,35) ; //(x0,y0):起点坐标,(x0,y0):停止点坐标
//draw_line(40,35,60,55) ; //(x0,y0):起点坐标,(x0,y0):停止点坐标
//draw_line(60,55,80,35) ; //(x0,y0):起点坐标,(x0,y0):停止点坐标
}
*/
if(circularity_done != 1)
{
draw_circularity(20,80,35);
}
}
}
评论0