单片机课程设计报告音乐花样灯精品.docx

上传人:b****0 文档编号:9342951 上传时间:2023-05-18 格式:DOCX 页数:17 大小:116.89KB
下载 相关 举报
单片机课程设计报告音乐花样灯精品.docx_第1页
第1页 / 共17页
单片机课程设计报告音乐花样灯精品.docx_第2页
第2页 / 共17页
单片机课程设计报告音乐花样灯精品.docx_第3页
第3页 / 共17页
单片机课程设计报告音乐花样灯精品.docx_第4页
第4页 / 共17页
单片机课程设计报告音乐花样灯精品.docx_第5页
第5页 / 共17页
单片机课程设计报告音乐花样灯精品.docx_第6页
第6页 / 共17页
单片机课程设计报告音乐花样灯精品.docx_第7页
第7页 / 共17页
单片机课程设计报告音乐花样灯精品.docx_第8页
第8页 / 共17页
单片机课程设计报告音乐花样灯精品.docx_第9页
第9页 / 共17页
单片机课程设计报告音乐花样灯精品.docx_第10页
第10页 / 共17页
单片机课程设计报告音乐花样灯精品.docx_第11页
第11页 / 共17页
单片机课程设计报告音乐花样灯精品.docx_第12页
第12页 / 共17页
单片机课程设计报告音乐花样灯精品.docx_第13页
第13页 / 共17页
单片机课程设计报告音乐花样灯精品.docx_第14页
第14页 / 共17页
单片机课程设计报告音乐花样灯精品.docx_第15页
第15页 / 共17页
单片机课程设计报告音乐花样灯精品.docx_第16页
第16页 / 共17页
单片机课程设计报告音乐花样灯精品.docx_第17页
第17页 / 共17页
亲,该文档总共17页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

单片机课程设计报告音乐花样灯精品.docx

《单片机课程设计报告音乐花样灯精品.docx》由会员分享,可在线阅读,更多相关《单片机课程设计报告音乐花样灯精品.docx(17页珍藏版)》请在冰点文库上搜索。

单片机课程设计报告音乐花样灯精品.docx

单片机课程设计报告音乐花样灯精品

单片机课程设计报告

 

名称:

   音乐盒

院系:

惠州学院电子科学系

班级:

   05电气

学生姓名:

   陈文志     

同组姓名:

  周俊锋、张少威  

日期:

 2008年12月

 

1、设计方案

设计一个基于MCS-51系列单片机的音乐盒,利用试验板上的开关,按开关切换演奏出不同的乐曲。

蜂鸣器发出某个音调,与之相对应的LED亮起。

使用两个按键,一个用来切换歌曲,另一个切换八路LED的变化花样。

2、实现功能:

1)电路有两种工作模式:

演奏音乐模式和花样灯模式。

演奏音乐模式:

演奏完整的一首的歌曲,八路LED随着音乐变化。

花样灯模式:

八路LED变化出各种花样,蜂鸣器随着发出“嘀嘀”声

2)按下按键1进入演奏音乐模式,再按切换歌曲,共两首歌曲。

3)按下按键2进入花样灯模式,再按切换LED花样,共四种花样。

此电路的程序只占用了1K左右,可编制更多的音乐和LED花样,使系统的功能更加强大。

3、硬件电路设计

电路原理图

由于51单片机的电流驱动能力较弱,而蜂鸣器的工作电流为几十MA,故驱动蜂鸣器需用一个pnp三极管。

单片机给P3.0低电平,则蜂鸣器开;给高电平则蜂鸣器关。

LED接到单片机的P1口,拉低IO口,可使LED亮起。

两个按键的一端接单片机的IO口,另一端接地。

不按下去时与按键相连的IO口被单片机内部上拉电阻拉高,按下则与之相连的IO口变成低电平,引发单片机中断。

4、软件设计

程序设置了两个标志——count1和count2,分别初始化为1和0。

按键1使得count1在1和2之间切换,按键2使得count2在1~4之间切换。

程序检测count1的值,count1等于1时播放第一首歌曲,等于2时播放第二首。

另一方面根据count2的值来切换LED的花样。

Count1和count2的值是互斥的,设置count1等于1、2时,count2同时设置为0;设置count2等于1~4时,count1也同时设置为0。

歌曲简谱的编码规则:

doremifasolasi分别编码为1~7,重音do编为8,重音re编为9,停顿编为0。

