迪文科技论坛

 找回密码
 立即注册
搜索
查看: 151|回复: 1

【2023.7.7获奖项目】固定机柜音乐播放主机系统

[复制链接]

567

主题

167

回帖

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
11956
发表于 2024-1-11 12:10:07 | 显示全部楼层 |阅读模式
固定机柜音乐播放主机系统,已经量产,屏幕用的是DMG12480C068_03WTC

视频查看使用效果地址:
































首重介绍,这个也是用modbus作为主要通信工具。
这个项目,大家值得一看,里面运用了许多的知识点,这里我挑几个讲讲。
大致为屏幕为从机,单片机为主控。

一、modbus和T5L的用户程序编写
之前我也讲过,T5L的之前我也给过源码,这次我们就简单的说下T5L的用户从机modbus源码。
用keil点开我的源码。
  1. int main(void)
  2. {   
  3.        INIT_CPU();
  4.        T2_Init();
  5.        UART4_Init();
  6.        EA=1;
  7. //    UART4_SendStr("hello",sizeof("hello"));
  8.        WDT_ON();//打开开门狗
  9.        while(1)
  10.        {   
  11.               WDT_RST();//喂狗
  12.               Process();
  13.        }
  14. }
复制代码
INIT_CPU(); 这个我们先不用管
主要看的是UART4_Init();
  1. void UART4_Init(void)
  2. {
  3. //UART4 波特率设置:
  4. //BODE2_DIV_H:L=CPU 主频/(8*波特率) 。
  5. //206438400/8/115200=224=0xe0
  6. //206438400/8/921600=28=0x1C
  7. //206438400/8=25804800/230400=112=0x70
  8.        SCON2T=0x80;
  9.        SCON2R=0x80;
  10. BODE2_DIV_H=0x00;    //FCLK/(8*DIV)
  11. BODE2_DIV_L=0x1C;//;  921600 波特率
  12. //    BODE2_DIV_H=0x00;     //FCLK/(8*DIV)
  13. //    BODE2_DIV_L=0x70;
  14.        //ES3T=1;
  15.        ES2R=1;
  16.        EA=1;
  17. }
复制代码
设置波特率,这里我们设置为921600,其它115200 ,这里我计算好了,大家直接填入BODE2_DIV_L,这个寄存器即可,如果说想懂得如何计算,可以查看迪文 T5L ASIC应用开发指南.pdf, 帖子末尾也上传一个文档,给大家参考学习。
就是文档这里写着:



主要是查看,Process函数
  1. void Process(void)
  2. {
  3.        SpecialAddrValAutoUp();
  4.        OneMsHandle();
  5.        TenMsHandle();
  6. }
  7. void OneMsHandle(void)
  8. {
  9.        if(!OnemsFlag)
  10.               return;
  11.        OnemsFlag=0;
  12.        MainMachineHandle();
  13. }
  14. void MainMachineHandle(void)
  15. {
  16.        if(UartDataHandle)
  17.        {
  18.               uartHandle(Uart4_Rx,uart4_rx_count);
  19.               CLR_UartMp3();
  20.        }
  21. }
复制代码

