文档库 最新最全的文档下载
当前位置:文档库 › 单片机电子琴实验报告定稿版

单片机电子琴实验报告定稿版

单片机电子琴实验报告定稿版
单片机电子琴实验报告定稿版

单片机电子琴实验报告精编W O R D版

IBM system office room 【A0816H-A0912AAAHH-GX8Q8-GNTHHJ8】

单片机及DSP课程设计报告

专业:通信工程

班级:

姓名:

学号:

指导教师:李贺

时间:2015-06-22~2015-07-03

通信与电子工程学院

基于单片机的电子琴设计

一、课设的目的及内容

本设计主要是用单片机为核心控制元件,设计一台电子琴。以单片机作为主控核心,与键盘、蜂鸣器、数码管等模块组成核心主控制模块,在主控模块上设有7个按键和1个复位按键。本系统主要是完成的功能:电子琴弹奏并显示所按的按键对应音的唱名。关于声音的处理,使用单片机C语言,利用定时器来控制频率,而每个音符的符号只是存在自定义的表中。

总之,本设计的电子琴有以下要求:

(1)用键盘作出电子琴的按键,共7个,每键代表1个音符。各音符按照符合电子琴的按键顺序排列;

(2)达到电子琴的基本功能,可以用弹奏出简单的乐曲;

(3)在按下按键发出音符的同时显示出音符所对应的唱名

即1(dao)、2(ruai)、3(mi)、4(fa)、5(sao)、6(la)、7

(xi)。

二、问题分析、解决思路及原理图

本系统采用STC89C52RC为主控芯片,因其精度较高,操作比较灵活,输入电路和输出电路由芯片来进行处理,电路的系统的稳定性高,功耗小。其中,输入电路有7个独立按键,通过按键随意按下所要表达的音符,作为电平送给主体电路,中央处理器通过识别,解码输出音符,在蜂鸣器中发出有效的声音。由于需要显示的信息不多,显示电路未采用液晶屏显示,而是使用数码管显示电路负责显示按下的琴键所对应音符的唱名,这样既节省了成本,又降低了编程难度。

图1

如图1所示基于单片机STC89C52RC的电子琴电路,它主要由琴键控制电路、数码管显示电路、音频功放电路和时钟-复位电路四部分所构成。

三、硬件设计

(一)琴键控制电路

琴键控制电路作为人机联系的输入部分,也是间接控制数码显示和音频功放的重要组成部分。本设计采用独立式键盘的思路。

独立式键盘的特点是一键一线,各键相互独立,每个键各接一条I/O口线,通过检测I/O输入线的电平状态,可判断出被按下的按键。

显而易见,这样电路简单,各条检测线独立,识别按下按键的软件编写简单。

适用于键盘按键数目较少的场合,不适用于键盘按键数目较多的场合,因为将占用较多的I/O口线。

独立式键盘的7个独立按键分别对应一个I/O口线,当某一按键按下时,对应的检测线就变成了低电平,与其它按键相连的检测线仍为高电平,只需读入I/O输入线的状态,判别哪一条I/O输入线为低电平,很容易识别哪个键被按下。

(二)数码管显示电路

LED(Light Emitting Diode)发光二极管缩写。LED数码管是由发光二极管构成的。常见的LED数码管为“8”字型的,共计8段。它由七个条形发光二极管和一个小圆点发光二极管组成,每一段对应一个发光二极管。一般来说分共阳极和共阴极两种接法,如图二所示为八段LED数码管结构及外形。

图二

共阳极LED数码管的发光二极管的阳极连接在一起,公共阳极接正电压,当某个发光二极管的阴极接低电平时,发光二极管被点亮,相应的段被显示,如图二a所示。反之,共阴极发光二极管的阴极连在一起,通常公共阴极接地。当阳极为高电平时,发光二极管点亮,如图二b所示。

LED数码管的a至g七个发光二极管因接得电压不同而导致不同亮暗的组合就能形成不同的字形,这种组合称之为字形码,如表一所示为八段LED数码管的字形码表。

表一

本设计所采用的是共阴二极管。

(三)音频功放电路

本设计采用蜂鸣器作为音频发生的设备,而若将蜂鸣器的正极直接与单片机端口相连,由于单片机端口的电流值太小而无法驱动蜂鸣器发声,所以本设计采用三极管放大电流的方法来完成目的的,如图三所示,

图三

(四)时钟、复位电路

1、时钟电路

