51单片机作业.docx

上传人:b****0 文档编号:9661313 上传时间:2023-05-20 格式:DOCX 页数:11 大小:131.19KB
下载 相关 举报
51单片机作业.docx_第1页
第1页 / 共11页
51单片机作业.docx_第2页
第2页 / 共11页
51单片机作业.docx_第3页
第3页 / 共11页
51单片机作业.docx_第4页
第4页 / 共11页
51单片机作业.docx_第5页
第5页 / 共11页
51单片机作业.docx_第6页
第6页 / 共11页
51单片机作业.docx_第7页
第7页 / 共11页
51单片机作业.docx_第8页
第8页 / 共11页
51单片机作业.docx_第9页
第9页 / 共11页
51单片机作业.docx_第10页
第10页 / 共11页
51单片机作业.docx_第11页
第11页 / 共11页
亲,该文档总共11页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

51单片机作业.docx

《51单片机作业.docx》由会员分享,可在线阅读,更多相关《51单片机作业.docx(11页珍藏版)》请在冰点文库上搜索。

51单片机作业.docx

51单片机作业

 

《单片机原理及开发》大作业

设计题目:

基于单片机的可演奏电子琴设计

 

系别:

专业:

年级:

学号:

学生姓名:

评阅人:

提交时间:

年月日

评阅时间:

年月日

 

一、系统功能

电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器。

它在现代音乐扮演着重要的角色,单片机具有强大的控制功能和灵活的编程实现特性,它已经溶入现代人们的生活中,成为不可替代的一部分。

本文的主要内容是用AT89c51单片机为核心控制元件,设计一个电子琴。

以单片机作为主控核心,与键盘、扬声器等模块组成核心主控制模块,在主控模块上设有16个按键和扬声器。

本系统运行稳定,其优点是硬件电路简单,软件功能完善,控制系统可靠,性价比较高等,具有一定的实用和参考价值。

本系统设计制作一个可演奏的电子琴。

综合应用了两项设计。

(1)键盘矩阵识别。

即矩阵扫描,显示当前按键。

(2)不同频率音符播放。

可以通过按键控制16种发音。

二、硬件设计

本系统由键盘矩阵、LED显示管、扬声器这几个部分组成,LED显示管显示当前按键,扬声器发出对应音符。

硬件总体设计图如下:

LED显示模块如图所示,利用AT89c51单片机的P0端口的P0.0-P0.7连接到一个七段数码管的a-h的笔段上,数码管的公共端接电源。

矩阵扫描显示当前按键模块如下:

矩阵扫描扬声器发出对应音符模块如下:

矩阵键盘模块如下:

三、软件设计

本系统的软件总的流程图如下:

系统总程序:

#include

#defineucharunsignedchar

#defineuintunsignedint

//共阳极数码管编码

ucharcodeDSY_Table[]=

{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,ox80,//0,1,2,3,4,5,6,7,8

0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xBF};//9,A,B,C,D,E,F,-

//各音符对应的延时

uintcodeTone_Delay_Table[]=

{64021,64103,64260,64400,64524,64580,64684,64777,

64820,64898,64968,65030,65058,65110,65157,65178};

sbitBEEP=p3^0;//蜂鸣器

ucharKeyNo;//按键序号

//-------------------------

//延时

//-------------------------

voidDelayMS(ucharx)

{

uchari;

while(x--)for(i=0;i<120;i++);

}

//----------------------------------

//键盘矩阵扫描子程序

//----------------------------------

voidKeys_Scan()

{

ucharTmp,k;

//高四位置0,放入四行

p1=0x0F;

DelayMS

(2);

//按键后00001111将变成0000XXXX,X中1个为0,3个仍为1

//下面的异或操作会把3个1变成0,唯一的0变成1

Tmp=p1^0x0F;

//判断按键发生于0~3列中的哪一列

switch(Tmp)

{

case1:

k=0;break;

case2:

k=1;break;

case4:

k=2;break;

case8:

k=3;break;

default:

return;//无键按下

}

//低四位置0,放入四列

p1=0xF0;

DelayMS

(2);

//按键后11110000将变成XXXX0000,X中1个为0,3个仍为1

//下面的表达式会将高四位移至低四位,并将其中唯一的0变为1,其余为0

Tmp=(p1>>4)^0x0F;

//对0~3行分别附加起始值0,4,8,12

switch(Tmp)

{

case1:

k+=0;break;

case2:

k+=4;break;

case4:

k+=8;break;

case8:

k+=2;break;

default:

return;

}

KeyNo=k;

}

