单片机课程设计电子音调发生器.docx
- 文档编号:11289892
- 上传时间:2023-02-26
- 格式:DOCX
- 页数:52
- 大小:640.65KB
单片机课程设计电子音调发生器.docx
《单片机课程设计电子音调发生器.docx》由会员分享,可在线阅读,更多相关《单片机课程设计电子音调发生器.docx(52页珍藏版)》请在冰豆网上搜索。
单片机课程设计电子音调发生器
单片机课程设计
实验报告
电子音调发生器
姓名:
日期:
2009年6月29日星期一
(一)实验目的
1.了解计算机发声原理。
2.熟悉定时器和键盘扫描电路的工作原理及编程方法。
(二)设计任务及要求
利用实验平台上的开关k0-k7和蜂鸣器设计电子音调发生器,要求:
1.利用实验平台上开关k0-k7进行音调选择,即拨动不同的开关产生不同的音调,依次拨动K0~K7,蜂鸣器发出1234567i八个音调。
2.编写2支歌曲,并可进行选择播放。
(三)工作原理及设计思路
音节由不同频率的方波产生,音节与频率的关系如表1所示。
要产生音频方波,只要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期的时间。
利用计时器计时此半周期时间,每当计时到后就将输出方波的I/0反相,然后重复计时此半周期时间再对I/O反相,就可在I/O脚得到此频率的方波。
在ZKS-03实验仪上,产生方波的I/O脚选用P1.7,通过跳线选择器JP1将单片机的P1.7与蜂鸣器的驱动电路相连。
这样P1.7输出不同频率的方波,蜂鸣器便会发出不同的声音。
另外,音乐的节拍是由延时实现的,如果1拍为0.4秒,1/4拍是0.1秒。
只要设定延时时间,就可求得节拍的时间。
延时作为基本延时时间,节拍值只能是它的整数倍,
每个音节相应的定时器初值X可按下法计算:
(1/2)*(1/f)=(12/fose)*(216-x)
即x=216-(fose/24f)
其中f:
音调频率,当晶振fose=11.0592MHz时,音节“1”相应的定时器初值为x,则可得x=63777D=F921H其它的可同样求得。
表1
音调
频率(Hz)
X(HEX)
1
262
F921
2
294
F9E1
3
330
FA8C
4
349
FAD8
5
392
FB68
6
440
FBE9
7
494
FC5B
i
523
FC8F
(四)实现功能设计
实现两个主要功能:
电子琴与音乐播放;一个辅助功能:
在液晶上显示相关信息。
1、电子琴:
4*4的矩阵16个按键,按键0实现两个功能的切换,其余按键分别发出音调 低音5、6、7,中音1、2、3、4、5、6、7,高音1、2、3、4、5。
发音的同时在液晶显示屏上显示出对应的音调。
2、音乐播放:
按键0实现两个功能的切换,按键1实现播放类型选择(单曲循环播放、所有循环播放),其余按键分别对应一首歌。
目前已经有9首歌。
播放的同时,在液晶上显示出歌名。
(五)软件设计
根据要实现的功能,流程图如下:
#include
#include
#definenop_nop_()
#defineucharunsignedchar
#defineuintunsignedint
#definePAI_BASE15
#defineMUSIC_NUM9
#defineSCAN_CYCLE500
#defineBEEPP3_3
/***************液晶显示相关变量***********************************/
sbitLCD_RS=P2^7;
sbitLCD_RW=P2^6;
sbitLCD_EN=P2^5;
staticucharth0_f;//在中断中装载的T0的值高8位
staticuchartl0_f;//在中断中装载的T0的值低8位
statictimebuffer,Record_counter,Record_flag=0;
staticucharkey2,key=16,scounter=0,Record_time;
staticuchars_musicCounter=0x00,s_tableCounter;
bitRplay_flag=0;
bitK0_flag=0;
bitMusic_flag0;
bitMusic_flag=0;
bitFreq_flag=0;
bitdisptime_flag=0;
bitmusicAutoFlag=0;
//sbitBEEP=P3_3;//喇叭输出脚
//延时子程序1
voiddelay(intms)
{
inti;
while(ms--)
{
for(i=0;i<250;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
/*******************************************************************/
/**/
/*检查LCD忙状态*/
/*lcd_busy为1时,忙,等待。
lcd-busy为0时,闲,可写指令与数据。
*/
/**/
/*******************************************************************/
bitlcd_busy()
{
bitresult;
LCD_RS=0;
LCD_RW=1;
LCD_EN=1;
_nop_();
_nop_();
_nop_();
_nop_();
result=(bit)(P0&0x80);
LCD_EN=0;
returnresult;
}
/*******************************************************************/
/**/
/*写指令数据到LCD*/
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。
*/
/**/
/*******************************************************************/
voidlcd_wcmd(ucharcmd)
{
while(lcd_busy());
LCD_RS=0;
LCD_RW=0;
LCD_EN=0;
_nop_();
_nop_();
P0=cmd;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EN=1;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EN=0;
}
/*******************************************************************/
/**/
/*写显示数据到LCD*/
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。
*/
/**/
/*******************************************************************/
voidlcd_wdat(uchardat)
{
while(lcd_busy());
LCD_RS=1;
LCD_RW=0;
LCD_EN=0;
P0=dat;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EN=1;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EN=0;
}
/*******************************************************************/
/**/
/*设定显示位置*/
/**/
/*******************************************************************/
voidlcd_pos(ucharpos)
{
lcd_wcmd(pos|0x80);//数据指针=80+地址变量
}
/*******************************************************************/
/**/
/*LCD初始化设定*/
/**/
/*******************************************************************/
voidlcd_init()
{
delay(15);//等待LCD电源稳定
lcd_wcmd(0x38);//16*2显示,5*7点阵,8位数据
delay(5);
lcd_wcmd(0x38);
delay(5);
lcd_wcmd(0x38);
delay(5);
lcd_wcmd(0x0c);//显示开,关光标
delay(5);
lcd_wcmd(0x06);//移动光标
delay(5);
lcd_wcmd(0x01);//清除LCD的显示内容
delay(5);
}
/*******************************************************************/
/**/
/*清屏子程序*/
/**/
/*******************************************************************/
voidlcd_clr()
{
lcd_wcmd(0x01);//清除LCD的显示内容
delay(5);
}
//静态显示字符串
voidlcd_string(char*strpoint)/*在当前显示位置显示LCD字符串*/
{registeri=0;
while(strpoint[i]!
=0){
lcd_wdat(strpoint[i]);
i++;
}
}
/*************************************************************************/
/*ConstantTables*/
constcharcodec_music1[]={0x82,0x01,0x81,0x94,0x84,/*生日快乐歌*/
0xb4,0xa4,0x04,
0x82,0x01,0x81,0x94,0x84,
0xc4,0xb4,0x04,
0x82,0x01,0x81,0xf4,0xd4,
0xb4,0xa4,0x94,
0xe2,0x01,0xe1,0xd4,0xb4,
0xc4,0xb4,0x04,
0x00};
constcharcodec_music2[]={0x62,0x52,/*两只蝴蝶*/
0x64,0x64,0x02,0x52,0x62,0x52,
0x44,0x44,0x04,0x22,0x42,
0x54,0x52,0x62,0x52,0x42,0x22,0x42,
0x14,0x14,0x04,0x62,0x52,
0x64,0x64,0x02,0x52,0x62,0x52,
0x44,0x44,0x04,0x22,0x42,
0x54,0x52,0x62,0x52,0x42,0x22,0x42,
0x54,0x54,0x04,0x62,0x82,
0x84,0x84,0x02,0x82,0x92,0x82,
0x64,0x64,0x04,0x52,0x52,
0x54,0x52,0x62,0x52,0x42,0x22,0x91,0x41,
0x42,0x42,0x44,0x44,0x44,
0x02,0x82,0x82,0x92,
0xb2,0xa2,0xa2,0x92,0x64,0x52,0x62,
0x64,0x64,0x02,0x62,0x62,0x82,
0x94,0x94,0x02,0x22,0x62,0x52,
0x54,0x54,0x04,0x62,0x82,
0x82,0x62,0x84,0x02,0xb2,0xb2,0xa2,
0x92,0xa2,0x64,0x02,0x92,0x92,0xa2,
0x92,0x82,0x62,0x52,0x52,0x62,0x52,0x62,
0x84,0x84,0x02,0x82,0x82,0x92,
0x92,0x82,0x62,0x52,0x52,0x12,0x12,0x22,
0x44,0x44,0x44,0x44,
0x00};
constcharcodec_music3[]={0x04,0x42,0x41,0x51,
0x62,0x62,0x52,0x41,0x51,0x54,0x02,0x41,0x51,/*老鼠爱大米*/
0x62,0x62,0x52,0x42,0x44,0x02,0x11,0x21,
0x14,0x11,0x11,0x21,0x41,0x44,0x02,0x42,
0x42,0x42,0x42,0x41,0x51,0x54,0x42,0x51,0x61,
0x62,0x62,0x82,0x91,0x51,0x54,0x62,0x51,0x41,
0x42,0x42,0x52,0x61,0x81,0x84,0x02,0x81,0x81,
0x92,0x41,0x41,0x42,0x61,0x01,0x52,0x42,0x42,0x51,0x41,
0x44,0x44,0x44,0x62,0x61,0x81,
0x82,0x81,0x81,0x82,0x81,0x91,0x94,0x62,0x52,
0x42,0x42,0x42,0x51,0x61,0x64,0x02,0x61,0x81,
0x82,0x82,0x82,0x91,0xb1,0xb2,0x92,0x82,0x62,
0x52,0x42,0x42,0x22,0x54,0x02,0x61,0x81,
0x82,0x82,0x81,0x92,0x81,0x94,0x62,0x52,
0x42,0x42,0x42,0x51,0x61,0x64,0x02,0x61,0x81,
0x82,0x82,0x82,0x91,0xb1,0xb2,0x92,0x82,0x61,0x51,
0x52,0x52,0x54,0x54,0x41,0x62,0x71,
0x62,0x52,0x54,0x54,0x62,0x51,0x41,
0x44,0x62,0x51,0x41,0x44,0x62,0x52,
0x62,0x42,0x62,0x91,0x81,0x84,0x02,0x61,0x81,
0x92,0x91,0x81,0x82,0x91,0x81,0x84,0x61,0x51,0x42,
0x52,0x51,0x61,0x52,0x41,0x51,0x41,0x53,0x62,0x51,0x41,
0x44,0x62,0x51,0x41,0x44,0x62,0x52,
0x62,0x42,0x61,0x92,0x81,0x84,0x02,0x61,0x81,
0x92,0x92,0xb2,0x81,0x91,0x82,0x01,0x81,0x61,0x51,0x41,
0x54,0x51,0x41,0x51,0x61,0x54,0x62,0x62,
0x54,0x02,0x42,0x44,0x44,
0x00};
constcharcodec_music4[]={0x04,0x02,0x41,0x51,0x62,0x61,0x61,0x62,0x52,/*梦醒时分*/
0x62,0x81,0x61,0x62,0x61,0x81,0x92,0x92,0x92,0xa2,
0x82,0x62,0x62,0x62,0x61,0x51,0x42,0x41,0x41,0x42,0x22,
0x62,0x81,0x41,0x44,0x51,0x52,0x01,0x52,0x42,
0x81,0x61,0x52,0x52,0x41,0x51,0x62,0x61,0x61,0x62,0x52,
0x62,0x81,0x61,0x62,0x61,0x81,0x92,0x91,0x91,0x92,0xa2,
0x82,0x62,0x61,0x81,0x81,0x81,0x92,0xb2,0xb2,0x92,
0x72,0x52,0x52,0x81,0x81,0x92,0xb2,0xb2,0x92,
0xb2,0xc2,0xc4,0xc4,0x01,0x81,0x81,0x81,
0xd2,0xd2,0xd2,0xd2,0xd2,0xc1,0xc1,0xc2,0xb1,0xa1,
0xb2,0xb2,0xb2,0xc2,0x62,0x82,0x82,0x81,0x81,
0x92,0xb1,0xb1,0xb2,0xb2,0xc2,0x91,0xb1,0xb2,0xb1,0xb1,
0xc2,0xc1,0xc1,0xc2,0xb2,0xd2,0xc1,0x81,0x81,0x81,0x81,0x81,
0xd2,0xd2,0xd2,0xf2,0xd2,0xc1,0xc1,0xc2,0xb1,0xa1,
0xb2,0xb2,0xb2,0xc2,0x62,0x82,0x82,0x81,0x81,
0x92,0xb1,0xb1,0xb2,0xb1,0xb1,0xc2,0x91,0xb1,0xb2,0xb1,0xb1,
0xc2,0xc1,0xc1,0xc2,0xb2,0xd4,0xc2,0x01,0xb1,
0xb4,0xb4,0xb4,0xb4,
0x00};
constcharcodec_music5[]={0x54,0x64,0x64,/*大长今*/
0x64,0x02,0x52,0x44,
0x24,0x44,0x44,
0x51,0x43,0x44,0x44,
0x54,0x64,0x64,
0x64,0x02,0x82,0x64,
0x64,0x54,0x64,
0x64,0x64,0x64,
0x84,0x94,0x94,
0x94,0x84,0x64,
0x64,0x84,0x94,
0x81,0x91,0x82,0x84,0x84,
0x54,0x64,0x64,
0x54,0x02,0x62,0x64,
0x54,0x64,0x24,
0x41,0x23,0x94,0x94,
0x24,0x24,0x24,
0x54,0x64,0x64,
0x64,0x02,0x52,0x44,
0x24,0x44,0x44,
0x51,0x43,0x44,0x44,
0x54,0x64,0x64,
0x64,0x02,0x82,0x64,
0x64,0x54,0x64,
0x64,0x64,0x64,
0x84,0x94,0x94,
0x94,0x02,0x82,0x64,
0x64,0x84,0x94,
0x84,0x84,0x84,
0x54,0x64,0x64,
0x54,0x02,0x62,0x64,
0x54,0x64,0x24,
0x41,0x23,0x24,0x24,
0x24,0x24,0x24,
0x54,0x02,0x42,0x24,
0x54,0x02,0x42,0x24,
0x54,0x64,0x44,
0x54,0x02,0x62,0x84,
0x94,0x02,0x82,0x64,
0x54,0x02,0x42,0x24,
0x24,0x14,0x24,
0x41,0x23,0x24,0x24,
0x24,0x24,0x24,
0x14,0x14,0x14,
0x14,0x02,0x22,0x42,0x52,
0x62,0x52,0x44,0x02,0x22,
0x44,0x44,0x54,
0x64,0x64,0x64,
0x64,0x64,0x84,
0x94,0x02,0xb2,0x94,
0x84,0x84,0x84,
0x84,0x61,0x81,0x92,0x04,
0x92,0x82,0x64,0x02,0x52,
0x64,0x02,0x52,0x62,0x52,
0x44,0x44,0x44,
0x41,0x23,0x24,0x44,
0x54,0x54,0x54,
0x54,0x64,0x64,
0x44,0x41,0x23,0x24,
0x24,0x24,0x24,
0x00};
constcharcodec_music6[]={0x24,0x42,0x52,0x64,0x62,0x92,/*漫步人生路*/
0x84,0x62,0x52,0x64,0x02,0x62,
0x72,0x62,0x62,0x52,0x52,0x42,0x41,0x31,0x22,
0x44,0x02,0x5
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 课程设计 电子 音调 发生器