基于51单片机的电子八音盒详细设计步骤

  • 格式:doc
  • 大小:462.00 KB
  • 文档页数:13

下载文档原格式

  / 13
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、设计目的

利用8052单片机结合内部定时器设计一个八音盒,按下单键可以演奏预先设置的歌曲旋律。

二、设计要求

其基本功能为:1,使用LED显示器来显示目前演奏的歌曲编号;2,具有8个按键操作来选择演奏哪一首歌曲;3,内建8首歌曲旋律,按下单键可以演奏歌曲。

三、设计器材

T89C52单片机、晶振、八个按键、二位一体共阳极数码管、电阻电容若干、导线。

四、设计方案及分析

设计思路:

(1)选择8052单片机,通过T0定时中断,并配合P2.0引脚输出音频频率。

(2)P2.0引脚输出接蜂鸣器。

(3)通过P0口接LED。

(4)P1口接键盘,输入歌曲号。

音符产生方法:

不同的音调有不同的频率。频率不同,音调也就不同。

利用定时器,使其工作在模式1,定时中断,然后控制P2.0引脚的输出每次取反,就可以在P2.0的引脚输出相应的方波频率。改变计数初值,就改变了频率。定时器的定时时间等于半个周期,定时时间到就输出脉冲取反,重复此过程,就可在P2.0引脚得到一音频的脉冲。

如:中音1的频率=523HZ,周期T=1/523=1912us;

定时器的定时时间为:T/2=1912/2us=956us;

计算得TH0,TL0的计数初值THTL=64580

下面是个音符计数初值

节拍产生方法:

音乐中的节拍用延时时间产生。假设1/4拍执行一次延时程序,这1/2拍就执行两次延时程序,所以只要求出1/4延时时间,其余的节拍就是他的倍数。为方便记谱,将节拍数也进行编码,如下:

建立曲谱编码表:

编谱用8位编码,高4位代表音符,低4位代表节拍。如5 6中音5,中音6,都是1/2拍,则编码为:82H 92H

程序清单:

#include

#define uchar unsigned char

#define uint unsigned int

#define ulong unsigned long

sbit SPEAK = P2^0;//接蜂鸣器管脚

uchar th0_f;

uchar tl0_f;

uchar code SEG[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};

uchar code jie8[8]={12,14,16,17,19,21,23,24};

/**************************中断函数*******************************************/ timer0() interrupt 1

{

TL0=tl0_f;TH0=th0_f;

SPEAK =~SPEAK; //取反音乐输出IO

}

/********************T0的值,及输出频率对照表***********************************/ uchar code freq[36*2]={

0xA9,0xEF,//00220HZ ,1 //0

0x93,0xF0,//00233HZ ,1#

0x73,0xF1,//00247HZ ,2

0x49,0xF2,//00262HZ ,2#

0x07,0xF3,//00277HZ ,3

0xC8,0xF3,//00294HZ ,4

0x73,0xF4,//00311HZ ,4#

0x1E,0xF5,//00330HZ ,5

0xB6,0xF5,//00349HZ ,5#

0x4C,0xF6,//00370HZ ,6

0xD7,0xF6,//00392HZ ,6#

0x5A,0xF7,//00415HZ ,7

0xD8,0xF7,//00440HZ 1 //12

0x4D,0xF8,//00466HZ 1# //13

0xBD,0xF8,//00494HZ 2 //14

0x24,0xF9,//00523HZ 2# //15

0x87,0xF9,//00554HZ 3 //16

0xE4,0xF9,//00587HZ 4 //17

0x3D,0xFA,//00622HZ 4# //18

0x90,0xFA,//00659HZ 5 //19

0xDE,0xFA,//00698HZ 5# //20

0x29,0xFB,//00740HZ 6 //21

0x6F,0xFB,//00784HZ 6# //22

0xB1,0xFB,//00831HZ 7 //23

0xEF,0xFB,//00880HZ `1

0x2A,0xFC,//00932HZ `1#

0x62,0xFC,//00988HZ `2

0x95,0xFC,//01046HZ `2#

0xC7,0xFC,//01109HZ `3

0xF6,0xFC,//01175HZ `4

0x22,0xFD,//01244HZ `4#

0x4B,0xFD,//01318HZ `5

0x73,0xFD,//01397HZ `5#

0x98,0xFD,//01480HZ `6

0xBB,0xFD,//01568HZ `6#

0xDC,0xFD,//01661HZ `7 //35

};

/***************************音乐符号串解释函数****************************/ //入口:要解释的音乐符号串,输出的音调串,输出的时长串

changedata(uchar *song,uchar *diao,uchar *jie)

{

uchar i,i1,j;

char gaodi; //高低+/-12音阶

uchar banyin;//有没有半个升音阶

uchar yinchang;//音长

uchar code jie7[8]={0,12,14,16,17,19,21,23}; //C调的7个值

*diao=*song;

for(i=0,i1=0;;)

{

gaodi=0; //高低=0