基于STC89C52单片机的简易电子琴.docx
《基于STC89C52单片机的简易电子琴.docx》由会员分享,可在线阅读,更多相关《基于STC89C52单片机的简易电子琴.docx(17页珍藏版)》请在冰豆网上搜索。
基于STC89C52单片机的简易电子琴
基于STC89C52单片机的简易电子琴
课程设计报告
课程名称:
微机原理课程设计
题目:
简易电子琴
学院:
环境与化学工程系:
过程装备与测控工程
专业:
测控技术与仪器
班级:
测仪xxx班
学号:
学生姓名:
起讫日期:
2013-12-27~2013-1-6
指导教师:
一、设计任务、要求
1.1、设计任务:
利用52单片机最小系统,共阴数码管,无源蜂鸣器以及独立按键,设计实现可发出八个基本音阶的简易电子琴系统。
1.2、设计要求:
1、蜂鸣器可发出八个简单音阶。
2、八位独立按键分别控制不同的音阶产生。
3、四位数码管依据所按按键,在不同的数码管上显示不同的数字。
4、通过按键实现系统复位。
二、方案总体设计
本次设计简易电子琴,通过STC89C52芯片最小系统控制电路,以八位独立按键控制,蜂鸣器产生八个不同的音阶,四位共阴数码管显示不同的数字,独立按键控制复位。
系统编程采用Keilc软件,电路图设计以及PCB板绘制使用Altiumdesigner软件,仿真调试使用ISIS软件实现。
将不同模块结合起来,实现简易电子琴的设计。
2.1、显示模块
本设计采用四位数码管显示,每位数码管分别由八位发光二极管组成。
数码管可分为共阴和共阳两种,通过不同的位选操作驱动不同的数码管显示,再通过不同的段选点亮不同的发光二极管,达到显示不同数字的功能。
2.2、按键模块
八位独立按键,通过P2口控制音阶的产生和数码管显示,按下响应的键产生设定的声音点亮对应的数码管。
2.3、蜂鸣器音阶产生模块
蜂鸣器可分为两种,分别为有源蜂鸣器和无源蜂鸣器
注意,这里的“源”不是指电源。
而是指震荡源。
也就是说,有源蜂鸣器内部带震荡源,所以只要一通电就会叫。
而无源内部不带震荡源,所以如果用直流信号无法令其鸣叫。
必须用2K~5K的方波去驱动它有源蜂鸣器往往比无源的贵,就是因为里面多个震荡电路。
无源蜂鸣器的优点是:
1。
便宜 2。
声音频率可控,可以做出“多来米发索拉西”的效果 3。
在一些特例中,可以和LED复用一个控制口。
有源蜂鸣器的优点是:
程序控制方便
乐曲中不同的音符,实质就是不同频率的声音。
通过单片机产生不同的频率的脉冲信号,经过放大电路,由蜂鸣器放出,就产生了美妙和谐的乐曲。
(1)单片机产生不同频率脉冲信号的原理:
要产生音频脉冲,只要算出某一音频的脉冲(1/频率),然后将此周期除以2,即为半周期的时间,利用定时器或延时函数计时这个半周期的时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期的时间再对I/O反相,就可以在I/O脚上得到此频率的脉冲。
例如:
要产生1KHZ的频率,则半周期为0.5ms,则P3^5所送出的信号中,0.5ms为高电平,0.5ms为低电平。
若0.5ms高电平与0.5ms为低电平为一组信号(总共1ms),连续送出100组,则可得到1KHZ的声音约0.1s:
停止输出0.1s之后,在连续送出100组高低电平,则可听到“哔,哔”两声。
通过改变频率,控制产生不同的方波,就可以产生不同的音阶。
使用无源蜂鸣器,通过内部程序延时产生不同频率的方波,使蜂鸣器产生八个基本的音阶Do,Re,Mi,Fa,So,La,Si,Do-H。
l按键与参数的对照表
按键
音阶
参数
S1
中音Do
115
S2
中音Re
102
S3
中音Mi
91
S4
中音Fa
86
S5
中音So
77
S6
中音La
68
S7
中音Si
61
S8
高音Do
57
图2-1音阶参数对应图
2.4、总体设计:
设计总体框架图如图2-1所示。
图2-2总体框架图
三、硬件设计
3.1、最小系统
3.1.1、时钟信号的产生
89C52芯片内部有一个高增益法相放大器,用于构成振荡器。
反相放大器的输入端为XTAL1,输出端为XTAL2,两端跨接石英晶体及两个电容就可以构成稳定的自己振荡器,电路如图3-1所示。
图3-1晶振电路
3.1.2、复位电路
复位操作有上电自动复位和按键手动复位两种方式,本设计采用按键电平复位,结构如图3-2所示。
图3-2复位电路
3.2、数码管显示模块
3.2.1、数码管引脚图
图3-3四位八段共阴极数码管
3.2.2、数码管连线电路
本设计中是用P1口低四位接1k的电阻控制数码管的位选,用P0口接1k的上拉排阻控制数码管的段选。
连线电路图:
图3-4数码管连线电路图
3.3、矩阵键盘
本设计采用八位独立按键,通过P2口控制,按键序号及接线图如下图所示:
图3-5独立键盘连线电路图
3.4、蜂鸣器电路
本课程设计使用的蜂鸣器是无源蜂鸣器,通过程序控制产生不同频率的方波送给蜂鸣器,驱动蜂鸣器蜂鸣器发出相应频率的声音,驱动电路如下图所示:
图3-6蜂鸣器连线电路图
3.5、整体电路
图3-7整体电路图
图3-8PCB电路图
四、程序流程图
程序流程图如4-1所示
图4-1程序流程图
五、系统仿真与调试
5.1、仿真软件简介
本次设计使用ProteusISIS仿真软件进行调试。
ProteusISIS是英国Labcenter公司开发的电路设计、分析与仿真软件,功能极其强大。
该软件的主要特点是:
①集原理图设计、仿真分析(ISIS)和印刷电路板设计(ARES)于一身。
可以完成从绘制原理图、仿真分析到生成印刷电路板图的整个硬件开发过程。
②提供几千种电子元件(分立元件和集成电路、模拟和数字电路)的电路符号、仿真模型和外形封装。
③支持大多数单片机系统以及各种外围芯片(RS232动态仿真、I2C调试器、SPI调试器、键盘和LCD系统仿真等)的仿真。
④提供各种虚拟仪器,如各种测量仪表、示波器、逻辑分析仪、信号发生器等。
过去需要昂贵的电子仪器设备、繁多的电子元件才能完成的电子电路、单片机等实验,
5.2、调试与仿真过程图
图5-1仿真调试图
5.3、实物图
按键模块
按键
复位
模块
蜂鸣器模块
图5-2实物图
图5-4实物调试图
5.4、使用说明
按键分布图
图5-5按键分布
按下0号键,蜂鸣器发出Do的音阶,第一位数码管显示0;
按下1号键,蜂鸣器发出Re的音阶,第二位数码管显示1;
按下2号键,蜂鸣器发出Mi的音阶,第三位数码管显示2;
按下3号键,蜂鸣器发出Fa的音阶,第四位数码管显示3;
按下4号键,蜂鸣器发出So的音阶,第一位数码管显示4;
按按下5号键,蜂鸣器发出La的音阶,第二位数码管显示5;
按下6号键,蜂鸣器发出Si的音阶,第三位数码管显示6;
按下7号键,蜂鸣器发出Do-H的音阶,第一位数码管显示7;
六、总结、心得体会
在这次课程设计中,由刚开始时的手足无措不知从何下手,到过程中电路设计,程序编写,调试模拟,腐蚀电路板,做出实物,实物调试。
一步一步收获了很多。
刚开始的几天,面对要把课本上的单片机做出实物,并且实现一定的功能就让动手实践能力不佳的我很犯难。
尤其是在选择课题上,怕选的太难实现不了功能,选的太简单没有挑战性,但是最终还是选择了简易电子琴这个设计课题。
选定课题后,第一步各种查资料,查音阶的产生原理,数码管的引脚分布,蜂鸣器的发声原理等等。
画电路板找元件到生成PCB板,调节各个元件的位置,选择封装形式,处理飞线等等。
最开始PCB的图就做了三次,选错封装,飞线太多,一步一步慢慢学着让自己的板子看起来更合理。
收获了很多但是最后还是由于粗心忘记加电源和底线的孔。
程序的编写可能是这次课设中对我来说最具挑战性的环节了,程序的编写不但需要一定的c语言的基础还需要把单片机的各种功能和引脚知识结合起来,程序的编写刚开始是错误加警告满篇,查资料问同学,一步一步改。
先是模仿书上的程序调试,然后是查资料。
把课设的功能分为好几个模块,一个模块一个模块的通过编程实现,然后相互加在一起通过一定的逻辑实现了最后的功能。
当然调试中,也遇到了很多的麻烦,按键不能起到控制作用,数码管亮度太低,引脚底座被焊坏,用万用表一条条的查线路,查引脚,按键,直到最后功能的全部实现。
这次课设真的让我收获很多,从硬件到软件,没有经验欠缺很多知识,虽然这个简易电子琴真的不难,但是从设计构想到实物的功能实现,还是花费了不少心血。
做设计不但要有丰厚的知识做后盾,还要细心耐心,有很好的动手能力,才能取得最后成功。
而我在这些方面还差的很多,这次课设在让我锻炼和收获的同时,也让我明白了自己还有很多的东西要学要做。
最后感谢课设过程中给予我帮助的老师和同学。
七、参考文献
【1】李朝青《单片机原理及接口技术》北京航天大学出版社
【2】杨长兴《C++程序设计》中国铁道出版社
【3】张义和《例说51单片机》人民邮电出版社
附录
/*-----------------
简易电子琴
时间:
2013.12.31
------------------*/
#include//
#defineDuanxuanP0
#defineWeixuanP1
#defineSW_PortP2
sbitbuzzer=P3^5;
unsignedcharkeys;
/*声明音阶数组DoReMiFaSolaSiDo_H*/
unsignedcharcodetone[8]={115,102,91,86,77,68,61,57};
unsignedcharcodeTAB[8]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07};
unsignedcharcodeCAB[8]={0xfe,0xfd,0xfb,0xf7,0xfe,0xfd,0xfb,0xf7};
voiddisplay(unsignedchar);
voidsound(int);
voiddelay(int);
//------主程序------
main()
{
{while
(1)
if(SW_Port==0xfe)
{display(0);
sound(0);}
elseif(SW_Port==0xfd)
{display
(1);
sound
(1);}
elseif(SW_Port==0xfb)
{display
(2);
sound
(2);}
elseif(SW_Port==0xf7)
{display(3);
sound(3);}
elseif(SW_Port==0xef)
{display(4);
sound(4);}
elseif(SW_Port==0xdf)
{display(5);
sound(5);}
elseif(SW_Port==0xbf)
{display(6);
sound(6);}
elseif(SW_Port==0x7f)
{display(7);
sound(7);}
}
}
//---数码管显示函数-----
voiddisplay(unsignedcharx)
{
{
Duanxuan=TAB[x];
Weixuan=CAB[x];
}
}
//----发声函数-----
voidsound(intx)
{inti;
for(i=0;i<100;i++)
{buzzer=0;
delay(tone[x]);
buzzer=1;
delay(tone[x]);
}
}//----延时函数----
voiddelay(intx)
{inti,j;
for(i=0;ifor(j=0;j<1;j++);
}