当前位置:文档之家› 寻迹避障下车程序_51绝版(模块化)

寻迹避障下车程序_51绝版(模块化)

寻迹避障下车程序_51绝版(模块化)
寻迹避障下车程序_51绝版(模块化)

main.c

#include "common.h"

#include "motor.h"

#include "timer.h"

uchar speed_l;

uchar speed_r;

sbit out = P3^7;

void main()

{

P1 = 0xff;

flag_l = 0;

flag_r = 0;

sensor_ldata = 0;

sensor_rdata = 0;

avoid_keyfunc = 0;

findline_keyfunc = 0;

motor_stop();

timerinit();

while(1)

{

/*********************************************************

循迹功能

*********************************************************/

while(findline_keyfunc)

{

/****************************************************************

正常情况下前进

****************************************************************/

if(sensor == 0x27)

{

motor_go();

speed_l = 50;

speed_r = 47;

}

/****************************************************************

如果小车偏左

****************************************************************/

if((sensor == 0x37) || (sensor == 0x17) || (sensor == 0x0f) || (sensor == 0x1f) || (sensor == 0x3f))

{

motor_r();

speed_l = 45;

speed_r--;

if(speed_r == 30)

{

speed_r = 31;

}

}

/****************************************************************

如果小车偏右

****************************************************************/

if((sensor == 0x67) || (sensor == 0x47) || (sensor == 0x87) || (sensor == 0xc7) ||(sensor == 0xe7))

{

motor_l();

speed_r = 45;

speed_l--;

if(speed_l == 30)

{

speed_l = 31;

}

}

}

///////////////////////////////////////////////////////////////////////

/******************************************************************* 避障功能

*******************************************************************/ while(avoid_keyfunc)

{

/***********************************************************

如果没有检测到有障碍物

***********************************************************/

if((sensor_ldata == 1) && (sensor_rdata == 1))

{

motor_go();

speed_l = 48;

speed_r = 50;

}

/***********************************************************

如果检测到右边有障碍物

***********************************************************/

if((sensor_ldata == 1) && (sensor_rdata == 0))

{

motor_go();

speed_l--;

speed_r = 100;

if(speed_l == 10)

{

speed_l = 11;

}

}

/****************************************************** 如果左边检测到有障碍物

******************************************************/ if((sensor_ldata == 0) && (sensor_rdata == 1))

{

motor_go();

speed_r--;

speed_l = 100;

if(speed_r == 10)

{

speed_r = 11;

}

}

/****************************************************** 如果都检测到有障碍物

******************************************************/ if((sensor_ldata == 0) && (sensor_rdata == 0))

{

motor_go();

speed_r = 100;

speed_l = 10;

}

//////////////////////////////////////

}

/////////////////////////////////////

motor_stop();

}

}

MAIN.H

#ifndef __MAIN_H__ #define __MAIN_H__

extern uchar speed_l; extern uchar speed_r;

#endif

Motor.c

#include "common.h"

#include "timer.h"

sbit in1 = P2^0;

sbit in2 = P2^1; //左电机

sbit in3 = P2^2;

sbit in4 = P2^3;//右电机

sbit ENA = P2^4; //只有当ENA=1时左电机才能转sbit ENB = P2^5; // 只有。ENB.

//////////////////

void motor_go() //电机前进函数

{

in1 = 1;//左电机正转

in2 = 0;

in3 = 1;//右电机正转

in4 = 0;

ENA = flag_l;

ENB = flag_r;

}

void motor_stop()

{

in1 = 1;//左电机正转

in2 = 0;

in3 = 1;//右电机正转

in4 = 0;

ENA = 0;

ENB = 0;

}

void motor_l() //电机前进函数

{

in1 = 0;//左电机正转

in2 = 1;

in3 = 1;//右电机正转

in4 = 0;

ENA = flag_l;

ENB = flag_r;

}

void motor_r() //电机前进函数

{

in1 = 1;//左电机正转

in2 = 0;

in3 = 0;//右电机正转

in4 = 1;

ENA = flag_l;

ENB = flag_r;

}

MOTOR.H

#ifndef __MOTOR_H__ #define __MOTOR_H__

extern void motor_go(); extern void motor_stop(); extern void motor_r(); extern void motor_l();

#endif

Timer.c

#include

#include "common.h"

#include "main.h"

sbit sensor_l = P2^6;

sbit sensor_r = P2^7;

sbit k1 = P3^0;

sbit k2 = P3^1;

sbit k3 = P3^2;

//sbit buzzer = P3^7;

uint num,num1,num2,num3,num4;

bit sensor_ldata;

bit sensor_rdata;

uchar sensor;

bit flag_l;

bit flag_r;

bit avoid_keyfunc;

bit findline_keyfunc;

void timerinit()

{

TMOD = 0X01;

TH0 = (65536-100)/256;

TL0 = (65536-100)%256;

TR0 = 1; //定时器开关

ET0 = 1; //中断开关

EA = 1;

}

////

void timer_0() interrupt 1

{

TR0 = 0;

TH0 = (65536-100)/256; //0.1us

TL0 = (65536-100)%256;

num++;num1++;num2++;num3++;num4++;

/*********************************************** 每隔1ms扫描循迹传感器

***********************************************/ if(num3 == 1)

{

num3 = 0;

sensor = P1;

}

/********************************************** 左边电机速度控制

**********************************************/ if(num < speed_l)

{

flag_l = 1;

}

if(num > speed_l)

{

flag_l = 0;

}

if(num == 100)

{

num = 0;

}

/********************************************** 右边电机速度控制

**********************************************/ if(num1 < speed_r)

{

flag_r = 1;

}

if(num1 > speed_r)

{

flag_r = 0;

}

if(num1 == 100)

{

num1 = 0;

}

/******************************************** 每隔2ms扫描避障传感器

********************************************/ if(num2 == 2)

{

num2 = 0;

sensor_ldata = sensor_l;

sensor_rdata = sensor_r;

}

/************************************************* 每隔10ms按盘扫描一次

**************************************************/ if(num4 == 10)

{

num4 = 0;

if(k1 == 0) //使能按键

{

findline_keyfunc = 1;

avoid_keyfunc = 0;

}

if(k2 == 0) //避障功能键

{

avoid_keyfunc = 1;

findline_keyfunc = 0;

}

if(k3 == 0)

{

avoid_keyfunc = 0;

findline_keyfunc = 0;

}

}

////////////////////////////////////////////////

TR0 = 1;

}

TIMER.H

#ifndef __TIMER_H__

#define __TIMER_H__

extern bit flag_l;

extern bit flag_r;

extern bit sensor_ldata;

extern bit sensor_rdata;

extern uchar sensor;

extern bit avoid_keyfunc;

extern bit findline_keyfunc;

extern void timerinit();

#endif

COMMON.H

#ifndef __COMMON_H__ #define __COMMON_H__

#include

#include

#define uint unsigned int

#define uchar unsigned char

#endif

相关主题
文本预览
相关文档 最新文档