基于51单片机音乐盒程序设计.docx
- 文档编号:25497036
- 上传时间:2023-06-09
- 格式:DOCX
- 页数:13
- 大小:81.90KB
基于51单片机音乐盒程序设计.docx
《基于51单片机音乐盒程序设计.docx》由会员分享,可在线阅读,更多相关《基于51单片机音乐盒程序设计.docx(13页珍藏版)》请在冰豆网上搜索。
基于51单片机音乐盒程序设计
基于51单片机音乐盒程序设计
基于51单片机音乐盒程序设计一、功能设计说明
1、电路设计
实物图
矩阵键盘部分电路图
2、运行流程图
程序开始
播放小苹果歌曲
否
判断任意按键是否按下继续播放小苹果歌曲
是
否播放完成
进入电子琴模式
判断K16按键是否按下
是
3、电子琴模式按键对应发音设计
按键发音按键发音
低1中2K1K9
低2中3K2K10
低3中4K3K11
低4中5K4K12
低5中6K5K13
按键发音按键发音
低6中7K6K14
低7高1K7K15
中1重新播放小苹果K8K16
二、硬件电路说明
1、程序下载电路
音乐盒电路图
ISP下载接口
本设计采用的单片机为AT89S52单片机,需使用ISP下载器进行下载程序,程序下载电路图如图中ISP1接口.
2、音乐发音电路
IO口P10发出不同频率的脉冲,则BUZZER产生各种不同的声音,本设计采用12MHZ
晶振,系统频率1MHZ,定时器计数一个1us,其对应关系如下表所示:
频率简谱码(T音符音符频率(HZ)简谱码(T值)
(HZ)值)
低1DO26263628#4FA#74064860#1DO#27763731中5SO78464898低2RE29463853#5SO#83164934#2RE#31163928中6LA88064968低3M33064021#693264994低4FA34964103中7SI98865030#4FA#37064185高1DO104665058低5SO39264260#1DO#110965085#5SO#41564331高2RE117565110低6LA44064400#2RE#124565134#646664463高3M131865157低7SI49464524高4FA139765178
中1DO52364580#4FA#148065198
#1DO#55464633高5SO156865217
中2RE58764684#5SO#166165235
#2RE#62264732高6LA176065252
中3M65964777#6186565268
中4FA69864820高7SI196765282
计算方法:
例如产生262HZ频率(发音DO),
周期T=1/262=3816us,由于定时器中断使IO不停取反,故周期T=3816/2=1908us
定时器初值N=65536-1908=63628
TH0=63628/256
TL0=65536%256
三、程序代码说明
1、脉冲产生
采用定时器0溢出中断产生脉冲,定时器初始化如下:
TMOD=0x01;//定时器0工作方式1,即十六位计数器计数
TR0=1;//启动定时器
ET0=1;//定时器0溢出中断使能
EA=1;//总中断使能
定时器0溢出中断产生脉冲,voidTimer0()interrupt1代码如下:
TH0=th0;
TL0=tl0;
if(th0==0)BUZZER=1;//判断停顿,有停顿不发音
else{BUZZER=~BUZZER;}//无停顿发音
2、音普规则:
a、音普由一个字节十六进制数组成
b、高4位代表节拍,一拍约400MS,将一拍分成8份
c、低4位代表音符,一一对应Note[]列表
d、0x20代表歌曲结束符
e、uintcodeNote[]={0,64580,64684,64777,64820,64898,64968,65030,/*中音*/
63628,63853,64021,64103,64260,64400,64524,/*低音*/
65058,65110,65157,65178,65217,65252,65282/*高音*/};
该列表为发音所对应的定时器初装值
例如编写如下一段音乐列表:
0x83,0x81,0x82,0x8d,0x43,0x42,0x41,0x42,0x8d,0x8d,0x400x40表示停顿4*50MS/*你是我的小呀小苹果*/
3、音普列表解读
while(Xiaopingguo[temp]!
=0x20)//不停判断音乐是否结尾,结尾跳出
{
jiepai=Xiaopingguo[temp]>>4;//获取节拍,即高4位数
yinpu=Xiaopingguo[temp]&0x0F;//获取音普,即低4位数
Timer_Set(yinpu);//根据列表对应发音
Delay(jiepai*50);//节拍
temp++;
P0=0x0f;
if(P0!
=0x0f)gotoout;
}
voidTimer_Set(ucharnum)为定时器0赋值子程序,包含的代码如下:
th0=Note[num]/256;
tl0=Note[num]%256;
四、程序代码编写
/******************************************************************************
****************
项目名称:
音乐盒
单片机型号:
AT89S52
频率:
外部石英晶振12MHZ
设计时间:
2014-08-06
设计者:
小左MCU工作室
QQ:
576689422
*******************************************************************************
**************/
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitBUZZER=P1^0;//蜂鸣器输出
ucharth0,tl0;//定时器0赋值变量
ucharstart_;//返回变量
uintcodeNote[]={0,64580,64684,64777,64820,64898,64968,65030,/*中音*/
63628,63853,64021,64103,64260,64400,64524,/*低音*/
65058,65110,65157,65178,65217,65252,65282/*高音*/};/*************************************************************************
音普规则:
1、音普由一个字节十六进制数组成
2、高4位代表节拍,一拍约400MS,将一拍分成8份
3、低4位代表音符,一一对应Note[]列表
4、0x20代表歌曲结束符
**************************************************************************/
ucharcodeXiaopingguo[]={
0x83,0x81,0x82,0x6d,0x43,0x42,0x41,0x42,0x8d,0x8d,0x40,/*你是我的小呀小苹果*/
0x83,0x81,0x82,0x82,0x45,0x43,0x8e,0x81,0x40,
/*怎么爱你都不嫌多*/
0x41,0x4e,0x8d,0x4e,0x41,0x82,0x8c,0x46,0x45,0x83,0x83,0x43,0x40,/*红红的小脸温暖我的心窝*/
0x42,0x81,0x42,0x43,0x42,0x43,0x42,0x23,0x25,0x85,0x30,0x45,0x10,0x45,0x30,0x45,0x10,0x
45,0x30,0x85,0x85,0x85,0x40,
/*点亮我生命的火火火火火火*/
0x83,0x81,0x82,0x6d,0x43,0x42,0x41,0x42,0x8d,0x8d,0x40,/*你是我的小呀小苹果*/
0x83,0x81,0x82,0x82,0x45,0x43,0x8e,0x81,0x40,
/*就像天边最美丽的云朵*/
0x41,0x4e,0x8d,0x4e,0x41,0x82,0x8c,0x46,0x45,0x83,0x83,0x43,0x40,/*春天又来到了花开满山坡*/
0x42,0x81,0x42,0x43,0x82,0x8c,0x8d,0x4d,0x41,0x8d,0x20/*种下希望就会收获*/
};
//----延时子程序--------------------------------------------------voidDelay(uintxms)
{
uintj;
for(;xms>0;xms--)
for(j=110;j>0;j--);
}
//---------------------------------------------------------------
//----定时器变量赋值---------------------------------------------voidTimer_Set(ucharnum)
{
th0=Note[num]/256;
tl0=Note[num]%256;
}
//---------------------------------------------------------------
//----系统初始化-------------------------------------------------voidInit()
{
BUZZER=1;//关闭蜂鸣器
TMOD=0x01;//定时器0工作方式1
TR0=1;//启动定时器
ET0=1;//定时器0溢出中断使能
EA=1;//总中断使能
start_=0;//返回变量初始化
}
//---------------------------------------------------------------
//----按键扫描---------------------------------------------------voidKey_Scan()
{
P0=0x0f;
if(P0!
=0x0f)
{
Delay(5);
if(P0!
=0x0f)
{
P0=0xfe;
if(P0==0xee){Timer_Set(8);}//按键1被按下
elseif(P0==0xde){Timer_Set(12);}//按键5被按下
elseif(P0==0xbe){Timer_Set
(2);}//按键9被按下
elseif(P0==0x7e){Timer_Set(6);}//按键13被按下
else;
P0=0xfd;
if(P0==0xed){Timer_Set(9);}//按键2被按下
elseif(P0==0xdd){Timer_Set(13);}//按键6被按下
elseif(P0==0xbd){Timer_Set(3);}//按键10被按下
elseif(P0==0x7d){Timer_Set(7);}//按键14被按下
else;
P0=0xfb;
if(P0==0xeb){Timer_Set(10);}//按键3被按下
elseif(P0==0xdb){Timer_Set(14);}//按键7被按下
elseif(P0==0xbb){Timer_Set(4);}//按键11被按下
elseif(P0==0x7b){Timer_Set(15);}//按键15被按下
else;
P0=0xf7;
if(P0==0xe7){Timer_Set(11);}//按键4被按下
elseif(P0==0xd7){Timer_Set
(1);}//按键8被按下
elseif(P0==0xb7){Timer_Set(5);}//按键12被按下
elseif(P0==0x77){start_=1;}//按键16被按下
else;
}
}
else
{
th0=0;
}
}
//---------------------------------------------------------------
//----主程序-----------------------------------------------------
voidmain()
{
uchartemp,yinpu,jiepai;
Init();
while
(1)
{
start:
temp=0;
while(Xiaopingguo[temp]!
=0x20)
{
jiepai=Xiaopingguo[temp]>>4;//获取节拍
yinpu=Xiaopingguo[temp]&0x0F;//获取音普
Timer_Set(yinpu);
Delay(jiepai*50);
temp++;
P0=0x0f;
if(P0!
=0x0f)gotoout;
}
out:
th0=0;
BUZZER=1;//关闭蜂鸣器
while
(1)
{
Key_Scan();
if(start_==1)
{
start_=0;
gotostart;
}
}
}
}
//---------------------------------------------------------------
//----定时器0中断服务程序----------------------------------------
voidTimer0()interrupt1
{
TH0=th0;
TL0=tl0;
if(th0==0)BUZZER=1;//判断停顿,有停顿不发音
else{BUZZER=~BUZZER;}//无停顿发音
}
//----------------------------------------------------------------
更多精彩程序请在淘宝店铺中搜索“小左MCU”
QQ:
576689422
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 51 单片机 音乐盒 程序设计