基于51系列单片机的(循迹、避障、蓝牙)智能小车(3)源代码

电机模块

motor.h

#ifndef  __MOTOR_H__
#define  __MOTOR_H__
#include <reg52.h>

extern void car_go_ahead(void);
extern void car_go_back(void);
extern void car_go_stop(void);
extern void car_stay_left(void);
extern void car_stay_right(void);
#endif

motor.c

#include "motor.h"

sbit left_advance = P0^0;
sbit left_back = P0^1;
sbit right_advance = P0^2;
sbit right_back = P0^3;

unsigned char pwm_left_val ;//左电机占空比值
unsigned char pwm_right_val ;//右电机占空比值
unsigned char pwm_t=0;//周期计数变量
unsigned char left_en=0;
unsigned char right_en=0;

//定时器0中断
void timer0() interrupt 1
{
  TH0=(65526-100)/256;
  TL0=(65526-100)%256;
	pwm_t++;
	if(pwm_t==100) //将一个周期分成100份
		pwm_t=left_en=right_en=0;
	if(pwm_left_val==pwm_t)//达到pwm_left_val后开启左使能开关
		left_en = 1;		
	if(pwm_right_val==pwm_t)//达到pwm_left_val后开启右使能开关
		right_en = 1;			 
}

void car_go_ahead(void)
{
	pwm_left_val=1;
	pwm_right_val=1;
	
	if(left_en==1)
	{
		left_advance=1; //左电机前进
		left_back=0;	
	}
	else 
	{
		left_advance=1; //左电机前进
		left_back=1;	
	}		
	
	if(right_en==1)
	{
		right_advance=1; //右电机前进
		right_back=0;
	}
	else
	{
		right_advance=1; //右电机前进
		right_back=1;
	}

}
void car_go_back(void)
{
	pwm_left_val=1;
	pwm_right_val=1;
	
	if(left_en==1)
	{
		left_advance=0; //左电机前进
		left_back=1;	
	}
	else 
	{
		left_advance=1; //左电机前进
		left_back=1;	
	}		
	
	if(right_en==1)
	{
		right_advance=0; //右电机前进
		right_back=1;
	}
	else
	{
		right_advance=1; //右电机前进
		right_back=1;
	}
}
void car_go_stop(void)
{
	left_advance = 1;
	left_back = 1;
	right_advance = 1;
	right_back = 1;
}
void car_stay_left(void)
{
	pwm_left_val=80;
	pwm_right_val=10;
	
	if(left_en==1)
	{
		left_advance=1; //左电机前进
		left_back=0;	
	}
	else 
	{
		left_advance=1; //左电机前进
		left_back=1;	
	}		
	
	if(right_en==1)
	{
		right_advance=1; //右电机前进
		right_back=0;
	}
	else
	{
		right_advance=1; //右电机前进
		right_back=1;
	}
}
void car_stay_right(void)
{
	pwm_left_val=10;
	pwm_right_val=80;
	
	if(left_en==1)
	{
		left_advance=1; //左电机前进
		left_back=0;	
	}
	else 
	{
		left_advance=1; //左电机前进
		left_back=1;	
	}		
	
	if(right_en==1)
	{
		right_advance=1; //右电机前进
		right_back=0;
	}
	else
	{
		right_advance=1; //右电机前进
		right_back=1;
	}
}

循迹避障模块

infarced.h

#ifndef  __INFRARED_H__
#define  __INFRARED_H__
extern void search_path(void);
extern void auto_avoid(void);
#endif

infarced.c

#include <reg52.h>
#include "motor.h"
#include "delay.h"
sbit IN1=P0^4;//避障左
sbit IN2=P0^5;//循迹左
sbit IN3=P0^6;//循迹右
sbit IN4=P0^7;//避障右

void search_path(void)
{
	while(1)
	{
		if(IN2==0 && IN3==0)//左右探头都没有在黑线中==>前进
		{
			car_go_ahead();
		}
		else if(IN2==1 && IN3==1)//左右探头都在黑线中 ==>停止
		{
			car_go_stop();
		}
		else if(IN2==1 && IN3==0)//左探头在黑线中,右探头没有在黑线	==> 原地左转
		{
			car_stay_left();
		}
		else if(IN2==0 && IN3==1) //有探头在黑线中,左探头没有在黑线中 ==> 原地右转
		{
			car_stay_right();
		}	
	}                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
}

void auto_avoid(void)
{
	while(1)
	{
		if(IN1==1 && IN4==1)//左右探头都没有检测到障碍物 ==> 前进
		{
			car_go_ahead();
		}
		else if(IN1==0 && IN4==1)//左探头检测到障碍物,右探头没有检测到障碍物
		{
			car_go_back();
			delay_ms(1500);
			car_stay_right();
			delay_ms(1500);
		}
		else if(IN1==1 && IN4==0)//右探头检测到障碍物,左探头没有检测到障碍物
		{
			car_go_back();
			delay_ms(1500);
			car_stay_left();
			delay_ms(1500);
		}
		else if(IN1==0 && IN4==0)//左右探头都有障碍物, ==> 掉头
		{
			car_go_back();
			delay_ms(1500);
			car_stay_left();
			delay_ms(2000);
		}

	}
}

蓝牙串口模块

uart.h

#ifndef  __UART_H__
#define  __UART_H__
extern void uart_init(void);
extern void uart_SendBytes(unsigned char *sendbuf,int n);
extern void remote_control(void);
#endif

uart.c

#include <reg52.h>
#include "motor.h"
unsigned char recvbuf='0';
/*
	@brief uart_init: 串口的初始化函数
	@param:           None
	@retval:          None
*/
void uart_init(void)
{
	SCON=0X50;			//设置为工作方式1
	TMOD=0X20;			//设置计数器工作方式2
	TH1=0XFD;		    //计数器初始值设置,注意波特率是9600的
	TL1=0XFD;
	ES=1;				//打开接收中断
	EA=1;				//打开总中断
	TR1=1;			    //打开计数器
}

/*
	@brief uart_isr: 串口的中断处理函数
	@param:           None
	@retval:          None
*/
void uart_isr(void)  interrupt  4  //外0 定0 外1 定1 串
{
	 if(RI == 1) //由来数据触发中断
	 {
	 	RI = 0;//硬件置1,软件清零
		recvbuf = SBUF;//此处对SBUF进行的是读操作,因此是接收缓冲区
		if(recvbuf == 'A')
		{
			P1 = 0x00;//把LED灯点亮
		}
		else if(recvbuf == 'B')
		{
			P1 = 0xFF;//把LED灯熄灭
		}
	 }
}

void uart_SendBytes(unsigned char *sendbuf, int n)
{
	 int i;
	 for(i=0;i<n;i++)
	 {
	 	SBUF = sendbuf[i];//此处对SBUF进行的是写操作,因此是发送缓冲区
		while(TI == 0);//等待数据发送完成
		TI = 0;//硬件置1,软件清零
	 }
}

void remote_control(void)
{
	while(1)
	{
		switch(recvbuf)
		{
			case '1': 
				car_go_ahead();break;
			case '0':
				car_go_stop();break;
			case '2':
				car_go_back();break;
			case '3':
				car_stay_left();break;
			case '4':
				car_stay_right();break;
		}
	}
}

所有源代码已分享完,项目简单,对嵌入式入门有挺多帮助,有问题可留言评论。

  • 22
    点赞
  • 200
    收藏
    觉得还不错? 一键收藏
  • 20
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值