时钟频率直接影响单片机的速度,时钟电路的质量也直接影响单片机系

统的稳定性。常用的时钟电路有两种方式,一种是内部时钟方式,另一种

是外部时钟方式。

STC89C52内部有一个用于构成振荡器的高增益反相放大器,输入端为芯

片引脚XTAL1,输出端为引脚XTAL2。这两个引脚跨接石英晶体振荡器和

微调电容,构成一个稳定的自激振荡器,图四是STC89C52内部时钟方式的

电路,C1和C2的典型值通常选择为30pF,石英晶体常选6MHz或12MHz

的。本设计采用内部时钟方式做时钟电路

图四

2、复位电路

单片机的初始化操作,给复位脚RST加上大于2个机器周期(即24个时钟振荡周期)的高电平就使STC89C52复位。这些操作都是由复位电路来

实现。在单片机的实用系统中,一般有两种复位操作形式:上电复位和手

动复位。上电复位在单片机系统每次通电时执行。上电时,电容C充电加

给RST引脚一个短的高电平信号,此信号随着VCC对电容C的充电过程而

逐渐回落,即RST引脚上的高电平持续时间取决于电容C充电时间。为保

证系统可靠复位,RST引脚上的高电平必须维持足够长的时间。手动复位

在系统出现操作错误或程序运行出错时使用。在单片机系统运行过程中,

按下复位键,高电平输入RST引脚,单片机被强制执行复位操作,系统可

以退出错误运行状态,恢复正常工作。

四、软件设计

1、硬件接口定义

2.发声原理

若要产生音频脉冲,只要算出某一音频的周期(1/频率),再将此周期除以2,即为半周期的时间。利用定时器计时半周期时间,每当计时终止后就将P3.3反相,然后重复计时再反相。就可在P1.0引脚上得到此频率的脉冲。利用STC89c52的内部定时器使其工作计数器模式(MODE1)下,改变计数值TH0及TL0以产生不同频率的方法产生不同音阶。

例如,频率为523Hz,其周期T=1/523=1912μs,因此只要令计数器计时956μs/1μs=956,每计数956次时将I/O反相,就可得到中音DO(523Hz)。

计数脉冲值与频率的关系式是:N=fi÷2÷fr,式中,N是计数值;fi是机器频率(晶体振荡器为12MHz时,其频率为1MHz);fr是想要产生的频率。其计数初值T的求法如下:T=65536-N=65536-fi÷2÷fr 例如:设K=65536,fi =1MHz,求中音DO(261Hz)。T=65536-N=65536-fi÷2÷fr=65536-1000000÷2÷fr=65536-500000/fr,中音DO的T=65536-500000/523=

64580。

3.程序流程

3.1主函数运用模块化的思想,流程如图所示。

3.2初始化函数

流程图如下图所示,该函数对所需的I/O口、定时器0以及数码管蜂鸣器进行初始化配置。

3.3

五、源程序

#define keyport P1

#define uchar unsigned char

#define uint unsigned int

sbit SPK=P3^3; //蜂鸣器接口定义

uchar high,low; //定时器预装值的高八位和低八位

uchar code fre[][2]= { //频率值

0x44,0xfc, //中音1

0xac,0xfc, //中音2

0x09,0xfd, //中音3

0x34,0xfd, //中音4

0x82,0xfd, //中音5

0xc2,0xfd, //中音6

0x06,0xfe, //中音7

};

