
JAVA、前端、后端、嵌入式一.硬件组成主控STM32F103C8T6红外循迹模块TCRT5000超声波HC-SR04显示OLED蓝牙JDY-31TT马达L293D按键二.功能蓝牙模式可以控制小车的前、后、左、右、以及停止的动作巡线模式按照地上贴的线进行前进OLED屏幕显示当前模式和超声波测到的距离超声波巡线时如果检测到前方有障碍物就停下按键通过按键切换模式三.核心代码超声波float Senor_Using(void) { float length0,sum0; u16 tim; u8 i0; /*测5次数据计算一次平均值*/ while(i!1) { // PBout(14)1;//拉高信号作为触发信号 GPIO_SetBits(GPIO_HCSR04,TRIG_PIN); delay_us(20);//高电平信号超过10us // PBout(14)0; GPIO_ResetBits(GPIO_HCSR04,TRIG_PIN); /*等待回响信号*/ while(GPIO_ReadInputDataBit(GPIO_HCSR04,ECHO_PIN)RESET); TIM_Cmd(TIM4,ENABLE);//回响信号到来开启定时器计数 i1; //每收到一次回响信号1收到5次就计算均值 while(GPIO_ReadInputDataBit(GPIO_HCSR04,ECHO_PIN)SET);//回响信号消失 TIM_Cmd(TIM4,DISABLE);//关闭定时器 timTIM_GetCounter(TIM4);//获取计TIM2数寄存器中的计数值一边计算回响信号时间 length(timovercount*1000)/58.0;//通过回响信号计算距离 sumlengthsum; TIM4-CNT0;//将TIM2计数寄存器的计数值清零 overcount0;//中断溢出次数清零 delay_ms(3); } lengthsum; return length;//距离作为函数返回值 } length Senor_Using(); //超声波程序 OLED_ShowNum(78,6,length,4,16);//显示超声波测到的距离巡线void HW_Track() { if(zxj 0 yxj 0) { go(base_speed,base_speed); } if(zxj 1 yxj 1) { go(base_speed,base_speed); } if(zxj 1 yxj 0) { // go(base_speed change_speed,base_speed - change_speed); turn_left(base_speed,base_speed); } if(zxj 0 yxj 1) { // go(base_speed - change_speed,base_speed change_speed); turn_right(base_speed,base_speed); } }最后在main.c文件调用if (in_obstacle_avoidance_mode2) //巡线模式 { if(length 20) { HW_Track(); } else { stop(); } }if (in_obstacle_avoidance_mode3) //蓝牙模式 { if(res A) { res 0; go(80,80); } if(res B) { res 0; back(80,80); } if(res C) { res 0; turn_left(80,80); } if(res D) { res 0; turn_right(80,80); } if(res Z) { res 0; stop(); } }PSL293D和298N的代码可以共用这里选L293D的原因是以为L293D更便宜