|
参加了学校里的机器人比赛,虽然得到的名次是倒数,但还是很高兴,重在参与嘛,而且我现在对这方面又不是很熟。当时就是临时和我们说了一下,时间又很紧,结果三个晚上搞定,尤其舵机和直流电机被我轻松搞定,这点上我还是很佩服我自己的,但也还是有很多地方没有注意以致最后的失败。在这里和大家总结一下,希望大家引以为鉴:
第一、舵机的电路没有连接正确,我说怎么一下就烧一个芯片呢,调试了三天结果烧了四个芯片。
第二、电源质量太差,用几下没电了,尤其那比赛场地又摩擦很大,结果到最后它跑不动了。。。
还有另外很多经验教训就不一一和各位说了。
(原文件名:IMG0218A.jpg)
(原文件名:IMG0219A.jpg)
点击此处下载 ourdev_559865.rar(文件大小:6.31M) (原文件名:MOV0010A.rar)
以下是程序:
# include<REG51.h>
# define uchar unsigned char
# define uint unsigned int
#include<math.h>
#define uchar unsigned char
#define uint unsigned int
sbit en1=P1^5;
sbit en2=P1^1;
sbit s1=P1^4;
sbit s2=P1^3;
sbit s3=P1^2;
sbit s4=P1^0;
sbit dl=P2^0;
sbit d2=P2^1;
sbit d3=P2^2;
sbit d4=P2^3;
sbit d5=P2^4;
sbit d6=P2^5;
sbit d7=P2^6;
sbit d8=P2^7;
uint order1;
uint t1,t2,t3,t4,t5,t6,t7,t8;
uchar t=0; /* 中断计数器 */
uchar m1=0; /* 电机1速度值 */
uchar m2=0; /* 电机2速度值 */
uchar tmp1,tmp2; /* 电机当前速度值 */
/* 电机控制函数 index-电机号(1,2); speed-电机速度(-100—100) */
void motor(uchar index, char speed)
{
if(speed>=-100 && speed<=100)
{
if(index==1) /* 电机1的处理 */
{
m1=abs(speed); /* 取速度的绝对值 */
if(speed<0) /* 速度值为负则反转 */
{
s1=0;
s2=1;
}
else /* 不为负数则正转 */
{
s1=1;
s2=0;
}
}
if(index==2) /* 电机2的处理 */
{
m2=abs(speed); /* 电机2的速度控制 */
if(speed<0) /* 电机2的方向控制 */
{
s3=0;
s4=1;
}
else
{
s3=1;
s4=0;
}
}
}
}
void timer0(void) interrupt 1 /* T0中断服务程序 */
{
switch(order1)
{
case 1: dl=1;
TH0=-t1/256;
TL0=-t1%256;
break;
case 2: dl=0;
TH0=-(2700-t1)/256;
TL0=-(2700-t1)%256;
break;
case 3: d2=1;
TH0=-t2/256;
TL0=-t2%256;
break;
case 4: d2=0;
TH0=-(2700-t2)/256;
TL0=-(2700-t2)%256;
break;
case 5: d3=1;
TH0=-t3/256;
TL0=-t3%256;
break;
case 6: d3=0 ;
TH0=-(2700-t3)/256;
TL0=-(2700-t3)%256;
break;
case 7: d4=1;
TH0=-t4/256;
TL0=-t4%256;
break;
case 8: d4=0;
TH0=-(2700-t4)/256;
TL0=-(2700-t4)%256;
break;
case 9: d5=1;
TH0=-t5/256;
TL0=-t5%256;
break;
case 10: d5=0;
TH0=-(2700-t5)/256;
TL0=-(2700-t5)%256;
break;
case 11: d6=1;
TH0=-t6/256;
TL0=-t6%256;
break;
case 12: d6=0;
TH0=-(2700-t6)/256;
TL0=-(2700-t6)%256;
break;
case 13: d7=1;
TH0=-t7/256;
TL0=-t7%256;
break;
case 14:d7=0;
TH0=-(2700-t7)/256;
TL0=-(2700-t7)%256;
break;
case 15: d8=1;
TH0=-t8/256;
TL0=-t8%256;
break;
case 16:d8=0;
order1=0;
TH0=-(2700-t8)/256;
TL0=-(2700-t8)%256;
order1=0;
break;
default : order1=0;
}
order1++;
}
void timer3() interrupt 3 /* T1中断服务程序 */
{
if(t==0) /* 1个PWM周期完成后才会接受新数值 */
{
tmp1=m1;
tmp2=m2;
}
if(t<tmp1) en1=1; else en1=0; /* 产生电机1的PWM信号 */
if(t<tmp2) en2=1; else en2=0; /* 产生电机2的PWM信号 */
t++;
if(t>=100) t=0; /* 1个PWM信号由100次中断产生 */
}
void delay(uint j) /* 简易延时函数 */
{
for(j;j>0;j--);
}
void delay_m(uint n) //大延时
{
for(n;n>0;n--)
{delay(200000);}
}
void zhuantou()//将头转一下
{
uint i;
for (i=2700;i>300;i-=300)
{t2=i;
delay(200000);}
for (i=300;i<2700;i+=300)
{t2=i;
delay(200000);}
for (i=2700;i>1500;i-=300)
{t2=i;
delay(200000);}
}
void updowntou(uchar n)//臂的运动
{
if (n==1)
{t1+=100;delay_m(3);t1+=100;delay_m(3);}
if (n==2)
{t1-=100;delay_m(3);t1-=100;delay_m(3);}
}
void xiaoquan()//转圈
{
uint i;
motor(2,-40);//右
motor(1,-15);//左
for (i=0;i<3;i++)
{
updowntou(2);
updowntou(1);
}
delay_m(12);
//delay(10000);
motor(1,0);
motor(2,0);
}
void xiaoquan1()//顺时转圈
{
uint i;
motor(1,-40);//左
motor(2,-15);//右
for (i=0;i<3;i++)
{
updowntou(2);
updowntou(1);
}
delay_m(12);
//delay(10000);
motor(1,0);
motor(2,0);
}
void main(void)
{
uint i,j;
t1=1400;
t2=1800;
t3=1500;
t4=1000;
t5=1750;
t6=2000;
t7=2500;
t8=2000;
TMOD=0x21; /* 设定T0的工作模式为2 */
TH1=0x9B; /* 装入定时器的初值 */
TL1=0x9B;
order1=1;
TH0=-1500/256;
TL0=-1500%256;
EA=1;
ET0=1;ET1=1;; TR0=1;TR1=1;PT0=1;PT1=1;
motor(1,0);
motor(2,0);
delay_m(20);
//*************************************转一圈,行鞠躬礼
for (i=0;i<4;i++)
{
updowntou(2);//上
updowntou(1);//下
updowntou(1);
updowntou(2);
motor(1,-20);
motor(2,20);
delay_m(5);
delay(11000);
motor(1,0);
motor(2,0);
delay_m(5);
}
//***************************************
delay_m(5);
//**************************************前进和后退
for (i=0;i<2;i++)
{
motor(1,-20);
motor(2,-20);
delay_m(20);
motor(1,0);
motor(2,0);
delay_m(2);
//----------
zhuantou();
//----------
motor(1,20);
motor(2,20);
delay_m(20);
motor(1,0);
motor(2,0);
delay_m(2);
zhuantou();
}
//*******************************************小圆圈
for (i=0;i<1;i++)
{
xiaoquan();
xiaoquan();
xiaoquan();
xiaoquan1();
xiaoquan1();
xiaoquan1();
}
motor(1,0);
motor(2,0);
delay_m(2);
zhuantou();
/* //********************************************回转转头
motor(1,20);
motor(2,-20);
delay_m(10);
motor(1,-20);
motor(2,20);
delay_m(10);
motor(1,0);
motor(2,0);
delay_m(3);
zhuantou();
//--------
motor(1,-20);
motor(2,20);
delay_m(10);
motor(1,20);
motor(2,-20);
delay_m(10);
motor(1,0);
motor(2,0);
delay(3);
zhuantou(); */
//***************************************转向向前
motor(1,-20);
delay_m(4);
motor(1,0);
delay_m(2);
updowntou(2);
zhuantou();
updowntou(1);
updowntou(1);
zhuantou();
updowntou(2);
updowntou(2);
zhuantou();
//--------
motor(2,-20);
delay_m(10);
motor(2,0);
delay_m(2);
zhuantou();
updowntou(1);
updowntou(1);
zhuantou();
updowntou(2);
updowntou(2);
zhuantou();
//--------
motor(1,-20);
delay_m(10);
motor(1,0);
delay_m(2);
zhuantou();
updowntou(1);
updowntou(1);
zhuantou();
updowntou(2);
updowntou(2);
zhuantou();
//-----------
//*****************************************向后花样
//--------
motor(1,20);
delay_m(10);
motor(1,0);
delay_m(2);
zhuantou();
updowntou(1);
updowntou(1);
zhuantou();
updowntou(2);
updowntou(2);
zhuantou();
//-------
motor(2,20);
delay_m(10);
motor(2,0);
delay_m(2);
zhuantou();
updowntou(1);
updowntou(1);
zhuantou();
updowntou(2);
updowntou(2);
zhuantou();
//--------
motor(2,0);
motor(1,20);
delay_m(4);
motor(1,0);
delay_m(2);
updowntou(2);
zhuantou();
updowntou(1);
updowntou(1);
zhuantou();
updowntou(2);
//***********
motor(1,0);
motor(2,0);
updowntou(1);
delay_m(2);
//***********************************************翻斗
zhuantou();
delay_m(1);
for(i=0;i<3;i++)
{
motor(1,20);
motor(2,-20);
delay_m(2);
updowntou(2);
updowntou(1);
updowntou(1);
updowntou(2);
motor(1,0);
motor(2,0);
zhuantou();
//-----
motor(2,20);
motor(1,-20);
delay_m(2);
updowntou(2);
updowntou(1);
updowntou(1);
updowntou(2);
motor(1,0);
motor(2,0);
zhuantou();
}
//*********************************************小旋风
for (j=0;j<2;j++)
{
motor(1,0);
motor(2,-20);
delay_m(2);
for (i=0;i<3;i++)
{updowntou(2);updowntou(1);updowntou(1);updowntou(2);}
motor(1,20);
motor(2,0);
delay_m(2);
for (i=0;i<3;i++)
{updowntou(2);updowntou(1);updowntou(1);updowntou(2);}
}
//**************************
motor(1,0);
motor(2,0);
delay_m(2);
//**********************************************双旋风
delay_m(2);
for (i=0;i<6;i++)
{
motor(1,-i*20);
motor(2,i*20);
zhuantou();
}
delay_m(3);
motor(1,0);
motor(2,0);
delay_m(2);
for (i=0;i<6;i++)
{
motor(1,i*20);
motor(2,-i*20);
zhuantou();
}
delay_m(30);
//--------------
while(1){
motor(1,0);
motor(2,0);}
//--------------
}
|
|