材料
我是拼多多散买的,价格仅供参考
买整装好的可能便宜点
效果展示
蓝牙红外小车
接线
原理图如下
接好线就差不多这样,很简单,按着原理图插杜邦线就行,这里电源我是买了个DC接口分出来正负极,如果不想买直接剪掉电池的DC公头,里面就有正负极两条线,直接拿来绕上也行
代码
各个模块的函数声明,因为文件太多,我这里不一个一个放出来,完整源码已经上传
//小车驱动模块,负责小车车轮的控制
void XC_forward(void);
void XC_right(void);
void XC_left(void);
void XC_rightS(void);
void XC_leftS(void);
void XC_stop(void);
void XC_back(void);
//UART串口模块,负责接收蓝牙信号
void UART_Init(void);
void UART_SendByte(char byte);
//蓝牙控制模块
extern unsigned char BT_vel;
extern unsigned char BT_dir;
void BT_Run(void);
void BT_GetDir(unsigned char BT_dirTemp);
//红外扫描模块,负责循迹
extern unsigned char IR_pwm;
extern bit IR_over;
void IR_Scan(void);
void IR_Run(void);
//定时器0初始化
void Timer0_Init(void);
//蜂鸣器
void buzzer(unsigned int ms);
这是main.c的代码,核心思想就是用UART接收蓝牙信号,由信号决定前进方向,如果信号是6就开启循迹模式
#include <REG52.H>
#include "buzzer.h"
#include "delay.h"
#include "timer0.h"
#include "IRtrack.h"
#include "uart.h"
#include "xc.h"
#include "buletooth.h"
#define AUTOFLAG 6
void main()
{
buzzer(300);
Timer0_Init();
UART_Init();
while (1)
{
if(!IR_over&&BT_dir==AUTOFLAG)
IR_Scan();
}
}
void Timer0_Isr() interrupt 1
{
static unsigned char IR_count=0;
static unsigned char BT_count=0;
TL0 = (65535-100)%256;
TH0 = (65535-100)/256;
if (BT_dir==AUTOFLAG)
{
if(!IR_over){
IR_count++;
if(IR_count<=IR_pwm){
IR_Run();
}
else {
XC_stop();
IR_count%=101;
}
}
}
else {
BT_count++;
if(BT_count<=BT_vel){
BT_Run();
}
else {
XC_stop();
BT_count%=101;
}
}
}
void UART_Isr() interrupt 4
{
if(RI==1){
unsigned char Temp=SBUF;
if(Temp==AUTOFLAG){
IR_over=0;
}
XC_stop();
BT_GetDir(Temp);
UART_SendByte(Temp);
RI=0;
}
}