您好,欢迎来到飒榕旅游知识分享网。
搜索
您的当前位置:首页课程设计报告---基于单片机的电子琴设计

课程设计报告---基于单片机的电子琴设计

来源:飒榕旅游知识分享网


课程设计报告---基于单片机的电子琴设计

河南理工大学

《单片机应用与仿真训练》设计报告

基于单片机的电子琴设计

姓 名: 郭鹏超 王 芳 学 号: 310808010609 310808010602 专业班级: 电气 08-6班 指导老师: 王 莉 所在学院: 电气工程与自动化学院

2012年5月 19 日

0

摘要

当代,爱好音乐的人越来越多,有不少人自己练习弹奏乐器作为业余爱好和一种放松的手段,鉴于一些乐器学习难度大需要太多的学习时间,且其价格又太过于高昂,使得一部分有这种想法的人不得不放弃这种想法。而一些简易的电子乐器价格相对便宜,学习上手快,一般人容易负担的起,能够满足一般爱好者的需求,故简易电子琴的研制具有一定的社会意义。本次课程设计主要研究基于AT89S52单片机的简易电子琴设计。整个系统主要包括以下几个部分组成:

(1)单片机的最小系统:最小应用系统设计是单片机应用系统的设计基础。它包括单片机的选择、时钟系统设计、复位电路设计、简单的I/O口扩展、掉电保护等。

