#include<reg52.h> \a6)t%u
#include<present.h> xI<dBg|]+
`e9uSF:9C
sbit Buzz=P3^7; *h4m<\^U
,\M_q">npc
uchar flag=16,sign=1; Q'a N|^w"f
uchar time=0; //流水灯定时 [;=ky<K0E
uint *pf=Happy_Birthday; 'sF563kE
uint *p=Happy_Birthday; YW{V4yW
pHvE`s"Ea
void init_devices(void) -7O/ed+
{ d*>k
]X@G
TMOD=0x11; ,j nRt%W
TH1=0x71; -(uBTO s
TL1=0x48; //40ms的定时 668bJ.M\O
TH0=0x00; 9Bk}g50$#
TL0=0x00; //初始化 )A0&16<
IT1=1; [~<',,tA0|
EA=1; D%idlL2%J
EX1=1; 9-Qtj49
ET0=1; u-9t s
ET1=1; +2}(]J=-
} GnOo+hB
2jZ}VCzRG
void int1() interrupt 2 using 0 b(q&}60
{ tKeO+6 l
sign++; //下一曲 ]2%P``Yj
switch(sign) t4k'9Y:\Q
{ case 1:TR0=1;pf=Happy_Birthday;flag=16;break; W{+0iAYnp
case 2:pf=Legend;flag=8;break; 9(F?|bfk
case 3:pf=Childhood;flag=8;break; <e&QTyb
case 4:TR0=0;sign=0;Buzz=1;break;//停唱Buzz=1,三极管关断,防止大电流 ^R7z LHU;
default :pf=Happy_Birthday;flag=16;break; :UcS$M1LE
} mF}k}0
p=pf; 3Gl]g/
} g$"eI/o
E@jl: -*E
//定时器0产生频率 d95N$n
void timer0() interrupt 1 using 1 e-cb?.WU?
{ pInWKj[y1
uint temp=65536-*p; ;]M67ma7C
TH0=(uchar)(temp>>8); thPH_DW>eb
TL0=(uchar)temp; px>>]>ZMH
if(*p) Buzz^=1; JGDUCb~
else Buzz=1; //Buzz=1,三极管关断,防止大电流 6J-}&U
i>Bi&azx
} g**%J Xo
"$IwQ
//定时器1产生40ms延时 ~}0hN]*G
void timer1() interrupt 3 using 2 '>|*j"jv-
{ x0A%kp&w
TH1=0x71; /Tf*d>Yh;
TL1=0x48; //40ms的定时 pu$XUt
?SO F
n
if(flag==0) 6>BDA?
{ w52HN;Jm
flag=*(p+1); wt.{Fqm
if(flag==0) q AVfbcb
{ ms\/=96F
p=pf; A Wh*<H
flag=*(p+1); Fl+tbF
} #8f"}>U9.,
else K@sP~('
{ p++; ?> M oV5
p++; :y-0qzD?
} NVA`t]gn
} 4fu\3A&
else flag--; R`C_CsXir
time++; //流水灯定时 YTjuSV
if(time%5==0) 9poEUjBI
{ switch(time) v8vh~^X%P
{case 5:P0=0x01;break; ,6orB}w?z
case 10:P0=0x02;break; h,'mN\6t
case 15:P0=0x04;break; 9 QCpXy
case 20:P0=0x08;break; ilRm}lU|x
case 25:P0=0x10;break; J ]Gc
case 30:P0=0x20;break; So\| Ye
case 35:P0=0x40;break; UGC|C F2K
case 40:P0=0x80;time=0;break; jdg
~!<C
default :time=0;break; i3 l #~
} K!D_PxV
} -90ZI1O`
} k|$"TFXx;
8/>wgY
void delay(uint i) 2.Eu+*UC
{ itC *Z6^
while(i--); b ?2X>QJ
} lGnql 1(
void word(uchar *ps) //显示单个字符 Q 9gFTLQ
{ uchar i,j; yrE,,N%I
uchar _bit=0X80; ny
for(i=0;i<200;i++) V:F+HMBk
{ ^Azt.\fMX
for(j=0;j<8;j++) Wq{d8|)1
{ P1=0xff; ^!o1l-Y^gr
P2=~_bit; csFJ5
P1=*(ps+j); kHJDX;
delay(100); / 8WpX
_bit>>=1; j""y2c1
} }[KDE{,V
_bit=0X80; [aWDD[#j~
} p-i.ITRS
} 0x]OF8=J
void display(uchar *ps) //显示移动字符 ){Ciu[h
{ uchar i,j; g]==!!^<D
uchar _bit=0X80; w$b+R8.n)
while(*(ps+8)!=0xaa) u1pc5 Y{
{ 47C(\\
for(i=0;i<20;i++) *< $c
=
{ s}[A4`EWH
for(j=0;j<8;j++) 5!SoN}$
{ P1=0xff; GTp?)nh^
P2=~_bit; n{.*El>{
P1=*(ps+j); M|[@znzR<
delay(100); jHu,u|e0>S
_bit>>=1; yUD_w
} _>gXNS r4u
_bit=0x80; +(=0CA0GE
} Mz/]D J8
ps++; 9zoT6QP4
} DnG/ n
} B@"SOX
KJ0xp hf
void main() WA]%,6
{ uchar i; gqP-E
init_devices(); Q
SHx]*)
for(i=0;i<6;i++) word(figure); D4=..;
word(arrow); x9x#'H3
word(arrow); /RJ6nmN@}
TR0=1; PwFQ #Z
TR1=1; ),nCq^Bp
while(1) W"b&M%y|
{ p@?7^nIR*u
display(str1); b(PHZCy#
display(str1); QvG56:M3
display(str2); toS(UM n
} =~GE?}.o
}