发布: 2009-4-27 09:39 | 作者: hnrain | 查看: 1058次
/m0]vEw-~ ]*d8\0资料编写与整理:AVR猎手benladn911 出处:AVR猎手的地盘 http://benladn911.21ic.org/ www.avrzone.com转载请注明出处电子园51单片机学习网U7kS {rrW5Gj
3Sy.`Q,F;uey%F0在2006年时候记得我在做 ISD1420的播放控制,当时在 选段播放上遇到了问题,当时网络上也没有详细描述具体的控制方法,也在咱们坛子里问过。电子园51单片机学习网 |5P_ A;]u S
折腾了很久,后来还是实现出来了。但资料后来没有实际应用到产品上,今天翻看资料的时候发现了,拿出来给同样碰到问题的朋友做为参考。
M!xDU+ig'O!R!H+s4i0以前写的C程序比较菜,注释比较多。(现在写的程序注释也很多 :)电子园51单片机学习网_7u4O6CZ#]
电子园51单片机学习网YO9zUX z(v
电路图简单画了下,大家都看得懂:
h fwL-w&L/Or4W0电子园51单片机学习网*[?,Nu"h.Jw{
电子园51单片机学习网8g%_3J$_|Sfg%k t&ha
附上 KEIL完整工程:电子园51单片机学习网k$A/]^`$B
电子园51单片机学习网$Z!Yk8c ]'c1420_code.rar电子园51单片机学习网 @e2h/E*OGL!W.rI6vs*P
EB-aW7GgYm x4m0
+Y1I$^L`whP"w0VCHG8eCVK.h0程序原文:
y!e%zB EV6[0/**********************************************************电子园51单片机学习网:O9{1fwq;R
功能: 使用STC2052单片机控制 ISD1420语音芯片的播放电子园51单片机学习网.F \X&W6M r
1、顺序连续分段放音
mb+Wg#QmY9| Q3X%R0 2、选段播放(播放任意段)
$lPP{ I~n0 3、所有的播放控制都是通过接收串口的命令来执行
Aazz pxk+[7l;U0 电子园51单片机学习网]]a v[
编写: benladn911 AVR猎手电子园51单片机学习网Q&SC9f2nR)BU
oYS u}-E oPE0日期: 2006-6-28创建
RrY%P0M \fJx0 2008-2-21添加注释和完善电子园51单片机学习网7K WQ0V3I@
**********************************************************/
(O9]m8E;`0
\"Nez(I Q;VIJ0#i nclude<STC12C2052.H>
|/^aR-v~g0#i nclude<intrins.h>电子园51单片机学习网W4LNdRrW
#i nclude<stdio.h>
`9}:C3T9[-b.e E#y1r*`0#i nclude<string.h>
7n!S$uX6icy K _0uXnP0
%c4Rsaekvk0//硬件端口的定义电子园51单片机学习网vdL6R1s0J
#define POW P3_7 //此引脚为单片机控制一个三极管给 ISD1420供电
+C(|;b-M2b:Wz a9NV0
o3N\L]?3p9N0q0#define PL P3_5 //接 ISD1420 的 PLAYL
"b"[#Z5?_:pb$f;N0#define PE P3_4 //接 ISD1420 的 PLAYE
1e/D)I0M/vGC0#define REC P3_3 //接 ISD1420 的 REC电子园51单片机学习网}7JdJ6Y
V'OXEQ]0#define REC_LED P3_2 //ISD1420 的 REC LED电子园51单片机学习网$aG Z/tEz8Z
&BzM ? M r:c0//操作模式的定义电子园51单片机学习网(}+F#u*t8d~
#define mode1 0xC8 //循环放音操作,按一下 PE 键可循环放音,按 PL 键停止;或按 PL 键放音,松开即停止
p/E"?1~]-L!rG;w9I0
9f-b(tl`6v7r[:W$K0#define mode2 0xD0 //按顺序连续分段录放音,每段语音长度不限电子园51单片机学习网Txxd1HR!uN
#define mode3 0xC0 //地址指针复位,开始录放第一段电子园51单片机学习网n0TpV.bBTj
#define mode4 0xD1 //按 PE 键可快速选段放音
9L o@6f&Jz0电子园51单片机学习网*u:egV w&bh
//0xC1 //也为地址指针复位电子园51单片机学习网/oA7X&w,g%~NS
9dZ&EtI+t!T0unsigned char RX_index=0; //电子园51单片机学习网T6} k2k3m;uzU
bit FLAG_rev = 0; //
'o `^ ?g0unsigned char PC_COMMAND;电子园51单片机学习网 ?A K m8RaW-S3v
unsigned char RX_BUFFER[10];//串行接收缓存
1^9RM#W c&gZE$o0电子园51单片机学习网~q;T(X1} Q&x4\
void io_init(void);
{ gr f'T0void init_serialcomm(void);
1cz A+}.yA0void serial_out(unsigned char d);
6Z*MZ/R ]gOd1G0void delay5ms(void);电子园51单片机学习网 d2@*k@;f
void delay(unsigned int x);电子园51单片机学习网)Q)d%[ ~|8N5}
void nop(unsigned char i);电子园51单片机学习网 h"_*W1Lr|!Q6]aH
8z3@j}J8he0void paly(unsigned char i);//选择播放当前段操作
U`L*\"b)T0电子园51单片机学习网YC Q$_bL$C~8G
X)@F\/d0void main(void)
?5f#y rW3M!|0{
Ffkw|*C}0 io_init();
7O.~j7kj0vy0 init_serialcomm();
#@1h^ p&w@:g|0 delay(1000);
w)t2ViwOi0电子园51单片机学习网.A rX%j_l9tf,h0Cx4`R
serial_out(0xaa); //发送到PC机,看看PC端是否收到正确数据电子园51单片机学习网c~x:o)keNaFbh L;~
serial_out(0x55);电子园51单片机学习网0@,ucsu bp$f+xBM
serial_out(0x33); 电子园51单片机学习网&K-e c n0u/gT[5M+d
W0E {;Rx7t(St0 POW = 0;//开启电源电子园51单片机学习网7ov)[W0yO3Zl
v:rQD!a/|0 //P1 = mode4;电子园51单片机学习网x.H!FW1Ed5Ss
//P1 = 0X00;
#m!TrK{0 while(1)
/G GL k{0 {电子园51单片机学习网}+j3b.\T+eU
电子园51单片机学习网)tX-Q"Z(`z
} 电子园51单片机学习网 o4{K~7M K$?&sm
}电子园51单片机学习网3ge%a#jm1IY
电子园51单片机学习网%pa^-Z7{-D(hn ?
//----- 端口初始化 电子园51单片机学习网]WPy%V?X;P*m
void io_init(void)
:Zm [ `9~0{
-wm;JbkXW*M0 P1M0 = 0x00; //设置STC的 IO 为标准51 IO模式电子园51单片机学习网z4G*Z(XS
P1M1 = 0x00;电子园51单片机学习网u s C)wBk/N z-L#d
P3M0 = 0x00;
w"cr6q~%h'r P0 P3M1 = 0x00;
)n6X{A@0 P1 = 0XFF;
R9~MfT)HXo+mC H0 P3 = 0XFF;
?Fn5aG(d z0}
}+b\HVHx(E0
(wN3bpT:N4v+j"w} i0//串行口初始化电子园51单片机学习网(EE&_%Xv+j&Zo|'F
void init_serialcomm(void)电子园51单片机学习网+z:VYEJ#c}
{
;SOtBd2g/L c0 SCON = 0x50; //SCON: serail mode 1, 8-bit UART, enable ucvr 电子园51单片机学习网9\*s fzK1}
电子园51单片机学习网r*H`~A4a7_
TMOD = 0x20; //TMOD: timer 1, mode 2, 8-bit reload 电子园51单片机学习网N%z%T9S0Wfd?
电子园51单片机学习网Jy8r;L4Bb&R"HG
TH1 = 0xf3;//12MHz, 2400 bps电子园51单片机学习网0|-bH9ld!kp
TL1 = 0xf3;电子园51单片机学习网V%P J+F"w"U0i
//IE |= 0x90; //Enable Serial Interrupt 电子园51单片机学习网,w'^*gBBf3@%vh.i
电子园51单片机学习网Hk.?/["SR _$|
TR1 = 1; // timer 1 run电子园51单片机学习网J5x.L W$L
%s8?4} p0ds%Du0 ES=1;
0|r1Jn#k!R0 EA=1;
*mGOWV+[fE!N6T0?;q0}
!P\:f|,g@B k0
ZE0`1P;D'O*z0//串行数据发送,查询模式电子园51单片机学习网cGbD$l0z a3t
void serial_out(unsigned char d)
7s is:uP4_Dp0{
)nY&]#]fFdR0 ES=0;电子园51单片机学习网m%l_W?N&U}
SBUF=d;while(TI==0){;}TI=0;
0B||n ^]$J ~L0 ES=1; 电子园51单片机学习网.I!j.I;zmZ
}电子园51单片机学习网\2c{!W(s
r$ua0kz r:r&d0//串行中断接收
F_T5ETZ(@0void receive() interrupt 4电子园51单片机学习网$hh(DO?W_)_
{
ph2^"\ ~3`z:x^0 if(RI)电子园51单片机学习网9gc-T%i*I3y-M~ t
{
6xL\j$xgQ0 RI = 0;
*|uh/d/U!i0 ES = 0;
~+b#]Y(a0 PC_COMMAND = SBUF;
N(VPH"tX(X0电子园51单片机学习网Wd;\SVc*by
//RX_BUFFER[RX_index] = PC_COMMAND; //保存数据到数组里面电子园51单片机学习网 {0e(~7O&_.h g's
//RX_index++;
,{)[U!Jz^-Q0 switch(PC_COMMAND)
:F gPw;kx@\0 {
?)G_pI#N8v4f x O0电子园51单片机学习网 j%`a0\(`!? dd9s-vR
电子园51单片机学习网+I.QC B I1xzN
case 0xa0:
4wB4q8nb$u-W0
nyXp^9nyN*uM0 serial_out(0xa0);电子园51单片机学习网.i[[;Qhk*E
P1 = mode2; //按顺序连续分段录放音,每段语音长度不限 0xD0 连续寻址,A4
~"T"o#T?%M}0
w)r0CP.Y{xTa0 PE = 0;
p;zK2[u@m0 nop(10);
nycyEa+X P0 PE = 1;
"D!e7e D.Syj-Vu0
8H @c&Z6jOt2{0n0 P1 = 0XFF;
X ]o/vbW0电子园51单片机学习网6Cj(ZcB
break;
)I Zz.o,tt0 电子园51单片机学习网 r#E[r] \%T/Mr'c2x
case 0xb0:电子园51单片机学习网Dko1\q%fcW
serial_out(0xb0);电子园51单片机学习网9D1F)es hI].U
P1 = mode3; //地址指针复位 0xC0
"[(W{,f K1f {"V0 电子园51单片机学习网 e;jeLF8X;?
nop(10);电子园51单片机学习网F%Z @9H t5g g
P1 = 0XFF;电子园51单片机学习网F7{;m3iw
电子园51单片机学习网y ]+^\ f;^
break;电子园51单片机学习网l;SJG?'X
H4i-l1Y3w0 case 0xc0: //选段播放控制电子园51单片机学习网d/})Z$q[ E
serial_out(0xc0);
7b!|M)z|*A1ZZV0 电子园51单片机学习网{8nN`n4F0~"xv.T
电子园51单片机学习网7escm? ZvLA
P1 = 0xD1; //第二步:快速选段放音电子园51单片机学习网dG q)H&s2kt |}
电子园51单片机学习网n7VC0Yy;|6w k
9dVTR|J;V0 P1_0 = 0; 电子园51单片机学习网1d3i:Wz5|%XX1O
nop(10);
k} i XM1J%oD0 P1_0 = 1; 电子园51单片机学习网6j6F+q8b#G*y
nop(10);
}n,V9Y,~0 电子园51单片机学习网k Q3zi-] R9d
电子园51单片机学习网6Go)`RW`
PE = 0;
)P.YJ{,K }2b2W7{;k-o:A0 nop(10);
0B}I v6t+z0 PE = 1;电子园51单片机学习网$@oPK-R9Pgm/B
电子园51单片机学习网6e+ch @FJ?5S
break;电子园51单片机学习网7d}@)n;N+P k
电子园51单片机学习网-O$} [p8j
case 0xd0:
6HeePFz-cFG6_0 serial_out(0xd0); //播放任意段的组合
Z n(gL\g0 paly(3);
h.@[o%o7Y'H$v!jD0 paly(1);电子园51单片机学习网;ep t}3Mz;Z? t
paly(5);
4E w;cY#X6l2lCeJ0 paly(5);
\:Jk$} j0 paly(6);
Qa+vBks~#ZZ0 paly(4);电子园51单片机学习网osC2b`6as
paly(3);
:Jk[S:X)[0 paly(6);
H)T-JI Z5E2d0 paly(1); 电子园51单片机学习网!R2lfM[
}5PL3d'G Y(@0 break;
/Wos#_&Go0电子园51单片机学习网'xHSI mdH*_+T0w(wt V
case 0x30:
)?K3r-@/w_(_U0 serial_out(0x30);电子园51单片机学习网[ r%^iq
//此操作循环放音操作,按一下 PE 键可循环放音,按 PL 键停止;或按 PL 键放音,松开即停止电子园51单片机学习网7HP)] J{
//此操作没什么用
9HsR` Q[6TT0 P1 = mode1;电子园51单片机学习网 U7M4[)w"Y;q,v]A.T
电子园51单片机学习网z#cP$?+l;mA
PE = 0;
6`+L v%dak0 nop(10);电子园51单片机学习网&f |-t#af0k#F5\
PE = 1;电子园51单片机学习网%^"[W!f\+nvd` Q
//
D@ X,Do{4t0 break;电子园51单片机学习网FNqw ^;sg8[8?
电子园51单片机学习网?wZ$hD#FZu c(D
default: break;
rw,AH'X ca}H0 }
K3d2Y K9rt/y's0 电子园51单片机学习网(\v4Yw6w0}_
ES = 1; 电子园51单片机学习网`l#m*k-E d5nB
}电子园51单片机学习网N5|zU{u
}
7{:^!F@s*F,?0电子园51单片机学习网 mrRB k:k
/*************************************************************
%[m2}/w ^4ax0 选段播放,i 的值就是要播放的当前段
OJV YyP+J;@w0 i的取值:1 ~ ...电子园51单片机学习网|-f"l&|1^!Y8_
**************************************************************/
sv` Y U"Qo}0void paly(unsigned char i)
!u!C R1|r\~9^0{
| O'K Q&o;~%u+g0 i--;电子园51单片机学习网Q~(`lM aY,A
电子园51单片机学习网3h:j0Qg??9f,Gef#c
P1 = mode3; //第一步:地址指针复位 0xC0 A7--A0: 1100 0000 (A2、A5在应用中可直接接地) 电子园51单片机学习网B3~2sy[
nop(10);
-` H Pi1vMY.dC q0 //P1 = 0XFF; 电子园51单片机学习网6~ k$p8U(i"pI [
bY G |Y y\Q#rHK$i0 delay(30);//必要的延时电子园51单片机学习网0M4h&@s q;}
电子园51单片机学习网9^a8|uhP:Zw
if(i>0)电子园51单片机学习网 I#y]%Fl*ts q
{
+s8[(hN8sA6r0 P1 = 0xD1; //第二步:快速选段放音 0xD1 A7--A0: 1101 0001 (A2、A5在应用中可直接接地)电子园51单片机学习网y4S*n/P7X
do电子园51单片机学习网Y"X8v2o.P#@J;Z
{ 电子园51单片机学习网&g[:]C l~#D
P1_0 = 0; //给 A0 低电平脉冲 电子园51单片机学习网#|-}6odP9CSm.i_
nop(10);
@m3mt Our#m0 P1_0 = 1;
9L:?uqO5`n0 nop(10);电子园51单片机学习网G0L/g9n }T
T;q8t?d*U%y:t0 PE = 0;电子园51单片机学习网7sA/WE2n,WXt
nop(10);电子园51单片机学习网vT+t0dL)P-s
PE = 1;
j @x/d @b:@X Tab,V0
G!JZ,F~-v S0 delay(50);//这个延时是非常必要的! 电子园51单片机学习网&Q7K,{dHwld
i--;
&hQ k\^2RV S$p:wI0 }
'P y`(D{;Kd0 while(i!=0);
khR}0fT9e0
EEA h7~C0 delay(30);//必要的延时电子园51单片机学习网 a;jq^0x{d
}电子园51单片机学习网xg.X BlKsC%mp
电子园51单片机学习网 m]"{r`-F;S
J#_/[ Q I3K_ G0 P1 = mode2; //第三步:播放当前段 0xD0 A7--A0: 1101 0000 (A2、A5在应用中可直接接地)
'q;r(vyf6R0
F j _%A*p;M0 PE = 0;
*rk?"[6F0 nop(10);电子园51单片机学习网z,iK~2{~n
PE = 1;
(I@B6U!A K)||0 //P1 = 0XFF; 电子园51单片机学习网5QG9fgA
N@L5k:J)z9x @0 while(REC_LED==1){;}//等待播放
:n:EyII0 while(REC_LED==0){;}//等待播放结束电子园51单片机学习网8Vm6g~U%O*b0e,l&ce
9Gs*R%R,|6^apq Zp0}
7x%`-F Lo$n;^Gn0电子园51单片机学习网az#dRAsl;P5M
//----------------------------软件延时函数----------------------------电子园51单片机学习网q9}'s N.Z+S0\ |
//50ms延时电子园51单片机学习网-{EsD6C8h
void delay5ms(void)
,D;^P'Rxk0{电子园51单片机学习网)Cb#IbMlh
unsigned char TempCyc = 250;电子园51单片机学习网V*s D`(\.?
while(TempCyc--);电子园51单片机学习网)FR!iEs X#X
}电子园51单片机学习网 m|U9Q8sr$L@
电子园51单片机学习网L*[y4c5L`f0tv
void delay(unsigned int x)
Fq3C$Ct5ce U0{电子园51单片机学习网0vKu])KU%u `
do
Ye4i5Ck'US+Q0 {电子园51单片机学习网 eY's*U"h.Xmk
delay5ms();delay5ms();delay5ms();x--;
6I.{q%| A(|0 }
HB3RhrJ8d0o0 while(x!=0);
1f-~,hY"\Q)X)v0}电子园51单片机学习网 M wM0r&{S|W
`f5fu2Lx$NRNT1E0void nop(unsigned char i)
3Bf'tm*z_1U o2Br0{
r P!M,M8Wh0 do
'F,^SX)R \+pW0 {
S[ \@ zb0 _nop_();电子园51单片机学习网 ~IuM0j(`U%oT
i--;电子园51单片机学习网`j#n~r[X.i K
}电子园51单片机学习网 C~b*^G2od"Hh3u
while(i!=0);
*WT h3N1GkT.o0}
w,Lg0pz:X\0电子园51单片机学习网'Mk(dW(B
文章评论(0条评论)
登录后参与讨论