播放长度以十六分音符为单位(在本程序中为165ms),一拍即四分音符等于4个十六分音符,编为4,其它的播放时间以此类推。

音调作为编码的高4位,而播放时间作为低4位,如此音调和节拍就构成了一个编码。

以0xff作为曲谱的结束标志。

举例1:

音调do,发音长度为两拍,即二分音符,将其编码为0x18。

举例2:

音调re,发音长度为半拍,即八分音符,将其编码为0x22

歌曲播放的设计。

先将歌曲的简谱进行编码,储存在一个数据类型为unsignedchar的数组中。

程序从数组中取出一个数,然后分离出高4位得到音调,接着找出相应的值赋给定时器0,使之定时操作蜂鸣器,得出相应的音调;接着分离出该数的低4位,得到延时时间,接着调用软件延时。

确定定时器0对应于音调的初值:

假设要得到500HZ的声音。

500HZ的声音信号每个周期为2ms,即2000us。

假设单片机采用12MHZ的晶振,每个机器周期的时间为12/12M=1us。

故单片机操作(对与蜂鸣器相连的IO口取反)一次蜂鸣器的时间间隔为2000us/1us/2=1000个机器周期,故给工作在方式1的定时器0赋的初值为TH0=(65536-1000)/256,TL0=(65536-1000)%256。

下面给出定时器0工作在方式1对应各音调的初值,假定使用的晶振是12MHZ:

 

5、程序流程图

主程序流程图

 

播放音乐子程序流程图

 

6、调试

音乐盒的程序设计过程中,遇到了很多问题,但是通过不断调试仿真,最终都得到解决。

问题是出在蜂鸣器与单片机的输出端口上,在这个环节消耗了很多时间。

之前这些程序通过星研软件编译没有错误,而且通过ptotues仿真成功,但在实验板上调试运行时却不行。

最终在迟老师的指导下发现问题的所在,就是在单片机输出端口出现问题,由于实验箱中单片机芯片的P2口在实验箱中被其他硬件电路所占用,所以我们在使用此端口时没有达到我们预想的效果,当我们把程序中单片机给蜂鸣器的信号输出端修改为由P3口输出信号,问题最终得到了解决。

7、心得体会

做单片机课程设计是十分有意义的,而且是十分必要的。

我们在课堂上掌握的仅仅是专业课的理论知识,如何去锻炼我们的实践能力?

如何把我们所学的专业基础课理论知识运用到实践中去呢?

我想做类似的课程设计就为我们提供了良好的实践平台。

通过这次单片机课程设计,我们不仅加深了对单片机理论的理解,将理论很好地应用到实际当中去,同时也使我们认识到自身存在的不足之处,无论是理论上还是遇到问题的处理能力上都还有待提高,而且这也激发了我们今后努力学习的兴趣。

此次课程设计结果能够符合要求,成功完成了此次课程设计任务。

但我们不只在乎这一结果,更加在乎的是这个过程。

这个过程中,我们花费了大量的时间和精力,更重要的是,我们在学会创新的基础上,同时还懂得合作精神的重要性,在团队中,我们互帮互助,对整个课程设计来说,这是至关重要的,缺少每一个人都会对我们的设计产生影响。

还有要感谢指导老师在我们遇到困难时,给予我们的建议与鼓励。

此次课程设计结束了,但是从中学到的知识会让我受益终身。

发现问题、提出问题、分析问题、解决问题和实践能力的提高都会受益于我在以后的学习、工作和生活中。

8、参考文献

[1]单片机演奏音乐时音调和节拍的确定方法伟纳电子

[2]音乐和简谱知识网络资源

[3]《千年之恋》及《寂寞沙洲冷》的简谱网络资源

[3]芯片资料下载网站——三毛电子世界、21IC中国电子网等

9、附录

软件源程序:

#include

#defineucharunsignedchar

#defineuintunsignedint

sbitduan=P2^6;

sbitkey1=P3^2;//按key1可切换花样

sbitkey2=P3^3;//按key2可切换歌曲

sbitfm=P3^7;//蜂鸣器连续的IO口

sbitP34=P3^4;//矩阵键盘的一列

ucharcodehuayang1[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,

0xfd,0xfb,0xf7,0xef,0xdf,0xbf};//花样1

ucharcodehuayang2[]={0x7f,0xfe,0xbf,0xfd,0xdf,0xfb,0xef,0xf7,

0xef,0xfb,0xdf,0xfd,0xbf,0xfe};//花样2

