思路 两个步进电机模拟两个轮子 使二驱车能够实现加速 减速 转向 既做到匀速加速减速左右转 其中非转向时两点机同步转动
设备和连接 89C82 其中电阻除了
单片机供电是10K之外全是220 电容30PF 按键分别有加减速 倒车 左右转 寻迹模式和壁障模式 7个
程序
#include<AT89X52.h>
#define step_moto_port1 P0
#define step_moto_port2 P3
#define JIASU_KEY (!(P2_0))
#define JIANSU_KEY (!(P2_1))
#define ZZ_KEY (!(P2_2))
#define YZ_KEY (!(P2_3))
#define XJ_KEY (!(P2_4))
#define BZ_KEY (!(P2_5))
#define DC_KEY (!(P2_6))
sbit LED1 = P1^0;
sbit LED2 = P1^1;
unsigned int speed=1000;
unsigned int speed_change=1000;
unsigned char dir=1; //倒车控制,1为前进,0为倒车
unsigned char zhuan=0; //转向控制,0为直线,1为左转,2为右转
unsigned char ji=0; //模拟接收寻迹传感器读数,0为关闭,1为开启寻迹
unsigned char bi=0; //避障模式,0为无障碍,1为需要避障
unsigned char s;
void Delay()
{
unsigned char t,y;
for (t=0;t<245;t++)
for (y=0;y<240;y++);
}
void run()
{
speed=speed_change;
while(speed--)
if(zhuan==0)
{
if(dir==1)
{
if(step_moto_port1 >=0x80)
step_moto_port1=0x01;
else
step_moto_port1 <<= 1;
if(step_moto_port2 >=0x80)
step_moto_port2=0x01;
else
step_moto_port2 <<= 1;
}
if(dir==0)
{
LED1 = ~LED1;
LED2 = ~LED2;
if(step_moto_port1 <=0x01)
step_moto_port1=0x08;
else
step_moto_port1 >>= 1;
if(step_moto_port2 <=0x01)
step_moto_port2=0x08;
else
step_moto_port2 >>= 1;
}
}
if(zhuan==1)
{
LED1 = ~LED1;
step_moto_port1=0x00;
if(step_moto_port2 >=0x80)
step_moto_port2=0x01;
else
step_moto_port2 <<= 1;
}
if(zhuan==2)
{
LED2 = ~LED2;
step_moto_port2=0x00;
if(step_moto_port1 >=0x80)
step_moto_port1=0x01;
else
step_moto_port1 <<= 1;
}
if(bi==1)
{
LED1 = ~LED1;
LED2 = ~LED2;
if(step_moto_port1 <=0x01)
step_moto_port1=0x08;
else
step_moto_port1 >>= 1;
if(step_moto_port2 <=0x01)
step_moto_port2=0x08;
else
step_moto_port2 >>= 1;
Delay();
Delay();
Delay();
LED1 = ~LED1;
step_moto_port1=0x00;
if(step_moto_port2 >=0x80)
step_moto_port2=0x01;
else
step_moto_port2 <<= 1;
bi=0;
}
}
void main(void)
{
step_moto_port1=0x01;
step_moto_port2=0x01;
while(1)
{
if(DC_KEY)
{
if(ji==0)
dir = 0;
while(DC_KEY) run();
dir = 1;
}
if(JIANSU_KEY)
{
if(speed_change >= 2000)
speed_change = speed_change - 1000;
while(JIANSU_KEY) run();
}
if(JIASU_KEY)
{
if(speed_change < 20000)
speed_change = speed_change + 1000;
while(JIASU_KEY) run();
}
if(ZZ_KEY)
{
if(ji==0)
zhuan=1;
dir=3;
while(ZZ_KEY) run();
zhuan=0;
dir=1;
}
if(YZ_KEY)
{
if(ji==0)
zhuan=2;
dir=3;
while(YZ_KEY) run();
zhuan=0;
dir=1;
}
if(BZ_KEY)
{
if(ji==0)
dir=3;
bi=1;
while(BZ_KEY) run();
bi=0;
dir=1;
}
if(XJ_KEY)
{
ji=1;
dir=3;
{
if(ZZ_KEY)
zhuan=1;
while(ZZ_KEY) run();
zhuan=0;
}
{
if(YZ_KEY)
zhuan=2;
while(YZ_KEY) run();
zhuan=0;
}
while(XJ_KEY) run();
dir=0;
ji=0;
}
run();
}
}
问题
程序无法实现控制```````````按任何键都是减速到近乎停止 而且电机要按倒车按键启动 求助大神````````````
一周热门 更多>