电子琴设计报告
院 系:计算机科学学院
专 业:计算机科学与技术
学 号:201003784
姓 名:张林峰
班 级:计科1002
设计时间:2012.10.22
设计地点:4#2号机房
指导教师:严圣华
目录
一、总体方案
二、硬件介绍
三、音乐产生原理
四、软件设计
五、电子琴演示
六、完整代码
七、实验体会
一、总体方案
1.1设计要求
1.要求达到电子琴的基本功能,可以用弹奏出简单的乐曲。
2.用键盘作出电子琴的按键,每键代表一个音符。
3.各音符按一定的顺序排列,必须符合电子琴的按键排列顺序。
4.固定音乐播放有按键控制。
1.2电子琴系统的组成
STC89C52单片机设计微型电子琴的方法,仅需STC89C52最小系统,扩展一组矩阵键盘,再接一组发光二极管用来指示电子琴的工作状态。
本系统分为两个部分,一个是音乐另一个是电子琴。
音乐播放部分:音乐实际上是有固定周期的信号。本文介绍用STC89C52的两个定时器(如T0,T1)控制,在P1.3脚上输出方波周期信号,产生乐音
电子琴弹奏部分:实际上就是把每个按键所对应的值经过处理后发给单片机,再在单片机内把数字当作指针指向所对应的音符。
二、硬件介绍
2.1 STC89C52
STC89C52是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。 具有以下标准功能: 8k字节Flash,512字节RAM, 32 位I/O 口线,,内置4KB EEPROM,MAX810复位电路,三个16 位定时器/计数器,一个6向量2级中断结构,全双工串行口。
2.2 STC89C52引脚图
2.3引脚功能介绍
在这里就只介绍一下制作电子琴所用到的一些引脚功能。
VCC:供电电压。
GND:接地。
P3.2 /INT0(外部中断0)
P3.3 /INT1(外部中断1)
P3.4 T0(记时器0外部输入)
P3.5 T1(记时器1外部输入)
P3口连接矩阵键盘用来控制音符输出及音乐播放。
P0口控制数码管,以显示音符。
P2.6连接锁存器U6控制数码管的段选。
P2.7连接锁存器U7控制数码管的位选。
P2.0控制蜂鸣器
2.4矩阵键盘工作原理
列线通过电阻接正电源,并将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口则作为输入。这样,当按键没有按下时,所有的输出端都是高电平,代表无键按下。行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。具体的识别及编程方法如下所述。
2.5矩阵键盘的按键识别方法
1、判断键盘中有无键按下 将全部行线Y0-Y3置低电平,然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。若所有列线均为高电平,则键盘中无键按下。
2、判断闭合键所在的位置 在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。
三、音乐产生原理
3.1不同频率产生原理
一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。
若要产生音频脉冲,只要算出某一音频的周期(1/频率),再将此周期除以2,即为半周期的时间。利用定时器计时半周期时间,每当计时终止后就将P2.0反相,然后重复计时再反相。就可在P1.3引脚上得到此频率的脉冲。利用STC89C52的内部定时器使其工作计数器模式(MODE1)下,改变计数值TH0及TL0以产生不同频率的方法产生不同音阶。
3.2 计数值TH0及TL0的计算方法
例如,频率为523Hz,其周期T=1/523=1912μs,因此只要令计数器计时956μs/1μs=956,每计数956次时将I/O反相,就可得到中音DO(523Hz)。
要是计数器记956次,就要设定此时的TH0、TL0的值。
TH0=(65536-956)/256=(11111100)2=0xfc
TL0=(65536-956)%256=(01000100)2=0X44
3.3音节频率表
四、软件设计
4.1数组的运用
为数码管写了一个显示0~F的数组,便于直接调用,来显示不同音符表示的数字,代码如下:
uchar code shuma[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,};
不同频率声音的TH0、TL0值也分别存在两个数组中,便于直接运用,如下:
codeunsignedcharFREQH[]={ 0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,
0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC, 0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE00xFF,0x00, } ;
codeunsignedcharFREQL[]=
{0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F, 0xEE,0x44,0x6B,0xB4,0xF4,0x2D,0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,0x00, };
一首歌的每个音符对应频率在TH0、TL0数组中的地址也存入一个新数组中,如下:
code unsigned char sszymmh[]={ 6,2,3, 5,2,1, 3,2,2, 5,2,2, 1,3,2, 6,2,1, 5,2,1,
6,2,4, 3,2,2, 5,2,1, 6,2,1, 5,2,2, 3,2,2, 1,2,1,
6,1,1, 5,2,1, 3,2,1, 2,2,4, 2,2,3, 3,2,1, 5,2,2,
5,2,1, 6,2,1, 3,2,2, 2,2,2, 1,2,4, 5,2,3, 3,2,1,
2,2,1, 1,2,1, 6,1,1, 1,2,1, 5,1,6, 0,0,0
};
4.2 键盘
通过switch语句,每按下一个键,产生一个num值,如下:
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0){
switch(temp)
{
case 0xe0:num=0;break;
case 0xd0:num=1;break;
case 0xb0:num=2;break;
case 0x70:num=3;break;
}
}
4.3 其他一些功能子函数
如通过中断函数void t0char() interrupt 1
{
TR0=0;
beep=!beep;
TH0=timer0h;
TL0=timer0l;
TR0=1;
}产生不同频率的电压变换,进而使蜂鸣器产生不同频率的声音。延时函数、数码管显示函数、声音播放函数。
4.4 整体构思
由于本键盘的每列接P3口的低4位,每行接P3口的高4位,先使某一列的4个键一边接低电平,当该行的一个按键按下时,低电平传到该按键所对应的行P3口高位。然后通过switch语句来检测到底是那一个按键传递的低电平。不同按键按下,产生一个不同的num值
按键产生的num值,先判断如果num>0传递给音频对应的定时器高八位、第八位,数组函数中,以及数码管显示数组函数中,来产生频率,显示音符。
anjian(num);
if(num>0)
{ timer0h=FREQH[num];
timer0l=FREQL[num];
display(num);
time=1;
song();
}
如果num=0则运行音乐播放部分,
else {
i=0;
while(i<100){
k=sszymmh[i]+7*sszymmh[i+1]-1;
timer0h=FREQH[k];
timer0l=FREQL[k];
time=sszymmh[i+2];
i=i+3;
song();
}
六、完整代码
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit beep=P2^0;
uchar timer0h,timer0l,time,i,num,temp,k;
code unsigned char sszymmh[]={ 6,2,3, 5,2,1, 3,2,2, 5,2,2, 1,3,2, 6,2,1, 5,2,1,
6,2,4, 3,2,2, 5,2,1, 6,2,1, 5,2,2, 3,2,2, 1,2,1,
6,1,1, 5,2,1, 3,2,1, 2,2,4, 2,2,3, 3,2,1, 5,2,2,
5,2,1, 6,2,1, 3,2,2, 2,2,2, 1,2,4, 5,2,3, 3,2,1,
2,2,1, 1,2,1, 6,1,1, 1,2,1, 5,1,6, 0,0,0
};
code unsigned char FREQH[]={
0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,
0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC, //1,2,3,4,5,6,7,8,i
0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,
0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,
} ;
code unsigned char FREQL[]={
0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,
0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F, //1,2,3,4,5,6,7,8,i
0xEE,0x44, 0x6B,0xB4,0xF4,0x2D,
0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,
};
void delay(unsigned char t)
{
unsigned char t1;
unsigned long t2;
for(t1=0;t1<t;t1++)
{
for(t2=0;t2<8000;t2++)
{
;
}
}
}
void t0int() interrupt 1
{
TR0=0;
beep=!beep;
TH0=timer0h;
TL0=timer0l;
TR0=1;
}
void song()
{
TH0=timer0h;
TL0=timer0l;
TR0=1;
delay(time);
}
uchar anjian( i)
{
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
switch(temp)
{
case 0xe0:num=0;break;
case 0xd0:num=1;break;
case 0xb0:num=2;break;
case 0x70:num=3;break;
}
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
switch(temp)
{
case 0xe0:num=4;break;
case 0xd0:num=5;break;
case 0xb0:num=6;break;
case 0x70:num=7;break;
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
switch(temp)
{
case 0xe0:num=8;break;
case 0xd0:num=9;break;
case 0xb0:num=10;break;
case 0x70:num=11;break;
}
}
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
switch(temp)
{
case 0xe0:num=12;break;
case 0xd0:num=13;break;
case 0xb0:num=14;break;
case 0x70:num=15;break;
}
}
return num;
}
void main(void)
{
TMOD=1;
EA=1;
ET0=1;
while(1)
{
anjian( num);
if(num>=1)
{ timer0h=FREQH[num];
timer0l=FREQL[num];
time=1;
song();
num=1;
}
else if(num=0){
i=0;
while(i<100){
k=sszymmh[i]+7*sszymmh[i+1]-1;
timer0h=FREQH[k];
timer0l=FREQL[k];
time=sszymmh[i+2];
i=i+3;
song();
}
}
}
}
七、实验体会
无数次的实践是必须的。不放弃,有时遇到了不能解决的难题,不要说我已经无能为力了,要不断的尝试,从上次失败中找原因!做这个竞赛,我总共做了257次尝试!最终取得成功!
第二篇:电子琴
湖南工程学院应用技术学院
课 程 设 计
课题名称
专 业 电气工程及其自动化
班 级学 号
姓 名
指导教师
20xx年 6 月 5 日 课程名称
湖南工程学院应用技术学院 课程设计任务书
课程名称: 单片机原理与应用
题 目:电子琴
专业班级: 学生姓名: 学号: 指导老师: 寻大勇 审 批:
任务书下达日期 2014 年 5月 26日 任务完成日期 2014 年 6月 5日
目录
1 系统概述.......................................................................................................... 1
1.1课程设计的目的和意义 ....................................................................... 1
1.2 本系统主要研究内容 .......................................................................... 2
1.3 本系统主要研究目标 .......................................................................... 2
1.4主要芯片简介 ....................................................................................... 2
2 方案论证 ........................................................................................................ 3
2.1 控制模块选择方案 .............................................................................. 3
2.2 按键模块选择方案 .............................................................................. 3
3 方案的实现 .................................................................................................... 4
3.1系统实现的具体措施 ........................................................................... 4
3.2系统硬件设计 ....................................................................................... 5
3.2.1 系统硬件总体设计 .................................................................. 5
3.2.2子系统(模块)一 ................................................................... 6
3.2.3子系统(模块)二 ................................................................... 7
3.2.4 子系统(模块)三 .................................................................. 8
3.3系统软件设计 ............................................................................. 10
3.3.1系统软件总体设计 ................................................................. 10
3.3.2子程序(模块)一:LED显示 .............................................. 10
3.3.3子程序(模块)二:扬声器 ................................................... 11
3.3.4子程序(模块)三:矩阵键盘 ............................................. 13
4 系统调试 .............................................................................................. 13
4.1 Proteus 简介 .................................................................................... 13
4.2 keil 简介 .......................................................................................... 14
4.3 Proteus和Keil的联调 ................................................................... 15
5 设计心得 ...................................................................................................... 17
附录1:............................................................................................................. 19
1 系统概述
1.1课程设计的目的和意义
单片微型计算机是大规模集成电路技术发展的产物,属第四代电子计算机,它具有高性能、高速度、体积小、价格低廉、稳定可靠、应用广泛的特点。它的应用必定导致传统的控制技术从根本上发生变革。因此,单片机的开发应用已成为高科技和工程领域的一项重大课题。
电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器。它在现代音乐扮演着重要的角色,单片机具有强大的控制功能和灵活的编程实现特性,它已经溶入现代人们的生活中,成为不可替代的一部分。本文的主要内容是用AT89C51单片机为核心控制元件,设计一个电子琴。以单片机作为主控核心,与键盘、扬声器等模块组成核心主控制模块,在主控模块上设有16个按键和扬声器。
本文主要对使用单片机设计简易电子琴进行了分析,并介绍了基于单片机电子琴统硬件组成。利用单片机产生不同频率来获得我们要求的音阶,最终可随意弹奏想要表达的音乐。并且本文分别从原理图,主要芯片,各模块原理及各模块的程序的调试来详细阐述。本系统是简易电子琴的设计,按下键盘矩阵中的按键会使数码管显示当前按键,扬声器播放器对应的音符。通过设计本系统可了解单片机的基本功能。对单片机的了解有一个小的飞跃。
1
1.2 本系统主要研究内容
本系统设计制作一个可演奏的电子琴。综合应用了两项设计。
(1)键盘矩阵识别。即矩阵扫描,显示当前按键。
(2)不同频率音符播放。可以通过按键控制16种发音。
1.3 本系统主要研究目标
本系统的设计是为了实现按下矩阵键盘中的按键会使数码管显示当前按键,扬声器播放对应音符的目标。
1.4主要芯片简介
AT89C51简介
AT89C51是一个低功耗,高性能CMOS 8位单片机,片内含4k Bytes ISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,功能强大的微型计算机的AT89C51可为许多嵌入式控制应用系统提供高性价比的解决方案。
AT89C51具有如下特点:40个引脚(引脚图如图1-2所示),4k Bytes Flash片内程序存储器,128 bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器。 2
此外,AT89C51设计和配置了振荡频率可为0Hz并可通过软件设置省电模式。空闲模式下,CPU暂停工作,而RAM定时计数器,串行口,外中断系统可继续工作,掉电模式冻结振荡器而保存RAM的数据,停止芯片其它功能直至外中断激活或硬件复位。同时该芯片还具有PDIP、TQFP和PLCC等三种封装形式,以适应不同产品的需求。
2 方案论证
2.1 控制模块选择方案 采用AT89C51单片机进行控制,由于其性价比高,完全满足了本作品智能化的要求,它的内部程序存储空间达到4K,使软件设计有足够的内部使用空间并且方便日后系统升级,使用方便,抗干扰性能提高。AT89C51单片机设计微型电子琴的方法,仅需AT89C51最小系统,扩展一组矩阵键盘,再接一组发光二极管用来指示电子琴的工作状态。
2.2 按键模块选择方案
传统电子琴可以用键盘上的“1”到“A”键演奏从低SO到高DO等11音。该设计有16个按钮矩阵,设计成16个音,可以实现音阶在低音4---高音5之间。比传统音阶范围大,弹奏效果好。 3
3 方案的实现
3.1系统实现的具体措施
键盘接口必须具有的4个基本功能:
(1)去抖动:每个按键在按下或松开时,都会产生短时间的抖动。抖动的持续时间与键的质量相关,一般为5—20mm。所谓抖动是指在识别被按键是必须避开抖动状态,只有处在稳定接通或稳定断开状态才能保证识别正确无误。去抖问题可通过软件延时或硬件电路解决。
(2)防串键:防串键是为了解决多个键同时按下或者前一按键没有释放又有新的按键按下时产生的问题。常用的方法有双键锁定和N键轮回两种方法。双键锁定,是当有两个或两个以上的按键按下时,只把最后释放的键当作有效键并产生相应的键码。N键轮回,是当检测到有多个键被按下时,能根据发现它们的顺序依次产生相应键的键码。
(3)被按键识别:如何识别被按键是接口解决的主要问题,一般可通过软硬结合的方法完成。常用的方法有行扫描法和线反转法两种。行扫描法的基本思想是,由程序对键盘逐行扫描,通过检测到的列输出状态来确定闭合键,为此,需要设置入口、输出口一个,该方法在微机系统中被广泛使用。线反转法的基本思想是通过行列颠倒两次扫描来识别闭合键,为此需要提供两个可编程的双向输入/输出端口。
(4)键码产生:为了从键的行列坐标编码得到反映键功能的键码,一般在内存区中建立一个键盘编码表,通过查表获得被按 4
键的键码。
用AT89C51的并行口P0接4×4矩阵键盘,以P0.0-P0.3作输入线,以P0.4-P0.7作输出线;在数码管上显示每个按键的“0-F”序号。
3.2系统硬件设计
3.2.1 系统硬件总体设计
本系统由键盘矩阵、LED显示管、扬声器这几个部分组成,LED显示管显示当前按键,扬声器发出对应音符。硬件总体设计图如下:
图1
5
3.2.2子系统(模块)一
LED显示模块如图2-2所示,利用AT89c51单片机的P0端口的P0.0-P0.7连接到对应的矩阵按钮上。
矩阵扫描显示当前按键模块如下:
图2
6
3.2.3子系统(模块)二
矩阵扫描扬声器发出对应音符模块如下:
图3
7
3.2.4 子系统(模块)三
矩阵键盘模块如下:
图4
矩阵式键盘的结构与工作原理
在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口(如P1口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。
矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,上图中,列线通过电阻接正电源,并将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口则作为输入。这样,当按键没有按下时,所有的输出端都是高电平,代表无键按下。 8
行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。具体的识别及编程方法如下所述。
9
3.3系统软件设计
3.3.1系统软件总体设计
本系统的软件总的流程图如下:
图5
系统总程序见附录1.
3.3.2子程序(模块)一:LED显示
I/O并行口直接驱动LED显示
把“AT89C51”区域中的P2.0/A8-P2.7/A15端口用8芯排线 10
连接到一位数码管的a-h端口上;要求:P2.0/A8与a相连,P2.1/A9与b相连,P2.2/A10与c相连,??,P2.7/A15与h相连。 表1:
在本设计中,数码管的显示通过 P2=DSY_CODE[k] 这句语言来查表并输出,实现音符的显示。
具体程序见附录1
3.3.3子程序(模块)二:扬声器
一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信
11
号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。
若要产生音频脉冲,只要算出某一音频的周期(1/频率),再
将此周期除以2,即为半周期的时间。利用定时器计时半周期时间,每当计时终止后就将P3.7反相,然后重复计时再反相。就可在P3.7引脚上得到此频率的脉冲。
利用AT89C51的内部定时器使其工作计数器模式(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)、中音
DO(523Hz)、高音DO(1046Hz)的计数值。
T=65536-N=65536-fi÷2÷fr=65536-1000000
÷2÷fr
=65536-500000/fr
低音DO的T=65536-500000/262=63628
中音DO的T=65536-500000/523=64580
高音DO的T=65536-500000/1046=65058
我们要为这个音符建立一个表格,单片机通过查表的方式来
12
获得相应的数据:uint code Tone_Delay_Table[] =
{ 64021,64103,64260,64400,64524,64580,64684,64777,
64820,64898,64968,65030,65058,65110,65157,65178 };
具体程序见附录1
3.3.4子程序(模块)三:矩阵键盘
矩阵式键盘的按键识别方法:
确定矩阵式键盘上何键被按下介绍一种“行扫描法”。
行扫描法 行扫描法又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法,如上图所示键盘,介绍过程如下。
1、判断键盘中有无键按下 将全部行线Y0-Y3置低电平,然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。若所有列线均为高电平,则键盘中无键按下。
2、判断闭合键所在的位置 在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。
具体程序见附录1
4 系统调试
4.1 Proteus 简介
Proteus的ISIS是一款Labcenter出品的电路分析实物仿真系 13
统,可仿真各种电路和IC,并支持单片机,元件库齐全,使用方便,是不可多得的专业的单片机软件仿真系统。
该软件的特点:
① 全部满足我们提出的单片机软件仿真系统的标准,并在同类产品中具有明显的优势。
②具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统的仿真、RS-232动态仿真、C调试器、SPI调试器、键盘和LCD系统仿真的功能;有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。
③ 目前支持的单片机类型有:68000系列、8051系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列以及各种外围芯片。
④ 支持大量的存储器和外围芯片。总之该软件是一款集单片机和SPICE分析于一身的仿真软件,功能极其强大 ,可仿真51、AVR、PIC。
4.2 keil 简介
单片机开发中除必要的硬件外,同样离不开软件,我们写的汇编语言源程序要变为CPU可以执行的机器码有两种方法,一种是手工汇编,另一种是机器汇编,目前已极少使用手工汇编的方法了。机器汇编是通过汇编软件将源程序变为机器码,用于MCS-51单片机的汇编软件有早期的A51,随着单片机开发技术的不断发展,从普遍使用汇编语言到逐渐使用高级语言开发,单片机的开发软件也在不断发展,Keil软件是目前最流行开发MCS-51系列单片机的软件,这从近年来各仿真机厂商纷纷宣布全面支持Keil即可看出。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部份组合在一起。运行Keil软件需要Pentium或以上的CPU,16MB或更多RAM、20M以上空闲的硬 14
盘空间、WIN98、NT、WIN2000、WINXP等操作系统。掌握这一软件的使用对于使用51系列单片机的爱好者来说是十分必要的,如果你使用C语言编程,那么Keil几乎就是你的不二之选(目前在国内你只能买到该软件、而你买的仿真机也很可能只支持该软件),即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。
4.3 Proteus和Keil的联调
使用步骤:
1、打开keil,建立工程,输入程序
2、编译和生成hex文件。
3、打开Proteus,设计硬件电路图。
4、导入hex文件。将鼠标置于电路图中AT89C51器件上,右击后再左击,在出现的窗口中找到如下图所示的Program File对话框,并填入hex文件对应的路径。
图6
5、点击面板左下角的,开始调试。
6、按下任意键,扬声器发出对应的声音,并在数码管上显示出键值,例如,按下KF按键,仿真结果如下:
15
图7
7、按下另外一个K9键,仿真结果如下:
图8
其他的同理。
16
5 设计心得
将程序导入AT89C51芯片,调试成功后,可任意弹奏自己想要的旋律。本课题通过制作电子琴,将几个模块很好的融合起来,对使用单片机设计简易电子琴进行了分析,并介绍了基于单片机电子琴统硬件组成。利用单片机产生不同频率来获得我们要求的音阶,最终可随意弹奏想要表达的音乐。说明一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,于是我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可,然后我们利用功放电路来将音乐声音放大,同时通过显示模块来确知自己所弹的音符。
通过这次课程设计,我感觉收获了很多:
首先,通过实践,加深对单片机系列知识及其系统的认识。这个设计题目并不是新的,但从中能体现到一个系统开发设计的过程,足于让我们受益。
第二,通过设计学习到了很多软件的使用。本次设计,软件部分用到了proteus进行硬件设计,用keil4进行程编译。
第三,提高了自己的动手能力。动手在一定程度上反映了一个人的能力,作为当代大学生,社会要求的我们不是只能说而不能做的人才;三能人才标准更让我们清醒地认识到,实际动手能 17
力无比重要。从这次实物制作中,我的动手能力提高了。感谢学院给了我们这次实践动手的机会,更感谢我们的郭老师教会了我们单片机相关知识。
本设计还可以扩展其他功能,比如记忆功能,即可以存储弹奏者所弹奏的音乐且保存,待弹奏完后播放给弹奏者听。还可以做得更加娱乐一点,增加一些彩灯使彩灯随着音调变化而产生不同的样式。
参考文献
1.《单片机原理与应用》 王迎旭等编 机械工业出版社
2.《51系列单片机设计实例》 楼然苗等编 北京航空航天大学出版社
3.《计算机硬件技术基础实验教程》 黄勤等编 重庆大学出版社
4.《微型计算机接口技术及应用》 刘乐善主编 华中科技大学出版社
5.《单片微型计算机原理及接口技术》陈光东等 华中科技大学出版社
18
附录1:
KEYBUF EQU 30H STH0 EQU 31H STL0 EQU 32H TEMP EQU 33H ORG 00H
LJMP START ORG 0BH
LJMP INT_T0
START: MOV TMOD,#01H SETB ET0
SETB EA
WAIT:
MOV P3,#0FFH CLR P3.4
MOV A,P3
ANL A,#0FH XRL A,#0FH JZ NOKEY1
LCALL DELY10MS MOV A,P3
ANL A,#0FH XRL A,#0FH JZ NOKEY1 MOV A,P3
ANL A,#0FH CJNE A,#0EH,NK1 MOV KEYBUF,#0 LJMP DK1
NK1: CJNE A,#0DH,NK2 MOV KEYBUF,#1 LJMP DK1
NK2: CJNE A,#0BH,NK3 MOV KEYBUF,#2 LJMP DK1
19
NK3: CJNE A,#07H,NK4 MOV KEYBUF,#3 LJMP DK1
NK4: NOP
DK1:
MOV A,KEYBUF MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,A
MOV A,KEYBUF MOV B,#2
MUL AB
MOV TEMP,A
MOV DPTR,#TABLE1 MOVC A,@A+DPTR MOV STH0,A MOV TH0,A
INC TEMP
MOV A,TEMP
MOVC A,@A+DPTR MOV STL0,A MOV TL0,A
SETB TR0
DK1A: MOV A,P3 ANL A,#0FH XRL A,#0FH
JNZ DK1A
CLR TR0
NOKEY1:
MOV P3,#0FFH CLR P3.5
MOV A,P3
ANL A,#0FH XRL A,#0FH
JZ NOKEY2
LCALL DELY10MS 20
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY2
MOV A,P3
ANL A,#0FH
CJNE A,#0EH,NK5 MOV KEYBUF,#4 LJMP DK2
NK5: CJNE A,#0DH,NK6 MOV KEYBUF,#5 LJMP DK2
NK6: CJNE A,#0BH,NK7 MOV KEYBUF,#6 LJMP DK2
NK7: CJNE A,#07H,NK8 MOV KEYBUF,#7 LJMP DK2
NK8: NOP
DK2:
MOV A,KEYBUF MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,A
MOV A,KEYBUF MOV B,#2
MUL AB
MOV TEMP,A
MOV DPTR,#TABLE1 MOVC A,@A+DPTR MOV STH0,A MOV TH0,A
INC TEMP
MOV A,TEMP
MOVC A,@A+DPTR MOV STL0,A MOV TL0,A
21
SETB TR0
DK2A: MOV A,P3 ANL A,#0FH
XRL A,#0FH
JNZ DK2A
CLR TR0
NOKEY2:
MOV P3,#0FFH CLR P3.6
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY3
LCALL DELY10MS MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY3
MOV A,P3
ANL A,#0FH
CJNE A,#0EH,NK9 MOV KEYBUF,#8 LJMP DK3
NK9: CJNE A,#0DH,NK10 MOV KEYBUF,#9 LJMP DK3
NK10: CJNE A,#0BH,NK11 MOV KEYBUF,#10 LJMP DK3
NK11: CJNE A,#07H,NK12 MOV KEYBUF,#11 LJMP DK3
NK12: NOP
DK3:
MOV A,KEYBUF 22
MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,A
MOV A,KEYBUF MOV B,#2
MUL AB
MOV TEMP,A
MOV DPTR,#TABLE1 MOVC A,@A+DPTR MOV STH0,A MOV TH0,A INC TEMP MOV A,TEMP
MOVC A,@A+DPTR MOV STL0,A MOV TL0,A SETB TR0
DK3A: MOV A,P3 ANL A,#0FH XRL A,#0FH JNZ DK3A CLR TR0
NOKEY3:
MOV P3,#0FFH CLR P3.7
MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY4
LCALL DELY10MS MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY4 MOV A,P3 ANL A,#0FH 23
CJNE A,#0EH,NK13 MOV KEYBUF,#12 LJMP DK4
NK13: CJNE A,#0DH,NK14 MOV KEYBUF,#13 LJMP DK4
NK14: CJNE A,#0BH,NK15 MOV KEYBUF,#14 LJMP DK4
NK15: CJNE A,#07H,NK16 MOV KEYBUF,#15 LJMP DK4
NK16: NOP
DK4:
MOV A,KEYBUF MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,A
MOV A,KEYBUF MOV B,#2
MUL AB
MOV TEMP,A
MOV DPTR,#TABLE1 MOVC A,@A+DPTR MOV STH0,A
MOV TH0,A
INC TEMP
MOV A,TEMP
MOVC A,@A+DPTR MOV STL0,A
MOV TL0,A
SETB TR0
DK4A: MOV A,P3 ANL A,#0FH
XRL A,#0FH
JNZ DK4A
24
CLR TR0
NOKEY4:
LJMP WAIT
DELY10MS:
MOV R6,#10
D1: MOV R7,#248
DJNZ R7,$
DJNZ R6,D1
RET
INT_T0:
MOV TH0,STH0
MOV TL0,STL0
CPL P1.0
RETI
TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H
TABLE1: DW 64021,64103,64260,64400
DW 64524,64580,64684,64777
DW 64820,64898,64968,65030
DW 65058,65110,65157,65178
END
25
课程设计评分表
指导教师签名:________________
日 期:________________
注:①表中标*号项目是硬件制作或软件编程类课题必填内容;
②此表装订在课程设计说明书的最后一页。课程设计说明书装订顺序:封面、任务书、目录、正文、评分表、附件(非16K大小的图纸及程序清单)。
26