下面是主要的从机modbus 逻辑
  1. bool uartHandle(u8 *Tdata,u8 len)
  2. {
  3.        u16Wlen=0;
  4.        u16CRC_1=0,BegAddr=0;
  5.        u8  xdata RetData[Uart4_Rx_Maxlen+10];
  6.        u8  errnum=0;
  7. CRC_1=CalcCrcAll(0xffff,Tdata,len-2);
  8.        if(CRC_1!= ((Tdata[len-1])<<8 | (Tdata[len-2])))
  9.               returnfalse;
  10.        //这个为写指令
  11.        if(Tdata[0]==0&& Tdata[1]!=0x06)
  12.        {
  13.               returnfalse;
  14.        }
  15.        elseif(Tdata[0]!=DevAddr) //设备地址
  16.        {
  17.               returnfalse;
  18.        }
  19.        //这个为写指令
  20.        if(Tdata[1]!=0x03&& Tdata[1]!=0x06 && Tdata[1]!=0x10 )
  21.        {
  22.               SendModbusAckErr(Tdata,1);
  23.               returnfalse;
  24.        }
  25.        Wlen=(Tdata[4]<<8|Tdata[5]);        //长度
  26.        BegAddr=(Tdata[2]<<8|Tdata[3]);   //开始地址
  27.        if(Tdata[1]==0x06)//写内存
  28.        {
  29.               write_dgusii_vp(BegAddr,&Tdata[4],1);
  30.        }
  31.        elseif(Tdata[1]==0x10)
  32.        {
  33.               write_dgusii_vp(BegAddr,&Tdata[7],Wlen);
  34.        }
  35.        //读操作响应
  36.        //[01][0x03][00][6B][00][02][CRC高][CRC低]
  37.        if(Tdata[1]==0x03)
  38.        {
  39.               RetData[0]=Tdata[0];
  40.               RetData[1]=0x03;
  41.               RetData[2]=Wlen*2;
  42.               read_dgusii_vp(BegAddr,&RetData[3],Wlen);
  43.               CRC_1=CalcCrcAll(0xFFFF,RetData,3+Wlen*2);
  44.               RetData[Wlen*2+3]=CRC_1;
  45.               RetData[Wlen*2+3+1]=CRC_1>>8;
  46.               SendModbusAckOK(RetData,3+Wlen*2+2);
  47.        }
  48.        elseif(Tdata[1]==0x10)
  49.        {
  50.               memcpy(RetData,Tdata,6);
  51.               CRC_1=CalcCrcAll(0xFFFF,(INT8U*)&RetData,6);
  52.               RetData[6]=CRC_1;
  53.               RetData[7]=CRC_1>>8;
  54.               SendModbusAckOK(RetData,8);
  55.        }
  56.        elseif(Tdata[1]==0x06 && Tdata[0]) //当地址码为真,才应答
  57.        {
  58.               memcpy(RetData,Tdata,8);
  59.               SendModbusAckOK(RetData,8);            
  60.        }
  61.        returntrue;
  62. }
复制代码

二、时间的艺术字显示
大家先看图片,下面是时间显示,是不是很漂亮?

这里用的是艺术字控件

每一个时间变量用图片扣出来,放图标上面,如下:

最后生成一个96的图标,当需要改变时间时,就改变这个艺术字的变量,即可。


三、任意界面,任意触摸控件弹出菜单
这个是个小知识点,估计很多人不知道,可以弹出任意小窗口,和迪文的标准弹出小窗口不同的后门。

在界面上,有2个小小的隐藏的触摸按键,一般人是按不到的,如下:

没错就是它,几乎每个页面都有,主要是给程序用的,当需要某个时间点弹出窗口,程序上就会用模拟按压,点这里,然后就会出现你设定的弹窗。

关于模拟按压,就要看文档T5L_DGUS2应用指南_V63.pdf
就是这个变量,往这个变量上加模拟触摸,就会弹出菜单。

四、关于点击按键,出现的音效
主要是利用了这个屏幕后面的喇叭,可以播放一定的小文件的音乐。

这里设置语音的ID是1,指向的是:


而这个按键音乐,如何包含进去呢?这里的WAE生成工具,把音乐生成了WAE文件,这样烧录的时候,把文件烧录到对应的位置。




五、显示节假日

先看图片

节假日是不是挺漂亮?如何做的呢?主要用了3个控件:

1个是增量调节,触摸用

1个用了文本显示:



1个用了,位图显示图标:

总体的就是,当检测到触摸按下,就显示字体,然后再显示按下的图片背景。

好了,咱们暂停说到这里。


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

本帖子中包含更多资源

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

x
回复

使用道具 举报

0

主题

57

回帖

719

积分

高级会员

Rank: 4

积分
719
QQ
发表于 2024-1-11 16:09:08 | 显示全部楼层
点赞收藏
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 03:53 , Processed in 0.062586 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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