#include<reg52.h> E|-5=!]fX
#include<present.h> v~AshmP
eV(.\Lj
sbit Buzz=P3^7; qB@N|Bb
jdVj
FCl^#
uchar flag=16,sign=1; E[ -yfP~[
uchar time=0; //流水灯定时 n4{?Odrf
uint *pf=Happy_Birthday; r@i)Sluf
uint *p=Happy_Birthday; 1Ci^e7|?
n?6^j8i
void init_devices(void) WN|_IJR~
{ yMkR)HY
TMOD=0x11; "* FjEA6=
TH1=0x71; P5G0fq7
TL1=0x48; //40ms的定时 #sF#<nHZ
TH0=0x00; +Q5'!@8
TL0=0x00; //初始化 !a V:T&6
IT1=1; )AieO-4*
EA=1; IY!.j5q8
EX1=1; {%('|(57
ET0=1;
>_]Ov:5
ET1=1; )D+eWo
} %kkDitmI{
KU/QEeqbrp
void int1() interrupt 2 using 0 {_4Hsw?s6
{ Y@UW\d*'%I
sign++; //下一曲 Y/m-EL
switch(sign) O['[_1n_u]
{ case 1:TR0=1;pf=Happy_Birthday;flag=16;break; gL|
9hvHr[
case 2:pf=Legend;flag=8;break; *h?}~!AjY
case 3:pf=Childhood;flag=8;break; 7,?ai6{
case 4:TR0=0;sign=0;Buzz=1;break;//停唱Buzz=1,三极管关断,防止大电流 Y*lc ~X
default :pf=Happy_Birthday;flag=16;break; wS$ 'gKA6
} 32j#kJ W
p=pf; AGwdM-$iT
} AYoTCi%7E
ebL0cK?
//定时器0产生频率 uJ1oo| sn
void timer0() interrupt 1 using 1 "tmu23xQ
{ rOUQg_y
uint temp=65536-*p; &432/=QSm0
TH0=(uchar)(temp>>8); $_HyE%F#
TL0=(uchar)temp; *fy aAv
if(*p) Buzz^=1; P()&?C
else Buzz=1; //Buzz=1,三极管关断,防止大电流 06pY10<>X
f@Ve,i
} kyYU 1gfh
VJr ~h
"[
//定时器1产生40ms延时 S?'L%%Vo
void timer1() interrupt 3 using 2 i(# Fjp
{ F2n4#b
TH1=0x71; 6khm@}}
TL1=0x48; //40ms的定时 1csbuR?
SBi4i;qD
if(flag==0) (YPG4:[
{ B/~ubw
flag=*(p+1); #~|esr/wf
if(flag==0) w17{2']
{ ^h`rA"F\
p=pf; =@P(cFJ/
flag=*(p+1); VqOTrB1w/
} ^s=F<_{
else ^6CPC@B1
{ p++; :Xx7':5
p++; =(,kjw88w
} mxc^IRj
} S!R(ae^}
else flag--; 8y?q)y9h
time++; //流水灯定时 OMjx,@9
if(time%5==0) g'-hSV/@}@
{ switch(time) !.q#X^@>L
{case 5:P0=0x01;break; xTZJ5iZ17
case 10:P0=0x02;break; `Y '-2Fv
case 15:P0=0x04;break; ']X0g{%
case 20:P0=0x08;break; PIsXX#`7;
case 25:P0=0x10;break; O]25{L
case 30:P0=0x20;break; ${t$:0R,h
case 35:P0=0x40;break; UG]5Dxk
case 40:P0=0x80;time=0;break; z`dnS]q9
default :time=0;break; BSEP*#s
} bGj<Dojl
} tKi^0vE8
} ; ?,'jI*1
OtT*)8*c
void delay(uint i) q^[SN
{ *unJd"<*&@
while(i--); R~dWblv
} RHt~:D3*
void word(uchar *ps) //显示单个字符 y<yU5
{ uchar i,j; $*9:a3>zny
uchar _bit=0X80; eX^ F^(
for(i=0;i<200;i++) 1eS@ihkP
{ Q#4OgNt
for(j=0;j<8;j++) ef:Zi_o
{ P1=0xff; HhTD/
P2=~_bit; -K5u5l}
P1=*(ps+j); .m%ygoO
delay(100); f(-3d*g
_bit>>=1; aSSw>*?Q
} R"71)ob4
_bit=0X80; Op iVQr:
} !8J%%Ux&M
} UzkX;UA
void display(uchar *ps) //显示移动字符 5PKdMEK|q
{ uchar i,j; dM5N1$1,
uchar _bit=0X80; yjChnp
Cc
while(*(ps+8)!=0xaa) S'q4va"
{ "3a_C,\
for(i=0;i<20;i++) *C^`+*}OE$
{ RLF]Wa,
for(j=0;j<8;j++) `lE8dwL
{ P1=0xff; Rd+`b
P2=~_bit; "Ze<dB#,Y
P1=*(ps+j); Ktf lbI!
delay(100); G^w:c]
_bit>>=1; F:2V;
} gG46hO-M%x
_bit=0x80; R<8!lQ4s
} 0hju@&