proteus仿真(以下代码根据仿真实现同时也给了实物小车的代码部分取消注释即可)
che.h
#ifndef __ CHE_H__
#define __CHE_H__
/*电机驱动IO定义*/
sbit IN1 = P1^4; //为1 前左电机反转
sbit IN2 = P1^3; //为1 前左电机正转
sbit IN3 = P1^1; //为1 前右电机正转
sbit IN4 = P1^2; //为1 前右电机反转
sbit EN1 = P1^5; //为1 前左电机使能
sbit EN2 = P1^0; //为1 前右电机使能
sbit IN12=P2^1;//为1 后左电机正
sbit IN22=P2^2;//为1 后左电机反
sbit IN32=P2^3;//为1 后右电机正
sbit IN42=P2^4;//为1 后右电机反
sbit ENA2=P2^0;//为1 后左电机使能
sbit ENB2=P2^5;//为1 后右电机使能
/*循迹小车IO口定义*/
sbit R_led2 = P0^0;// 右寻迹灯2 为0没有识别到红线 为1识别到红线
sbit R_led1 = P0^1;//右寻迹灯1 为0没有识别到红线 为1识别到红线
sbit M_led0 = P0^2;//中间寻迹灯0 为0没有识别到红线 为1识别到红线
sbit L_led1 = P0^3;//左寻迹灯1 为0没有识别到红线 为1识别到红线
sbit L_led2 = P0^4;//左寻迹灯2 为0没有识别到红线 为1识别到红线
sbit R2_led2 = P3^3;// 右寻迹灯2 为0没有识别到红线 为1识别到红线
sbit R2_led1 = P3^4;//右寻迹灯1 为0没有识别到红线 为1识别到红线
sbit M2_led0 = P3^5;//中间寻迹灯0 为0没有识别到红线 为1识别到红线
sbit L2_led1 = P3^6;//左寻迹灯1 为0没有识别到红线 为1识别到红线
sbit L2_led2 = P3^7;//左寻迹灯2 为0没有识别到红线 为1识别到红线
#define left_motor_en EN1 = 1,ENA2=1 //左电机使能
#define right_motor_en EN2 = 1,ENB2=1 //右电机使能
#define left_motor_dis EN1 = 0,ENA2=0 //左电机不使能
#define right_motor_dis EN2 = 0 ,ENB2=0//右电机不使能
//房间选择定义
sbit L1=P0^5;
sbit L2=P0^6;
sbit L3=P0^7;
//仿真判断代替
sbit pj =P1^6;
#define left_motor_stops IN1 = 0, IN2 = 0,IN12=0,IN22=0//左电机停止
#define right_motor_stops IN3 = 0, IN4 = 0,IN32=0,IN42=0//右电机停止
#define left_motor_go IN1 = 0, IN2 = 1,IN12=1,IN22=0//左电机正传
#define left_motor_back IN1 = 1, IN2 = 0,IN12=0,IN22=1//左电机反转
#define right_motor_go IN3 = 1, IN4 = 0,IN32=1,IN42=0//右电机正传
#define right_motor_back IN3 = 0, IN4 = 1,IN32=0,IN42=1//右电机反转
typedef unsigned char uchar;
typedef unsigned int uint;
#endif
dainji.c
#include<reg52.h>
#include<che.h>
/*毫秒级延时*/
void delay(uint z)
{
uint x,y;
for(x = z; x > 0; x--)
for(y = 114; y > 0 ; y--);
}
/*小车前进*/
void forward()
{
left_motor_go; //左电机前进
right_motor_go; //右电机前进
}
/*小车左转*/
void left_run()
{
left_motor_back; //左电机后退
right_motor_go; //右电机前进
}
/*小车右转*/
void right_run()
{
right_motor_back;//右电机后退
left_motor_go; //左电机前进
}
/*小车后退*/
void backward()
{
left_motor_back; //左电机后退
right_motor_back; //右电机后退
}
/*小车停止*/
void stop()
{
right_motor_stops;
left_motor_stops;
}
/*转向*/
void turn_roud()
{
left_motor_go;
right_motor_back;
}
/*直走*/
void go_straight()
{
if(L_led1==0 && R_led1==0 )//识别红线直行
{
forward();
}
else
{
if(L_led1 == 1 && R_led1 == 0)//小车右边出线,左转修正 1是红 0是白
{
left_run();//左转
}
if(L_led1 == 0 && R_led1 == 1)//小车左边出线,右转修正
{
right_run();//右转
}
if(L_led2 == 1 && L_led1 == 0 && R_led2 ==0) //小车右边出线,左转修正
{
left_run();//左转
}
if(L_led1 == 0 && R_led1 == 0 && R_led2==1)//小车左边出线,右转修正
{
right_run();//右转
}
// if((uchar)L_led2 + (uchar)L_led1 >= 1) //小车右边出线,左转修正
// {
// left_run();//左转
// }
// if((uchar)R_led1 +(uchar)R_led2>=1)//小车左边出线,右转修正
// {
// right_run();//右转
// }
}
}
void go_back()
{
if(L_led1==0 && R_led1==0 )//识别红线直行
// if(L2_led1==0 && R2_led1==0 )//识别红线直行
{
backward();
}
else
{
if(L2_led1 == 1 && R2_led1 == 0)//小车右边出线,左转修正 1是红 0是白
{
left_run();//左转
}
if(L2_led1 == 0 && R2_led1 == 1)//小车左边出线,右转修正
{
right_run();//右转
}
if(L2_led2 == 1 && L2_led1 == 0 && R2_led2 ==0) //小车右边出线,左转修正
{
left_run();//左转
}
if(L2_led1 == 0 && R2_led1 == 0 && R2_led2==1)//小车左边出线,右转修正
{
right_run();//右转
}
}
}
void chesi()
{
stop();
while(1);
}
main.c
/* 说明:
(灯亮白0) (灯灭红1)
*/
#include<reg52.h>
#include<che.h>
//void UsartConfiguration() //串口中断,进行房间选择
//{
// SCON=0X50;
// TMOD=0X21;
// PCON=0X00;
// TH1=0XFd; //波特率9600
// TL1=0XFd;
// TR1=1;
// ET1=1;
// ES = 1;
// EA = 1;
//}
//void Com_Int(void) interrupt 4
//{
// if(RI == 1)
// {
// RI = 0;
// left_motor_stops;
// right_motor_stops;
// receive_data = SBUF; //接收的房间号选择信息
// }
//}
void delay(uint z);
void forward();
void left_run();
void right_run();
void backward();
void stop();
void turn_roud();
void forward();
void go_back();
void go_straight();
void chesi();
void congif_T0();
uchar PWM_T = 0; //周期
uchar PWM_left_val = 60;//左电机占空比值 取值范围 95
uchar PWM_right_val = 60;//右电机占空比值取值范围 95
uchar receive_data;
uchar flag_go = 0;
uchar flag_back = 0;
void congif_T0()
{
TMOD = 0X01;
EA = 1;
TL0 = 0x33;
TH0 = 0xFE;
TR0 = 1;
ET0 = 1;
}
void main()
{
//加串口
// UsartConfiguration();
congif_T0();//pwm调速
while(1)
{
if(L1 == 0&&L2 == 0&& L3== 1) //OO1=1号房间
{
while(pj== 0)
// while((uchar)L_led2 + (uchar)L_led1+ (uchar)R_led1 + (uchar)R_led2 <= 3)
{
go_straight();
}
if(pj==1)
// if((uchar)L_led2 + (uchar)L_led1+ (uchar)R_led1 + (uchar)R_led2 >= 3)
{
left_run();
delay(600);
while(M_led0==0)
// while(R_led1 = 0)
{
left_run();
}
while(1)
{
go_straight();
if(pj==1)
// if((uchar)L_led2 + (uchar)L_led1+ (uchar)R_led1 + (uchar)R_led2 >= 3)
{
stop();
delay(3000);
backward();
delay(200);
while(pj== 0)
// while((uchar)L2_led2 + (uchar)L2_led1+ (uchar)R2_led1 + (uchar)R2_led2 <= 3)
{
go_back();
}
if(pj==1)
// if((uchar)L2_led2 + (uchar)L2_led1+ (uchar)R2_led1 + (uchar)R2_led2 >= 3)
{
right_run();
delay(600);
while(M_led0==0)
// while((uchar)L2_led1 != 1)
{
right_run();
}
while(1)
{
// backward();
// delay(100);
// while(pj== 0)
while((uchar)L2_led2 + (uchar)L2_led1+ (uchar)R2_led1 + (uchar)R2_led2 <= 3)
// {
go_back();
// }
if(pj==1)
// if((uchar)L2_led2 + (uchar)R2_led2 >= 2 &&(uchar)L2_led2 + (uchar)L2_led1+ (uchar)R2_led1 + (uchar)R2_led2 >= 3)
{
stop();
delay(1000);
while(1);
}
}
}
}
}
}
}
//房3
if(L1 == 0&&L2 == 1&& L3== 1) //011=3
{
while(pj== 0)
// while((uchar)L_led2 + (uchar)L_led1+ (uchar)R_led1 + (uchar)R_led2 <= 3)
{
go_straight();
}
if(pj==1)
// if((uchar)L_led2 + (uchar)L_led1+ (uchar)R_led1 + (uchar)R_led2 >= 3)
{
flag_go++;
forward();
delay(300);
backward();
delay(50);
stop();
delay(500);
}
if(flag_go == 2)
{
backward();
delay(50);
left_run();
delay(400);
while(M_led0==0)
// while((uchar)R_led1 != 1)
{
left_run();
}
while(1)
{
go_straight();
if(pj==1)
// if((uchar)L_led2 + (uchar)L_led1+ (uchar)R_led1 + (uchar)R_led2 >= 3)
{
stop();
delay(3000);
backward();
delay(200);
while(pj== 0)
// while((uchar)L2_led2 + (uchar)L2_led1+ (uchar)R2_led1 + (uchar)R2_led2 <= 3)
{
go_back();
}
if(pj==1)
// if((uchar)L2_led2 + (uchar)L2_led1+ (uchar)R2_led1 + (uchar)R2_led2 >= 3)
{
backward();
delay(40);
right_run();
delay(400);
while(M_led0==0)
// while((uchar)L2_led1 != 1)
{
right_run();
}
while(1)
{
// backward();
// delay(100);
// while((uchar)L2_led2 + (uchar)L2_led1+ (uchar)R2_led1 + (uchar)R2_led2 <= 3)
// {
go_back();
// }
if(pj==1)
// if((uchar)L2_led2 + (uchar)L2_led1+ (uchar)R2_led1 + (uchar)R2_led2 >= 3)
{
flag_back++;
stop();
delay(500);
}
if(flag_back==2)
{
stop();
while(1);
}
}
}
}
}
}
}
//房5
if(L1 == 1&&L2 == 0&& L3== 1)//101=5
{
while(pj== 0)
// while((uchar)L_led2 + (uchar)L_led1+ (uchar)R_led1 + (uchar)R_led2 <= 3)
{
go_straight();
}
if(pj==1)
// if((uchar)L_led2 + (uchar)L_led1+ (uchar)R_led1 + (uchar)R_led2 >= 3)
{
flag_go++;
// backward();
// delay(50);
stop();
delay(500);
}
if(flag_go == 3)
{
// backward();
// delay(50);
left_run();
delay(400);
while(M_led0==0)
// while((uchar)R_led1 != 1)
{
left_run();
}
while(1)
{
go_straight();
if(pj==1)
// if((uchar)L_led2 + (uchar)L_led1+ (uchar)R_led1 + (uchar)R_led2 >= 3)
{
backward();
delay(50);
left_run();
delay(500);
while(M_led0==0)
// while((uchar)R_led1 != 1)
{
left_run();
}
while(1)
{
go_straight();
if(pj==1)
// if((uchar)L_led2 + (uchar)L_led1+ (uchar)R_led1 + (uchar)R_led2 >= 3)
{
stop();
delay(3000);
backward();
delay(200);
while(pj== 0)
// while((uchar)R2_led2 != 1)
{
go_back();
}
if(pj==1)
// if((uchar)R2_led1 + (uchar)R2_led2 >= 2)
{
// backward();
// delay(40);
right_run();
delay(400);
while(M_led0==0)
// while((uchar)L2_led1 != 1)
{
right_run();
}
while(1)
{
// backward();
// delay(100);
// while((uchar)R2_led2 != 1)
// {
go_back();
// }
if(pj==1)
// if((uchar)R2_led1 + (uchar)R2_led2 >= 2 )
{
// backward();
// delay(50);
right_run();
delay(400);
while(M_led0==0)
// while((uchar)L2_led1 != 1)
{
right_run();
}
while(1)
{
// while((uchar)L2_led2 + (uchar)L2_led1+ (uchar)R2_led1 + (uchar)R2_led2 <= 3)
// {
go_back();
// }
if(pj==1)
// if((uchar)L2_led2 + (uchar)L2_led1+ (uchar)R2_led1 + (uchar)R2_led2 >= 3)
{
flag_back++;
stop();
delay(500);
}
if(flag_back == 3)
{
stop();
while(1);
}
}
}
}
}
}
}
}
}
}
}
}
}
// }
// }
//}
void intter0() interrupt 1
{
TL0 = 0x33;
TH0 = 0xFE;
// TF0 = 0;
PWM_T++;
if(PWM_T == 100)
{PWM_T = 0;}
if(PWM_T <= PWM_left_val)
{
left_motor_en;
}else{left_motor_dis;}
if(PWM_T <= PWM_right_val)
{
right_motor_en;
}else{ right_motor_dis;}
}