电子课程设计实验报告可编程电子演奏电路单子琴Word下载.docx
- 文档编号:17626627
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:21
- 大小:204.30KB
电子课程设计实验报告可编程电子演奏电路单子琴Word下载.docx
《电子课程设计实验报告可编程电子演奏电路单子琴Word下载.docx》由会员分享,可在线阅读,更多相关《电子课程设计实验报告可编程电子演奏电路单子琴Word下载.docx(21页珍藏版)》请在冰豆网上搜索。
一、设计要求
1、扬声器可发出八个简单音阶。
2、可自动播放预设歌曲。
3、通过按键实现系统复位。
二、设计原理及方案
2.1原理
一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,利用不同的频率组合,即可构成我们所想要的音乐了,可以利用单片机的定时/计数器T0来产生这样方波频率信号。
因此,我们要把一首歌曲的音阶对应频率的定时时间计算出来,利用AT89C51的内部定时器使其工作在计数器模式1下,改变计数值TH0及TL0以产生不同频率的方法产生不同音阶。
定时周期计算公式:
音符频率表:
音符
频率
定时时间T
定时器初值
中DO
523
64580
FC44
中RE
587
64684
FCAC
中MI
659
64777
FD09
中FA
698
64820
FD34
中SO
784
64898
FD82
中LA
880
64968
FDC8
中SI
988
65030
FE06
高DO
1046
65058
FE22
2.2系统模块:
电源模块
键盘模块
单片机主控模块
音频放大模块
扬声器
存储模块
2.2.1电源模块:
电源模块采用了7805芯片,7805芯片有3个引脚,分别为输入IN端、输出OUT端和接地GND端,一般情况下可以提供1.5A的电流,如果在散热足够的情况下可以提供AT89C52主控模块和直流电机驱动等模块的电压。
7805芯片的输入电压可以为9V、12V、15V不等,但是输出电压会稳定在5V,正负误差不会超过0.2V(±
4%)。
2.2.2键盘模块
2.2.3音频放大模块
音频放大模块采用LM386运算放大器电路。
2.2.4存储模块
存储模块采用24C06串行E2PROM来存储数据。
2.2.5单片机主控模块(最小系统)
1.时钟信号产生
9C52芯片内部有一个高增益反相放大器,用于构成振荡器。
反相放大器的输入端为XTAL1,输出端为XTAL2,两端跨接石英晶体及两个电容就可以构成稳定的晶振。
2.复位电路
复位操作有上电自动复位和按键手动复位两种方式,本设计采用按键电平复位。
2.3主流程图
定时器T0使能
Y
开始
有键按否
键盘扫描
取T值
启动定时器T0
按键松开
定时器T0关中断
N
2.4电路整体原理图
2.5PCB图
三、成品实物图
12345678
ABCD
复位
12345678
ABCD
四、使用说明
1号键:
扬声器发出Do;
2号键:
扬声器发出Re
3号键:
扬声器发出Mi
4号键:
扬声器发出Fa
5号键:
扬声器发出So
6号键:
扬声器发出La;
预置歌曲1
7号键:
扬声器发出Si;
预置歌曲2
8号键:
扬声器发出Do-H;
预置歌曲3
A键:
播放预置歌曲与弹奏转换
B键:
播放刚弹的歌曲
C键:
掉电存储刚弹奏的歌曲
D键:
播放掉电存储的歌曲
五、设计总结及体会
在这次课程设计中,从刚开始时的手足无措不知从何下手,到过电路设计,制作PCB电路板,程序编写,实物调试,最后把电子琴做出来,一步一步走来不容易,但也收获良多。
选定课题后,首先查音阶产生的原理,存储芯片的原理,音频放大等等原理。
再到画电路板,调节各个元件的位置,修改封装,买元器件,制作PCB板。
最开始PCB的图就做了三次,不停改封装,走线,一步一步地让板子的布线看起来更合理。
在制作PCB的过程中,发生了一件挺尴尬的事,在用打孔机给PCB打孔的时候,我打了两个孔,断了两个转头,后来在同学的纠正下才发现自己原来用了雕刻机的转头。
这可给我提了个大醒,以后如果再粗心大意,冒冒失失,损失的就不只是钻头了。
在这次课设中对我来说最具挑战性的环节是程序的编写,编写电子琴程序不但需要一定的C语言的基础还需要把单片机的各种功能和引脚知识结合起来。
由于初学单片机,对其不熟悉,而且对存储芯片24C08的了解甚少,刚开始写的程序里一大堆的错误加警告,查资料问同学,一步一步改,把电路按功能分为好几个模块,一个模块一个模块的通过编程实现,最后才把程序完成。
电子琴做好的那一刻,我的心情是激动的,能用自己亲手做的电子琴弹奏一些简单的歌曲,我觉得非常有趣很好玩。
在这次课程设计中,我收获的不仅仅是理论知识和动手能力,更是那份久违的对课程学习的兴趣。
以前总是觉得我们所学的知识没什么用,而通过这次课程设计,做出了一个好玩的电子玩具,终于让我看到了学习电子专业的乐趣,这也成为了我以后做出更多好玩的东西的动力。
我希望这种能让我们边学边玩,从学习中发现乐趣的课程可以再多一点,因为我觉得培养对学习的兴趣比埋头苦学更重要,学习本应是一件让人快乐的事。
六、参考文献
[1]林土胜单片机技术及工程实践机械工业出版社,2010.2
[2]童诗白模拟电子技术基础(第四版)高等教育出版社,2006.5
[3]谭浩强C程序设计(第四版)学习指导清华大学出版社,2010.7
[4]
附录
源程序:
/**************************************************************
程序名称:
模拟电子琴
**************************************************************/
#include<
reg52.h>
//定义头文件
#defineucharunsignedchar//宏定义
#defineledP0//定义LED等位P0口
#definesw_portP1//中间变量使按键和led对应
sbitbuzzer=P2^7;
//扬声器管脚
sbitkey1=P3^2;
//播放音乐与弹奏歌曲转换
sbitkey3=P3^4;
//掉电存储按键
sbitkey4=P3^5;
//播放掉电存储的歌曲
sbitkeybofang=P3^3;
//播放刚才弹奏的歌曲
sbitkey7=P3^0;
//音调键和歌曲键
sbitkey8=P3^1;
sbitkey6=P1^7;
sbitkey5=P1^6;
sbitsda=P1^1;
//24c02数据线
sbitscl=P1^0;
//24c02时钟线
ucharkeyd,i,keys,b;
//定义变量
uchartone_H;
//定义变量
uchartone_L;
voidbeat_125(unsignedchar);
//声明函数
ucharcodebeat1[]={16,8,8,8,8,4,4,16,8,4,4,8,4,4,4,4,4,4,16,16,8,8,4,4,12,8,16,16,8,4,4,4,4,16};
//歌曲1节拍
ucharcodesong1[]={6,5,3,5,7,6,5,6,3,5,6,5,3,
2,1,6,5,3,2,2,3,5,5,6,3,2,1,5,3,2,1,6,1,1,15};
//歌曲1简谱
ucharcodebeat2[]={7,7,7,7,8,9,1,2,3,6,2,4,4,4,4,12,
8,2,2,4,4,4,8,2,2,4,4,4,2,2,4,4,12,};
//歌曲2节拍
ucharcodesong2[]={1,2,8,8,5,1,3,3,3,5,4,3,
5,4,3,2,2,1,0,1,2,3,4,3,2,3,4,5,5,4,3,2,1,15};
//歌曲2简谱
ucharcodebeat4[]={4,4,4,6,2,4,4,4,4,6,2,4,4,4,4,12,
ucharcodesong4[]={1,1,1,3,2,1,3,3,3,5,4,3,
5,4,3,2,2,1,0,1,2,3,4,3,2,3,4,5,5,4,3,2,1,15};
ucharcodetone[]={115,102,91,86,77,68,61,57};
//歌曲音调
unsignedintcodetone1[]={1012,956,852,759,716,638,568,506,478,426,379,531,10};
//歌曲音调
ucharsong3[43];
//定义空数组
voidplay(uchar*,uchar*);
//演奏歌曲函数
voiddelay8um(uchar);
//第一8um延时函数
voidsound(uchar);
//弹奏发声函数
/*******************************************
函数功能:
节拍的延时的基本单位,用于24c08简单延时
******************************************/
voiddelay()//简单延时函数
{;
;
}
节拍的延时的基本单位,延时1ms
******************************************/
voiddelay1ms(ucharx)//1um延时函数
{
ucharj;
while(x--)
for(j=120;
j>
0;
j--);
24c02驱动程序
voidinit_c02()//24c02初始化
sda=1;
delay();
scl=1;
voidstart_c02()//24c02的启动信号
sda=0;
voidstop_c02()//24c02停止信号
voidresponse_c02()//24c02的应答信号
uchari;
while((sda==1)&
&
(i<
250))i++;
scl=0;
voidwrite_c02byte(uchardate)//对24c02写一个字节
uchari,temp;
temp=date;
for(i=0;
i<
8;
i++)
{
temp=temp<
<
1;
scl=0;
delay();
sda=CY;
scl=1;
}
ucharread_c02byte()//对24c02读一个字节
uchari,k;
{
k=(k<
1)|sda;
returnk;
voidwrite_addc02(ucharaddress,uchardate)//对24c02写一个数据
start_c02();
write_c02byte(0xa0);
response_c02();
write_c02byte(address);
write_c02byte(date);
stop_c02();
ucharread_addc02(ucharaddress)//从24c02读一个数据
uchardate;
write_c02byte(0xa0);
write_c02byte(0xa1);
date=read_c02byte();
//response_c02;
returndate;
主函数
voidmain()//主函数
{
ucharyd,temp,jj,tt;
//定义变量
uchart1,i;
t1=0;
//初始化t1
yd=0;
//初始化t2
buzzer=1;
//初始化蜂鸣器
EA=1;
//打开定时总中断
TMOD=0x01;
//设置定时器模式定时器0工作在方式1
ET0=1;
//打开定时器0中断
while
(1)//主循环
led=0x3c;
sw_port=0xff;
keys=~sw_port;
//将led与按键结合起来
switch(keys)//进入键盘选择
{
case0x04:
sound(0);
temp=1;
yd=0;
break;
//如果键盘1被按下发音do,同时设置标志temp,将数字计入yd
case0x08:
sound
(1);
yd=1;
//如果键盘2被按下发音ruai,同时设置标志temp,将数字计入yd
case0x10:
sound
(2);
yd=2;
//如果键盘3被按下发音mi,同时设置标志temp,将数字计入yd
case0x20:
sound(3);
yd=3;
//如果键盘4被按下发音fa,同时设置标志temp,将数字计入yd
}
if(key5==0)//如果键盘5被按下发音la,同时设置标志temp,将数字计入yd
while(!
key5)//松手检测
sound(4);
temp=1;
yd=4;
if(key6==0)//如果键盘6被按下发音xi,同时设置标志temp,将数字计入yd
key6)//松手检测
sound(5);
yd=5;
if(key7==0)//如果键盘7被按下发音xi,同时设置标志temp,将数字计入yd
key7)//松手检测
sound(6);
yd=6;
if(key8==0)//如果键盘8被按下发音高音do,同时设置标志temp,将数字计入yd
key8)//松手检测
sound(7);
//播放高音do
yd=7;
if(temp==1)//标志位,如果标志位为1,则说明有按键被按下
temp=0;
//将标识位归零
song3[t1++]=yd;
//将数据存入song3[]数组
if(key3==0)//将数据存入24c02,掉电存储按键
delay1ms(10);
if(key3==0)//检测是否key3被按下
{
P0=0;
//如果被按下,将led打开
key3);
//松手检测
song3[t1++]=30;
init_c02();
//初始化24c02
for(i=0;
40;
)//进入循环
{
write_addc02(i,song3[i++]);
//将数据依次写入24c02
delay1ms(10);
//延时
}
P0=1;
//led关闭
}
if(key4==0)//读取24c02中的数据,掉电播放
if(key4==0)
{//检测是否有键被按下
key4);
//初始化
//将led打开
tt=1;
//将tt初值设为0
while(read_addc02(tt)!
=30)//进入while循环
{
jj=read_addc02(tt++);
tone_H=(65536-tone1[jj])/256;
//设定初值
tone_L=(65536-tone1[jj])%256;
//设定初值
TH0=tone_H;
//赋值TH0高八位
TL0=tone_L;
//赋值TL0低八位
TR0=1;
//打开定时器
beat_125(3);
//延时
TR0=0;
beat_125(4);
//关闭定时器
}
//关闭led
if(keybofang==0)
while(!
keybofang);
//检测回放键是否被按下
song3[t1++]=30;
//t1=0;
while(song3[i]!
=30)//进入while循环。
{
tone_H=(65536-tone1[song3[i]])/256;
tone_L=(65536-tone1[song3[i]])%256;
TL0=tone_L;
TR0=1;
//开启定时器
beat_125(3);
TR0=0;
//关闭定时器
i++;
beat_125(4);
//将i值加一
}
if(key1==0)
if(key1==0)//检测key1是否被按下
key1);
while(key1)//进入循环
{
if(key7==0)//检测key7是否被按下
if(key7==0)
{
P0=0xaa;
//设置led灯亮个数
while(!
key7);
//等待释放
play(song1,beat1);
//演奏歌曲1
P0=0xff;
//关闭led
}
if(key8==0)//检测是否key8键被按下
delay1ms(10)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电子 课程设计 实验 报告 可编程 演奏 电路 单子