2021电赛F题寻迹(课程设计)51代码

在这里插入图片描述
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;}
		
}

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值