ucharcodehuayang3[]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x0,

0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff};

charcodehuayang4[]={0x55,0xaa,0xcc,0x33,0x99,0x66,0x0f,0xf0};

ucharcount1;//花样标志

ucharcount2;//歌曲标志

uchartimeh,timel,i;

//================简谱====================

//编程规则:

字节高位是简谱,低位是持续时间,

//代表多少个十六分音符

//1-7代表中央C调,8-E代表高八度,0代表停顿

//最后的0是结束标志

ucharcodeqnzl[]={//千年之恋

0x12,0x22,0x34,0x84,0x74,0x54,0x38,0x42,0x32,0x22,0x42,0x34,0x84,0x72,0x82,0x94,0xA8,0x08,

//前奏

0x32,0x31,0x21,0x32,0x52,0x32,0x31,0x21,0x32,0x62,

//竹林的灯火到过的沙漠

0x32,0x31,0x21,0x32,0x82,0x71,0x81,0x71,0x51,0x32,0x22,

//七色的国度不断飘逸风中

0x32,0x31,0x21,0x32,0x52,0x32,0x31,0x21,0x32,0x62,

//有一种神秘灰色的旋涡

0x32,0x31,0x21,0x32,0x83,0x82,0x71,0x72,0x02,

//将我卷入了迷雾中

0x63,0xA1,0xA2,0x62,0x92,0x82,0x52,

//看不清的双手

0x31,0x51,0x63,0x51,0x63,0x51,0x63,0x51,0x62,0x82,0x7C,0x02,

//一朵花传来谁经过的温柔

0x61,0x71,0x82,0x71,0x62,0xA2,0x71,0x76,

//穿越千年的伤痛

0x61,0x71,0x82,0x71,0x62,0x52,0x31,0x36,

//只为求一个结果

0x61,0x71,0x82,0x71,0x62,0xA3,0x73,0x62,0x53,

//你留下的轮廓指引我

0x42,0x63,0x83,0x83,0x91,0x91,

//黑夜中不寂寞

0x61,0x71,0x82,0x71,0x62,0x0A2,0x71,0x76,

//穿越千年的哀愁

0x61,0x71,0x82,0x71,0x62,0x52,0x31,0x36,

//是你在尽头等我

0x61,0x71,0x82,0x71,0x62,0xA3,0x73,0x62,0x53,

//最美丽的感动会值得

0x42,0x82,0x88,0x02,0x74,0x93,0x89,0xff//结束标志

//用一生守候

};

ucharcodejmszl[]={//寂寞沙洲冷

0x12,0x12,0x22,0x32,0x31,0x22,0x21,0x22,

//自你走后心憔悴

0x21,0x31,0x51,0x52,0x31,0x52,0x61,0x15,0x14,

//白色油桐风中纷飞

0x51,0x52,0x31,0x52,0x62,0x13,0x11,0x13,0x32,0x28,0x08,0x28,

//落花似人有情这个季节

0x31,0x32,0x31,0x32,0x11,0x21,0x51,0x52,0x51,0x52,

//河畔的风放肆拼命地吹

0x51,0x51,0x31,0x32,0x31,0x32,0x81,0x72,0x63,

//不断拨弄离人的眼泪

0x62,0x71,0x81,0x72,0x61,0x61,0x52,0x31,0x21,0x32,0x51,0x54,

//那样浓烈的爱再也无法给

0x22,0x12,0x11,0x12,0x11,0x12,0x12,0x14,0x26,0x32,0x26,

//伤感一夜一夜

0x32,0x61,0x51,0x51,0x31,0x31,0x21,0x31,0x51,0x61,0x51,0x31,0x51,

//当记忆的线缠绕过往支离破碎

0x02,0x32,0x81,0x81,0x81,0x81,0x62,0x52,0x34,

//是慌乱占据了心扉

0x31,0x81,0x81,0x81,0x61,0x91,0x82,

//有花儿伴着蝴蝶

0x51,0x51,0x51,0x51,0x31,0x61,0x53,

//孤雁可以双飞

0x21,0x11,0x21,0x11,0x22,0x11,0x21,0x26,

//夜深人静独徘徊

0x32,0x61,0x51,0x51,0x31,0x31,0x21,0x31,0x51,0x61,0x51,0x31,0x51,0x52,

//当幸福恋人寄来红色分享喜悦

0x31,0x31,0x81,0x81,0x81,0x61,0x91,0x81,0x61,0x31,0x56,

//闭上双眼难过头也不敢回

0x32,0x32,0x81,0x81,0x81,0x81,0x91,0x81,0x61,0x81,0x61,0x51,0x31,0x51,0x34,

//仍然捡尽寒枝不肯安歇微带着后悔

0x21,0x31,0x51,0x31,0x21,0x11,0x61,0x21,0x16,

//寂寞沙洲我该思念谁

0xff};

