电机模块
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;
}
}
}
所有源代码已分享完,项目简单,对嵌入式入门有挺多帮助,有问题可留言评论。