作者声明:
作者笔名为:北风
作者QQ号为:2547903457
作者个人简介1:现为大二的一名普通学生,祝自己努力加油!!!!
作者个人简介2:因作者初学,能力有限,部分代码并不精简,可根据自身能力进行更改;
作品简介1:
本车为四驱小车,现在具有的功能:蓝牙、语音、寻光、巡线、避障。通过上行蓝牙或语音模块来控制下行车辆行驶(前进、后退、左转、右转、原地左转、原地右转)以及三个功能(寻光、巡线、避障)。
作品简介2:
本车用到一个stm32f103rct6作为主控板、两块tb6612集成的电机驱动板D24A、
四个带编码器的电机(但没用到编码器)、一个电源模块(12V转3.3/5/12V)、一个四路红外巡线模块、
一个舵机模块SG90、一个超声波测距避障模块HC-SR04、三个光敏电阻传感器模块、一个天问语音模块、
两块电池(一块12V)、两块板子(电机在中间)、几个雪糕棒(用来向外扩展四路巡线模块)、杜邦线若干
作者提示1:
本车程序代码的绝大部分注释均为作者本人所写。
主函数main.c
#include "stm32f10x.h"
#include "system.h"
#include "Delay.h"
#include "moto.h"
#include "pwm.h"
#include "Car.h"
#include "Serial.h"
#include "Timer1.h"
#include "Ultrasound.h"
#include "Track.h"
#include "usart3.h"
#include "Light.h"
#include "Timer2.h"
uint16_t Data1;
extern u16 flag_send;
extern u8 com_data;
/*******************************************************************************************
作者声明:
作者笔名为:北风
作者QQ号为:2547903457
作者个人简介1:现为大二的一名普通学生,祝自己努力加油!!!!
作者个人简介2:因作者初学,能力有限,部分代码并不精简,可根据自身能力进行更改;
作品简介1:
本车为四驱小车,现在具有的功能:蓝牙、语音、寻光、巡线、避障。通过上行蓝牙或语音模块来控制
下行车辆行驶(前进、后退、左转、右转、原地左转、原地右转)以及三个功能(寻光、巡线、避障)。
作品简介2:
本车用到一个stm32f103rct6作为主控板、两块tb6612集成的电机驱动板D24A、
四个带编码器的电机(但没用到编码器)、一个电源模块(12V转3.3/5/12V)、一个四路红外巡线模块、
一个舵机模块SG90、一个超声波测距避障模块HC-SR04、三个光敏电阻传感器模块、一个天问语音模块、
两块电池(一块12V)、两块板子(电机在中间)、几个雪糕棒(用来向外扩展四路巡线模块)、杜邦线若干
作者提示1:
本车程序代码的绝大部分注释均为作者本人所写。
********************************************************************************************/
int main() //语音控制(三个功能1.寻光功能 xunguang(); 2.巡线功能 xunxian(); 3.避障功能 bizhang();)
{ //int main()的上花括号
SystemInit(); //配置系统时钟为72M
delay_init(); //延时函数初始化
moto_Init(); //初始化gpioB pin_0/1/8/9/12/13/14/15
TIM4PWM_Init(); //初始化设置舵机转向 右边为0度 0°对应500 90°对应1500 180°对应2500
Car_Init(); //初始化车辆行驶方向
Light_Init(); //初始化寻光模块
Track_Init(); //初始化巡线模块
Ultrasound_Init(); //初始化避障模块
USART3_Init(); //初始化语音模块(语音模块用到串口3)
Serial_Init(); //初始化蓝牙模块(蓝牙模块用到串口1)
PWM_Int(0,0); //初始化电机模块(此车为四驱,定时器五的四个通道都用了)
while(1) //循环上花括号(设计的是通过蓝牙或语音来切换功能)
{ //(三个功能1.寻光功能 xunguang(); 2.巡线功能 xunxian(); 3.避障功能 bizhang();)
if(Data1 == 0x37)xunguang(); //蓝牙模式下的寻光模式
if(Data1 == 0x38)xunxian(); //蓝牙模式下的巡线模式
if(Data1 == 0x39)bizhang(); //蓝牙模式下的避障模式
if(com_data == 0x37)xunguang(); //语音模式下的寻光模式
if(com_data == 0x38)xunxian(); //语音模式下的巡线模式
if(com_data == 0x39)bizhang(); //语音模式下的避障模式
} //循环下花括号
} //int main()的下花括号
/*****************************************************************************************************
下方函数功能 :通过蓝牙或语音控制车辆的前进、后退、左转、右转、原地左转、原地右转。
作者提示1:通过调用USART_ClearITPendingBit函数,可以将接收中断挂起位清零,以便下一次接收中断能够正常触发。
作者提示2:USART_ClearFlag(USART3,USART_FLAG_RXNE);同理一样的作用。
******************************************************************************************************/
void USART1_IRQHandler(void) //蓝牙模块(蓝牙模块用到串口1)串口1中断服务程序
{
if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
{
Data1=USART_ReceiveData(USART1);
if(Data1 == 0x30)Car_Stop(); //停车函数可鼠标右键跳转查看
if(Data1 == 0x31)Go_Ahead(); //前进函数可鼠标右键跳转查看
if(Data1 == 0x32)Go_Back(); //后退函数可鼠标右键跳转查看
if(Data1 == 0x33)Turn_Left(); //左转函数可鼠标右键跳转查看
if(Data1 == 0x34)Turn_Right(); //右转函数可鼠标右键跳转查看
if(Data1 == 0x35)Self_Left(); //原地左转函数可鼠标右键跳转查看
if(Data1 == 0x36)Self_Right(); //原地右转函数可鼠标右键跳转查看
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
}
}
void USART3_IRQHandler(void) //语音模块(语音模块用到串口3)串口3中断服务程序
{
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
{
USART_ClearFlag(USART3,USART_FLAG_RXNE);
com_data = USART3->DR;
if(com_data == 0x30)Car_Stop();
if(com_data == 0x31)Go_Ahead();
if(com_data == 0x32)Go_Back();
if(com_data == 0x33)Turn_Left();
if(com_data == 0x34)Turn_Right();
if(com_data == 0x35)Self_Left();
if(com_data == 0x36)Self_Right();
}
}
/*******************************************************************************************
下方为各功能模块的独立代码:1.寻光功能 xunguang(); 2.巡线功能 xunxian(); 3.避障功能 bizhang();
在测试使用各功能模块时请解除对应模块的注释。
********************************************************************************************/
/*******************************************************************************************
功能模块:1.寻光功能 xunguang();
********************************************************************************************/
//int TargetVelocity=500;
//int main(void)
// {
// SystemInit(); //配置系统时钟为72M
// delay_init(); //延时函数初始化
// moto_Init(); //初始化gpioB pin_0/1/8/9/12/13/14/15
// Car_Init();
// Light_Init();
// PWM_Int(0,0);
// while(1)
// {
// xunguang();
// }
// }
/*******************************************************************************************
功能模块:2.巡线功能 xunxian();
********************************************************************************************/
//int TargetVelocity=500;
//int main(void)
//{
// SystemInit(); //配置系统时钟为72M
// delay_init(); //延时函数初始化
// moto_Init(); //初始化gpioB pin_0/1/8/9/12/13/14/15
// Car_Init();
// Track_Init();
// PWM_Int(0,0);
//
// while(1)
// {
// xunxian();
// }
//}
/*******************************************************************************************
功能模块:3.避障功能 bizhang();
********************************************************************************************/
//int TargetVelocity=500; //自动避障功能
//int main(void)
// {
// SystemInit(); //配置系统时钟为72M
// delay_init(); //延时函数初始化
// moto_Init(); //初始化gpioB pin_0/1/8/9/12/13/14/15
// TIM4PWM_Init();
// Car_Init();
// Ultrasound_Init();
// PWM_Int(0,0);
// while(1)
// {
// bizhang();
// }
//}
/*******************************************************************************************
直线巡线时绕开障碍物后继续巡线:绕开障碍物的函数(本代码实现从左侧绕过障碍物并回到直行线上)
(需按照实际情况更改)
********************************************************************************************/
// Car_Stop();
// delay_ms(240);
// Self_Left();
// delay_ms(834);
// Go_Ahead();
// delay_ms(520);
// Self_Right();
// delay_ms(750);
// Go_Ahead();
// delay_ms(800);
// Self_Right();
// delay_ms(740);
// Go_Ahead();
// delay_ms(790);
// Self_Left();
// delay_ms(380);
// Car_Stop();
// delay_ms(500);
/*******************************************************************************************
后续功能可按照自己所需功能自行添加
********************************************************************************************/
usart3.c串口3全套配置
#include "stm32f10x.h"
#include "usart3.h"
u16 flag_send=0;
u8 com_data;
u16 USART3_RX_STA=0;
/**************************************************************************
函数功能:语音配置,用到串口3,
作者提示:下方所有函数代码,b站江协科技up主都讲过
***************************************************************************/
void USART3_Init(void)
{
GPIO_InitTypeDef GPIO_InitStrue;
USART_InitTypeDef USART3_InitStrue;
NVIC_InitTypeDef NVIC_InitStrue;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
GPIO_InitStrue.GPIO_Mode = GPIO_Mode_AF_PP;//推挽输出(发射)
GPIO_InitStrue.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStrue.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStrue);
GPIO_InitStrue.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入(接收)
GPIO_InitStrue.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStrue.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStrue);
USART3_InitStrue.USART_BaudRate = 115200;
USART3_InitStrue.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART3_InitStrue.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;
USART3_InitStrue.USART_Parity = USART_Parity_No;//奇偶校验位
USART3_InitStrue.USART_StopBits = USART_StopBits_1;//停止位
USART3_InitStrue.USART_WordLength = USART_WordLength_8b;//数据位
USART_Init(USART3, &USART3_InitStrue);
USART_Cmd(USART3, ENABLE);
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//打开接收中断,当接收到数据时开启中断
NVIC_InitStrue.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStrue.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStrue.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&NVIC_InitStrue);
}
//extern u8 check_flag;
void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch)
{
/* 发送一个字节数据到 USART */
USART_SendData(pUSARTx,ch);
/* 等待发送数据寄存器为空 */
while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);
}
void Usart_SendString(USART_TypeDef* pUSARTx, char *str)
{
unsigned int k=0;
do
{
Usart_SendByte(pUSARTx, *(str + k));
k++;
}while(*(str + k) != '\0');
/* 等待发送完成 */
while (USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET)
{}
}
usart3.h串口3全套配置
#ifndef _usart3_H
#define _usart3_H
#include "system.h"
#define USART3_MAX_RECV_LEN 600 //最大接收缓存字节数
#define USART3_MAX_SEND_LEN 600 //最大发送缓存字节数
//#define USART3_RX_EN 1 //0,不接收;1,接收.
extern u8 USART3_RX_BUF[USART3_MAX_RECV_LEN]; //接收缓冲,最大USART3_MAX_RECV_LEN字节
extern u8 USART3_TX_BUF[USART3_MAX_SEND_LEN]; //发送缓冲,最大USART3_MAX_SEND_LEN字节
extern u16 USART3_RX_STA; //接收数据状态
void USART3_Init(void); //串口3初始化
void Usart_SendString(USART_TypeDef* pUSARTx, char *str);
#endif
usart3中提及的
system.c的配置
#include "system.h" //请跳转至.h文件查看注释,此模块.c文件中不需要任何代码
system.h
#ifndef _system_H
#define _system_H
#include "stm32f10x.h"
//位带操作,实现51类似的GPIO控制功能
//具体实现思想,参考<<CM3权威指南>>第五章(87页~92页).
//IO口操作宏定义
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
#define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
//IO口地址映射
#define GPIOA_ODR_Addr (GPIOA_BASE+12) //0x4001080C
#define GPIOB_ODR_Addr (GPIOB_BASE+12) //0x40010C0C
#define GPIOC_ODR_Addr (GPIOC_BASE+12) //0x4001100C
#define GPIOD_ODR_Addr (GPIOD_BASE+12) //0x4001140C
#define GPIOE_ODR_Addr (GPIOE_BASE+12) //0x4001180C
#define GPIOF_ODR_Addr (GPIOF_BASE+12) //0x40011A0C
#define GPIOG_ODR_Addr (GPIOG_BASE+12) //0x40011E0C
#define GPIOA_IDR_Addr (GPIOA_BASE+8) //0x40010808
#define GPIOB_IDR_Addr (GPIOB_BASE+8) //0x40010C08
#define GPIOC_IDR_Addr (GPIOC_BASE+8) //0x40011008
#define GPIOD_IDR_Addr (GPIOD_BASE+8) //0x40011408
#define GPIOE_IDR_Addr (GPIOE_BASE+8) //0x40011808
#define GPIOF_IDR_Addr (GPIOF_BASE+8) //0x40011A08
#define GPIOG_IDR_Addr (GPIOG_BASE+8) //0x40011E08
//IO口操作,只对单一的IO口!
//确保n的值小于16!
#define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //输出
#define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //输入
#define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n) //输出
#define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n) //输入
#define PCout(n) BIT_ADDR(GPIOC_ODR_Addr,n) //输出
#define PCin(n) BIT_ADDR(GPIOC_IDR_Addr,n) //输入
#define PDout(n) BIT_ADDR(GPIOD_ODR_Addr,n) //输出
#define PDin(n) BIT_ADDR(GPIOD_IDR_Addr,n) //输入
#define PEout(n) BIT_ADDR(GPIOE_ODR_Addr,n) //输出
#define PEin(n) BIT_ADDR(GPIOE_IDR_Addr,n) //输入
#define PFout(n) BIT_ADDR(GPIOF_ODR_Addr,n) //输出
#define PFin(n) BIT_ADDR(GPIOF_IDR_Addr,n) //输入
#define PGout(n) BIT_ADDR(GPIOG_ODR_Addr,n) //输出
#define PGin(n) BIT_ADDR(GPIOG_IDR_Addr,n) //输入
#endif
祝你学习进步!