当前位置:文档之家› 北邮电子工艺实习小学期实验报告音乐发生器

北邮电子工艺实习小学期实验报告音乐发生器

2013年小学期单片机设计实验报告

题目:电子音乐发生器

班级:2010211119班

班内序号:

实验组号:31

学生姓名:

指导教师:张老师周老师邱老师

目录

一.实验论证与比较 (1)

1.1 音乐播放模块 (1)

1.2 液晶显示模块 (2)

1.3 键盘电子琴与键盘点歌模块 (2)

1.4 存储模块 (2)

二.软件模块设计介绍 (2)

2.1 总体软件设计思路介绍: (2)

2.1 4×4键盘程序设计介绍: (3)

2.3 液晶初始化程序设计介绍: (5)

2.4 液晶功能显示界面程序介绍: (5)

2.5 电子琴发声程序介绍: (6)

2.6 EEPROM程序设计介绍: (7)

三.硬件系统设计 (8)

3.1 系统总体设计 (8)

3.2 液晶显示模块 (9)

3.3 键盘模块 (10)

3.4 音乐喇叭模块 (11)

3.5 电源电路模块 (11)

3.6 人工复位端模块 (12)

3.7 外部中断输入端模块 (12)

3.8 8个发光二极管模块 (13)

3.9 晶振模块 (13)

四.调试过程 (13)

4.1 键盘检测程序修改问题 (13)

4.2 液晶初始化程序问题 (14)

4.3 中断程序调试问题 (14)

4.4 EEPROM相应问题 (15)

4.5子程序在整体代码中的位置问题 (15)

4.6 延时程序的问题 (16)

五.参考文献: (16)

六.实验心得体会 (17)

实验摘要

这次单片机设计实验,我们制作的是电子音乐发生器。通过实验室提供的PIC16F877单片机以及其他外围硬件,编写汇编语言程序实现能演奏简单曲目、能键盘点歌、能存储歌曲等多功能的电子音乐发生器。

整个系统分为硬件和软件两个部分,其中硬件部分:核心微控制器采用Microchip公司的PIC16F877单片机,外围硬件包括4*4矩阵键盘、液晶显示屏、S8050、发光二极管、喇叭等。软件部分是利用集成开发环境是MICROCHIP MPLAB-IDE编写汇编语言来实现。

本次实验设计的电子音乐发生器可以实现以下具体功能:液晶显示屏滚动显示欢迎信息(从左往右,循环两遍)、键盘能演奏从低音do到高音do总共21个音调(其中,1-8按键实现八个音阶,A、B、C按键实现低中高音调的变化)、实现低中高音调变化、演奏歌曲和演奏歌曲的播放功能。

另外,为了保证电路布局美观,材料节省,我们将电路的外围组件和PIC布局于一块基板中央,其余模块按照与PIC的端口布线妥善安置。在实验分工上,我()主要负责软件程序的调试、烧写、下载、测试以及对硬件元件的检测;搭档负责硬件部分,包括整体电路的布线和焊接。

总之,我们小学期利用PIC16F877单片机和其他外围设备实现音乐发生器。概括地说,本次实验设计的就是一个能演奏、能听歌、能录放的简单音乐发生器。

Abstract

In this experiment of Microchip, we made an electronic music player. With the PIC16F877 microchip which is supplied by the laboratory and some other peripheral equipments , we accomplished the music player that can display music note, order songs as well as save the tones you have wrote. The entire system can be divided to hardware and software. Among hardware, PIC16F877 from Microchip Company is the core module, peripheral equipments including 4*4 matrix board, liquid crystal display, dynatron S8050, flash diode and trumpet. Meanwhile, software program is developed in MICROCHIP MPLAB-ICD integrate environment.

The music player we designed can fulfill the function below: First: Display welcome message (from the left to the right and go circle twice). Second, ranging from low pitch "do" to high pitch "do" can be displayed following the order of