(2)矩阵键盘:当按键数目较多时,为了节省I/O口线,通常采用矩阵式键盘接口电路。本设计采用5*8矩阵键盘(共40个按键,其中36个按键用来显示高中低音的1、1#、2、2#、3、4、4#、5、5#、6、6#、7的36个音调,其它4个按键可以随意的播放已存歌曲)。

(3)产生外部中断的系统:它由两个四输入与非门74LS20和一个两输入或非门74LS02组成,把矩阵的五行与与非门74LS20和或非门74LS02相接后接在了单片机的P3.2口,下降沿触发产生中断INT0。

(4)发音电路:此电子琴发音电路是由或非门来驱动扬声器发音的,控制单片机的P2.7口产生不同频率使扬声器发出不同的音调。

本文主要对单片机设计简易电子琴进行了分析,并介绍了基于单片机电子琴的硬件组成。并且从原理图,主要芯片,各模块的原理和各个模块的程序调试来阐述。利用单片机产生不同频率来获得我们要求的音阶,最终可以随意弹奏想要表达的音乐,还设计了一按键用来自动播放一首曲子。系统运行稳定,其优点是硬件电路简单,软件功能完善,控制系统可靠,性价比高等,具有一定的使用和参考价值。

0

目录

1.2本次课程设计的任务及要求 ................................ 0 2 系统总体方案及硬件设计 .......................................... 1

2.1设计原理分析 ............................................ 1 2.2设计方案 ................................................ 1

2.2.1原理框图 ..................................... 1

1 概述 ............................................................ 0

1.1 本次课程设计的目的意义 ................................. 0

2.2.2定时/计数器的设计和状态字定义: ........................................................ 2 2.2.3 矩阵键盘设计及相关应用技术 4 2.2.4 LED显示设计及相关应用技术 . 4 2.2.5发音电路设计 ............................. 5 2.2.6产生外部中断电路设计 ............. 5

2.2.7单片机最小系统设计 ................. 6 3软件设计 ........................................................ 7

3.1系统分析 ................................................ 7

3.1.1系统软件的组成 ......................... 7

3.1.2系统程序总体流程图 ................. 7 3.2参数计算 ................................................ 8 3.3程序设计 ................................................ 9

3.3.1弹奏程序流程图 ......................... 9 3.3.2自动播放歌曲程序流程图 ....... 10

4实验仿真测试 .................................................... 12 5课程设计体会 .................................................... 13

0

1.1 本次课程设计的目的意义

1 概述

本论文是基于单片机的电子琴设计,电子琴是现代科技与音乐结合的产物,是一种新型的键盘乐器。它是现代音乐扮演着的重要角色,单片机具有强大的控制功能和灵活的编程实现特性,它融入现代人们的生活中,成为不可替代的一部分。因此说,学会运用单片机做一些简单的课程设计是我们工程技术人员必需掌握的一向技能。本次设计要求我们综合利用所学单片机知识完成一个单片机应用系统设计并仿真实现,从而加深对单片机软硬知识的理解,获得初步的应用经验,为走出校门从事单片机应用的相关工作打下基础。另外,通过本次课程设计,对我们还有以下帮助:

1、 进一步熟悉和掌握单片机的内部结构和工作原理,了解单片机应用系统设计的基本方法和步骤

2、掌握单片机仿真软件Proteus的使用方法; 3、掌握键盘和显示器在的单片机控制系统中的应用。 4、掌握撰写课程设计报告的方法。 1.2本次课程设计的任务及要求

实现电子琴发声控制系统,要求电路实现如下功能:

利用扬声器或者蜂鸣器作为发声部件,两个数码管作为显示部件,设置多个按键,实现高音、中音、低音的1、2、3、4、5、6、7的发音。并在存储一首歌曲的内容,可以实现自动播放。

说明:单片机的工作时钟频率为12MHz。

0

2.1设计原理分析

2 系统总体方案及硬件设计

一定频率产生声音,频率高低决定音调。利用单片机输出脉冲信号经放大后送给喇叭,便可发出声音。利用单片机的定时器,让定时器中断一次就对改变喇叭的状态一次,即形成矩形方波,这也是数字电路产生声音的方法。由于一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,可以利用不同的频率的组合,即可构成我们所想要的音乐了,对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,只要把一首歌曲的音阶对应频率关系弄正确即可。 2.2设计方案

2.2.1原理框图 原理图如下图所示

1

键盘驱动数码管显示中断单片机AT89S52驱动定时器扩音器

2.2.2定时/计数器的设计和状态字定义:

用单片机播放音乐,或者弹奏电子琴,实际上是按照特定的频率,输出一连串的方波。为了输出合适的方波,首先应该知道音符与频率的关系。若要产生音频脉冲,只要算出某一音频的周期(1/频率),再将此周期除以2,即为半

2

周期的时间。利用定时器计时半周期时间,每当计时终止后就将P2.7反相,然后重复计时再反相。就可在P2.7口引脚上得到此频率的脉冲。利用AT89S52的内部定时器使其工作计数器模式(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。

单片机12MHZ晶振,音符与计数T0相关的计数值如表所示: C调音频率TH TL C调音频率TH TL C调音频率符 /Hz 符 /Hz 符 /Hz 低音1 262 F88B 1 523 FC43 高音1 1045 低音1# 277 F8F2 1# 553 FC78 高音1# 1106 低音2 293 F95B 2 586 FCAB 高音2 1171 低音2# 311 F9B7 2# 621 FCDB 高音2# 1241 低音3 329 FA14 3 658 FD08 高音3 1316 低音4 349 FA66 4 697 FD33 高音4 1393 低音4# 370 FAB9 4# 739 FD5B 高音4# 1476 低音5 392 FB03 5 783 FD81 高音5 1563 低音5# 415 FB4A 5# 830 FDA5 高音5# 1658 低音6 440 FB8F 6 879 FDC7 高音6 1755 低音6# 466 FBCF 6# 931 FDE7 高音6# 1860 低音7 494 FC0B 7 987 FE05 高音7 1971 TH TL FE21 FE3C FE55 FE6D FE84 FE99 FEAD FEC0 FED2 FEE3 FEF3 FF02 采用查表程序进行查表时,可以为这个音符建立一个表格,有助于单片机通过查表的方式来获得相应的数据:低音0-11之间,中音在12-23之间,高音在24-35之间

TABLE:0xF8,0x8B,0xF8,0xF2,0xF9,0x5B,0xF9,0xB7,0xFA,0x14,0xFA,0x66,0xFA,0xB9,0xFB,0x03,0xFB,0x4A,0xFB,0x8F,0xFB,0xCF,0xFC,0x0B, //低音

0xFC,0x43,0xFC,0x78,0xFC,0xAB,0xFC,0xDB,0xFD,0x08,0xFD,0x33,0xFD,0x5B,0xFD,0x81,0xFD,0xA5,0xFD,0xC7,0xFD,0xE7,0xFE,0x05, //中音

0xFE,0x21,0xFE,0x3C,0xFE,0x55,0xFE,0x6D,0xFE,0x84,0xFE,0x99,0xFE,0xAD,0xFE,0xC0,0xFE,0xD2,0xFE,0xE3,0xFE,0xF3,0xFF,0x02

//高音

3

把这个数据表,放在程序中,需要播音的时候,就从表中取出一个数据送到定时器,当定时器溢出中断的时候,再对输出引脚取反,那么,在扬声器中,即可听到上表中对应频率的声音。

音乐的音拍,一个节拍为单位(C调) 曲调值 调4/4 调3/4 调2/4 DELAY 125ms 187ms 250ms 曲调值 调4/4 调3/4 调2/4 DELAY 62ms 94ms 125ms 对于不同的曲调我们也可以用单片机的另外一个定时/计数器来完成。 在这个程序中用到了两个定时/计数器来完成的。其中T0用来产生音符频率延时函数用来产生音拍。

2.2.3 矩阵键盘设计及相关应用技术

采用5X8行列式键盘识别;

(1)把“单片机系统”区域中的P1.0-P1.7端口用8芯排线连接到“5X8行列式键盘”区域中的列C1-C8端口上,把P2.0-P2.4端口连接到“5X8行列式键盘”区域中的行R1-R5上;

(2)把“单片机系统”区域中的P0.0-P0.7端口用8芯排线连接到“7段数码显示模块”区域中的任一个a-h端口上;要求:P0.0对应着a,P0.1对应着b,……,P0.7对应着h。

2.2.4 LED显示设计及相关应用技术

LED显示模块,是采用两位一体的数码管显示的。利用AT89S52单片机的P0端口的P0.0-P0.7连接到一个七段数码管的a-h的笔段上,数码管的公共端接地。第一个显示0、1、2,分别表示高、中、低音,第二个用来显示1、1#、2、2#、3、4、4#、5、5#、6、6#、7等十二个音调,分别用0、1、2、3、4、5、6、7、8、9、A、b显示出来。

(1)LED数码显示原理:七段LED显示器内部由七个条形发光二极管和一个小圆点发光二极管组成,根据各管的极管的接线形式,可分成共阴极型和共阳极型。 LED数码管的a~g七个发光二极管因加正电压而发亮,因加零电压而不以发亮,不同亮暗的组合就能形成不同的字形,这种组合称之为字形码,下面给出共阴极的字形码表:

4

“0” 3FH “8” 7FH “1” 06H “9” 6FH “2” 5BH “A” 77H “3” 4FH “b” 7CH “4” 66H “C” 39H “5” 6DH “d” 5EH “6” 7DH “E” 79H “7” 07H “F” 71H (2)由于显示的数字0-9的字形码没有规律可循,只能采用查表的方式来

完成我们所需的要求了。这样我们按着数字0-9的顺序,把每个数字的笔段代码按顺序排好!建立的表格如下所示:TABLEDB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH。

2.2.5发音电路设计

如左图所示,发音电路是由扬声器、或非门74LS02构成。由或非门来驱动扬声器发音的,可通过控制单片机的P2.7口产生不同频率使扬声器发出不同的音调。

2.2.6产生外部中断电路设计

5

它由两个四输入与非门74Ls20和一个两输入或非门74LS02组成,把矩阵的五行与与非门74LS20和或非门74LS02相接后接在了单片机的P3.2口,下降沿触发产生中断INT0。矩阵键盘的列在程序中初始化为低电平,当有按键按下,

行与列接通,行也变为低电平,即使P2.0-P2.4为“0”,通过上面电路,使INT0端口为“0”,产生中断。利用程序控制,作用与发音电路发出声音。

2.2.7单片机最小系统设计

最小应用系统设计是单片机应用系统的设计基础。它包括单片机的选择、时钟系统设计、复位电路设计、简单的I/O口扩展、掉电保护等。

本次设计采用的是AT89S52,其特点是8字节FLASH闪速存储器,256字节,32个I/O口线,3个16位定时/计数器,掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位.主演的是它与C51系列产品指令和引脚完全兼容.

最小系统的时钟电路采用12MHZ晶振,机器周期为1us,连接两个30pF的电容,连接到AT89S52的XATL1,XATL2上面,如左图所示。

复位电路采用的是上电+按钮电平复位,是利用电容充电来实现上电复位。当按钮按下后,电源施加在单片机复位端RST上,实现单片机复位功能。

6

3.1系统分析

3.1.1系统软件的组成

(1)键盘扫描程序:检测是否有按键按下,有按键按下则记录按下键的键值,并跳转至功能转移程序;无按键按下,则返回键盘扫描程序继续检测。

(2)功能转移程序:对检测到的按键值进行判断,是琴键则跳转至琴键处理程序,是功能键则跳转至相应的功能程序,我们设计的功能程序有两种,即音色调节功能和自动播放乐曲的功能。

(3)琴键处理程序:根据检测到的按键值,查询音调表,给计时器赋值,使发出相应频率的声音。

(4)自动播放歌曲程序:检测到按键按下的是自动播放歌曲功能键后执行该程序,电子琴会自动播放事先已经存放的歌曲,歌曲播放完毕之后自动返回至键盘扫描程序,继续等待是否有按键按下。

3软件设计

3.1.2系统程序总体流程图

7

开始初始化Y扫描键盘外部中断判断N琴键播放音乐响应按键程序响应音乐程序显示结束3.2参数计算

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

8

例如:设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程序设计

3.3.1弹奏程序流程图

9

琴键子程序判断按键设置计数值(对应频率)定时器开始计数定时器中断时IO脚不断取反以产生不同频率输出到扩音器驱动部分显示 3.3.2自动播放歌曲程序流程图

10

琴键子程序判断按键设置计数值(对应频率)定时器开始计数定时器中断时IO脚不断取反以产生不同频率输出到扩音器驱动部分显示

11

4实验仿真测试

12

5课程设计体会

这次设计从软件方面来讲不是很难,程序相对长一点,但都是书本上所学的知识,主要是中断及其服务程序的编写。在protues上仿真,则起到很好的效果,因为元器件都是理想状态的,但做出实物来却不是那么简单啦。经过多次调试、修改才得以出结果。将程序载入芯片,调试成功后,可任意弹奏自己想要的旋律。同时可以播放一首示例歌曲,但是也有不足之处的,声音杂音时而有点大,不稳定。

经过本次课程设计,我们比较好的把理论知识与实践相结合,而我们在也本次设计中收获不少。设计过程中,首先,对于C语言多了一层了解,其次,还有硬件的接线,还有单片机AT89S52芯片的引脚方面,都让我们收获不少。加强了自身的动手能力。

参考文献

参考文献格式:

(具体文献中,中文用宋体、英文为Time New Roman、五号行间距固定值18 期刊论文:

[序号] 主要责任者. 文献题名. 刊名,年,卷(期):起止页码

如:[1] 金显贺,王昌长,王忠东,等.一种用于在线检测局部放电的数字滤波技术.清华大学学报(自然科学版),1993,33(4):62-67

书、专著:

[序号] 主要责任者.文献题名.出版地:出版社,出版年.起止页码

如:[1] 刘国钧,陈绍业,王凤翥.图书馆目录.北京:高等教育出版社,1957.15-18

电子文献:

13

[序号] 主要责任者.电子文献题名.电子文献的出处或可获得地址,发表或更新日期/引用日期 如:[1] 王明亮.关于中国学术期刊标准化数据库系统工程的进展.

http://www./cajcd.edu.cn/pub/wml.txt/980810-2.html, 1998-08-16/1998-10-04

附1 源程序代码

#include

#define uchar unsigned char #define uint unsigned int

void PlayKey(uchar,uchar); //运行按键

void Run(); //运行 void KeyScan(); //扫描键盘 void delay_1ms(uchar); //1ms延时

14

void PlayMusic(uchar code *p); //演奏音乐

void Display(uchar);

sbit Speaker=P2^7; sbit G=P2^6; sbit D=P2^5; sbit Led=P1^0;

uchar KeyValue; //按键值 uchar Th0,Tl0; //TH0,TL0 uchar KeyPinlv; //按键对应频率 uchar flag; uchar

code

table_d[]

=

{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //数码管编码 //音调频率

uchar code pinlv[]={

0xF8,0x8B,0xF8,0xF2,0xF9,0x5B,0xF9,0xB7,0xF

15

A,0x14,0xFA,0x66,0xFA,0xB9,0xFB,0x03,0xFB,0x4A,0xFB,0x8F,0xFB,0xCF,0xFC,0x0B, //低音

0xFC,0x43,0xFC,0x78,0xFC,0xAB,0xFC,0xDB,0xFD,0x08,0xFD,0x33,0xFD,0x5B,0xFD,0x81,0xFD,0xA5,0xFD,0xC7,0xFD,0xE7,0xFE,0x05, //中音

0xFE,0x21,0xFE,0x3C,0xFE,0x55,0xFE,0x6D,0xFE,0x84,0xFE,0x99,0xFE,0xAD,0xFE,0xC0,0xFE,0xD2,0xFE,0xE3,0xFE,0xF3,0xFF,0x02 //高音

}; uchar

code

music[]={1,16,1,24,1,24,1,23,1,21,1,16,1,16,1,16,1,24,1,23,1,21,2,19,1,21,1,19,1,19,1,17,1,19,1,19,1,12,1,12,1,17,1,17,1,16,1,12,1,14,1,16,1,14,1,16,1,24,1,24,1,23,1,21,1,16,1,16,1,16,1,24,1,23,1,21,2,19,1,21,1,19,1,19,1,17,1,19,1,19,1,12,1,12,2,17,1,16,1,9,1,12,1,12,1,9,0,0,1,9,0,0,1,7,1,9,1,16,1,17,1,17,1,19,1,21,1,28,1,28,1,26,1,28,1,28,1,21,1,26,1,26,1,24,2,26,1,21,1,26,1,26,1,24,1,26,1,26,1,26,1,26,1,26,1,2

16

6,1,28,1,24,1,21,1,21,1,21,1,28,1,28,1,26,1,28,1,28,1,21,1,26,1,26,1,24,2,26,1,21,1,26,1,26,1,24,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,28,1,29,1,28,1,26,3,26,0,0,1,24,1,24,1,26,1,24,1,21,1,21,0xFF};

void Display(uchar Key) {

P0=table_d[Key/12]; G=0;D=1;

delay_1ms(10); 低位 P2.6高位 P0=table_d[Key%12]; G=1;D=0; delay_1ms(10); }

void delay_1ms(uchar i) 时 {

uchar x,j; for(j=0;j17

//P2.5//1ms延

; }

void KeyScan() //检测按键 { uchar i,j; uchar temp; uchar

table0[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};

EX0=0; //扫描键盘,关外部中断 for(j=0;j<8;++j) {

P1=table0[j];//delay(); temp=0x01; for(i=0;i<5;++i) {

if(!(P2&temp)) {

KeyValue=i*8+j;

18

EX0=1; //开外部中断

P1=0x00; return; }

temp<<=1; } } EX0=1; }

void Run() //运行 {

uchar code *p; if(KeyValue<36) {

PlayKey(pinlv[KeyValue*2],pinlv[KeyValue*2+1]); } else

19

{ p=music; PlayMusic(p); } }

void PlayKey(uchar PLH,uchar PLL) 运行按键 {

Th0=PLH; Tl0=PLL; TR0=1; delay_1ms(187); TR0=0; Speaker=1; }

void PlayMusic(uchar code *p) { uint i,j; flag=0;

20

//

for(i=0;p[2*i]!=0xFF;++i) {

j=p[2*i]; if(j!=0) {

while(j--) {

if(flag==1) return;

PlayKey(pinlv[p[2*i+1]*2],pinlv[p[2*i+1]*2+1]); } } if(j==0) {

delay_1ms(187); } } }

void Device_init() //初始化 {

21

TMOD = 0x01; //使用定时器0 的16 位工作模式 TR0 = 0;

ET0 = 1; //定时器0 中断 EX0=1;

IT0=1; //下降沿中断 EA = 1; //打开总中断 flag=0; //没有按键 P1=0x00; }

timer0() interrupt 1 using 0 断 {

TH0=Th0;TL0=Tl0; Speaker=!Speaker; }

Int0() interrupt 0 using 1 { EX0=0; flag=1;

22

//定时器中//外部中断

P1=0x00; EX0=1; }

void main() {

Device_init(); while(1) { if(flag) {

KeyScan(); Run(); flag=0; }

Display(KeyValue); } }

附2 系统原理图

23

设计仪器、设备和材料清单: 主要仪器设备:个人计算机和相关的软件

主要元器件:按键40个、单片机芯片AT89S52一片 12MHz晶振一个 不同阻值电阻数个 开关一个

USB电源插口一个

喇叭一个 10uF、30pF电容数个 电路板一块

电烙铁一个等

24

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- sarr.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务