找回密码
 注册
关于网站域名变更的通知
查看: 267|回复: 2
打印 上一主题 下一主题

单片机教程28单片机音乐程序设计

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-8-16 10:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

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

x
利用单片机(或单板机)奏乐大概是无线电爱好者感兴趣的问题之一。本文从单片机的基本发间实验出发,谈谈音乐程序的设计原理,并给出具体实例,以供参考。" V3 o3 b6 {. k6 B% h
单片机的基本发音实验
% r1 g+ s' L( u" z我们知道,声音的频谱范围约在几十到几千赫兹,若能利用程序来控制单处机某个口线的“高”电平或低电平,则在该口线上就能产生一定频率的矩形波,接上喇叭就能发出一定频率的声音,若再利用延时程序控制“高”“低”电平的持续时间,就能改变输出频率,从而改变音调。/ P$ T" k3 X) w& C3 t5 i
例如,要产生200HZ的音频信号,按图1接入喇叭(若属临时实验,也可将喇叭直接接在P1口线上),实验程序为:0 `- N: g+ U" M$ X
其中子程序DEL为延时子程序,当R3为1时,延时时间约为20us,R3中存放延时常数,对200HZ音频,其周期为1/200秒,即5ms。这样,当P1.4的高电平或低电平的持续时间为2.5ms,即R3的时间常数取2500/20=125(7DH)时,就能发出200HZ的音调。将上述程序键入学习机,并持续修改R3的常数能感到音调的变化。乐曲中,每一音符对应着确定的频率,表1给出C调时各音符频率及其对应的时间常数。读者能根据表1所供给的常数,将其16进制代码送入R3,反复练习体会。根据表1能奏出音符。仅这还不够,要准确奏出一首曲子,必须准确地控制乐曲节奏,即一音符的持续时间。
' X: G7 V* J# L5 F5 L音符的节拍我们能用定时器T0来控制,送入不一样的初值,就能产生不一样的定时时间。便如某歌曲的节奏为每分钟94拍,即一拍为0.64秒。其它节拍与时间的对应关系见表2。
- N( V) _. G, m- _但时,由于T0的最大定时时间只能为131毫秒,因此不可能直接用改变T0的时间初值来实现不一样节拍。我们能用T0来产生10毫秒的时间基准,然后设置一个中断计数器,通过判别中断计数器的值来控制节拍时间的长短。表2中也给出了各种节拍所对应的时间常数。例如对1/4拍音符,定时时间为0.16秒,对应的时间常数为16(即10H);对3拍音符,定时时间为1.92秒,对应时间长数为192(即C0H)。
1 ]+ N* A6 w6 o' g* y我们将每一音符的时间常数和其对应的节拍常数作为一组,按次序将乐曲中的所有常数排列成一个表,然后由查表程序依次取出,产生音符并控制节奏,就能实现演奏效果。此外,结束符和体止符能分别用代码00H和FFH来表示,若查表结果为00H,则表示曲子终了;若查表结果为FFH,则产生对应的停顿效果。为了产生手弹的节奏感,在某些音符(例如两个相同音符)音插入一个时间单位的频率略有不一样的音符。
1 V9 R# p' p& ~  u8 m$ T下面给出程序序清单,可直接在TD-III型学习机上演奏,对其它不一样型号的学习机,只需对应地改变一下地址即可。本程序演奏的是民歌“八月桂花遍地开”,C调,节奏为94拍/分。读者也能自行找出一首歌,按表1和表2给定的常数,将乐曲翻译成码表输入机器,而程序不变。本实验办法简便,即使不懂音乐的人,将一首陌生的曲子翻译成代码也是易事,和着机器的演奏学唱一首歌曲,其趣味无穷。
7 f0 n# k% j: P) s. L程序清单(略,请参看源程序的说明)。6 \4 V2 \% L' ~( N/ S8 K: ?8 [( z
程序框图如图2所示。
. G: @0 Q$ a8 _6 E) S/ s2 P: X6 d6 m: _# Y) |% T5 Q" V
<单片机音乐程序的设计图>
! B" |4 X5 U+ P* e' M: _2 j( x; Y, t8 D% W+ m
硬件连接说明:8 R7 l4 d% ^8 I' D( T! q8 i
随便找一个仿真机或者什么单片机实验板,只要能工作的就行,将程序输入,运行,然后找个音箱(你计算机旁边应当就有一对吧)拨出插头,插头的前端接在P1。0上,后面部分找根线接单片机的地,就应当有声了,然后怎么改进硬件连接就是你的事了。。。。1 w2 M: |2 l) Q, i3 F
音乐程序汇编代码代码1 -------------Voice.asm--------------------------# E0 g% j/ B9 |# R0 h
        ORG     0000H! U* G9 G8 P/ g9 @" r
        LJMP    START7 c# U4 L/ }2 S1 h6 C$ p
        ORG     000BH5 }( G9 Z$ G8 F4 ?) f, O
        INC     20H     ;中断服务,中断计数器加1
9 P  \0 u& A+ S2 A0 f& \, S6 u        MOV     TH0,#0D8H7 e- b% ~/ T9 d2 x* `6 @5 J0 [3 K/ G
        MOV     TL0,#0EFH  ;12M晶振,形成10毫秒中断( H- a' H6 C% C4 A- Q( y
        RETI
* L4 e( {; z! h/ ]1 WSTART:  . C! q: W/ i& W
        MOV     SP,#50H
$ a8 @4 B/ `: u+ b0 I        MOV     TH0,#0D8H
0 Z7 }  V: O6 V$ L' |, G* ]2 ?        MOV     TL0,#0EFH
2 n- E9 o; d, z& y2 }7 l/ S        MOV     TMOD,#01H
% j) v0 e$ o/ C; k0 w        MOV     IE,#82H: D  Q8 r* X3 f% J0 v
MUSIC0:. y, _* p/ I1 D
        NOP
! w1 E" n  Y, V( R7 [        MOV     DPTR,#DAT      ;表头地址送DPTR% p3 t6 @* i. B4 C$ N" x( H# q
        MOV     20H,#00H        ;中断计数器清0
" R( N- @$ Y4 F        MOV     B,#00H          ;表序号清0
* ], t5 Q; l& i5 w. B/ p/ xMUSIC1:
' {* v3 |' S: r: S        NOP* @/ n  v/ E: ^
        CLR     A
% l; v! d- p- @8 g3 y$ E6 G* r5 W; {        MOVC    A,@A+DPTR       ;查表取代码& h2 A/ P: B; r  z) R
        JZ      END0     ;是00H,则结束
" G6 y7 Q$ ]# X" r9 a  {        CJNE    A,#0FFH,MUSIC58 U# a* v. K5 B
        LJMP    MUSIC3
" _$ I! Z5 a% f4 E' pMUSIC5:
- W5 k8 K) h# C2 i6 F4 h        NOP7 t" f2 t- |. c4 F  R' X3 b
        MOV     R6,A; D( w9 f! \" I0 P$ {4 x' O# P
        INC     DPTR
; j1 I, G/ `' q        MOV     A,B  B/ R( Y* k% H7 j; |) ?9 B$ h' ?
        MOVC    A,@A+DPTR       ;取节拍代码送R7
, J; _3 V3 ~" m7 K5 ~( V' \8 y% b        MOV     R7,A/ Y8 ~5 I8 O# r! ^: I
        SETB    TR0             ;启动计数
  X, E6 S* T9 \& c1 v' A* E9 HMUSIC2:7 U4 H' n" d: e3 Q! c
        NOP4 N( g$ J8 U/ b7 l( H
        CPL     P1.0
: j1 l0 S+ i$ `        MOV     A,R6* X1 c7 ~  C! g# o
        MOV     R3,A
9 [& g, q. F1 n2 A0 ^5 N        LCALL   DEL
* F' K/ U. M& O' l; z) h) ?6 _" A        MOV     A,R7# S( @3 @2 ^; O) \, L" |8 j/ f) J
        CJNE    A,20H,MUSIC2    ;中断计数器(20H)=R7否?& x. \( y8 L( u8 d
                                ;不等,则继续循环
/ M5 h- a7 [' K% ]" X, ^/ r        MOV     20H,#00H        ;等于,则取下一代码! D$ Y6 c$ G# K: G7 Z
        INC     DPTR
# M# r$ z" R; x0 m+ W$ i;        INC     B
: v2 L9 `0 l& `) u$ v: S        LJMP    MUSIC14 q8 K/ X- I1 o* S& k
MUSIC3:  C0 H0 e9 Y4 ?4 e9 y
        NOP4 p6 e9 A' _, _: u, P$ X# p9 v
        CLR     TR0     ;休止100毫秒
2 \( e6 Y7 ]. N& @0 a        MOV     R2,#0DH) Y1 V- `# W( o& _
MUSIC4:
4 ^3 a) z: H, u3 d( `; _        NOP" Y! N( p, ?+ g* e+ Q
        MOV     R3,#0FFH0 F: h; @. {; n# @2 E
        LCALL   DEL6 k7 \% `& L( ~0 C3 P
        DJNZ    R2,MUSIC45 N; l' V9 O* P( a
        INC     DPTR/ N5 |. c) M/ {5 e1 k9 H8 M
        LJMP    MUSIC1
. Y5 K% ?6 a3 W0 A( {END0:  l( X: c' ~( x+ }+ v  l& R
        NOP
9 ?8 }* b, l7 G: R7 f$ G7 s        MOV     R2,#64H ;歌曲结束,延时1秒后继续
8 {; H! `9 j6 U' OMUSIC6:1 o% R3 n, i; \4 U0 U+ |# F
        MOV     R3,#00H  B5 O4 K# C& s( b0 d7 V  _
        LCALL   DEL; }( O2 m* W  D( U$ y
        DJNZ    R2,MUSIC6% B' F' X/ {9 f9 A& ]
        LJMP    MUSIC0
4 t( p4 O1 m; Z( V* Q' wDEL:
% ?6 W) W+ f8 g3 }+ g        NOP
4 T5 W- g7 S  V6 C" U6 MDEL3:                  
+ p$ j) N( K2 c        MOV     R4,#02H+ K+ X3 d  W5 v
DEL4:   
% }! s* X$ R, ^        NOP4 ~3 A; F* [  U6 K5 S. O4 l( m
        DJNZ    R4,DEL4
4 A3 @+ P) B; k3 p        NOP$ Z+ R( I$ V, J
        DJNZ    R3,DEL3  T: W9 i  S/ O8 M, M' T: P- F* g
        RET
" q( U5 {. H8 O( `        NOP1 A- U3 }! g% P" c8 n0 p
DAT:
' w5 v% Z3 k0 A. O. {6 X6 @ db 26h,20h,20h,20h,20h,20h,26h,10h,20h,10h,20h,80h,26h,20h,30h,20h1 l/ q* Q/ I0 z& g* s2 i1 z- a
db 30h,20h,39h,10h,30h,10h,30h,80h,26h,20h,20h,20h,20h,20h,1ch,20h2 t' y9 T, Y8 y1 g6 @) _/ O9 C8 i$ P+ c
db 20h,80h,2bh,20h,26h,20h,20h,20h,2bh,10h,26h,10h,2bh,80h,26h,20h% l& E9 r, f# p) ?* Y& I. {
db 30h,20h,30h,20h,39h,10h,26h,10h,26h,60h,40h,10h,39h,10h,26h,20h" z0 m" g3 B4 W- j7 {* ?$ a
db 30h,20h,30h,20h,39h,10h,26h,10h,26h,80h,26h,20h,2bh,10h,2bh,10h# \2 O' |) T; V0 X+ R6 {
db 2bh,20h,30h,10h,39h,10h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,20h0 `- J3 c) T# m% c
db 20h,10h,20h,10h,2bh,10h,26h,30h,30h,80h,18h,20h,18h,20h,26h,20h7 O. T% D  `* l% E! o* ~
db 20h,20h,20h,40h,26h,20h,2bh,20h,30h,20h,30h,20h,1ch,20h,20h,20h0 f' [3 B+ c. e8 t0 A9 d6 ?0 F
db 20h,80h,1ch,20h,1ch,20h,1ch,20h,30h,20h,30h,60h,39h,10h,30h,10h# M+ L. F, }/ a0 }4 [
db 20h,20h,2bh,10h,26h,10h,2bh,10h,26h,10h,26h,10h,2bh,10h,2bh,80h
1 p$ c$ K2 \3 K4 z db 18h,20h,18h,20h,26h,20h,20h,20h,20h,60h,26h,10h,2bh,20h,30h,20h2 Q! G$ ]5 \0 S
db 30h,20h,1ch,20h,20h,20h,20h,80h,26h,20h,30h,10h,30h,10h,30h,20h
) |( z4 u0 U* n8 T) \ db 39h,20h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,10h,40h,10h,20h,10h
9 F5 x  b2 c! x9 ^  S db 20h,10h,2bh,10h,26h,30h,30h,80h,00H
1 K8 h: q- Z+ X. r' v  r% rEND
; ?4 s  G7 ?2 v音乐程序汇编代码代码2 -------------Voice1.asm--------------------------
) F6 e# F; P+ A3 O- k;标题    '八月桂花香'发声程序        
. t# ?& `* w$ n1 b" W$ w0 G/ H;摘要    详见'无线电'92年3期) z* K/ J% R* u# ]) K: U
;作者    周振安/ d/ C2 j& B6 p
  ORG     0000H
5 P' ~* s. K% l$ J9 b        LJMP    START
# A0 t6 a+ G# M/ J2 o+ [/ f3 b        ORG     000BH3 \0 x$ U4 a3 D. z9 r0 [
        INC     20H     ;中断服务,中断计数器加1
2 [% a* e' m# |5 r7 J! B        MOV     TH0,#0D8H  d* W+ ^3 Y& r5 q! j2 U- k
        MOV     TL0,#0EFH  ;12M晶振,形成10毫秒中断, }5 \5 U7 j+ ?0 }" P/ d' X
        RETI
4 ]; O4 u. l# V! F* m4 w3 a5 l6 GSTART:  3 _  O+ }5 {. S( C6 `* x( `6 o2 D
        MOV     SP,#50H7 c, z* B( F! Q6 F
        MOV     TH0,#0D8H- G( ?* `; h8 I1 n
        MOV     TL0,#0EFH
- R8 ^2 Y6 [, ^, O9 Q        MOV     TMOD,#01H& z! h; M$ V8 I
        MOV     IE,#82H. w, o- ~: X  j9 G( W/ D
MUSIC0:
' R' C- [9 d$ X5 |9 Y' u9 o        NOP
* n9 f  n$ o6 u: _' C* A6 _& }        MOV     DPTR,#DAT      ;表头地址送DPTR
* J, a) D/ k, v% `# C        MOV     20H,#00H        ;中断计数器清0
# q# v+ I0 y- \# N3 i1 c5 g        MOV     B,#00H          ;表序号清02 D+ n: K9 ^$ j+ k, }8 |. H
MUSIC1:
2 k6 ]; |2 l2 }( K) l+ g; F1 l        NOP
; v8 |7 Q9 \3 F# L+ i; J5 S        CLR     A
( T2 @: t0 o- g7 \/ i. n2 m        MOVC    A,@A+DPTR       ;查表取代码
" K0 T3 z- `; P' H! g  X+ z        JZ      END0     ;是00H,则结束, w  m8 N7 }, N6 I$ n) s$ ^) C3 v3 z) N
        CJNE    A,#0FFH,MUSIC5
6 @: G6 I9 s. y+ K7 e        LJMP    MUSIC3
1 f3 q% I! C1 f2 E( ]' T* l. mMUSIC5:
6 ]7 Y! G. T# Y/ _3 v; a        NOP$ U, D* q, I% l
        MOV     R6,A
0 O. ?" ^8 \( O        INC     DPTR  |0 k3 ~% g$ o, r$ {4 ]. \
        MOV     A,B
7 e7 W$ S0 G+ A9 C1 f1 U        MOVC    A,@A+DPTR       ;取节拍代码送R7. U0 E9 U2 ~" [) j1 p: m8 `
        MOV     R7,A
$ d  O$ R2 C. d1 w' k        SETB    TR0             ;启动计数
; ^) C9 `; I7 hMUSIC2:
' B1 j: L( ~4 _1 |6 Y        NOP
) C8 w" O4 _# w1 P' W        CPL     P1.0
) V  V* v2 y) S8 ]+ k0 D        MOV     A,R6# `: Q+ l- m4 n
        MOV     R3,A4 ?- Q0 u. q5 H- r9 f2 q
        LCALL   DEL; s! k# G8 Y' d+ V& F. J( \
        MOV     A,R7, m1 Q+ k( {3 x: q+ q
        CJNE    A,20H,MUSIC2    ;中断计数器(20H)=R7否?0 Q- \2 t) {$ W; d( y
                                ;不等,则继续循环
* o& T9 n, A, m        MOV     20H,#00H        ;等于,则取下一代码6 G* ~" N% R& g/ F, C* j. ~" G3 m) D9 H+ i
        INC     DPTR* b1 {- S& a# P% P
;        INC     B+ c) e( K+ h, t
        LJMP    MUSIC1; H$ x% S7 ^1 s% h( X& Q
MUSIC3:
) M$ T, C# o/ ^- C7 Z' q1 b, z        NOP
% C0 \5 l/ X( y        CLR     TR0     ;休止100毫秒8 V. @* D3 q. [
        MOV     R2,#0DH
, i7 `# b: A" OMUSIC4:
% u5 N& w; f: N; d  E$ U- |        NOP
5 m# n4 s+ Z* D$ V" g8 E$ D        MOV     R3,#0FFH7 e. w0 b2 }! H1 y2 q( Y
        LCALL   DEL
; e0 Q1 a7 `; B% i4 R4 M  c        DJNZ    R2,MUSIC4; v5 Y8 i0 K% Q" k* F1 r9 G
        INC     DPTR) L. W# B5 t% @# E" ?$ G
        LJMP    MUSIC1
6 d1 b2 f4 [, u& V7 R& V8 ^END0:% {. R9 e; X6 Z' Q% i
        NOP) Q9 R$ G' z+ j. n$ {
        MOV     R2,#64H ;歌曲结束,延时1秒后继续
+ i& `# [$ o- Y" @MUSIC6:
3 X8 d5 h1 F# I, F        MOV     R3,#00H
1 \" g: p) D! ?! ?        LCALL   DEL
8 }4 h+ U5 V% A+ m. T        DJNZ    R2,MUSIC6
: h6 W) m& p/ a+ q8 W( E        LJMP    MUSIC0
( J  A0 r' M4 ?) yDEL:* ?. n1 b7 v' [( ^/ M0 O
        NOP
7 u2 N+ n, W, vDEL3:                  
( h0 P) |/ h6 ~3 l, _, b        MOV     R4,#02H
) m- `# H6 V3 B5 T8 g0 J% J+ j3 ZDEL4:   
6 K" a( I, @* g( \: H/ j        NOP; E  H( y7 ~$ Q' z& F6 K
        DJNZ    R4,DEL4
# v" H) d5 P) C& k        NOP
( U- [8 m* n* F6 Q        DJNZ    R3,DEL3
) S! g6 b" M+ p; t" c- [        RET
7 y4 I4 e" Z# J7 h4 z        NOP' t5 ?5 `" I( Y' u- d! K/ ^5 k
DAT:   
8 d' c( v( X. F. ^        DB      18H,     30H,     1CH,     10H/ |, y0 s+ s% T
        DB      20H,     40H,     1CH,     10H     ; N# @5 @4 E4 B% n
        DB      18H,     10H,     20H,     10H
; v9 ^" @& M8 O        DB      1CH,     10H,     18H,     40H5 ?% B. p0 W# v3 L3 A$ a
        DB      1CH,     20H,     20H,     20H8 c, V! n( \5 m& q
        DB      1CH,     20H,     18H,     20H     # j& |3 [) y6 J$ {2 ^, |% m" x
        DB      20H,     80H,     0FFH,    20H
, a7 O' B  D* ~% {5 N8 l! c        DB      30H,     1CH,     10H  ,   18H! c8 U/ |; x# g' V9 _3 _% }+ u$ T& G
        DB      20H,     15H,     20H ,    1CH: ^! A) I6 q0 Q3 _
        DB      20H,     20H,     20H ,    26H
! |; C) `1 w# x        DB      40H,     20H ,    20H ,    2BH
; N( A% }2 c) d* Q  K! N        DB      20H,     26H,     20H ,    20H     / W8 d. k) I" P8 Z
        DB      20H,     30H ,    80H ,    0FFH9 V7 r8 E% v' N
        DB      20H,     20H,     1CH ,    10H
' J- n( H' v. L# [4 ?        DB      18H,     10H,     20H ,    20H+ h9 w+ N6 L4 Z
        DB      26H,     20H ,    2BH ,    20H6 l6 T4 R- K4 y" F
        DB      30H,     20H ,    2BH ,    40H
: Q7 o& ?4 j" ]  Z, E9 p. l        DB      20H,     20H  ,   1CH  ,   10H" {* l+ e: B% h2 I# {+ p. b
        DB      18H,     10H,     20H,     20H
) B! Q. z3 h2 ]/ \1 F        DB      26H,     20H ,    2BH,     20H
0 F; ?& ^; l7 {" F# s0 V        DB      30H,     20H,     2BH ,    40H5 W6 S1 V4 y, F5 f4 d
        DB      20H,     30H,     1CH ,    10H
5 j( \5 \( Q. c' P        DB      18H,     20H ,    15H ,    20H" \5 D) j% w+ Y) ]6 J9 M
        DB      1CH,     20H ,    20H ,    20H
$ v8 g7 d; A9 b( p* N8 a$ \        DB      26H,     40H,     20H ,    20H     
" m3 z+ y; _6 n- w, n8 e- |        DB      2BH,     20H,     26H ,    20H     1 H5 u. Y2 c$ a# m* j4 ~& x* O
        DB      20H,     20H,     30H ,    80H  D3 t* ^3 @* f. ~) K2 S7 b
        DB      20H,     30H,     1CH ,    10H
3 D; ?! }& O1 K  h7 y( h        DB      20H,     10H,     1CH ,    10H
0 A8 H1 L1 J6 E7 R        DB      20H,     20H,     26H  ,   20H6 }+ Y; R- Y) `/ _& l) V' F
        DB      2BH,     20H,     30H  ,   20H1 W5 y6 e1 E4 O4 N1 D7 W
        DB      2BH,     40H,     20H   ,  15H4 a7 Y2 C  k7 }- d
        DB      1FH,     05H,     20H    , 10H8 m9 y* f, ~* ]) ]) G- I
        DB      1CH,     10H,     20H ,    20H0 s; F" u! F' C; I0 A& I
        DB      26H,     20H,     2BH ,    20H
+ S0 O. Z& _8 K  h# M' Q        DB      30H,     20H,     2BH ,    40H
; p& V8 H. {1 m        DB      20H,     30H,     1CH  ,   10H( A1 D; W+ V3 n* C* B
        DB      18H,     20H ,    15H  ,   20H
  {9 u  X4 z: ~$ w  h' V; ~9 \        DB      1CH,     20H ,    20H  ,   20H. Q, L  t  G! w: I3 z
        DB      26H,     40H,     20H  ,   20H
3 X  k  S5 @* K4 b0 v- n        DB      2BH,     20H,     26H   ,  20H% o. k8 d1 Z+ k5 U! ~5 ?9 [# m9 }
        DB      20H,     20H,     30H,     30H      8 i2 m( d( C. V. J* S
        DB      20H,     30H,     1CH,     10H
7 g. _% ?2 L9 z. \$ l6 v; R        DB      18H,     40H,     1CH,     20H
( X5 G1 P5 a. j        DB      20H,     20H,     26H,     40H! O" ?0 i) m5 u9 v1 g0 ]
        DB      13H,     60H,     18H ,    20H
& r8 k7 P: j0 U4 e: G3 j1 ]        DB      15H,     40H,     13H ,    40H" T" j) V" s9 `
        DB      18H,     80H,     00H
( u% X- f& p8 y. ^8 Oend- z; q, g+ B1 g) T

该用户从未签到

2#
发表于 2022-8-16 11:30 | 只看该作者
不错啊受教了,真的很有用

该用户从未签到

3#
发表于 2022-8-16 14:39 | 只看该作者
谢谢楼主,实在是好东西啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-24 01:35 , Processed in 0.125000 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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