keyboard(push button 1-8 corresponding music scale, and "A,B,C" transform music tones).What's more, it can save tones and play songs that' already reserved in EEPROM.

In order to guarantee the reasonable composition of the electric circuit and economize materials, we put microcontroller in the center of the board, peripheral equipments reasonably composition surrounding PIC.

关键字

单片机PIC16F877 并行四段控制按键查找

撰写声明:

由于整个实验是由2人分工合作完成,有些模块是由个人设计,对方不是很了解。对于有引用刘进报告的地方,我会注明出处:【搭档撰写】

我负责撰写部分:软件系统

搭档负责撰写部分:硬件系统

一.实验论证与比较

根据电子音乐发生器的不同功能,下面分为以下四个模块来阐述:

1.1 音乐播放模块

a)程序设计思想:该模块涉及到音乐方面的相关知识。因为在乐理中,每个音符对

应着不同的频率,所以通过计算可以得到周期,然后控制单片机的输出端口,产生

不同频率的方波,通过三极管S8050放大并驱动喇叭发出该音符的声音,这样便得

到了音高(即音阶do re mi fa so la si)。同时,用事先设计好的延时的长短与返

回的数值相乘,调用延时子程序DELAY,即可实现音程,也就是节拍。例如:事先设

定200*225*4为一拍子,则200*225*2的音符就是1/2音符,200*225为1/8音符,以此类推。

b)音乐中音程与频率的关系和计算方法:在音乐上音程就是两个音之间音高的差

值。所谓音高指的是频率的高低,而非音量的高低。在钢琴上,每一个键对应着一

个固定的物理频率,比如中音do的频率是523HZ,人的听力与频率是成对数关系的。

也就是说,你听到的音程相等的组音,他们每组的频率比是相等。比如:DO与RE,

RE与MI音程都是全音。那么也就有如下关系:

然后再介绍音程上的八度,何为八度?用物理上的语言来描述,频率之比正好为2

倍的两个音,其音程就是八度。DO与高DO之间就是八度关系。

周期(十进制)周期(二进制)周期(十六进制)低音SO 64260 1111101100000100 FB04

低音LA 64400 1111101110010000 FB90

低音XI 64524 1111110000001100 FC0C DO 64580 1111110001000100 FC44

RE 64684 1111110010101100 FCAC

MI 64777 1111110100001001 FD09

FA 64820 1111110100110100 FD34

SO 64898 1111110110000010 FD82

LA 64840 1111110111001000 FDC8

XI 65030 1111111000000110 FE06

高音DO 65058 1111111000100010 FE22

高音RE 65157 1111111010000101 FE85

1.2 液晶显示模块

本实验中使用的是16位2行的点阵式液晶。共有16条引脚。单片机RE0、RE1端口分别连接液晶RS端口(寄存器选择信号)和E端口(片选信号),单片机RD0RD7端口分别连接液晶DB0DB7(数据线,实现数据传输)。

显示模块程序由初始化子程序、指令传输子程序、数据传输子程序组成。

在主程序开始时机调用Welcome子程序,使液晶显示“WELCOME”字样。

1.3 键盘电子琴与键盘点歌模块

在键盘模块部分,我们采取用按键9和0来触发已经预先储存下的两首歌曲,当按下数字键9或0时,程序就跳到相应的song1和song2的子程序里面并调用方波发声子程序,播放歌曲。

1.4 存储模块

数据存储模块可以使用单片机本身的RAM,实际上在计算机端的驱动程序加入了30个单位的RAM存储模块.RAM的优点是存储速度快,缺点是容量太小,无法掉电存储.所以我们考虑使用EEPROM来存储音乐.EEPROM有2个选择,单片机内部的EEPROM和外加的EEPROM.在测试内部EEPROM成功后,我们决定使用外部EEPROM,以更深入的理解单片机系统.外加的EEPROM采用8K容量的24C64芯片. 利用主控同步串行端口MMSP采用I2C 总线读写芯片.这样单片机就可以保存更多数据,掉电存储.后期扩展也可以实现更多的功能。

