标题:
stm32F103单片机+超声波测距模块HC-SR03+讯飞语音合成模块XFS5152代码
[打印本页]
作者:
WYSANDREW
时间:
2019-8-1 19:05
标题:
stm32F103单片机+超声波测距模块HC-SR03+讯飞语音合成模块XFS5152代码
HC-SR03:可测量2cm~4m之间的距离
stm32f103将超声波测量得到的距离信息进行处理并发送给语音合成模块
XFS5152语音合成模块对距离信息进行播报
答主自写,为电子设计竞赛做的准备
0.png
(9.32 KB, 下载次数: 51)
下载附件
2019-8-2 04:06 上传
单片机源程序如下:
/*2019-7-13 超声波测试模块 HC-SR04*/
/*2019-7-15 语音测试模块 XFS5152*/
#include "stm32f10x.h"
#include "tim2.h"
#include "Sonic.h"
#include "SysTick.h"
#include "bsp_ili9341_lcd.h"
#include "bsp_usart.h"
#include "string.h"
#include "stdio.h"
extern u32 Distance;
float str[200]; // 字符串暂存
uint8_t number_detect(uint16_t number);
char *show(uint16_t distance);
void number_apart(uint16_t number);
void my_str_cat(char *a, char *b);//实现指针中的数据连接
int a;
int b;
int c;
int main(void)
{
char *p;
char *fasong;//发送给STC单片机的结果
p="{x10bfd00080100bfaacabcc1cb4f08}";//测试语音用例
ILI9341_Init (); //LCD 初始化
LCD_SetFont(&Font8x16);
LCD_SetColors(BLUE,WHITE);
ILI9341_Clear(0,0,LCD_X_LENGTH,LCD_Y_LENGTH); /* 清屏,显示全黑 */
ILI9341_DispStringLine_EN(LINE(3)," ultrasonic rangefinder ");
SysTick_Init();
USART1_Config(); /* 初始化USART1 */
USART2_Config(); /* 初始化USART2 */
TIM2_Config(); /* 定时器TIM2初始化 */
TIM6_Init(); //TIM6 Init
Sonic_Init(); //Sonic_Init
printf("欢迎使用野火STM32开发板!\r\n");
while(1)
{
Delay_ms(1000);
/*串口显示*/
printf("The Distance is:%d cm\r\n",Distance);
/*LCD显示*/
sprintf((char *)str," DISTANCE = %3d cm ",Distance);
ILI9341_DispStringLine_EN(LINE(5),(char*)str);
fasong=show(Distance);
printf("合成结果为:%s\r\n",fasong);
Usart_SendString(USART2,fasong);
}
}
/******************* (C) COPYRIGHT 2019 *****END OF FILE************/
char* show(uint16_t distance)
{
uint8_t num;
char prefix1[100]={'{','x','1'};
char *prefixp1=prefix1;//前缀1:开始标志
char prefix2[100]={'1','4'};
char *prefixp2=prefix2; //前缀2:总帧长,默认为22
char prefix3[100]={'f','d','0','0'};
char *prefixp3=prefix3;//前缀3
char prefix4[100]={'1','1'};
char *prefixp4=prefix4; //前缀4:数据帧长,默认为19
char prefix5[100]={'0','1','0','0'};
char *prefixp5=prefix5; //前缀5
char suffix[100]="4f08}"; //后缀
char *suffixp=suffix;
char datage[100]="30"; //距离数值个位
char *datagep=datage;
char datashi[100]="31"; //距离数值十位
char *dataship=datashi;
char databai[100]="31"; //距离数值百位
char *databaip=databai;
char juli[50]="b5b1c7b0bee0c0ebceaa"; //提示1:当前距离为
char *julip=juli;
char limi[50]="c0e5c3d7"; //提示2:厘米
char *limip=limi;
char play[100]=""; //最后结果
char *playp=play;
char shi[50]="caae";
char *ship=shi; //十
char bai[50]="b0d9";
char *baip=bai; //百
num=number_detect(distance);//数据位数检测
number_apart(distance); //数据每位分离
//测试用例:{x1 06 fd 00 03 01 00 30 4f 08} 成功
//播放结果:0
printf("num=%d \r\n",num);
printf("a=%d b=%d c=%d \r\n",a,b,c);
if(num==1){
if(c==0) strcpy(datage,"30"); //数字转化成字符
else if(c==1) strcpy(datage,"31");
else if(c==2) strcpy(datage,"32");
else if(c==3) strcpy(datage,"33");
else if(c==4) strcpy(datage,"34");
else if(c==5) strcpy(datage,"35");
else if(c==6) strcpy(datage,"36");
else if(c==7) strcpy(datage,"37");
else if(c==8) strcpy(datage,"38");
else if(c==9) strcpy(datage,"39");
my_str_cat(playp,prefixp1);
my_str_cat(playp,prefixp2);
my_str_cat(playp,prefixp3);
my_str_cat(playp,prefixp4);
my_str_cat(playp,prefixp5);
my_str_cat(playp,julip);
my_str_cat(playp,datage);
my_str_cat(playp,limip);
my_str_cat(playp,suffix);
printf("得到结果为:%s\r\n",play);
printf("得到结果指针为:%s\r\n",playp);
}
else if(num==2){
strcpy(prefix2,"17");
strcpy(prefix4,"14");
if(b==1) strcpy(datashi,"31");
else if(b==2) strcpy(datashi,"32");
else if(b==3) strcpy(datashi,"33");
else if(b==4) strcpy(datashi,"34");
else if(b==5) strcpy(datashi,"35");
else if(b==6) strcpy(datashi,"36");
else if(b==7) strcpy(datashi,"37");
else if(b==8) strcpy(datashi,"38");
else if(b==9) strcpy(datashi,"39");
if(c==0){
strcpy(datage,"");
strcpy(prefix2,"16");
strcpy(prefix4,"13");
} //数字转化成字符
else if(c==1) strcpy(datage,"31");
else if(c==2) strcpy(datage,"32");
else if(c==3) strcpy(datage,"33");
else if(c==4) strcpy(datage,"34");
else if(c==5) strcpy(datage,"35");
else if(c==6) strcpy(datage,"36");
else if(c==7) strcpy(datage,"37");
else if(c==8) strcpy(datage,"38");
else if(c==9) strcpy(datage,"39");
my_str_cat(playp,prefixp1);
my_str_cat(playp,prefixp2);
my_str_cat(playp,prefixp3);
my_str_cat(playp,prefixp4);
my_str_cat(playp,prefixp5);
my_str_cat(playp,julip);
my_str_cat(playp,datashi);
my_str_cat(playp,shi);
my_str_cat(playp,datage);
my_str_cat(playp,limip);
my_str_cat(playp,suffix);
printf("得到结果为:%s\r\n",play);
printf("得到结果指针为:%s\r\n",playp);
}
else if(num==3){
strcpy(prefix2,"1a");
strcpy(prefix4,"17");
if(a==1) strcpy(databai,"31");
else if(a==2) strcpy(databai,"32");
else if(a==3) strcpy(databai,"33");
if(b==1) strcpy(datashi,"31");
else if(b==2) strcpy(datashi,"32");
else if(b==3) strcpy(datashi,"33");
else if(b==4) strcpy(datashi,"34");
else if(b==5) strcpy(datashi,"35");
else if(b==6) strcpy(datashi,"36");
else if(b==7) strcpy(datashi,"37");
else if(b==8) strcpy(datashi,"38");
else if(b==9) strcpy(datashi,"39");
if(c==0){
strcpy(datage,"");
strcpy(prefix2,"19");
strcpy(prefix4,"16");
} //数字转化成字符
else if(c==1) strcpy(datage,"31");
else if(c==2) strcpy(datage,"32");
else if(c==3) strcpy(datage,"33");
else if(c==4) strcpy(datage,"34");
else if(c==5) strcpy(datage,"35");
else if(c==6) strcpy(datage,"36");
else if(c==7) strcpy(datage,"37");
else if(c==8) strcpy(datage,"38");
else if(c==9) strcpy(datage,"39");
my_str_cat(playp,prefixp1);
my_str_cat(playp,prefixp2);
my_str_cat(playp,prefixp3);
my_str_cat(playp,prefixp4);
my_str_cat(playp,prefixp5);
my_str_cat(playp,julip);
my_str_cat(playp,databai);
my_str_cat(playp,bai);
my_str_cat(playp,datashi);
my_str_cat(playp,shi);
my_str_cat(playp,datage);
my_str_cat(playp,limip);
my_str_cat(playp,suffix);
printf("得到结果为:%s\r\n",play);
printf("得到结果指针为:%s\r\n",playp);
}
return playp;
}
uint8_t number_detect(uint16_t number)
{
uint8_t count=1;
while(number>=10)
{
count++;
number=number/10;
}
return count;
}
void number_apart(uint16_t number)
{
a=b=c=0;
if (number<10 && number>=0) c=number;
else if(number<100 && number>=10){
c=number%10;
b=number/10;
}
else if(number<350 && number>=100){
//number=186
c=number%10; //c=6,number=186
number=number/10; //number=18
b=number%10; //b=8
number=number/10; //number=1;
a=number;
}
}
void my_str_cat(char *a, char *b)
{
while(*a !=0)a++;
while(*b != 0){
*a=*b;
a++;
b++;
}
*a=0;
//printf("a为%s",a);
}
复制代码
所有资料51hei提供下载:
超声波测距(最终版本).7z
(228.31 KB, 下载次数: 61)
2019-8-2 04:06 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1