迪文科技论坛

 找回密码
 立即注册
搜索
查看: 83|回复: 0

【2025.05.10获奖项目】录音显示播放

[复制链接]

604

主题

175

回帖

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13725
发表于 2025-6-9 11:27:27 | 显示全部楼层 |阅读模式
【开源】录音显示播放

1.演示效果如下:


2.硬件结构:

这次主要结构是, STM32+屏幕+录音板,它们之间通过串口进行连接。


3.界面展示:






4.代码如下:
  1. 迪文屏幕
  2. void main(){
  3.         INIT_CPU();  //系统初始化
  4.         PORT_Init(); //IO口初始化

  5.         T0_Init();//定时器0初始化
  6.         T2_Init();//定时器2初始化
  7.         my_UART4_Init(115200);
  8.         uart_init();// 串口初始化

  9.         while(1){
  10.                 Uart_Handle_all();
  11.                 OneMsHandle();//1Ms一次
  12.                 TenMsHandle();

  13.         Read_0xF00();//数据自动上传
  14.         }
  15. }

  16. u8 uartHandle(u8 *Tdata,u8 len)
  17. {
  18.         u16 Wlen=0;
  19.         u16 CRC_1=0,BegAddr=0;
  20.         u8  xdata  RetData[Uart4_Rx_Maxlen+10];
  21.         u8  errnum=0;

  22.   CRC_1=CalcCrcAll(0xffff,Tdata,len-2);
  23.         if(CRC_1 != ((Tdata[len-1])<<8 | (Tdata[len-2])))
  24.                 return 0;

  25.         //这个为写指令
  26.         if(Tdata[0]==0 && Tdata[1]!=0x06)
  27.         {
  28.                 return 0;
  29.         }
  30.         else if(Tdata[0]!=DevAddr) //设备地址
  31.         {
  32.                 return 0;
  33.         }

  34.         //这个为写指令
  35.         if(Tdata[1]!=0x03 && Tdata[1]!=0x06 && Tdata[1]!=0x10 )
  36.         {
  37.                 SendModbusAckErr(Tdata,1);
  38.                 return 0;
  39.         }

  40.         Wlen=(Tdata[4]<<8|Tdata[5]);                 //长度
  41.         BegAddr=(Tdata[2]<<8|Tdata[3]);        //开始地址

  42.         if(Tdata[1]==0x06) //写内存
  43.         {
  44.                 write_dgusii_vp(BegAddr,&Tdata[4],1);
  45.         }
  46.         else if(Tdata[1]==0x10)
  47.         {
  48.                 write_dgusii_vp(BegAddr,&Tdata[7],Wlen);
  49.         }

  50.         //读操作响应
  51.         //[01][0x03][00][6B][00][02][CRC高][CRC低]
  52.         if(Tdata[1]==0x03)
  53.         {
  54.                 RetData[0]=Tdata[0];
  55.                 RetData[1]=0x03;
  56.                 RetData[2]=Wlen*2;
  57.                 Read_Dgusii_Vp(BegAddr,&RetData[3],Wlen);
  58.                 CRC_1=CalcCrcAll(0xFFFF,RetData,3+Wlen*2);
  59.                 RetData[Wlen*2+3]=CRC_1;
  60.                 RetData[Wlen*2+3+1]=CRC_1>>8;
  61.                 SendModbusAckOK(RetData,3+Wlen*2+2);
  62.         }
  63.         else if(Tdata[1]==0x10)
  64.         {
  65.                 memcpy(RetData,Tdata,6);
  66.                 CRC_1=CalcCrcAll(0xFFFF,(u8 *)&RetData,6);
  67.                 RetData[6]=CRC_1 ;
  68.                 RetData[7]=CRC_1>>8;
  69.                 SendModbusAckOK(RetData,8);
  70.         }
  71.         else if(Tdata[1]==0x06 && Tdata[0]) //当地址码为真,才应答
  72.         {
  73.                 memcpy(RetData,Tdata,8);
  74.                 SendModbusAckOK(RetData,8);               
  75.         }

  76.         return 1;
  77. }

  78. void RecordPlaySliderLogo(void)
  79. {
  80.         static u8 VolC=102;
  81.         u8 data Readdtata[2];
  82.         VolCutDispLog_Para_s UpanPlayLog;

  83.         if(NowPage[1]!=21)
  84.         {
  85.                 VolC=0x102;
  86.                 return;
  87.         }

  88.         Read_Dgusii_Vp(0x17B8,Readdtata,1);
  89.         if(VolC==Readdtata[1])
  90.                 return;
  91.         VolC=Readdtata[1];

  92.         UpanPlayLog.LogoLen=459;//长度
  93.         UpanPlayLog.CutPage=24;//剪切图形所在页面
  94.         UpanPlayLog.CutDispaddr=0x7600;//基本图形地址
  95.         UpanPlayLog.Vol=VolC;//0~100音量值
  96.         UpanPlayLog.CutbegXY[0]=245;//剪切图形左上角开始地址X
  97.         UpanPlayLog.CutbegXY[1]=366;//剪切图形左上角开始地址Y
  98.         UpanPlayLog.CutendXY[0]=UpanPlayLog.CutbegXY[0]+UpanPlayLog.LogoLen;//剪切图形右下角开始地址X
  99.         UpanPlayLog.CutendXY[1]=366+12;//剪切图形右下角结束地址Y
  100.         UpanPlayLog.localPageXY[0]=248;
  101.         UpanPlayLog.localPageXY[1]=379;

  102.         VolCutDisp(&UpanPlayLog);
  103. }

  104. Stm32如下:
  105. void HW_Init(void)
  106. {
  107.    my_mem_init(SRAMIN);    //初始化内部内存池

  108.         uart1_init(115200);        //外置MP3
  109.         uart3_init(115200);        //屏幕收发
  110.         uart5_init(115200); //内置 MP3
  111.         uart4_init(115200); //串口4初始化

  112.         LED_Init();                                  //初始化LED
  113.         Mp3RecCtrIOinit();
  114. }


  115. void LoopHandle_task(void *p_arg)
  116. {
  117.         Init_TotalSet();
  118.         Init_Mp3data();
  119.         DMT_ChangePage(1);

  120.         while(1)
  121.         {
  122.                 LCD_Handle();
  123.                 Mp3PlayProcess();                                      
  124. UdiskDisInOut();                                       
  125.                 vTaskDelay(LoopHandle_ms/portTICK_PERIOD_MS);
  126.         }
  127. }

  128. void DMT_Action1(void)
  129. {
  130.         MainMeanKey();
  131.         UpanSDPlayKey();     
  132.         EnterKeyRET();                        

  133.         RecordRPage();
  134.         RecordPlayPage();

  135.         AllRetKey();
  136. }

  137. 录音板代码:
  138. void RECRToReady(void)
  139. {
  140.     u8 BOper=0;
  141.         u8 SecialNum=0;

  142.     if(!ModWriteReg[WR_RECFileReady][1])
  143.         return;
  144.     BOper=ModWriteReg[WR_RECFileReady][1];
  145.         SecialNum=ModWriteReg[WR_RECFileReady][0];
  146.     ModWriteReg[WR_RECFileReady][1]=0;
  147.         ModWriteReg[WR_RECFileReady][0]=0;
  148.         ModReadReg[RD_RECisOk][0]=0;//清除目录准备

  149.         MsgUserPara[0]=BOper;
  150.         MsgUserPara[1]=SecialNum;        
  151.         User_printf("%s\r\n",__FUNCTION__);
  152.         task_post_msg(NULL, 1, MSG_MUSIC_RECtoReady);
  153. }

  154. void RECSongToPoint(void)
  155. {
  156.     u16 BOper=0;

  157.         BOper=ModWriteReg[WR_RECFilePoint][0]<<8|ModWriteReg[WR_RECFilePoint][1];
  158.     if(!BOper)
  159.         return;
  160.         MsgUserPara[0]=ModWriteReg[WR_RECFilePoint][0];
  161.         MsgUserPara[1]=ModWriteReg[WR_RECFilePoint][1];

  162.     ModWriteReg[WR_RECFilePoint][1]=0;
  163.     ModWriteReg[WR_RECFilePoint][0]=0;
  164.         ModReadReg[RD_RECisOk][1]=0;//清除歌曲准备

  165.         User_printf("%s\r\n",__FUNCTION__);
  166.         task_post_msg(NULL, 1, MSG_MUSIC_RECtoBuffNum);
  167. }

复制代码


备注说明:如需源码,请参考此链接:http://inforum.dwin.com.cn:20080/forum.php?mod=viewthread&tid=12400&extra=&_dsign=8a3dbad6







本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

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

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2025-8-11 23:30 , Processed in 0.043132 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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