51单片机的简易电子琴设计.docx
《51单片机的简易电子琴设计.docx》由会员分享,可在线阅读,更多相关《51单片机的简易电子琴设计.docx(12页珍藏版)》请在冰豆网上搜索。
![51单片机的简易电子琴设计.docx](https://file1.bdocx.com/fileroot1/2023-1/22/12871179-c991-427f-b3ad-45f737895b63/12871179-c991-427f-b3ad-45f737895b631.gif)
51单片机的简易电子琴设计
课程设计
课程设计名称:
单片机课程设计
专业年级:
电子信息科学与技术
学生姓名:
学号:
指导教师:
课程设计时间:
2013.9.30-2013.10.7
10级电科专业课程设计任务书
学生姓名
专业班级
电科
学号
题目
51单片机的简易电子琴设计
课题性质
工程设计
课题来源
自拟
指导教师
同组姓名
主要内容
设计一个51单片机系统,实现简易电子琴操作的电路。
要求:
1设计51单片机最小系统;
2.设置至少8个按键,能发出doremifasollaSIDO;
能播放示范曲;
3.能够调节低音、高音和中音。
任务要求
1.根据功能要求选择设计方案,并进行论证。
2.画出电路的总体方框图和电路原理图。
3.说明系统工作原理,对系统进行调试。
4.写出课程设计报告。
参考文献
1.单片机技术有关教材
2.电路设计手册
3.其他资料
审查意见
指导教师签字:
教研室主任签字:
年月日
说明:
本表由指导教师填写,由教研室主任审核后下达给选题学生,装订在设计(论文)首页
1 任务及要求
1.1设计任务
1.设计一个2X4的8个按键矩阵,并且每个键对应一个音。
2.设计一个3个按键来控制低,中,高三种频段的声音。
3.设计完整的原理图电路,包括时钟电路、复位电路以及键盘接口电路等。
4.用AT89C51将键盘连接设计成为电子琴。
5.编写电子琴的程序,要达到可以随意弹奏想要表达的音乐的目的。
6.程序的分析与调试。
1.2设计要求
1.用C语言编程实现程序设计。
2.利用查表,定时中断等方式实现目的。
3.系统的各各功能模块要清楚,有序。
2 设计思想
2.1硬件设计思想
电子琴的原理框图如图一所示。
它由以下几个部件组成:
单片机AT89C51、2*4的8个按钮矩阵、3个频段控制开关,时钟电路,复位电路,音频放大模块。
2.2软件设计思想
本系统的软件系统主要可分为主程序、定时计数中断程序、时间调整或定时设置程序三大模块。
定时器初始化函数:
voidInit_timer0()
{
TMOD=0x01;//使用定时器0的16位工作模式
TR0=0;
ET0=1;
EA=1;
P2=0XFF;
P3=0XFF;
}
定时器溢出中断函数:
voidtimer0()interrupt1
{
TL0=tl0_f;
TH0=th0_f;//调入预定时值
BEEP=~BEEP;//取反音乐输出IO
}
3 电路原理与电路图
3.1电路原理
主要分为二个部分:
4.放大电路分析
此部分的放大电路简单容易实现。
可以采用一个小功率PNP型硅管9012,利用“分压偏置式工作点稳定直流通路”,达到了对静态工作点的稳定。
分压电阻分别选择1K和5.5K。
蜂鸣器一端接+5V电压,一端接晶体管的发射极。
由P1.0
输出预定的方波,加到晶体管进行放大,再输出到嗡宁器,很好的实
现了频率、声音的转换。
放大电路输出原理图
5.时钟电路分析
此系统的时钟电路设计是采用的内部方式,即利用芯片内部的振荡电路。
MCS-51内部有一个用于构成振荡器的高增益反相放大器。
引脚XTAL1和XTAL2分别是此放大器的输入端和输出端。
这个放大器与作为反馈元件的片外晶体谐振器一起构成一个自激振荡器。
外接晶体谐振器以及电容CX1和CX2构成并联谐振电路,接在放大器的反馈回路中。
对外接电容的值虽然没有严格的要求,但电容的大小会影响震荡器频率的高低、震荡器的稳定性、起振的快速性和温度的稳定性。
因此,此系统电路的晶体振荡器的值为12MHz,电容应尽可能的选择陶瓷电容,电容值约为30pF。
在焊接刷电路板时,晶体振荡器和电容应尽可能安装得与单片机芯片靠近,以减少寄生电容,更好地保证震荡器稳定和可靠地工作。
下图为复位电路的原理图。
复位电路原理图
MSC-51片内振荡电路
时钟电路原理图
6.复位电路的论证和分析:
MS-51的复位是由外部的复位电路来实现的。
片内复位电路是复位引脚RST通过一个斯密特触发器与复位电路相连,斯密特触发器用来抑制噪声,它的输出在每个机器周期的S5P2,由复位电路采样一次。
复位电路通常采用上电自动复位和按钮复位两种方式,此电路系统采用的是上电与按钮复位电路,如图所示。
当时钟频率选用12MHz时,C取1μF,R1约为10KΩ。
(1)2X4行列式键盘识别;
(2)音乐产生的方法;
①一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。
现在以单片机12MHZ晶振为例,列出高中低音符与单片机计数T0相关的计数值如表3.1所示.
下面我们要为这个音符建立一个表格,有助于单片机通过查表的方式来获得相应的数据:
低音0-15之间,中音在16-31之间,高音在32-47之间
ucharcodefreq[]={0xf8,0x8c,0xf9,0x5b,0xfa,0x15,0xfa,0x67,
0xfb,0x04,0xfb,0x90,0xfc,0x0c,0xfc,0x44,
0xfc,0x44,0xfc,0xac,0xfd,0x09,0xfd,0x34,
0xfd,0x82,0xfd,0xc8,0xfe,0x06,0xfe,0x22,
0xfe,0x22,0xfe,0x56,0xfe,0x85,0xfe,0x9a,
0xfe,0xc1,0xfe,0xe4,0xff,0x03,0xf8,0x8c};
表3.1高中低音符与单片机计数T0相关的计数值表
音符
频率(HZ)
简谱码(T值)
音符
频率(HZ)
简谱码(T值)
低1 DO
262
63628
#4FA#
740
64860
#1 DO#
277
63731
中5SO
784
64898
低2 RE
294
63835
#5SO#
831
64934
#2RE#
311
63928
中6LA
880
64968
低3M
330
64021
#6
932
64994
低4FA
349
64103
中7SI
988
65030
#4FA#
370
64185
高1DO
1046
65058
低5SO
392
64260
#1DO#
1109
65085
#5SO#
415
64331
高2RE
1175
65110
低6LA
440
64400
#2RE#
1245
65134
#6
466
64463
高3M
1318
65157
低7SI
494
64524
高4FA
1397
65178
中1DO
523
64580
#4FA#
1480
65198
#1DO#
554
64633
高5SO
1568
65217
中2RE
587
64684
#5SO#
1661
65235
#2RE#
622
64732
高6LA
1760
65252
中3M
659
64777
#6
1865
65268
中4FA
698
64820
高7SI
1967
65283
3.2电路原理图
4 流程图与算法描述
4.1流程图
图4.1系统主程序流程图
图4.2
4.3 程序清单
#include
#include"intrins.h"
#defineucharunsignedchar
#defineuintunsignedint
sbitBEEP=P1^0;
sbitb1=P3^5;
sbitb2=P3^6;
sbitb3=P3^7;
sbitp20=P2^0;
sbitp21=P2^1;
ucharkey;
ucharcodefreq[]={0xf8,0x8c,0xf9,0x5b,0xfa,0x15,0xfa,0x67,
0xfb,0x04,0xfb,0x90,0xfc,0x0c,0xfc,0x44,
0xfc,0x44,0xfc,0xac,0xfd,0x09,0xfd,0x34,
0xfd,0x82,0xfd,0xc8,0xfe,0x06,0xfe,0x22,
0xfe,0x22,0xfe,0x56,0xfe,0x85,0xfe,0x9a,
0xfe,0xc1,0xfe,0xe4,0xff,0x03,0xf8,0x8c};
ucharth0_f,tl0_f;
voidtimer0()interrupt1
{
TL0=tl0_f;
TH0=th0_f;//调入预定时值
BEEP=~BEEP;//取反音乐输出IO
}
voidkeyscan()
{
uchari,j;
key=0;
i=0xef;
for(j=0;j<4;j++)
{
P2=i;
if(p20==0)
break;
key++;
if(p21==0)
break;
key++;
i=_crol_(i,1);
}
}
voidspeak()
{
uinti;
keyscan();
if(b1==0&&key!
=8)
{
th0_f=freq[2*key];
tl0_f=freq[2*key+1];
TL0=tl0_f;
TH0=th0_f;
TR0=1;
for(i=0;i<10000;i++);
}
if(b2==0&&key!
=8)
{
th0_f=freq[2*key+16];
tl0_f=freq[2*key+17];
TL0=tl0_f;
TH0=th0_f;
TR0=1;
for(i=0;i<10000;i++);
}
if(b3==0&&key!
=8)
{
th0_f=freq[2*key+32];
tl0_f=freq[2*key+33];
TL0=tl0_f;
TH0=th0_f;
TR0=1;
for(i=0;i<10000;i++);
}
TR0=0;
}
voidInit_timer0()
{
TMOD=0x01;//使用定时器0的16位工作模式
TR0=0;
ET0=1;
EA=1;
P2=0XFF;
P3=0XFF;
}
voidmain()
{
Init_timer0();
while
(1)
{
speak();
}
}
4.4仿真图
图4.3
4.5结果分析
本设计主要是通过对电子琴主体部分的电路进行设计,达到电子琴固有的基本功能,故叫简易电子琴。
利用定时器可发出不同频率的脉冲,不同频率的脉冲经喇叭驱动电路放大滤波后,就会发出不同音调。
其次,定时器按设置的定时参数产生中断,这一次中断发出脉冲低电平,下一次反转发出脉冲高电平,由于定时参数不同,就发出不同频率的脉冲,若此时又有键被按下,若被按下的仍为原键则声音不变,否则键盘会译出被按下的另一个键的音调。
最后,下载到实验板上测试发出不同音调
5 总结
通过这次设计,我感觉收获了很多,我加深了对单片机系列知识及其系统的认识。
这个设计题目并不怎么新颖,但从中体现到了个系统开发设计的过程,足以让我们受益匪浅。
在这次的设计中,让我更进一步的提高了动手能力,也重新复习了一次单片机的程序编程能力,在这期间,让我更加深刻了体会到了汇编程序的思路,加强了对编程能力的理解和对相应资料的查阅。
另外,我们还要在下面多动手实践,来提高自己的实战能力,已达到学以致用。