//==============简谱音调对应的定时器初值=======

//适合11.0592M的晶振

ucharcodecuzhi[]={

0xff,0xff,//占位

0xFC,0x8E,//中央C调1-7

0xFC,0xED,

0xFD,0x43,

0xFD,0x6A,

0xFD,0xB3,

0xFD,0xF3,

0xFE,0x2D,

0xFE,0x47,//高八度1-7

0xFE,0x76,

0xFE,0xA1,

0xFE,0xC7,

0xFE,0xD9,

0xFE,0xF9,

0xFF,0x16

};

ucharyinyue[]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x0,0x0};

//将音调转化为对应的LED样式

voiddelay1(uintz);//延时1MS

voiddelay(uintz);//延时165MS,即十六分音符

voidsong();

voidbeep();//蜂鸣器叫一声

main()

{ucharx;

count1=0;//流水灯无花样

count2=1;//唱第一首歌

P34=0;//选取矩阵键盘的一列

EA=1;//开总中断

EX0=1;//开外部中断0

IT0=1;//外部中断0下降沿触发方式

EX1=1;//开外部中断1

IT1=1;//外部中断1下降沿触发方式

TMOD=0x01;//定时器0工作在方式1

TH0=0;

TL0=0;

ET0=1;

while

(1)

{

if(count1!

=0)

{

switch(count1)

{

case1:

for(x=0;x<14;x++)

{

duan=1;

P1=huayang1[x];

beep();

delay1(300);

duan=0;

if(count1!

=1)

break;

}

break;

case2:

for(x=0;x<14;x++)

{

duan=1;

P1=huayang2[x];

beep();

delay1(300);

duan=0;

if(count1!

=2)

break;

}

break;

case3:

for(x=0;x<16;x++)

{

duan=1;

P1=huayang3[x];

beep();

delay1(300);

duan=0;

if(count1!

=3)

break;

}

break;

case4:

for(x=0;x<8;x++)

{

duan=1;

P1=huayang4[x];

beep();

delay1(300);

duan=0;

if(count1!

=4)

break;

}

break;

}

}

else

{

song();

delay1(1000);

}

}

}

voidint0()interrupt0

{

EA=0;//关总中断

delay1

(1);//去抖

if(key1==0)

{

count2=0;//不让蜂鸣器唱歌

TR0=0;

count1++;

if(count1==5)

count1=1;

}

EA=1;//开总中断

}

voidint1()interrupt2

{

EA=0;//关总中断

delay1

(1);//去抖

if(key2==0)

{

count1=0;//流水灯无花样

TR0=1;

i=0;//从头开始唱

count2++;

if(count2==3)

count2=1;

}

EA=1;//开总中断

}

voidtimer0()interrupt1//用于产生各种音调

{

TH0=timeh;

TL0=timel;

fm=~fm;

}

voidsong()

{

uinttemp;

ucharjp;//jp是简谱

i=0;

while

(1)

{if(count2==0)

{

break;

}

if(count2==1)//选曲

temp=qnzl[i];

if(count2==2)

temp=jmszl[i];

if(temp==0xff)

break;

jp=temp/16;//取数的高4位

duan=1;

P1=yinyue[jp];

duan=0;

if(jp!

=0)

{

timeh=cuzhi[jp*2];

timel=cuzhi[jp*2+1];

}

else

{

TR0=0;

fm=1;//关蜂鸣器

}

delay(temp%16);//取数的低4位

TR0=0;//唱完一个音停10MS

fm=1;

delay1(10);

TR0=1;

i++;

}

TR0=0;

fm=1;

}

voiddelay(uintz)//延时165MS,即十六分音符

{uintx,y;

for(x=z;x>0;x--)

for(y=19000;y>0;y--);

}

voiddelay1(uintz)//延时1MS

{uintx,y;

for(x=z;x>0;x--)

for(y=112;y>0;y--);

}

voidbeep()//蜂鸣器叫一声

{uchari;

for(i=0;i<50;i++)

{fm=~fm;

delay1

(1);

}

fm=1;

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2