二.软件模块设计介绍

2.1 总体软件设计思路介绍:

程序开始先调用液晶屏初始化程序、液晶功能显示程序、键盘模块初始化程序、30位

RAM 模块初始化,再进入键盘扫描程序。整个程序大体上是在各种初始化程序结束后,进入键盘扫描程序,不断循环检测键盘是否按下,按的是什么键,一旦按下把键值传给接口程序,进一步实现即时发音和存贮发音的功能,功能完成后再回到键盘扫描程序等待新的命令。 整体框图如下:

2.1 4×4键盘程序设计介绍:

按键

功能

数字键1~8

音调低音dou~高音dou 数字键9和0 播放预先存放的两首歌 字母按键A 实现低音八度的转换 字母按键B 实现中音八度的转换 字母按键C

实现高音八度的转换 字母按键D

实现歌曲输入功能

音乐发声程序 存储读取EEPROM 液晶显示FSR

演奏 演奏? 获取键值FSR 系统启动

各个模块初始化 开始 键盘扫描 按下? 松开?

字母按键E

实现歌曲输出功能

字母按键F

实现返回主程序功能

键盘功能介绍 程序框图:

键盘的程序主要有键盘扫面子程序和键值翻译子程序构成 ,键盘扫描子程序的主要功能是检测是否有按键按下,若有,则检测是哪个按键按下,而这部分主要是由键值翻译子程序完成,键盘扫描子程序和键值翻译子程序一起构成了键盘检测子程序。统一检测按键的键值。

液晶显示FSR 演奏 音乐发声程序 存储读取EEPROM 延时

松开 按下 按下

键盘扫描开始 依次扫描PORTD 检测PORT B

延时 转换键值为FSR

2.3 液晶初始化程序设计介绍:

程序框图:

电源开

VDD上升到4.5V后等待>15ms

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 0 0 0 0 1 1 × × × ×

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 0 0 0 0 1 1 × × × ×

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 0 0 0 0 1 1 × × × ×

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 0 0 0 0 1 1 N F × ×

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 0 0 0 0 0 0 1 0 0 0

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 0 0 0 0 1 1 0 0 0 1

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 0 0 0 0 0 0 0 1 I/D S

初始化结束

等待>4.5ms

等待>100us

检查忙标志或延时40us

检查忙标志或延时40us

检查忙标志或延时40us

检查忙标志或延时40us

检查忙标志或延时40us

在编写液晶初始化程序时,我先仔细的看了那本小册子,认真的分析了其中的例子,经过了一天多的时间,弄懂了RW 、RS 、RAM 存储位等一系列新名词,最后一页的那个编程实例着实帮了我不小的忙,我照着它一步步的做,最终初始化了液晶,让我觉得有了一些成就感,也为我后面液晶的复杂显示打下了基础

2.4 液晶功能显示界面程序介绍:

程序框图:

液晶显示程序

在这部分上,我使用了让显示字幕滚动显示,但开始我不知道如何能够做到这样的显示效果,在网上查阅了相关额资料后,用了循环整体显示移位的编程方法并设计好延时,最终出来了这个效果

2.5 电子琴发声程序介绍:

程序框图:

发音程序关键是FSR 值的获取,其中音乐库程序是一个表,表中列出7个基本音节,音符发声程序主要是七个音的中音发声程序,照着书本上所给公式算出。拿500Hz 音频为例,计算式为:

1T =1/(500Hz )=0.002s=2000us; 1000÷8=125=256-131

程序中要用到所算数字131做为循环次数。

程序结束,返回

调用电子琴发声程序

音乐发声程序

获取FSR 键值

2.6 EEPROM 程序设计介绍:

程序框图:

