找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3543|回复: 1
收起左侧

STM32单片机语音播报当前GPS位置信息 源程序+资料

[复制链接]
ID:199636 发表于 2021-4-23 16:24 | 显示全部楼层 |阅读模式
主控制器为STM32F103C8T6单片机,GPS模块为NEO-6M模块,语音播报模块是JQ6500;
在GPS获取到信号的情况下,按下播报按键,系统会播报出当前的时间和经纬度信息。
附件为完整代码工程和电路原理图以及JQ6500模块资料包。
电路原理图如下:
51hei.png
单片机源程序如下:
  1. /**********************************************************

  2.                                                                                                
  3. 接线说明:
  4. STM32                                        GPS
  5. VCC                ------>        VCC
  6. GND                ------>        GND
  7. RX1                <------        TXD


  8. STM32                                        USB-TTL模块
  9. GND                ------>        GND
  10. TX1                ------>        RXD

  11. ***********************************************************/

  12. #include "stm32f10x.h"
  13. #include "delay.h"
  14. #include "usart.h"
  15. #include "led.h"

  16. //声明
  17. void errorLog(int num);
  18. void parseGpsBuffer(void);
  19. void printGpsBuffer(void);
  20. void uart2_init(u32 bound);
  21. u16 get_cmd(char input);
  22. void Voice_Play(u16 cmd);
  23. void Voice_GpsBuffer(void);
  24. void KEY_Init(void);

  25. #define KEY GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8)

  26. int main(void)
  27. {       
  28.         delay_init();
  29.        
  30.         NVIC_Configuration();          //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  31.         uart_init(9600);         //串口初始化为9600
  32.         uart2_init(9600);
  33.         KEY_Init();
  34.         delay_init();
  35.         Init_LEDpin();
  36.         LED1 = 1;
  37.        
  38.         clrStruct();
  39.        
  40.         printf("Welcome to use!\r\n");
  41.         printf("ILoveMcu.taobao.com!\r\n");
  42.         while(1)
  43.         {
  44.                 parseGpsBuffer();
  45.                 Voice_GpsBuffer();
  46.                 printGpsBuffer();
  47.                
  48.    
  49.         }
  50. }

  51. void errorLog(int num)
  52. {
  53.        
  54.         while (1)
  55.         {
  56.                   printf("ERROR%d\r\n",num);
  57.         }
  58. }

  59. void parseGpsBuffer()
  60. {
  61.         char *subString;
  62.         char *subStringNext;
  63.         char i = 0;
  64.         if (Save_Data.isGetData)
  65.         {
  66.                 Save_Data.isGetData = false;
  67.                 printf("**************\r\n");
  68.                 printf(Save_Data.GPS_Buffer);

  69.                
  70.                 for (i = 0 ; i <= 6 ; i++)
  71.                 {
  72.                         if (i == 0)
  73.                         {
  74.                                 if ((subString = strstr(Save_Data.GPS_Buffer, ",")) == NULL)
  75.                                         errorLog(1);        //解析错误
  76.                         }
  77.                         else
  78.                         {
  79.                                 subString++;
  80.                                 if ((subStringNext = strstr(subString, ",")) != NULL)
  81.                                 {
  82.                                         char usefullBuffer[2];
  83.                                         switch(i)
  84.                                         {
  85.                                                 case 1:memcpy(Save_Data.UTCTime, subString, subStringNext - subString);break;        //获取UTC时间
  86.                                                 case 2:memcpy(usefullBuffer, subString, subStringNext - subString);break;        //获取UTC时间
  87.                                                 case 3:memcpy(Save_Data.latitude, subString, subStringNext - subString);break;        //获取纬度信息
  88.                                                 case 4:memcpy(Save_Data.N_S, subString, subStringNext - subString);break;        //获取N/S
  89.                                                 case 5:memcpy(Save_Data.longitude, subString, subStringNext - subString);break;        //获取经度信息
  90.                                                 case 6:memcpy(Save_Data.E_W, subString, subStringNext - subString);break;        //获取E/W

  91.                                                 default:break;
  92.                                         }

  93.                                         subString = subStringNext;
  94.                                         Save_Data.isParseData = true;
  95.                                         if(usefullBuffer[0] == 'A')
  96.                                                 Save_Data.isUsefull = true;
  97.                                         else if(usefullBuffer[0] == 'V')
  98.                                                 Save_Data.isUsefull = false;

  99.                                 }
  100.                                 else
  101.                                 {
  102.                                         errorLog(2);        //解析错误
  103.                                 }
  104.                         }


  105.                 }
  106.         }
  107. }

  108. void printGpsBuffer()
  109. {
  110.         if (Save_Data.isParseData)
  111.         {
  112.                 Save_Data.isParseData = false;
  113.                
  114.                 printf("Save_Data.UTCTime = ");//当前时间
  115.                 printf(Save_Data.UTCTime);
  116.                 printf("\r\n");

  117.                 if(Save_Data.isUsefull)
  118.                 {
  119.                         Save_Data.isUsefull = false;
  120.                         printf("Save_Data.latitude = ");//纬度,范围0-90
  121.                         printf(Save_Data.latitude);
  122. //                         printf("*************************");
  123. //                         printf("\r\n");
  124. //                         printf("%c",Save_Data.latitude[0]);
  125. //                         printf("\r\n");
  126. //                         printf("%c",Save_Data.latitude[1]);
  127. //                         printf("\r\n");
  128. //                         printf("%c",Save_Data.latitude[2]);
  129. //                         printf("\r\n");
  130. //                         printf("%c",Save_Data.latitude[3]);
  131.                         printf("\r\n");
  132.                         printf("*************************");
  133.                         printf("\r\n");


  134.                         printf("Save_Data.N_S = ");
  135.                         printf(Save_Data.N_S);
  136.                         printf("\r\n");

  137.                         printf("Save_Data.longitude = "); //经度 ,范围0-180
  138.                         printf(Save_Data.longitude);
  139.                         printf("\r\n");

  140.                         printf("Save_Data.E_W = ");
  141.                         printf(Save_Data.E_W);
  142.                         printf("\r\n");
  143.                 }
  144.                 else
  145.                 {
  146.                         printf("GPS DATA is not usefull!\r\n");
  147.                 }
  148.                
  149.         }
  150. }

  151. u16 get_cmd(char input)
  152. {
  153.         u16 CMD;
  154.         switch(input)
  155.         {
  156.                 case 0:
  157.                         CMD = 0x11;
  158.                 break;
  159.                 case 1:
  160.                         CMD = 0x01;
  161.                 break;
  162.                 case 2:
  163.                         CMD = 0x02;
  164.                 break;
  165.                 case 3:
  166.                         CMD = 0x03;
  167.                 break;
  168.                 case 4:
  169.                         CMD = 0x04;
  170.                 break;
  171.                 case 5:
  172.                         CMD = 0x05;
  173.                 break;
  174.                 case 6:
  175.                         CMD = 0x06;
  176.                 break;
  177.                 case 7:
  178.                         CMD = 0x07;
  179.                 break;
  180.                 case 8:
  181.                         CMD = 0x08;
  182.                 break;
  183.                 case 9:
  184.                         CMD = 0x09;
  185.                 break;
  186.         }
  187.         return CMD;
  188. }

  189. void Voice_GpsBuffer(void)
  190. {
  191.         u16 cmd_voice;       
  192.         if(KEY==0)
  193.         {
  194.                         delay_ms(10);
  195.                         if(KEY==0)
  196.                         {                                       
  197.                                         Voice_Play(0x0a); //当前时间为
  198.                                   delay_ms(1000);
  199.                                 delay_ms(1000);
  200.                                 delay_ms(1000);
  201.                                         cmd_voice=get_cmd(Save_Data.UTCTime[0]);
  202.                                                                         printf("cmd_voice : %02x",cmd_voice&0x0f);
  203.                                         printf("\r\n");
  204.                                         Voice_Play(cmd_voice&0x0f);
  205.                                         delay_ms(500);
  206.                                         cmd_voice=get_cmd(Save_Data.UTCTime[1]);
  207.                                                                         printf("cmd_voice : %02x",cmd_voice&0x0f);
  208.                                         printf("\r\n");
  209.                                         Voice_Play(cmd_voice&0x0f);
  210.                                         delay_ms(500);
  211.                                         Voice_Play(0x0b); //点
  212.                                 delay_ms(500);
  213.                                         cmd_voice=get_cmd(Save_Data.UTCTime[2]);
  214.                                                                         printf("cmd_voice : %02x",cmd_voice&0x0f);
  215.                                         printf("\r\n");
  216.                                         Voice_Play(cmd_voice&0x0f);
  217.                                         delay_ms(500);
  218.                                         cmd_voice=get_cmd(Save_Data.UTCTime[3]);
  219.                                                                                 printf("cmd_voice : %02x",cmd_voice&0x0f);
  220.                                         printf("\r\n");
  221.                                         Voice_Play(cmd_voice&0x0f);
  222.                                         delay_ms(500);
  223.                                         Voice_Play(0x0c); //分
  224.                                         delay_ms(500);
  225.                                
  226.                                         Voice_Play(0x0d); //当前位置经度为
  227.                                         delay_ms(1000);
  228.                                         delay_ms(1000);
  229.                                         delay_ms(1000);
  230.                                         cmd_voice=get_cmd(Save_Data.longitude[0]);
  231.                                         printf("cmd_voice : %02x",cmd_voice&0x0f);
  232.                                         printf("\r\n");
  233.                                         Voice_Play(cmd_voice&0x0f);
  234.                                         delay_ms(500);
  235.                                         cmd_voice=get_cmd(Save_Data.longitude[1]);
  236.                                         printf("cmd_voice : %02x",cmd_voice&0x0f);
  237.                                         printf("\r\n");
  238.                                         Voice_Play(cmd_voice&0x0f);
  239.                                         delay_ms(500);
  240.                                         cmd_voice=get_cmd(Save_Data.longitude[2]);
  241.                                         printf("cmd_voice : %02x",cmd_voice&0x0f);
  242.                                         printf("\r\n");
  243.                                         Voice_Play(cmd_voice&0x0f);
  244.                                         delay_ms(500);
  245.                                         Voice_Play(0x0f); //度
  246.                                         delay_ms(500);
  247.                                         cmd_voice=get_cmd(Save_Data.longitude[3]);
  248.                                                                                 printf("cmd_voice : %02x",cmd_voice&0x0f);
  249.                                         printf("\r\n");
  250.                                         Voice_Play(cmd_voice&0x0f);
  251.                                         delay_ms(500);
  252.                                         cmd_voice=get_cmd(Save_Data.longitude[4]);
  253.                                                                                 printf("cmd_voice : %02x",cmd_voice&0x0f);
  254.                                         printf("\r\n");
  255.                                         Voice_Play(cmd_voice&0x0f);
  256.                                         delay_ms(500);
  257.                                         Voice_Play(0x0c); //分
  258.                                         delay_ms(500);
  259.                                        
  260.                                         Voice_Play(0x0e); //当前位置纬度为
  261.                                         delay_ms(1000);
  262.                                         delay_ms(1000);
  263.                                         delay_ms(1000);
  264.                                         cmd_voice=get_cmd(Save_Data.latitude[0]);
  265.                                                                                 printf("cmd_voice : %02x",cmd_voice&0x0f);
  266.                                         printf("\r\n");
  267.                                         Voice_Play(cmd_voice&0x0f);
  268.                                         delay_ms(500);
  269.                                         cmd_voice=get_cmd(Save_Data.latitude[1]);
  270.                                                                                 printf("cmd_voice : %02x",cmd_voice&0x0f);
  271.                                         printf("\r\n");
  272.                                         Voice_Play(cmd_voice&0x0f);
  273.                                         delay_ms(500);
  274.                                         Voice_Play(0x0f); //度
  275.                                         delay_ms(500);
  276.                                         cmd_voice=get_cmd(Save_Data.latitude[2]);
  277.                                                                                 printf("cmd_voice : %02x",cmd_voice&0x0f);
  278.                                         printf("\r\n");
  279.                                         Voice_Play(cmd_voice&0x0f);
  280.                                         delay_ms(500);
  281.                                         cmd_voice=get_cmd(Save_Data.latitude[3]);
  282.                                                                                 printf("cmd_voice : %02x",cmd_voice&0x0f);
  283.                                         printf("\r\n");
  284.                                         Voice_Play(cmd_voice&0x0f);
  285.                                         delay_ms(500);
  286.                                         Voice_Play(0x0c); //分
  287.                                         delay_ms(500);
  288.                         }
  289.         }

  290. }

  291. void KEY_Init(void)
  292. {
  293.         GPIO_InitTypeDef GPIO_InitStructure;
  294.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//??PORTA,PORTC??
  295.         GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_8;//PA15
  296.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //???????
  297.         GPIO_Init(GPIOA, &GPIO_InitStructure);//???GPIOA15
  298. }

  299. void uart2_init(u32 bound){

  300.         GPIO_InitTypeDef GPIO_InitStructure;
  301.         USART_InitTypeDef USART_InitStructure;
  302.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);       
  303.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);

  304.         //USART2_TX  
  305.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  306.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  307.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;       
  308.         GPIO_Init(GPIOA, &GPIO_InitStructure);

  309.         //USART2_RX       
  310.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  311.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  312.         GPIO_Init(GPIOA, &GPIO_InitStructure);  

  313.         USART_InitStructure.USART_BaudRate = bound;
  314.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  315.         USART_InitStructure.USART_StopBits = USART_StopBits_1;
  316.         USART_InitStructure.USART_Parity = USART_Parity_No;
  317.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  318.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;       

  319.         USART_Init(USART2, &USART_InitStructure);
  320.         //  USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
  321.         USART_Cmd(USART2, ENABLE);                     

  322. }

  323. // 7e 04 03 00 cmd ef
  324. void Voice_Play(u16 cmd)
  325. {
  326.                 USART_SendData(USART2,0x7E);
  327.                 delay_ms(1);
  328.                 USART_SendData(USART2,0x04);
  329.                 delay_ms(1);
  330.                 USART_SendData(USART2,0x03);
  331.                 delay_ms(1);
  332.                 USART_SendData(USART2,0x00);
  333.                 delay_ms(1);
  334.                 USART_SendData(USART2,cmd);
  335.                 delay_ms(1);
  336.                 USART_SendData(USART2,0xEF);
  337.                 delay_ms(1);

  338. }
复制代码
51hei.png 51hei.png
所有资料51hei提供下载:
STM32-GPS位置信息语音播报.7z (7.66 MB, 下载次数: 103)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:519089 发表于 2021-7-14 21:09 | 显示全部楼层
支持一下,原创辛苦
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表