uchar code table[]={

0x06,0x5b,0x4f,0x66,0x6d, //数码管显示1,2,3,4,5,6,7所对应的P0口电平0x7d,0x07,0x7f,0x6f,0x77,};

void delay(uint x); //延时函数

void Init(void); //初始化函数

void main (void) //主函数开始

{

Init(); //先进行初始化

while(1){

switch(keyport){ //扫描按键及判断键值case 0xfe:

delay(1);

if(keyport==0xfe) //消抖

{P0=table[0]; //数码管显示音的唱名num=1;}

break;

case 0xfd:

delay(1);

if(keyport==0xfd)

{P0=table[1];

num=2;}

break;

case 0xfb:

if(keyport==0xfb) {P0=table[2]; num=3;} break;

case 0xf7:

delay(1);

if(keyport==0xf7) {P0=table[3]; num=4;} break;

case 0xef:

delay(1);

if(keyport==0xef) {P0=table[4];

break;

case 0xdf:

delay(1);

if(keyport==0xdf) {P0=table[5];

num=6;} break;

case 0xbf:

delay(1);

if(keyport==0xbf) {P0=table[6]; num=7;} break;

case 0x7f:

delay(1);

if(keyport==0x7f)

{P0=table[7];

num=8;}

break;

default:

num=0;

break;

}

if(num==0) //没按按键

{

TR0=0;

}

else

{high=fre[num-1][1]; //将按键所对应的频率值装入定时器的高八位与低八位

low=fre[num-1][0];

TR0=1; //定时器打开 delay(500); //将其延时

SPK=0; //延时后关闭 P0=0x00;

}

}

}

void Init(void) //初始化函数

{

SPK=0;

P0=0x00;

TMOD = 0x01;

EA=1;

ET0=1;

TR0=0;

}

void Timer0_isr(void) interrupt 1 //中断函数

{

SPK=!SPK;

TH0=high;

TL0=low;

}

void delay(uint x) //延时函数{

int a,b;

for(a=x;a>0;a--)

for(b=110;b>0;b--)

;

}

六、Proteus仿真

Proteus软件是英国LabcenterElectronics公司研发的EDA工具软件。它是一个集模拟电路、数字电路、模/数混合电路以及多种微控制器系统为一体的系统设计和仿真平台。是目前同类软件中最先进、最完整的电子类仿真平台之一。它真正实现了在计算机上完成从原理图、电路分析与仿真、单片机代码调试与仿真、系统测试与功能验证到PCB板生成的完整的电子产品研发过程。

最新KeiluVision4IDE,旨在提高开发人员的生产力,实现更快,更有效的程序开发。KeiluVision4引入了灵活的窗口管理系统,能够拖放到视图内的任何地方,包括支持多显示器窗口。KeiluVision4在KeiluVision3IDE的基础上,增加了更多大众化的功能:多显示器和灵活的窗口管理系统;系统浏览器窗口的显示设备外设寄存器信息;调试还原

视图创建并保存多个调试窗口布局;多项目工作区简化与众多的项目

仿真结果

七、设计过程中遇到的问题及解决的方法

电子琴在设计过程中并非一帆风顺的,前前后后遇到了各种各样的问题,说几个关键的问题。首先是数码管的问题,焊接刚刚完成的时候,数码管完全是没有任何的反应的,反复检查程序,没有发现问题。又检查电路是否连接正确,也没有发现什么问题,完全是按照仿真图来连接的。直到用电压表检查端口电压时才发现问题出在哪。原来是最新系统上的上拉电阻阻值过大导致的,找到问题解决就容易多

了,我重新找了1k的电阻作为上拉电阻,焊接完成后,再重新运行单片机,数码管便正常了。第二个问题是蜂鸣器发声问题,也是很多同学都遇到的问题,就是蜂鸣器对频率的敏感性太差,同样的电路用扬声器就很完美,但用蜂鸣器效果就比较差。

八、设计体会

总体来说,此次单片机课程设计使我收获良多,虽然课程设计的过程中遇到了很多困难与问题,但我最终还是完成了设计的任务及要求。具体来说可以分为以下几点:第一,不够细心,不够严谨(如因为粗心大意而焊错线);第二,因对课本理论的掌握度不够导致编程出现错误;第三,硬件方面,刚开始有的程序模块不能实现预期的效果,对于有的硬件,在实物制作过程中焊了比较多的排线,同时对于整体各元器件的布局都有很高的要求。不过在向同学请教,各方面都有了不同程度的改善;第四,在做人方面,我认识到,无论做什么事情,只要你足够坚强,有足够的毅力和决心,有足够的挑战困难的勇气,就没有什么办不到的。

通过这次课设,也使我进一步熟悉和掌握了单片机的内部结构和工作原理,了解了单片机应用系统设计的基本方法和步骤,掌握了单片机仿真软件Proteus的使用方法和键盘、显示器在的单片机控制系统中的应用,同时也掌握了撰写课程设计报告的方法。总之,通过这次课程设计,我清楚明白了自己的能力有多深,想提高还得归于多锻炼,多动手,多向别人学习。

参考文献

[1] 张毅刚.单片机原理及应用(第二版)[M].北京:高等教育出版社,2010.

[2] 阎石.数字电子技术基础(第五版)[M].北京:高等教育出版社,2010.

[3]袁东.51单片机应用开发实战手册[M].北京:电子工业出版社,2011.

[4]林立.单片机原理及应用——基于Proteus和KeilC[M].北京:电子工业出版社,2009.

相关文档