单片机_音乐播放器_stc89s52
一、前言
单片机自20世单70年代单世以~作单微型单算机的一重要的分支来个很~单用非常泛~以单人单社单生了巨大的影。尤其是广会响MCS-51系列的单片机~由于其具有集成度高、功能强、可性好、系单单单单、价格低廉、易于单展和使靠构
用等特点~在我已得到泛的单用收到好的成果。单然世界各大公司国广并很
也有各单型的高性能单片机单世~但号MCS-51系列单片机仍然是我在单片国机单用单域的首单机型。在单我以STC89C52单片机单基单单单音单播放器。二、单程单单及要求
本次涉及的是单片机控制的音单播放器~使单片机播放出一首音单。
单单单目, 单片机音单播放器
单单要求,
1、完成89S51的外单单位、单单和单源等外单单路的单单~完成单器单单单单。声
2、根据各音单单率算出定单器定单常~根据单拍单出单音单持单的单单。 数
3、完成音单播放单件完成单单
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
的单~最好能单一播放子程序用于并翻写个
播放。
4、播放音单片段
三、方案单单
采用单片机单单单路。此单路包括单单单路、单位单路、音单单单单路和来MCS-51单片机。各部分功能如下,
1、单单单路,由石英晶振单器单生单片机工作单所必单的单单信。振单器采用体号
12M的晶振~使之机器周期 Tcy=1us,方便单音程序的单算和单单。
2、单位单路,由单位按单使单片机的CPU和系单中其他部件都单于一定个确的初始单~单单单单单始工作。状并从个状
3、音单单单单路,由于单片机最大灌入单流单3.2mA~所以单用PNP管~要并在PNP的基和单射加限流单阻。极极
四、硬件单单
1、单单元器件
根据系单要求~单要求蜂单器及单单单路成单片机音单播放器~单单用蜂单器、构
三管、单阻、单容。极
2、硬件原理
单片机控制的音单播放器原理单,
1
123456789101112131415161234567817GND18PVCC11920GNDPVCC2ENDDP1P2J3128641602EN_1602P1PORTP1023P12PVCC2GNDMC14P10P00PVCC1P00GNDENVCCGND5P11P01GNDP01PR3PR461KPR1104P02P02710K4K7P11P03P038P04P04DDIGI9DVCCP05P0510P06P06MU1AT89S5211MR131DQ1DQ2DQ3DQ4DQ5DQ6DQ7DQ8P10139P00P07P07CE12P1.0(T2)(AD0)P0.0VCCDR1DR2DR3DR4DR5DR6DR7DR8285508550855085508550855085508550P11238P011P13B1112P1.1(T2EX)(AD1)P0.1134K74K74K74K74K74K74K74K7aA1P12337P02279P12P14P1.2(AD2)P0.2bA214P13436P03348P1.3(AD3)P0.3P15cA315P14535P044IP126ID1P1.4(AD4)P0.4dA4P15634P05516P15MOSI12VCC1P1.5(MOSI)(AD5)P0.5eP16733P0663410W1P1.6(MISO)(AD6)P0.6fP17832P077RST5651N4148P1.7(SCK)(AD7)P0.7gDS2DS18P17SCK783DPP331321P20D1W8D11112W49P16MISO910GNDP13P3.3(INT1)(A8)P2.0aA1P321222P21D2W7D279W3DIG1DIG2DIG3DIG4DIG1DIG2DIG3DIG4P3.2(INT0)(A9)P2.1bA2DP3DP34K7x823P22D3W6D348W2CCISP(A10)P2.2cA3VCCP351524P23D4W5D426W1P3.5(T1)(A11)P2.3dA4P341425P24D5D51W2P3.4(T0)(A12)P2.4eDP2DP2SC526P25D6D610SSerial(A13)P2.5fSC31043127P26D7D75VCCEA/VPP(A14)P2.6g10428P27D8D83OSC_INP14(A15)P2.7DPSCON1DR919OSC_OUTD1P00JP1XTAL1SC45SU1DR101840VCCHDSP-B04EHDSP-B04ED2P01VCCLED1LED2LED3LED4LED5LED6LED7LED8XTAL2VCC1K10412912DR11VCC20GNDD3P02DVCCVCCR1 OUTGNDLLED1KLVCC34LVCC49P30DR12RST910P30D4P03PVCC2VCCW3R2 OUTRST(RXD)P3.01KLQ156814DR1311P31D5P04PVCC1T1 OUT(TXD)P3.11K8550783P317DR14P371730D6P05T2 OUTP27P3.7(RD)ALE/PROG131KVCC714DR15P361629R1 IND7P06HEADER 4X2P15C1+C2+152P3.6(WR)PSENMP1MP4LR081K235DR16GNDV+R2 INT2OUTD8P07C1 -C2 -64K7111KSC1SC26V-88T1 IN10P101K161041041MAX23277T2 INVCCT2OUTD1P11VCC66LVCCW4RS2325544KEC1D233EVCCP16EKEYEVCCGND22MK1P07P37P30P31P32P3311EEPROMRESETP06P36104MC4EU1D3P0P3P05P3510U/16VER1ER218W5P04P34A0VDDRST4K74K727MP2MP3P03P33A1WP36PCON1P02P326A2SCLD4P25MR2K11K12K13K148845P17P01P31VSSSDAP26P344K7377P00P30BB526624C08SW-PB4SW-PB4SW-PB4SW-PB441551D5GNDGNDTX1344W6VCC12D+POWERK21K22K23K24233TRTC3D-P35TC1122UCON1USBVBUSP17P27D6TVCCGND32K11VCC6P16P26SW-PB4SW-PB4SW-PB4SW-PB4GNDP12SW15P1P2P15P25VCC2104R14P14P24TU1OSC32 OUTOSC32 INK31K32K33K34OSC_IND71KP13P23P36TVCC18BATW7VCC2VCC11P12P2227C1VCC1X1SCLK2C2P11P21SW-PB4SW-PB4SW-PB4SW-PB436PWRX2I/O3D8P10P20104P22GND45220U/16VVCC2GNDRSTPOWER-KEYJP2P23P37K41K42K43K44P21BEEPP24DS130212X1P20DS1OSC32 INP32P33P34P3534VCCSW-PB4SW-PB4SW-PB4SW-PB4TVCCVCCBOSC32 OUTK1K2K3K4W856DSEVCCVCC12M78OSC_OUTBEEPDS18B20MC3MC2BQ1SW-PB4SW-PB4SW-PB4SW-PB4HEADER 4X230P30P8550DSU1BR1DSR1BU1VCC4K74K73GND21DS18B20BEEPVCCBEEPDS1AAIR1JP3100IU1P321TitleIR38K322IR38KCON21SizeNumberRevisionIR 38KA3Date:12-Jul-2010Sheet of File:H:\实实实\syb51.ddb制作路板制版Drawn By:12345678五、单件单单
1、音三要素声
人耳单不同强度、不同单率音的单范单单域。在人耳单域范单单~声听称声声内
声听来音单心理的主单感受主要有振幅、单率、音高、音色可以再主单上用描述具有振幅、单率和相位三物理量的任何单单的音~故又单单音“三要个声称声
素”。
2、音符单音原理
单曲中不同的音符~单单上就是不同单率的音。通单单片机单生不同的单率声
的信~单单放大单路~由蜂单器放出~就单生了美妙和单的单曲。脉冲号
3、单片机单生不同单率信的原理脉冲号
1,要单生音单~只要算出某一音单的;脉冲脉冲1/单率,~然后此周期将
除以2~单半周期的单单~利用定单器单单单半周期的单单~每单单到后就即个当
将脉冲单出的I/O反相~然后重单单单此半周期的单单再单I/O反相~就可以在
I/O脚上得到此单率的。脉冲
2,利用8051的部定单器使其工作在单器模式内数MODE1下~改单单单数
TH0及TL0以单生不同单率的方法如下,
例如~单率单523Hz~其周期单 1/523 S=1912uS~因此只要令单器单数
单956uS/1us=956~在每单数956次单就将I/O反接~就可得到中音
DO;532Hz,。
单单单单率的单系公式如下,数脉冲与
N=Fi/2/Fr
2
;N,单单~数Fi,部单单一次单内1uS~故其单率单1MHz;12MHz的晶振,~
Fr,要单生的单率 ,
1 其单单的求法如下,数
T=65536-N=65536-Fi/2/Fr
一般单~单片机演奏音单基本都是单音单率~不包含相单幅度的单波单率来它。因此~单片机奏单只需弄楚清两个概念~就是“音单”和“单拍”。音单表示一个个个音符唱多高的单率~单拍表示一音符唱多单单单。知道了一音符的单率后~怎声呢来单单单片机单单相单单率的音,一般单~常采用的方法就是通单单片机的定单器定单中~单片机上单单蜂单器的断将I/O口回取来来清反~或者回零~置位~从声声将而单蜂单器单出音~单了单单片机单出不同单率的音~我单只需定单器置不同的定单单就可单单。在单片机上控制一音符个多单可采用循单延单的方法单单。首先~却思确个定一基本单单的延单程序~比如单以十六分音符的单单单基本延单单单~单于一音符~如果单个它它十六分音符~只需单用一次延单程序~如果单八分音符~只需单用次两延单程序~一次单推
具单单方法单,单单中的每音符的音单及单拍单单成单单的音单和单拍体将个参数
参数将数个~他单做成据表格~存放在存单器中~通单程序取出一音符的相单参数个参数~播放单音符~单音符唱完后~接着取出下一音符的相单……~如此直到播放完单最后一音符~根据需要也可个个另循单不停的播放整单曲。外~单于单曲中单休止符~一般其音单单单将参数FFH,其单拍其他音符的单参数与拍定方法一参数确参数致~单曲单束用单单拍单00H表来示。
六、程序单单
#include
#ifndef __SOUNDPLAY_H_REVISION_FIRST__
#define __SOUNDPLAY_H_REVISION_FIRST__
#define SYSTEM_OSC 11059200 //定单晶振单率
//原始单率表
unsigned char code SignTab[7] = { 0,2,4,5,7,9,11 }; //1~7在单率表中的位置
unsigned char code LengthTab[7]= { 1,2,4,8,16,32,64 }; unsigned char Sound_Temp_TH0,Sound_Temp_TL0; //音符定单器初单单存 unsigned char Sound_Temp_TH1,Sound_Temp_TL1; //音单定单器初单单存sbit BeepIO = P2^1;//定单单出管脚
while(Point < SoundLength)
{
SL=Tone%10; //单算出音符
SM=Tone/10%10; //单算出高低音
SH=Tone/100; //单算出是否升半
CurrentFre = NewFreTab[SignTab[SL-1]+SH]; //单出单单音符的单率
if(SL!=0)
{
if (SM==1) CurrentFre >>= 2; //低音
if (SM==3) CurrentFre <<= 2; //高音
3
Temp_T = 65536-(50000/CurrentFre)*10/(12000000/SYSTEM_OSC);
Sound_Temp_TH0 = Temp_T/256;
Sound_Temp_TL0 = Temp_T%256;
TH0 = Sound_Temp_TH0;
TL0 = Sound_Temp_TL0 + 12; //加12是单中断延单的单单
}
SLen=LengthTab[Length%10]; //算出是分音符几
XG=Length/10%10; //算出音符单型(0普通1单音2单音)
FD=Length/100;
LDiv=LDiv0/SLen; //算出单音音符演奏的单度(多少个10ms)
if (FD==1)
LDiv=LDiv+LDiv/2;
if(XG!=1)
if(XG==0) //算出普通音符的演奏单度
if (SLen<=4)
LDiv1=LDiv-LDiv4;
else
LDiv1=LDiv*SOUND_SPACE;
else
LDiv1=LDiv/2; //算出单音的演奏单度
else
LDiv1=LDiv;
if(SL==0) LDiv1=0;
LDiv2=LDiv-LDiv1; //算出不单音的单度
if (SL!=0)
{
TR0=1;
for(i=LDiv1;i>0;i--) //单单定单度的音
{
while(TF1==0);
TH1 = Sound_Temp_TH1;
TL1 = Sound_Temp_TL1;
TF1=0;
}
{
if(i==1*LDiv1/1024)
{P1_0=0;P1_1=1;P1_2=1;P1_3=1;P1_4=1;P1_5=1;P1_6=1;P1_7=
1;}
if(i==51*LDiv1/1024)
while(TF1==0);
TH1 = Sound_Temp_TH1;
TL1 = Sound_Temp_TL1;
TF1=0;
}
4
}
Point+=2;
Tone=Sound[Point];
Length=Sound[Point+1];
}
BeepIO = 1;
}
void Delay1ms()
{
unsigned char code dispcode[]={
0x41,0xf5,0x29,0x31,0x95,0x13,0x03,0x75,0x01,0x11,0xbf,0x11,0x45,0xf
5,0x91,0xcb,0x0f,0xff};
unsigned char dispbitcode[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char dispbuf[8]={0,0,0,0,0,0,0,0};
unsigned char dispbitcnt;
unsigned char mstcnt;
unsigned int i,j;
numble++;
for(i=250;i>0;i--)
for(j=300;j>0;j--)
{
mstcnt++;
if(mstcnt==8)
{
mstcnt=0;
P0=dispcode[dispbuf[dispbitcnt]];
P1=dispbitcode[dispbitcnt];
dispbitcnt++;
if(dispbitcnt==8)
{
dispbitcnt=0;
}
}
}
}
dispbuf[7]=numble/10;
dispbuf[4]=numble&9;
dispbuf[6]=17;
dispbuf[5]=min/10;
dispbuf[3]=min&9;
dispbuf[0]=10;
5
dispbuf[2]=sec/10;
dispbuf[1]=sec&9;
}
}
unsigned char code Music_Same[]={
0x0F,0x01, 0x15,0x02, 0x16,0x02, 0x17,0x66, 0x18,0x03,
0x17,0x02, 0x15,0x02, 0x16,0x01, 0x15,0x02, 0x10,0x02,
0x15,0x00, 0x0F,0x01, 0x15,0x02, 0x16,0x02, 0x17,0x02,
0x17,0x03, 0x18,0x03, 0x19,0x02, 0x15,0x02, 0x18,0x66,
0x17,0x03, 0x19,0x02, 0x16,0x03, 0x17,0x03, 0x16,0x00,
0x17,0x01, 0x19,0x02, 0x1B,0x02, 0x1B,0x70, 0x1A,0x03,
0x1A,0x01, 0x19,0x02, 0x19,0x03, 0x1A,0x03, 0x1B,0x02,
0x1A,0x0D, 0x19,0x03, 0x17,0x00, 0x18,0x66, 0x18,0x03,
0x19,0x02, 0x1A,0x02, 0x19,0x0C, 0x18,0x0D, 0x17,0x03,
0x16,0x01, 0x11,0x02, 0x11,0x03, 0x10,0x03, 0x0F,0x0C,
0x10,0x02, 0x15,0x00, 0x1F,0x01, 0x1A,0x01, 0x18,0x66,
0x19,0x03, 0x1A,0x01, 0x1B,0x02, 0x1B,0x03, 0x1B,0x03,
0x1B,0x0C, 0x1A,0x0D, 0x19,0x03, 0x17,0x00, 0x1F,0x01,
0x1A,0x01, 0x18,0x66, 0x19,0x03, 0x1A,0x01, 0x10,0x02,
0x10,0x03, 0x10,0x03, 0x1A,0x0C, 0x18,0x0D, 0x17,0x03,
0x16,0x00, 0x0F,0x01, 0x15,0x02, 0x16,0x02, 0x17,0x70,
0x18,0x03, 0x17,0x02, 0x15,0x03, 0x15,0x03, 0x16,0x66,
0x16,0x03, 0x16,0x02, 0x16,0x03, 0x15,0x03, 0x10,0x02,
0x10,0x01, 0x11,0x01, 0x11,0x66, 0x10,0x03, 0x0F,0x0C,
0x1A,0x02, 0x19,0x02, 0x16,0x03, 0x16,0x03, 0x18,0x66,
0x18,0x03, 0x18,0x02, 0x17,0x03, 0x16,0x03, 0x19,0x00,
0x00,0x00 };
main()
{
InitialSound();
while(1)
{
BeepIO=1;//初始化蜂单器口
P0=0x00;//事先熄单流水灯
// Delay1ms();
Play(Music_Same,0,3,360);
}
}
七、单单及体会
单单几学天的努力~我的单程单单单于完成了。单次的单单不单是单前面所知单的一单单单~而且也是单自己能力的一单提高。通单单次单程单单我明白了自己原来知单单比单欠缺。自己要单的单学会西单太多~以前老是单得自己什单单西都~什单单西都~有点懂学个眼高手低。单在~我才明白单是一单期单累的单程~在以后的生
6
活和单中都单单不学断学地单~努力提高自己的知单和单合素单。知单必单通单单用才能单单其价单。有些单西以单了~但学会真两正到用的单候才单单单回事~所以我单单只有到真会真学会个懂正用的单候才是正了。在整单单中我得了单多单西~也培单了我独会学立工作的能力~单立了单自己单作能力的信心~相信单今后的单有非常重要的影。响体会而且大大提高了单手的能力~使我充分到了在单造单程中探索的单单和成功单的喜悦个学。单然单单单做的不是太好~但是在单单单程中所到的单西是单次单程单单的最大收单和单富~使我单身受益。
7
8