把程序改成4路避障3路寻线和防坠落功能
时间:10-02
整理:3721RD
点击:
帮忙把程序改成4路避障3路寻线和防坠落功能红外遥控功能最好是hex格式驱动程序能不能改成in1 in2 in3 in4驱动的用的是42步进电机驱动模块是l298n单片机是stc89c52现在这谢过了这个程序有需要的可以拿走
#include "reg51.h"
#include "stdio.h"
#include < intrins.h >
#include<math.h>
#define uchar unsigned char
#define uint unsigned int
//************************管脚定义************************************/
sbit en_left = P1^0;//左电机使能控制位
sbit cw_left= P1^1;//左电机方向控制位
sbit clk_left= P1^2;//左电机脉冲控制位
sbit en_right = P1^3;//右电机使能控制位
sbit cw_right= P1^4;//右电机方向控制位
sbit clk_right= P1^5;//右电机脉冲控制位
sbit ir_left=P1^6; //左侧红外传感器接收位
sbit ir_right=P1^7; //右侧红外传感器接收位
sbit ir_mid=P2^3; //中间红外传感器接收位
/////////////////////////函数声明////////////////////////////////////////
void timer1_init(); //定时器1初始化函数
void move_left(uint speed_l,uchar cw,uchar en);//左电机运动函数
void move_right(uint speed_r,uchar cw,uchar en);//右电机运动函数
void delay(unsigned int k); //延时函数
//////////////////变量定义////////////////////////////////////////////////
uint n;//进定时器1中断次数计数
uint speed;//电机速度控制变量
/**************函数体******************************************/
void delay(unsigned int k)
{
unsigned int i,j;
for(i=0;i<k;i++)
{
for(j=0;j<121;j++)
{;}}
}
/*******************************/
void timer1_init()
{
TMOD=0X10;
ET1=1;
EA=1;
TH1=(65536-100)/256;
TL1=(65536-100)%256;
TR1=1;//定时器启动后 运动控制脉冲将一直产生 小车的运动方式受 cw 和en控制
}
void move_left(uint speed_l,uchar cw,uchar en)
{ //speed_l速度控制变量 cw方向控制变量 en使能控制变量
speed=speed_l;
if(cw==1)
{
cw_left=1;
}
else
{
cw_left=0;
}
if(en==1)
{
en_left=1;
}
else
{
en_left=0;
}
}
void move_right(uint speed_r,uchar cw,uchar en)
{ //speed_r速度控制变量 cw方向控制变量 en使能控制变量
speed=speed_r; //speed数值与速度成反比 请结合实际情况进行调节,
if(cw==1) //但速度不能无限加快因为步进电机有速度上限
{ //而且速度加快是力矩会下降,容易导致丢步现象
cw_right=1; //所以实际应用当中应调节到速度可力矩比较合适的数值
} //应考虑到电池电压,轮胎直径等因素
else
{
cw_right=0; //cw 控制电机正反转,1与0各代表一个方向
}
if(en==1)
{ //en 为使能位 1:能 0:不能
en_right=1;
}
else
{
en_right=0;
}
}
void main (void)
{
delay(10);
timer1_init();
while(1)
{
if(ir_left==0&&ir_mid==0&&ir_right==0) //以下是三个红外传感器的八种状态和对应的运动方式
{
move_left(15,0,1);
move_right(15,0,1);
delay(800);
}
if(ir_left==0&&ir_mid==0&&ir_right==1)
{
move_left(15,0,1);
move_right(15,0,1);
delay(400);
}
if(ir_left==0&&ir_mid==1&&ir_right==0)
{
move_left(15,0,1);
move_right(15,0,1);
delay(800);
}
if(ir_left==0&&ir_mid==1&&ir_right==1)
{
move_left(15,0,1);
move_right(15,0,1);
delay(400);
}
if(ir_left==1&&ir_mid==0&&ir_right==0)
{
move_left(15,1,1);
move_right(15,1,1);
delay(400);
}
if(ir_left==1&&ir_mid==0&&ir_right==1)
{
move_left(15,0,1);
move_right(15,0,1);
delay(800);
}
if(ir_left==1&&ir_mid==1&&ir_right==0)
{
move_left(15,1,1);
move_right(15,1,1);
delay(400);
}
if(ir_left==1&&ir_mid==1&&ir_right==1)
{
move_left(15,0,1);
move_right(15,1,1);
}
}
}
void timer1_serve() interrupt 3
{
TH1=(65536-100)/256;
TL1=(65536-100)%256;
n=n+1;
// m=m+1;
if(n==speed)
{
clk_left=~clk_left;
clk_right=~clk_right;
n=0;
}
}
#include "reg51.h"
#include "stdio.h"
#include < intrins.h >
#include<math.h>
#define uchar unsigned char
#define uint unsigned int
//************************管脚定义************************************/
sbit en_left = P1^0;//左电机使能控制位
sbit cw_left= P1^1;//左电机方向控制位
sbit clk_left= P1^2;//左电机脉冲控制位
sbit en_right = P1^3;//右电机使能控制位
sbit cw_right= P1^4;//右电机方向控制位
sbit clk_right= P1^5;//右电机脉冲控制位
sbit ir_left=P1^6; //左侧红外传感器接收位
sbit ir_right=P1^7; //右侧红外传感器接收位
sbit ir_mid=P2^3; //中间红外传感器接收位
/////////////////////////函数声明////////////////////////////////////////
void timer1_init(); //定时器1初始化函数
void move_left(uint speed_l,uchar cw,uchar en);//左电机运动函数
void move_right(uint speed_r,uchar cw,uchar en);//右电机运动函数
void delay(unsigned int k); //延时函数
//////////////////变量定义////////////////////////////////////////////////
uint n;//进定时器1中断次数计数
uint speed;//电机速度控制变量
/**************函数体******************************************/
void delay(unsigned int k)
{
unsigned int i,j;
for(i=0;i<k;i++)
{
for(j=0;j<121;j++)
{;}}
}
/*******************************/
void timer1_init()
{
TMOD=0X10;
ET1=1;
EA=1;
TH1=(65536-100)/256;
TL1=(65536-100)%256;
TR1=1;//定时器启动后 运动控制脉冲将一直产生 小车的运动方式受 cw 和en控制
}
void move_left(uint speed_l,uchar cw,uchar en)
{ //speed_l速度控制变量 cw方向控制变量 en使能控制变量
speed=speed_l;
if(cw==1)
{
cw_left=1;
}
else
{
cw_left=0;
}
if(en==1)
{
en_left=1;
}
else
{
en_left=0;
}
}
void move_right(uint speed_r,uchar cw,uchar en)
{ //speed_r速度控制变量 cw方向控制变量 en使能控制变量
speed=speed_r; //speed数值与速度成反比 请结合实际情况进行调节,
if(cw==1) //但速度不能无限加快因为步进电机有速度上限
{ //而且速度加快是力矩会下降,容易导致丢步现象
cw_right=1; //所以实际应用当中应调节到速度可力矩比较合适的数值
} //应考虑到电池电压,轮胎直径等因素
else
{
cw_right=0; //cw 控制电机正反转,1与0各代表一个方向
}
if(en==1)
{ //en 为使能位 1:能 0:不能
en_right=1;
}
else
{
en_right=0;
}
}
void main (void)
{
delay(10);
timer1_init();
while(1)
{
if(ir_left==0&&ir_mid==0&&ir_right==0) //以下是三个红外传感器的八种状态和对应的运动方式
{
move_left(15,0,1);
move_right(15,0,1);
delay(800);
}
if(ir_left==0&&ir_mid==0&&ir_right==1)
{
move_left(15,0,1);
move_right(15,0,1);
delay(400);
}
if(ir_left==0&&ir_mid==1&&ir_right==0)
{
move_left(15,0,1);
move_right(15,0,1);
delay(800);
}
if(ir_left==0&&ir_mid==1&&ir_right==1)
{
move_left(15,0,1);
move_right(15,0,1);
delay(400);
}
if(ir_left==1&&ir_mid==0&&ir_right==0)
{
move_left(15,1,1);
move_right(15,1,1);
delay(400);
}
if(ir_left==1&&ir_mid==0&&ir_right==1)
{
move_left(15,0,1);
move_right(15,0,1);
delay(800);
}
if(ir_left==1&&ir_mid==1&&ir_right==0)
{
move_left(15,1,1);
move_right(15,1,1);
delay(400);
}
if(ir_left==1&&ir_mid==1&&ir_right==1)
{
move_left(15,0,1);
move_right(15,1,1);
}
}
}
void timer1_serve() interrupt 3
{
TH1=(65536-100)/256;
TL1=(65536-100)%256;
n=n+1;
// m=m+1;
if(n==speed)
{
clk_left=~clk_left;
clk_right=~clk_right;
n=0;
}
}
额,有点长!呵呵,露个脸!