单片机音乐流水灯报告Word文档下载推荐.docx
- 文档编号:17533314
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:10
- 大小:44.54KB
单片机音乐流水灯报告Word文档下载推荐.docx
《单片机音乐流水灯报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《单片机音乐流水灯报告Word文档下载推荐.docx(10页珍藏版)》请在冰豆网上搜索。
组员2:
焦子强
12
设备工具、软件准备等
2.实验目的要求:
1.编写程序,实现流水灯和音乐。
2.进一步熟悉KeiluVision4软件,proteus软件的使用。
3.学会构建简单的流水灯。
3.实验仪器设备、软件、元器件:
1.AT89C52型单片机一个。
2.按钮三个。
3.10k电阻一个。
4.22pF电容俩个,20uF电容一个。
5.晶体整荡器一个。
6.电阻一个。
7.数码管一个。
8.LED灯16个。
9.470Ω电阻16个。
10.SOUNDER型喇叭一个。
4.电路原理图
5.C语言程序代码:
#defineSYSTEM_OSC12000000//定义晶振频率12000000HZ
#defineSOUND_SPACE4/5//定义普通音符演奏的长度分率,//每4分音符间隔
#defineMUSICNUMBER3//歌曲的数目
sbitBeepIO=P2^6;
//定义输出管脚
externvoidLEDShow(unsignedintLEDStatus);
externunsignedcharGetKey(void);
externvoidKeyDispose(unsignedcharKey);
externvoidDelay1ms(unsignedintcount);
externunsignedcharMusicIndex;
unsignedintcodeFreTab[12]={262,277,294,311,330,349,369,392,415,440,466,494};
//原始频率表
unsignedcharcodeSignTab[7]={0,2,4,5,7,9,11};
//1~7在频率表中的位置
unsignedcharcodeLengthTab[7]={1,2,4,8,16,32,64};
unsignedcharSound_Temp_TH0,Sound_Temp_TL0;
//音符定时器初值暂存
unsignedcharSound_Temp_TH1,Sound_Temp_TL1;
//音长定时器初值暂存
//**************************************************************************
voidInitialSound(void)
{
BeepIO=0;
Sound_Temp_TH1=(65535-(1/1200)*SYSTEM_OSC)/256;
//计算TL1应装入的初值(10ms的初装值)
Sound_Temp_TL1=(65535-(1/1200)*SYSTEM_OSC)%256;
//计算TH1应装入的初值
TH1=Sound_Temp_TH1;
TL1=Sound_Temp_TL1;
TMOD|=0x11;
ET0=1;
ET1=0;
TR0=0;
TR1=0;
EA=1;
}
voidBeepTimer0(void)interrupt1//音符发生中断
BeepIO=!
BeepIO;
TH0=Sound_Temp_TH0;
TL0=Sound_Temp_TL0;
voidPlay(unsignedchar*Sound,unsignedcharSignature,unsignedOctachord,unsignedintSpeed)
unsignedintNewFreTab[12];
//新的频率表
unsignedchari,j;
unsignedintPoint,LDiv,LDiv0,LDiv1,LDiv2,LDiv4,CurrentFre,Temp_T,SoundLength;
unsignedcharTone,Length,SL,SH,SM,SLen,XG,FD,Key,LEDFlash,OFFSet;
for(i=0;
i<
12;
i++)//根据调号及升降八度来生成新的频率表
{
j=i+Signature;
if(j>
11)
{
j=j-12;
NewFreTab[i]=FreTab[j]*2;
}
else
NewFreTab[i]=FreTab[j];
if(Octachord==1)
NewFreTab[i]>
>
=2;
elseif(Octachord==3)
NewFreTab[i]<
<
}
SoundLength=0;
while(Sound[SoundLength]!
=0x00)//计算歌曲长度
SoundLength+=2;
}
Point=0;
Tone=Sound[Point];
Length=Sound[Point+1];
//读出第一个音符和它时时值
LDiv0=12000/Speed;
//算出1分音符的长度(几个10ms)
LDiv4=LDiv0/4;
//算出4分音符的长度
LDiv4=LDiv4-LDiv4*SOUND_SPACE;
//普通音最长间隔标准
TR1=1;
while(Point<
SoundLength)
SL=Tone%10;
//计算出音符
SM=Tone/10%10;
//计算出高低音
SH=Tone/100;
//计算出是否升半
LEDFlash=SM*((SL/2)+1)+2;
LEDShow(~(0xFFFE<
LEDFlash));
OFFSet=2;
CurrentFre=NewFreTab[SignTab[SL-1]+SH];
//查出对应音符的频率
if(SL!
=0)
if(SM==1)CurrentFre>
=2;
//低音
if(SM==3)CurrentFre<
//高音
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+6;
//加6是对中断延时的补偿
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;
//算出顿音的演奏长度
LDiv1=LDiv;
if(SL==0)LDiv1=0;
LDiv2=LDiv-LDiv1;
//算出不发音的长度
if(SL!
TR0=1;
for(i=LDiv1;
i>
0;
i--)//发规定长度的音
{
OFFSet=(OFFSet+1)%5;
LEDShow(~(0xFFFE<
(LEDFlash+OFFSet-2)));
while(TF1==0)
{
Key=GetKey();
if(Key!
=0x00)
{
KeyDispose(Key);
TR0=0;
TR1=0;
BeepIO=0;
return;
}
}
TH1=Sound_Temp_TH1;
TL1=Sound_Temp_TL1;
TF1=0;
}
if(LDiv2!
TR0=0;
BeepIO=0;
for(i=LDiv2;
i--)//音符间的间隔
Point+=2;
Tone=Sound[Point];
Length=Sound[Point+1];
MusicIndex=(MusicIndex+1)%MUSICNUMBER;
LEDShow(0x0001);
Delay1ms(300);
设计总结及注意事项:
1.会学用音符转码器转换我们想要的16进制数。
2.熟悉流水灯花样工作。
7.成绩评定:
成绩:
焦子强
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 音乐 流水 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)