EEPROM 包括写数据和读数据,I 2C 总线对8KB EEPROM 的读写程序中关键也是要对FSR 变量做相应检测,其中检测其是否是各种功能键尤为重要,这牵涉到功能的选择,并且每次烧写都要初始化歌曲地址,防止歌曲相互覆盖与读取时读串歌曲。

程序结束。返回

检测起始地址 记录为存储模式

记录为存储模式

记录为存储模式

起始地址初始化

是音符,调用烧写程序 D? A? B? E? 存储读取EEPROM 获取FSR 值 C? 读取程序

三.硬件系统设计【搭档撰写】

3.1 系统总体设计

a)管脚分布图:

0 1 2 3 4 5 6 7 PORT A 置空无PORT B 键盘列置空

PORT C 发光二极管

PORT D 液晶显示键盘行/液晶显示

PORT E 液晶显示置空无

b)系统连接:

3.2 液晶显示模块

液晶显示模块由LCD 板(液晶显示板),PCB 板(印刷电路板)和控制驱动电路三部分组成。本实验采用16位2行的点阵式液晶。共有16条引脚。在液晶板上排列着若干5x7或5x10点阵的字符显示位,每个显示位可显示1个字符,从规格上分为每行8、16、20、24、32、40位,有一行、两行及四行三类。

a) 各引脚说明:

b) 与单片机连接如下:

图1 系统模块总体框图

PIC16F877

语音芯片APR9600

喇叭

S8050

液晶显示模块

4*4矩阵键盘

c) 模块引脚功能:

所有的功能位数据和数据位数据送到液晶各引脚时液晶并不读入,而是通过将第六脚先置1再置0来触发,之后指令或数据才被读入。用户所编的显示程序,开始必须进行初始化,初始化结束前,要开显示,否则模块无法正常显示。采用软件复位进行初始化,下面为八位接口初始化流程图:

电源开

VDD上升到4.5V后等待>15ms

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 0 0 0 0 1 1 × × × ×

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 0 0 0 0 1 1 × × × ×

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 0 0 0 0 1 1 × × × ×

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 0 0 0 0 1 1 N F × ×

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 0 0 0 0 0 0 1 0 0 0

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 0 0 0 0 1 1 0 0 0 1

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 0 0 0 0 0 0 0 1 I/D S

初始化结束

等待>4.5ms

等待>100us

检查忙标志或延时40us

检查忙标志或延时40us

检查忙标志或延时40us

检查忙标志或延时40us

检查忙标志或延时40us

3.3 键盘模块

当无键按下时,各行线和各列线相互断开,各列线保持高电平,当有键按下时,则

相应的行线和列线相连,识别是哪一个键被按下,通常用行扫描法,即依次对每一行进行扫描,先使被扫描的行为低电平,其它所有的行均为高电平,接着检测各列线的状态(称为列码)。若各列均为高电平,则所按之键不在此行,继续扫描下一行,若列线不全为高电平,则被按之键在此行。根据行码和列码,就可知被按之键的坐标值(又称位置码),根据位置码通过查表就可得到它的键值。

与PIC的连接如下:

3.4 音乐喇叭模块

与PIC的连接如下:

3.5 电源电路模块

电源模块,使用了三端稳压器LM7805将输入的9V电压转换成5V电压,并且连接了滤波电容,增强了电源的滤波特性。

连接如下:

D 1

1B H 62

V reg U 1LM 7805C T

N

O U T

C 5

100nF

C 1

100uF

C 2100uF

C 3100nF

3.6 人工复位端模块

连接如下:接1管脚

R 1

47kO hm _5%

R 2

47O hm _5%

5V VC C

3.7 外部中断输入端模块

连接如下:接33管脚

R 147O hm _5%

R 2

100O hm _5%

5V V C C

3.8 8个发光二极管模块

连接如下:R1~R8对应接在单片机的RC0~RC7上。

LED1LED2LED3LED4LED5LED6LED7LED8