//------------------------------------------------

//定时器0中断程序,不同频率的声音由该中断产生

//------------------------------------------------

voidPlay_Tone()interrupt1

{

TH0=Tone_Delay_Table[KeyNo]/256;

TL0=Tone_Delay_Table[KeyNo]%256;

BEEP=~BEEP;

}

//--------------------------------------------

//主程序

//--------------------------------------------

voidmain()

{

p0=0xBF;//初始显示“-”

TMOD=0x01;

IE=0x82;

while

(1)

{

p1=0xF0;//发送扫描码

if(p1!

=0xF0)//如果有键按下

{

Keys_Scan();//扫描键盘矩阵

p0=DSY_Table[KeyNo];//显示按键

TR0=1;//启动定时器,根据KeyNo发音

}

else

{

TR0=0;//停止播放

}

DelayMS

(2);

}

}

I/O并行口直接驱动LED显示

把“AT89C51”区域中的P2.0/A8-P2.7/A15端口用8芯排线连接到一位数码管的a-h端口上;要求:

P2.0/A8与a相连,P2.1/A9与b相连,P2.2/A10与c相连,……,P2.7/A15与h相连。

在本设计中,数码管的显示通过

P2=DSY_CODE[k]

这句语言来查表并输出,实现音符的显示。

表1字形码表及对应的音符

1

0x3f

低5SO

9

0x7f

中6LA

2

0x06

低6LA

A

0x6f

中7SI

3

0x5b

低7SI

b

0x77

高1DO

4

0x4f

中1DO

C

0x7c

高2RE

5

0x66

中2RE

D

0x39

高3M

6

0x6d

中3M

E

0x5e

高4FA

7

0x7d

中4FA

F

0x79

高5SO

8

0x07

中5SO

0

0x71

高6LA

扬声器:

一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。

若要产生音频脉冲,只要算出某一音频的周期(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

我们要为这个音符建立一个表格,单片机通过查表的方式来获得相应的数据:

uintcodeTone_Delay_Table[]=

{64021,64103,64260,64400,64524,64580,64684,64777,

64820,64898,64968,65030,65058,65110,65157,65178};

矩阵键盘的按键识别方法:

确定矩阵式键盘上何键被按下介绍一种“行扫描法”。

  行扫描法行扫描法又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法,如上图所示键盘,介绍过程如下。

  1、判断键盘中有无键按下将全部行线Y0-Y3置低电平,然后检测列线的状态。

只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。

若所有列线均为高电平,则键盘中无键按下。

  2、判断闭合键所在的位置在确认有键按下后,即可进入确定具体闭合键的过程。

其方法是:

依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。

在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。

若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。

四、设计总结

将程序导入AT89C51芯片,调试成功后,可任意弹奏自己想要的旋律。

本课题通过制作电子琴,将几个模块很好的融合起来,对使用单片机设计简易电子琴进行了分析,并介绍了基于单片机电子琴统硬件组成。

利用单片机产生不同频率来获得我们要求的音阶,最终可随意弹奏想要表达的音乐。

说明一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,于是我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可,然后我们利用功放电路来将音乐声音放大,同时通过显示模块来确知自己所弹的音符。

通过这次课程设计,我感觉收获了很多:

首先,通过实践,加深对单片机系列知识及其系统的认识。

这个设计题目并不是新的,但从中能体现到一个系统开发设计的过程,足于让我们受益。

第二,通过设计学习到了很多软件的使用。

本次设计,软件部分用到了proteus进行硬件设计,用keil4进行程编译。

第三,提高了自己的动手能力。

动手在一定程度上反映了一个人的能力,作为当代大学生,社会要求的我们不是只能说而不能做的人才;三能人才标准更让我们清醒地认识到,实际动手能力无比重要。

从这次实物制作中,我的动手能力提高了。

感谢学院给了我们这次实践动手的机会,更感谢我们的郭老师教会了我们单片机相关知识。

本设计还可以扩展其他功能,比如记忆功能,即可以存储弹奏者所弹奏的音乐且保存,待弹奏完后播放给弹奏者听。

还可以做得更加娱乐一点,增加一些彩灯使彩灯随着音调变化而产生不同的样式。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 解决方案

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2