根据前面的程序http://www.51hei.com/bbs/dpj-126046-1.html 继续拓展出了加上用语音模块控制电机,主程序是执行超声波程序,当电机处于停止状态时,语音控制电机才起作用(这个问题我也不清楚为啥,看到此贴的大神可以交流交流),语音模块是用串口通讯的
单片机源程序如下:
- #include "stm32f10x.h"
- #include "interface.h"
- #include "motor.h"
- #include "sys.h"
- #include "delay.h"
- #include "LED.h"
- #include "UltrasonicWave.h"
- #include "usart.h"
- void BarrierProc(float distance_cm);
- extern u8 TIM5CH1_CAPTURE_STA; //输入捕获状态
- extern u16 TIM5CH1_CAPTURE_VAL; //输入捕获值
- int main(void)
- {
- u32 temp=0;
- float UltrasonicWave_Distance=0; //计算出的距离
-
-
- delay_init();
- GPIOCLKInit();
- RedRayInit();
- MotorInit();//必须放在TIM3_PWM_Init函数上面,因为TIM3_PWM_Init函数需要复用端口
- TIM3_PWM_Init();
-
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
- USART3_Initialise(9600); //串口初始化为9600
- uart_init(115200); //串口初始化为115200
- LED_Init(); //LED端口初始化
- UltrasonicWave_Configuration(); //对超声波模块初始化
- TIM5_Cap_Init(0XFFFF,72-1); //以1Mhz的频率计数
-
-
- while(1)
- {
- UltrasonicWave_StartMeasure();//开始测距
-
- temp=TIM5CH1_CAPTURE_STA&0X3F;
- temp*=65536;//溢出时间总和
- temp+=TIM5CH1_CAPTURE_VAL;//得到总的高电平时间
-
- //距离计算公式:距离=高电平持续时间*声速/2
- //即 距离= 高电平持续时间*340*100/(2*1000 000) = 高电平持续时间*170/10000
- UltrasonicWave_Distance=(float)temp*170/10000;
-
- printf("Distance:%f cm\r\n",UltrasonicWave_Distance);//打印总的高点平时间
-
-
-
- BarrierProc(UltrasonicWave_Distance);
-
- TIM5CH1_CAPTURE_STA=0;//开启下一次捕获
- }
- }
- void BarrierProc(float distance_cm)
- {
- if(distance_cm <= 15 && distance_cm >= 2 )
- {
- CarBack();
- }
- else if(distance_cm >= 20 && distance_cm <= 50)
- {
- CarGo();
- }
- else
- CarStop();//防震荡
- }
复制代码
所有资料51hei提供下载:
超声波魔术手+语音模块.rar
(289.41 KB, 下载次数: 32)
|