R1

47Ohm_5%

R2

R3

R4

47Ohm_5%

R5

R6

R7

R8

3.9 晶振模块

连接如下:

四.调试过程

此次程序的调试,我遇到了几个问题,其中有已经解决的,也有实验结束后还没有完成的, 在此我选几个典型的例子说明一下。

4.1 键盘检测程序修改问题

我们在决定做电子音乐发生器后,就知道我们此次程序的重点是键盘控制程序的调用。所以,一开始我就以键盘的程序作为突破口,在编写程序的过程中,我参看了提高篇的一个实例,与我们不一样的是,书上的例子对单片机端口的连接使用的是RB0-RB7,而我们的实验箱上的键盘列对应RB0-RB3,行使用的是RD4-RD7,

管脚1:空(不用接)

管脚7:接地

管脚14:接5V 电源

管脚8:接单片机OSC1(第13号管脚)

就是这小小的改变,却使得程序修改起来显得略显麻烦,由于是初始牛刀,调这一

个程序经过了比较“痛苦”的过程,在理解FSR,键值,间接寻址,端口初始化,

延时等概念后,最终完成了程序的修改并且下载运行成功。这次的调试程序让我第

一次了解了汇编的概念,加深了我对这门语言的理解,为以后编写更加复杂的键盘

程序奠定了基础。

4.2 液晶初始化程序问题

液晶模块程序的编写也是我们实验的重要一环,在编写液晶的程序时,我参看了试验箱里面的小本,并且认真的研究了里面的例子和编程方法,我按照初始化的

步骤做后,但是液晶并没有初始化,我有检查了程序,端口的初始化,下降沿的调

用,延时的长短都没有问题,我当时就觉得很奇怪,怀疑是液晶出了毛病,后来,

经过和同学的讨论,分析出问题来自于端口E的初始化问题,由于数模转换寄存器

ADCON1主要用于控制相关引脚的功能选择,对于RE端口的各条引脚功能进行设置,

他们可以被设置成模拟输入,或者参考电压输入,或者通用数字I/O引脚,只有

ADCON1寄存器的最高位和低四位是可读/写的。ADCON1的低四位PCFG3-PCFG0,当

这四位为1100时,RE2-RE0定义为通用数字I/O引脚,而液晶使用了RE0和RE1

引脚,所以对RE端口初始化时,应该赋予寄存器ADCON1八位相应的初始值,这样

才能使得RE端口成为普通的数字I/O引脚。在解决了这个问题之后,运行并下载

程序,成功的将液晶初始化,并显示一条线。这次编程经历告诉我要注意每一个细

节,吃透原理,才能有所收获。

4.3 中断程序调试问题

在我编写了两首歌曲并储存后,想用中断实现歌曲的暂停和播放功能,这部分内容涉及到基础篇的第八章,由于键盘的按键我都赋予了相应的作用,所以我决定

使用外部中断INT键实现歌曲的暂停恢复功能,参考了书上的几个实例之后,我就

将相应的程序添加到我的源程序中,并在开始加了中断的初始地址0004h,下载并

测试,当我按下9键播放事先存好的歌曲时,再按下中断INT键后,并没有出现相

应的结果,我把模式改为模拟仿真SIMILATOR模式,进行单步调试,查找原因,结

果是仿真的单步调试并没有问题,这就让我很纠结,问题究竟出在哪里呢?经过思

考,我想不通过按键触发,而改为直接播放歌曲。于是,我把歌曲的代码单独提炼

出来,进行调试并加入中断,下载测试,结果INT键成功的实现了中断并恢复现场。

这样就更加奇怪了,究竟是哪里出现了问题呢?经过连续几天的分析,我逐渐找到

了问题所在,我觉得是4×4按键触发影响了中断按键INT,为了证实我的猜想,

我把歌曲的程序直接运行,随便点了一个键盘上面的按键,结果也进入了中断!真

