你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

教你用PIC单片机做一个MP3音乐播放器

[复制链接]
gaosmile 发布时间:2021-1-15 11:22
PIC16F15324开发板是一款小巧的开发板,它板载了LED和KEY 等基本测试单元,可以完成简单的学习和测试目标。为了充分体验和展示PIC16F15324的性能,在原开发板的基础上通过配置I2C接口的OLED屏来显示信息,使用UART来控制MP3音乐模块来播放音频文件,使用KEY选取播放内容,从而构成了一个可以显示中文歌单的MP3播放装置,其整体构成见图1所示。8 P( c  W+ E* A% ?

* H* D9 k4 E; ^3 i, c" K
微信图片_20210115111924.jpg 图1 播放器整体构成
- U6 ~* t& ?) b3 T$ Z
3 @2 R" X( e% [/ F" m8 p" q/ X. i
在设计过程中,主要经过3个阶段:: }  R* D  Y" x/ f  O' U
1) 引脚配置阶段) {0 f* M# n3 f0 k( c* p  Z
2)  功能程序设计阶段, R" K% {* ?2 e+ U& d8 {/ o0 m
3) 功能测试阶段
$ R# ^5 S; C! |, W- W
1.      引脚配置
5 X; d6 W8 g2 n9 j1 H5 ^  N
PIC16F15324对于开发工具的限定,这里是使用MPLABX IDE v5.45为开发工具,并添加MCC进行引脚功能的配置,其引脚配置情况如图2所示。其中,PA0连接OLED屏的数据引脚,PA1连接OLED屏的时钟引脚;PC4连接MP3播放模块的串口接收引脚;PA5连接按键引脚;PC1作为备用引脚,以便调节音量。1 d* Q9 F, k( S$ @7 p5 V) E
微信图片_20210115111928.jpg
  w- }. R' j0 V4 X+ n图2 引脚功能配置
