标题:
基于STM32的智能循迹小车源程序
[打印本页]
作者:
第几秒
时间:
2017-7-28 14:33
标题:
基于STM32的智能循迹小车源程序
基于STM32的智能循迹小车源程序,希望对大家有参考价值!
单片机源程序如下:
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "stm32f10x_tim.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_flash.h"
#include "stm32f10x_exti.h"
#include "stm32f10x_it.h"
#include "systick.h"
#include "misc.h"
#include "stm32f10x_it.h"
//#define infra1 GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_7);
//#define infra2 GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_9);
#define tube1 GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_9);
#define tube2 GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_11);
#define tube3 GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_13);
#define tube4 GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_15);
extern FlagStatus Status;
u8 flag=0;
extern u16 TIM1Compare1[2] = {0x0,0x3FFF};
extern u16 TIM1Compare2[3] = {0x7100,0x7000,0x3fff};
extern u16 TIM1Compare3[2] = {0x0,0x3FFF};
extern u16 TIM1Compare4[3] = {0x7400,0x8FFF,0x3FFF};
extern u16 tubecnt=0;
extern u16 juli;
void GPIO_Configuration(void);
void TIM_Configuration(void);
void RCC_Configuration(void);
void NVIC_Configuration(void);
void stop__(void);
void zhi_fast(void);
void zhi(void);
void zhi_slow(void);
void zhi_wait(void);
void zuoxiao(void);
void zuoda(void);
void zuodada(void);
void youxiao(void);
void youda(void);
void xunji_qian(void);
void xunji_hou(void);
void xunji_dan(void);
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM1_OCInitStructure;
int main(void)
{
RCC_Configuration();
GPIO_Configuration();
TIM_Configuration();
NVIC_Configuration();
delay_init();
while(1)
{
if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_10)==1)
{
if(flag==0)
xunji_hou();
if(flag==1)
xunji_qian();
}
if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_10)==0) xunji_dan();
}
}
/*TIM2 TIM3 的中断优先级*/
void NVIC_Configuration(void)
{
#ifdef VECT_TAB_RAM
/* Set the Vector Table base location at 0x20000000 */
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else /* VECT_TAB_FLASH */
/* Set the Vector Table base location at 0x08000000 */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannel =TIM2_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel =TIM3_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
#endif
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*TIM1 PWM 输出:A8:CH1 / A9:CH2 / A10:CH2 / A11:CH4 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/*LED显示:LED5:PE15 / LED6:PB11 / LED7:PE14 / LED8:PB10 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_10);
GPIO_SetBits(GPIOB,GPIO_Pin_11);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_SetBits(GPIOE,GPIO_Pin_14);
GPIO_SetBits(GPIOE,GPIO_Pin_15);
/*红外管:infra1-> PC7, infra2-> PC8 浮空输入 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOC, &GPIO_InitStructure);
// GPIO_ResetBits(GPIOC,GPIO_Pin_7);
// GPIO_ResetBits(GPIOC,GPIO_Pin_8);
/*光电管:tube1-> PD9, tube2-> PD11, tube3-> PD13, tube4-> PD15 浮空输入*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1|GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOD, &GPIO_InitStructure);
/*超声波:TX->PB9 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_ResetBits( GPIOB, GPIO_Pin_9);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //PB8接受采集上升沿 PB6低电平
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_SetBits(GPIOE,GPIO_Pin_10);
}
void TIM_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM1_TimeBaseStructure;
TIM_OCInitTypeDef TIM1_OCInitStructure;
TIM_DeInit(TIM1);
/* Time Base configuration */
TIM1_TimeBaseStructure.TIM_Prescaler = 0x0; //设置了用来作为TIMx时钟频率除数的预分频值
TIM1_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //选择了计数器模式
TIM1_TimeBaseStructure.TIM_Period = 0xFFFF; //设置了在下一个更新事件装入活动的自动重装载寄存器周期 ARR
TIM1_TimeBaseStructure.TIM_ClockDivision = 0x0; //设置了时钟分割
TIM1_TimeBaseStructure.TIM_RepetitionCounter = 0x0; //设置了周期计数器值
TIM_TimeBaseInit(TIM1,&TIM1_TimeBaseStructure);//根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位(5个参数)
//TIM1基本计数器设置(设置PWM频率) //频率=TIM1_CLK/(ARR+1)
/* Channel 1, 2,3 and 4 Configuration in PWM mode */
TIM1_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
TIM1_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM1_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
TIM1_OCInitStructure.TIM_Pulse = 0x0;
TIM1_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
TIM1_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;
TIM1_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
TIM1_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
TIM_OC1Init(TIM1,&TIM1_OCInitStructure); //同TimeBaseStructure (8个参数) //TIM1_OC1模块设置(设置1通道占空比)
TIM1_OCInitStructure.TIM_Pulse = 0x7fff;
TIM_OC2Init(TIM1,&TIM1_OCInitStructure); //同TimeBaseStructure
TIM1_OCInitStructure.TIM_Pulse = 0x0;
TIM_OC3Init(TIM1,&TIM1_OCInitStructure); //同TimeBaseStructure
TIM1_OCInitStructure.TIM_Pulse = 0x7fff;
TIM_OC4Init(TIM1,&TIM1_OCInitStructure); //同TimeBaseStructure
TIM_Cmd(TIM1,ENABLE); //先设置好了TimeBase、OC、BDTR 使能或者失能TIM1外设
TIM_CtrlPWMOutputs(TIM1,DISABLE); //TIM1_CtrlPWMOutputs(ENABLE); 使能或者失能TIM1的主输出
/*超声波 TIM2 TIM3*/
TIM_DeInit(TIM2);
TIM_TimeBaseStructure.TIM_Period=72-1;
TIM_TimeBaseStructure.TIM_Prescaler=15-1;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, & TIM_TimeBaseStructure);
TIM_ClearFlag(TIM2,TIM_FLAG_Update);
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
TIM_Cmd(TIM2,DISABLE);
TIM_DeInit(TIM3);
TIM_TimeBaseStructure.TIM_Prescaler =72-1; //设置了用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //选择了计数器模式
TIM_TimeBaseStructure.TIM_Period = 20-1; //设置了15us在下一个更新事件装入活动的自动重装载寄存器周期 ARR
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ; //设置了时钟分割
TIM_TimeBaseInit(TIM3, & TIM_TimeBaseStructure);
TIM_ClearFlag(TIM3,TIM_FLAG_Update);
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
TIM_Cmd(TIM3,DISABLE);
}
void stop__(void) //直走速度正常
{
TIM_SetCompare1(TIM1,0);
TIM_SetCompare2(TIM1,0);
TIM_SetCompare3(TIM1,0);
TIM_SetCompare4(TIM1,0);
TIM_CtrlPWMOutputs(TIM1,ENABLE);
}
void zhi(void) //直走速度正常
{
TIM_SetCompare1(TIM1,TIM1Compare1[0]);
TIM_SetCompare2(TIM1,TIM1Compare2[0]);
TIM_SetCompare3(TIM1,TIM1Compare3[0]);
TIM_SetCompare4(TIM1,TIM1Compare4[0]);
TIM_CtrlPWMOutputs(TIM1,ENABLE);
}
void zhi_fast(void) //直走速度快
{
TIM_SetCompare1(TIM1,TIM1Compare1[0]);
TIM_SetCompare2(TIM1,TIM1Compare2[1]);
TIM_SetCompare3(TIM1,TIM1Compare3[0]);
TIM_SetCompare4(TIM1,TIM1Compare4[1]);
TIM_CtrlPWMOutputs(TIM1,ENABLE);
}
void zhi_slow(void) //直走速度慢
{
TIM_SetCompare1(TIM1,TIM1Compare1[0]);
TIM_SetCompare2(TIM1,TIM1Compare2[2]);
TIM_SetCompare3(TIM1,TIM1Compare3[0]);
TIM_SetCompare4(TIM1,TIM1Compare4[2]);
TIM_CtrlPWMOutputs(TIM1,ENABLE);
}
void zhi_wait(void) //直走_deng
{
TIM_SetCompare1(TIM1,TIM1Compare1[0]);
TIM_SetCompare2(TIM1,0x38ff);
TIM_SetCompare3(TIM1,TIM1Compare3[0]);
TIM_SetCompare4(TIM1,0x38ff);
TIM_CtrlPWMOutputs(TIM1,ENABLE);
}
void zuoxiao(void) //左小转
{
TIM_SetCompare1(TIM1,0);
TIM_SetCompare2(TIM1,0x0);
TIM_SetCompare3(TIM1,0);
TIM_SetCompare4(TIM1,0xdfff);
TIM_CtrlPWMOutputs(TIM1,ENABLE);
}
void zuoda(void) //左大转
{
TIM_SetCompare1(TIM1,0);
TIM_SetCompare2(TIM1,0);
TIM_SetCompare3(TIM1,0);
TIM_SetCompare4(TIM1,0xffff);
TIM_CtrlPWMOutputs(TIM1,ENABLE);
}
void zuodada(void)
{
TIM_SetCompare1(TIM1,0x5fff);
TIM_SetCompare2(TIM1,0);
TIM_SetCompare3(TIM1,0);
TIM_SetCompare4(TIM1,0xffff);
TIM_CtrlPWMOutputs(TIM1,ENABLE);
}
void youxiao(void) //右小转
{
TIM_SetCompare1(TIM1,TIM1Compare1[0]);
TIM_SetCompare2(TIM1,TIM1Compare2[0]);
TIM_SetCompare3(TIM1,TIM1Compare3[0]);
TIM_SetCompare4(TIM1,0x0);
TIM_CtrlPWMOutputs(TIM1,ENABLE);
}
void youda(void) //右大转
{
TIM_SetCompare1(TIM1,0);
TIM_SetCompare2(TIM1,0xffff);
TIM_SetCompare3(TIM1,0);
TIM_SetCompare4(TIM1,0);
TIM_CtrlPWMOutputs(TIM1,ENABLE);
}
void youdada(void) //右大转
{
TIM_SetCompare1(TIM1,0);
TIM_SetCompare2(TIM1,0xffff);
TIM_SetCompare3(TIM1,0x5fff);
TIM_SetCompare4(TIM1,0);
TIM_CtrlPWMOutputs(TIM1,ENABLE);
}
void xunji_dan(void)
{
if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_13)==1)
{
delay_us(500);
if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_13)==1)
{
tubecnt++;
if(tubecnt==1)
{
zhi();delay_ms(150);
}
if(tubecnt==2||tubecnt==3||tubecnt==4)
{
zhi();
delay_ms(650);
zuodada();
delay_ms(250);
}
if(tubecnt==5)
{
zhi();
delay_ms(650);
zuodada();
delay_ms(300);
tubecnt=0;
}
}
return;
}
if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_7)==0&&GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_9)==0)
{zhi();return;}
if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_7)==1&&GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_9)==1)
{zhi();return;}
if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_7)==1)
{youda();return;}
if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_9)==1)
{ zuoda();return;}
}
void xunji_qian(void) //循迹
{
if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_13)==1)
{
delay_us(500);
if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_13)==1)
{
tubecnt++;
if(tubecnt==1)
{
zhi();delay_ms(150);
}
if(tubecnt==2||tubecnt==3)
{
zhi();
delay_ms(400);
zuodada();
delay_ms(270);
}
if(tubecnt==4)
{
zhi();
delay_ms(580);
zuodada();
delay_ms(360);
zhi();delay_ms(600);
zhi_slow(); /*delay_ms(65535);
zhi_slow(); delay_ms(65535);
zhi_slow(); delay_ms(20000);*/
while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_9)==1);
delay_ms(10);
zhi();delay_ms(100);
}
if(tubecnt==5)
{
zhi();
delay_ms(350);
zuoda();
delay_ms(800);
tubecnt=0;
flag=0;
}
}
return;
}
if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_7)==0&&GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_9)==0)
{zhi();return;}
if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_7)==1&&GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_9)==1)
{zhi();return;}
if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_7)==1)
{youxiao();return;}
if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_9)==1)
{ zuoxiao();return;}
}
void xunji_hou(void) //循迹
{
if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_9)==0)
{
stop__();
while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_9)==0);
}
if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_13)==1)
{
delay_us(500);
if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_13)==1)
{
tubecnt++;
if(tubecnt==1)
{
zhi();delay_ms(150);
}
if(tubecnt==2||tubecnt==3)
{
zhi();
delay_ms(500);
zuodada();
delay_ms(300);
}
if(tubecnt==4)
{
zhi();delay_ms(430);
// while((GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_9)==0||GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_7)==0))
zuodada();delay_ms(240);
zhi();delay_ms(360);
while(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_9)==0);
zuodada();delay_ms(300);
zhi();delay_ms(800);
while(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_7)==0);
youdada();delay_ms(360);
zhi();delay_ms(800);
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
STM32_小车_乙_Last.rar
(214.1 KB, 下载次数: 465)
2017-7-28 16:57 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
only墨麟
时间:
2017-9-27 23:04
谢谢啦,刚好缺少这个
作者:
only墨麟
时间:
2017-9-27 23:05
谢谢啦,刚好缺少这个
作者:
1879397372
时间:
2017-11-20 20:01
黑币不够~~~~
作者:
yuexudong
时间:
2017-11-22 21:30
太棒了
作者:
wyt1456178707
时间:
2017-12-1 00:08
我用的是stm32f103vet6 keil5 ST-link,要怎么 修改 我是新手 求大神指点
作者:
jiange666
时间:
2017-12-21 11:23
找到想要的了,谢谢楼主
作者:
333333331
时间:
2018-3-7 08:27
楼主,请问这个程序适合用神州2号开发板吗
作者:
abc729003380
时间:
2018-4-11 22:08
黑币不够
作者:
abc729003380
时间:
2018-4-12 18:48
黑币不够了
作者:
))@::
时间:
2018-5-2 23:27
哇哇,想要这个丫丫丫
作者:
dazuo0845
时间:
2018-5-28 20:22
感谢分享
作者:
1005045175
时间:
2018-6-6 20:36
哇哇哇谢谢楼主
作者:
吉布森
时间:
2018-7-17 15:06
楼主厉害
作者:
joindp
时间:
2018-10-5 17:54
很给力
作者:
szyinbo
时间:
2018-10-7 07:56
感谢分享
作者:
137434741
时间:
2018-10-10 14:01
赞一个,超给力,正好借鉴一下
作者:
不懂装懂
时间:
2018-10-22 20:27
厉害啊,大神求带
作者:
TT3721
时间:
2018-11-23 09:50
正好缺这个程序
作者:
乌木喉
时间:
2018-11-27 18:19
请问下载之后是需要按顺序烧进单片机吗,第一次做这个东西,不太懂,求大佬
作者:
xqiang
时间:
2018-12-18 16:38
谢谢啦,刚好缺少这个
作者:
qipverome
时间:
2018-12-19 20:04
谢谢分享。
作者:
jetty-9
时间:
2018-12-26 19:01
盗别人的有意思?
作者:
yahuiwang
时间:
2019-1-8 10:07
真心的不错,,,,,谢谢分享
作者:
hbpu
时间:
2019-1-10 20:25
感觉挺有用的
作者:
ikon路
时间:
2019-1-14 10:49
我要下载啊啊啊啊啊。。。。
作者:
帝无心223
时间:
2019-2-16 22:19
赞一个
作者:
1907436340
时间:
2019-3-11 20:02
给力 赞
作者:
jieggee
时间:
2019-4-2 19:33
想要下载可是限于黑币不够啊
作者:
jianing2007
时间:
2019-7-5 09:21
谢谢LZ,正好在学习这个,下载来学习学习。
作者:
jianing2007
时间:
2019-7-5 09:30
已下载,正好是想要的。谢谢LZ
作者:
Curry1
时间:
2019-7-24 13:58
怎么27个error
作者:
Curry1
时间:
2019-7-24 14:08
27error,怎么没有 core_cm3.h ,求大神指点
作者:
lxgdd
时间:
2019-11-30 10:53
大佬,真N
作者:
不つ你不恨
时间:
2019-12-5 16:40
学习了
作者:
zcadqe2453
时间:
2019-12-23 10:27
可以的
作者:
知行合一1992
时间:
2020-2-12 17:08
请问单片机是什么型号的
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1