的是键盘影响了外部中断按键INT的使用,我又查看了INT键的硬件连接,实际上

是当按下INT键时,电压从VCC一下变成接地了,而4×4键盘与单片机的连接与

之类似,而且按键的RB0列正好是外部中断INT键对应的端口,这就不奇怪了,在

点下键盘上面按键的同时,影响到了RB0的电位,从而影响了中断和中断恢复的实

现,我想把中断键改成键盘上的按键,但这是我们已经大体布线完毕,修改起来比

较麻烦,所以不得不放弃中断,哎,我自己觉得很遗憾,但回过头一想,正是在这

种不断寻找问题所在的过程中,才锻炼了能力,尽管这次我们放弃了这个功能,但

是经过这一番“磨砺”,也让我在单步调试中获得了更多的经验。

4.4 EEPROM相应问题

由于我们开始规划,要实现歌曲的写入和读出功能,就必须学习EEPROM,我开始看了提高篇第一章的内容,并研究了其中的实例,掌握了EEPROM必要知识,

于是,我便开始编写相应的程序,开始我遇到了不小的困难,比如不同寄存器的功

能,地址变量的移位,键值FSR与EEDATA数据的存储,以及在进入写操作时如何

重复写入以及重复读出,这些问题需要一个个的解决,我规划将EEPROM部分的程

序分为两块,一块是写入操作,一块是读出操作,在写入操作中,我把输入的音

符地址储存到了EEDATA里面,在输入完一个音符后,又回到GOTO WRITE 子程序

中进行下一个音符的输入,并把EEDATA的地址相应加一,当输完音符,并按下E

键时,进入读出操作,这时调用发音子程序将刚刚输入的音符依次读出(发出声音),

这样,就实现了写入读出功能。

4.5子程序在整体代码中的位置问题

在最后的程序修改中,我把两首歌曲输入到总代码中,结果是当我按下9或0键时声音隔了好几秒才发出来,而且其他的按键有的起作用有的不起作用,我分析

了一下原因,在总代码中,我发现歌曲的代码与方波发声子程序的距离很远,是不

是由于代码相距过远造成每次调用方波子程序时都要耗费一段时间,我把方波子程

序放到两首歌曲的后面,运行下载,结果问题得以解决,经过这一个小问题我发现,

当代码过长时,我们还要考虑代码调用的便捷性,避免因为调用耗时过长而影响整

体的效果。

4.6 延时程序的问题

我开始是忽略延时程序的,我想不就是一个延时吗,有不有应该不会影响全局。但

许多问题的出现,使得我不得重新考虑延时的意义,如在编写歌曲中,在音符每句

之间都有延时,由于发音的长度。太短的延时容易“淹没”在音长的“浪潮”中,

于是我连续调用64ms延时程序,但收效甚微,这时,我准备编写更长的延时程序,

参看了基础篇的延时定义,我编写了一段5112ms的延时程序,在每句的结束调用,

下载测试后,有了明显的改进;又如在给发二极管送显时,如果延时过短,将会看

不到想要的效果,这说明一个小小的延时程序也会影响整个程序的运行,应当引起

我们的注意。

综上,在这次实验中,我接触到了一些汇编知识,同时也掌握了一些调试方法,在解决一个个细小的问题之中,锻炼了自己的能力,受益良多。

五.参考文献:

PIC单片机实用教程——基础篇

李学海

北京航空航天大学出版社

使用说明:的确是一本不可或缺的教材,本书列举了很多实用的具有实战意义的

例子,单片机入门就是通过把这本书里的好例子一字一行敲进电脑去来实现的。

PIC单片机实用教程——提高篇

李学海

北京航空航天大学出版社

这本书我看了第二章,使我了解了输入输出端口的相关知识,里面的例子详细,

浅显易懂,是一本不错的用于提高能力的书。

相关主题
文本预览
相关文档 最新文档