2 w5 o# G+ u' D& X
此外,因程序设计的需要,还选取了延时功能,见图3所示。
6 T& k$ W1 }" f1 J' q; Q0 J1 V8 H; S" N) P
微信图片_20210115111931.jpg
% _) q4 Z0 E3 A图3选取延时功能
! X% M3 q. w: g! ~2 {
在完成了引脚的配置后,点击“Generate”即可生成程序框架及程序。
: W# F- a: k' t  t/ g  [4 l2 j; L2.      功能程序设计; m) ]3 _. A( f. |0 N/ D! e8 X
1)  显示程序设计6 p% x6 G2 e, g5 d$ h7 w
#define OLED_SCLK_Set()   SCL_SetHigh()% Q  W  I5 M, t, d  T
#define OLED_SDIN_Set()   SDA_SetHigh()
: x% X0 J7 W) Q' w3 T+ `3 n1 I相应的OLED屏初始化函数为:
" L, ]5 @5 C; |7 |7 r- C
  • void OLED_Init(void)% L4 x8 w3 ]+ X/ \5 H3 J7 u* n
  • {
    1 C( o+ S- O# D, l( [  ]) q8 X9 r5 R% S
  • Write_IIC_Command(0xAE); //display off& V4 j; {# H1 ^$ L
  • Write_IIC_Command(0x20); //Set Memory Addressing Mode
    , o& W  R* d1 k
  • Write_IIC_Command(0x10);; t! X! @% c, m- p/ ~" Q* y
  • Write_IIC_Command(0xb0);//Set Page Start Address for Page Addressing Mode,0-7, U+ N" X! P8 [, b! e! q
  • Write_IIC_Command(0xc8);//Set COM Output Scan Direction
    ) n% x# W( {7 l0 ?5 K
  • Write_IIC_Command(0x00);//---set low column address
    1 {  m2 }: Q4 S: j8 m
  • Write_IIC_Command(0x10);//---set high column address
    5 ]( @" [* K' A0 C# x
  • Write_IIC_Command(0x40);//--set start line address* i2 {( g5 j3 |+ u1 K! j4 N- l, U6 e, }
  • Write_IIC_Command(0x81);//--set contrast control register
    # D, x! O0 x6 A+ y
  • Write_IIC_Command(0xdf);
    7 a/ i( H% K: ^7 {" Q4 H
  • Write_IIC_Command(0xa1);//--set segment re-map 0 to 127
    $ Q8 R) A- k% g5 }+ P: V
  • Write_IIC_Command(0xa6);//--set normal display/ z! u) z% {8 s# m& o% @
  • Write_IIC_Command(0xa8);//--set multiplex ratio(1 to 64)
    : ^9 L0 r) M+ Q  k0 G
  • Write_IIC_Command(0x3F);//
      m: ~2 b7 g9 ]4 U! R& a! E
  • Write_IIC_Command(0xa4);//
    5 b" W6 X9 \- z
  • Write_IIC_Command(0xd3);//-set display offset6 V# M1 O& U# C' A( s. z7 ~
  • Write_IIC_Command(0x00);//-not offset
    ( N3 t' F" E. C  D" M: E% C
  • Write_IIC_Command(0xd5);//--set display clock divide ratio/oscillator frequency5 e: k3 Z7 Q$ H" D& ^
  • Write_IIC_Command(0xf0);//--set divide ratio
    $ O2 j) r- \' X9 z
  • Write_IIC_Command(0xd9);//--set pre-charge period# S3 o* Q$ u) E# f2 X* L4 J2 }
  • Write_IIC_Command(0x22); //: P( o& n  D5 N2 O5 g
  • Write_IIC_Command(0xda);//--set com pins hardware configuration
    0 N) `: m* i( D4 m
  • Write_IIC_Command(0x12);1 g2 K; i7 M, D/ H2 L
  • Write_IIC_Command(0xdb);//--set vcomh
    ! i' P+ u9 V3 X1 D0 \' _$ D
  • Write_IIC_Command(0x20);//0x20,0.77xVcc
    $ ~3 F! j; e& `' Z" ~
  • Write_IIC_Command(0x8d);//--set DC-DC enable
    / D6 ]- `! `, K, P8 A' ?2 O: ?
  • Write_IIC_Command(0x14);//6 x. s) d3 H: s8 C7 F3 O
  • Write_IIC_Command(0xaf);//--turn on oled panel
    # Q" o  \, Z+ R: F+ U
  • OLED_Clear();
    1 b* k; S0 a; \5 s+ a3 N0 z" |
  • }

    1 l2 k* T) H1 X: I- C( z

- B! a# r) V$ A8 c' L
" A, d- V4 n0 A" v* Z4 V
2)  提取字模及歌曲选择5 ]' \2 Z- g$ ?; s
为了实现图4所示的歌曲选择界面,将所用到的汉字字模用字模提取工具提取出来,并构建了小字库。
: R$ b# j8 r  p6 O: Q' q; X- [; s- J# D/ m
微信图片_20210115111941.jpg
3 j3 A) H& e% J6 a图4 歌曲选择界面
4 s9 R1 H( k1 J
微信图片_20210115111944.jpg
* P1 U) h" m) F* A( r0 p  M图5 提取字模
) B9 C) A  X# m: x7 y
汉字的显示函数为:
# c3 F) a* m9 ]
  • void OLED_ShowCHinese(unsigned char x,unsigned char y,unsigned char no)
    : V; h$ M% y/ s) _$ l# j! o
  • {$ A) m) u. w  b& S% z
  • unsigned char t,adder=0;$ d& V  \  V3 R
  • OLED_Set_Pos(x,y);# h4 o/ e2 G, ?% w4 v+ }# J' f
  • for(t=0;t<16;t++)3 A$ j. L' e6 k- A( f
  • {
    7 p5 t, [  B/ X$ X9 `
  • OLED_WR_Byte(Hzk[2*no][t],OLED_DATA);
    # n5 r) I( d- x1 D# o2 \" Y% B
  • adder+=1;
    5 h; t- s- l  b! }: ^# [# X9 k8 s4 G
  • }0 B5 F  ~- Y( n( i
  • OLED_Set_Pos(x,y+1);- J/ u, K: @( c
  • for(t=0;t<16;t++)  R) n4 V! ^# `5 K5 D) \1 i
  • {
    ) A: A/ B3 E, _+ @9 T
  • OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA);6 {* S4 `! W( w% D, Z' D# l
  • adder+=1;& X; G0 K$ ]) S+ k
  • }
    3 Z) w1 H3 l8 G- P7 q
  • }

    $ D; |8 U: F1 q) ^0 L1 l
6 `0 R$ ]" w4 |7 |+ R4 ^
借助开发板上的按键,可实现播放歌曲的选择,其原理图如图6所示。5 _; i) u# \* K: |* k; d# r% e
微信图片_20210115111948.jpg
# ?  o2 @' E8 O$ z图6按键原理图
/ w- L6 `7 M3 I1 y
在按键的控制下,实现歌曲选择的程序如下:
  • void OLED_ShowCHinese(unsigned char x,unsigned char y,unsigned char no)
    & o8 U  O* F; w7 t( v0 s8 d
  • {
    ; a! ~& V2 V" V8 O" `7 d
  • unsigned char t,adder=0;: E! d- u6 f3 o. }
  • OLED_Set_Pos(x,y);
    ) \3 W" T5 h. f" F! o
  • for(t=0;t<16;t++)
    ( E7 r# H' Z7 F. E8 r
  • {
    0 \. E2 S! u, E
  • OLED_WR_Byte(Hzk[2*no][t],OLED_DATA);) {. s( o( a3 n/ q& {
  • adder+=1;
    $ E3 J% I8 U! }5 h& v
  • }
    0 w, I3 d& s: [
  • OLED_Set_Pos(x,y+1);
    $ k, i+ p1 {* Z" N! P% T  l5 E
  • for(t=0;t<16;t++)0 n% u4 u  {0 ^! A* T. ?
  • {
    ; h& w/ ?: G. T& R/ Y
  • OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA);
    / E/ R% [# F% G- @& F8 f# L
  • adder+=1;+ j% ?3 {- T& b6 Y( k; t
  • }
    5 ?- B# U) p  f. H; e9 E2 O9 A
  • }
    8 q( D% U2 j; T% i

    # S: w$ K# X. B! h5 \: X; s

    : d% k) c: w8 D

0 p% G( s7 n' y: h. z0 V
3)串行通信及应用
% K$ R$ M1 T* ]( b6 ?
由于MP3播放模块是支持串口控制的,故这里用串口的发送功能来发送控制指令,其引脚排列如图7所示。% A- m' M$ O; l, W! {/ z3 x; |
微信图片_20210115111953.jpg
; K$ {. m7 V. Q3 w3 Z: h: _图7  MP3播放模块引脚排列3 ~5 m' h3 H- U. i$ _# m, l1 u9 C4 H; h
为便于指令的方式,特将指令存放到数组中,其内容如下:
( g+ n" @0 ^" P0 D# |/ ^' A
unsigned charcmd3[10] = {0X7E, 0xFF, 0x06, 0X03, 0x00, 0x00, 0x01, 0xFE, 0xF7, 0XEF};//*play index
1 L. T$ x% T" R$ J6 S
unsigned charcmd6[10] = {0X7E, 0xFF, 0x06, 0X06, 0x00, 0x00, 0x10, 0xFE, 0xE5, 0XEF};//*set  Volume; l! O, u, G: t9 P; U/ z5 N
此外,播放指定乐曲的指令为:
& i" I2 s' r, U; ]* r! Z1 l
playn(num);for(i=0;i<10;i++){        EUSART1_Write(cmd3);}调整音量的指令为:setVolume(18);for(i=0;i<10;i++){      EUSART1_Write(cmd6);}
+ |4 n% K4 L: ]8 v3.      功能测试# p. _7 c" D) Z; x9 K8 l3 c! D
以MP3指令发送为例,其功能验证界面如图8所示。
$ Q, s9 v: `& R
微信图片_20210115111956.jpg
" q  c. d) J* A* ~图8 指令发送验证
+ v+ g0 k. S; v/ X3 h7 p# v6 G
微信图片_20210115112000.jpg 6 ?+ ?! s2 K1 P& u6 }6 Y7 l
图9 开发板驱动测试
" h7 F+ b( ]6 c3 x0 P
在完成各环节的测试后,程序的编译结果如图10所示,看见该设计对存储资源的占用还非常高。6 O. x9 @0 W- U) y1 G9 L  q
微信图片_20210115112003.jpg , H: [7 Q5 x2 _# }$ |
图10  编译结果; c: K& c# V6 g  k
此外,我们还进行一项T卡测试,如果仔细观察就会发现,在MP3播放模块上所用的T卡而不是TF卡。经实际测试,效果一样良好。
% J) g5 P9 p9 ?+ ~: L
微信图片_20210115112007.jpg + {2 Y* b8 z9 ]
图11 初始界面
$ b/ Q3 n2 O" U$ d( j6 P
微信图片_20210115112010.jpg
7 V$ ]: d8 A2 R! S图12 播放界面
4 v$ ^6 V- {6 U& b- S! b8 T由此可见PIC16F15324开发板虽然体型小,功能有限,但小芯片依然有大能量,在外设的配合下也能显示中文菜单,也能播放语音等。

$ x% _  w& _, m' P, O0 Z/ D
演示视频:0 s5 x! u: b% ?9 G$ P* x2 b. G
https://mp.weixin.qq.com/s/5tl7GiDtJFMpc-QQ_arQpQ
* k: z3 }8 T- r$ y
0 [  B  J8 u3 n
赞 收藏 评论0 发布时间:2021-1-15 11:22

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版