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