智能搬运小车C语言程序(完整)

智能搬运小车希望能够希望得到可以自动抓取货物,循迹行进,自动卸货物的功能。

#include<reg52.h>
unsigned char zkb1=0 ; //左边电机的占空比,最大100
unsigned char zkb2=0 ; //右边电机的占空比,最大100
unsigned char t,t1=0; //定时器中断计数器
char jd1=2,jd2=4,jd3=3; //舵机角度控制
unsigned char ftaiqi=0,fjiaqu=0; //是否已经取物,抬起夹子
sbit RSIGN1=P2^0; //左边信号1
sbit RSIGN2=P2^1; //左边信号2
sbit LSIGN1=P2^2; //右边信号1
sbit LSIGN2=P2^3; //右边信号2
sbit IN1=P0^0;
sbit IN2=P0^1;
sbit IN3=P0^2;
sbit IN4=P0^3;
sbit PWM1=P0^4; //左直流减速电机
sbit PWM2=P0^5; //右直流减速电机
sbit duoji1=P1^5; //左舵机
sbit duoji2=P1^6; //右舵机
sbit duoji3=P1^7; //上下舵机

void xunji();

void delay(int z) //延时函数//1ms
{
int j,k;
for(j=z;j>0;j--)
for(k=125;k>0;k--);
}
//初始化定时器,中断
void time_init() //O.1ms,0.5ms
{
TMOD=0x11;
TH0=(65536-7100)/256;
TL0=(65536-7100)%256;
TH1=(65536-500)/256;
TL1=(65536-500)%256;
EA=1;
ET0=1;
ET1=1;
TR0=1;
TR1=1;
}

void timer0() interrupt 1
{
TH0=(65536-7100)/256;
TL0=(65536-7100)%256;
if(t<zkb1)
PWM1=1;
else
PWM1=0;
if(t<zkb2)
PWM2=1;
else
PWM2=0;
t++;
if(t>=100)
t=0;
}

void timer1() interrupt 3
{
TH1=(65536-500)/256;
TL1=(65536-500)%256;
if(t1<jd1)
duoji1=1;
else
duoji1=0;
if(t1<jd2)
duoji2=1;
else
duoji2=0;

if(t1<jd3)
duoji3=1;
else
duoji3=0;
t1++;
if(t1==40)
t1=0;
}
void qianjinfangxiang() //前进方向
{
IN1=1;
IN2=0;
IN3=1;
IN4=0;
}

void houtuifangxiang() //后退方向
{
IN1=0;
IN2=1;
IN3=0;
IN4=1;
}

void qianjin() //直行
{
zkb1=40;
zkb2=40;
}

void turn_left1()//小左转函数
{
zkb1=10;
zkb2=40;
}

void turn_left2()//大左转函数
{
zkb1=0;
zkb2=50;
}

void turn_right1()//小右转函数
{
zkb1=40;
zkb2=10;
}

void turn_right2()//大右转函数
{
zkb1=50;
zkb2=0;
}


void jiaqu() //夹取货物
{
fjiaqu=1;
jd1=4;
jd2=2;
delay(400);
}

void songkai() //松开货物
{
jd1=2;
jd2=4;
delay(400);
fjiaqu=0;
}

void taiqi() //抬起货物
{
ftaiqi=1;
jd3=5;
delay(400);
}

void fangxia() //放下货物
{
jd3=3;
delay(500);
ftaiqi=0;
}

void stop()
{
zkb1=0;
zkb2=0;
}

void houtui() //后退
{
int i;
houtuifangxiang();
zkb1=30;
zkb2=30;
for(i=500;i>0;i--)
{
xunji() ;
delay(10);
}
}

void diaotou() //调头函数
{
char f1=0,f2=0,f3=0,f4=0; //标志
IN1=1;/////////////
IN2=0;/////////////
IN3=0;/////////////
IN4=1;/////////////

zkb1=30;/////////////
zkb2=30;

while(!(f1&&f2&&f3&&f4))
{
if(RSIGN1==1) f1=1;


if(RSIGN2==1) f2=1;
if(LSIGN1==1) f3=1;
if(LSIGN2==1) f4=1;
}
delay(2000);//////////////////\

qianjinfangxiang();
qianjin();

}


void xunji() //循迹函数
{
if((RSIGN1==0)&&(RSIGN2==0)&&(LSIGN1==0)&&(LSIGN2==0)) //直行
qianjin();
else if((RSIGN1==1)&&(RSIGN2==0)&&(LSIGN1==0)&&(LSIGN2==0))//左偏1,右转1
turn_right1();
else if((RSIGN1==1)&&(RSIGN2==1)&&(LSIGN1==0)&&(LSIGN2==0))//左偏2,右转2
turn_right2();
else if((RSIGN1==0)&&(RSIGN2==0)&&(LSIGN1==0)&&(LSIGN2==1))//右偏1,左转1
turn_left1();
else if((RSIGN1==0)&&(RSIGN2==0)&&(LSIGN1==1)&&(LSIGN2==1))//右偏2,左转2
turn_left2();
}

void main() //主程序
{
time_init();
zkb1=30;
zkb2=30;
qianjinfangxiang();
qianjin();
delay(10);
while(1)
{
xunji();
delay(20);
if((fjiaqu==0)&&(RSIGN1==1)&&(RSIGN2==1)&&(LSIGN1==1)&&(LSIGN2==1)) //已经到达取物处
{
stop();
delay(1000);///////////
jiaqu();
delay(100);
taiqi();
delay(100);
houtui();
qianjinfangxiang();
diaotou();
while(!((RSIGN1==1)&&(RSIGN2==1)&&(LSIGN1==1)&&(LSIGN2==1))) //已经到达卸货处
{
xunji();
delay(20);
}
fangxia();
delay(10);
songkai();
delay(10);
houtui();
qianjinfangxiang();
diaotou();
}
}
}



相关文档
最新文档