单片机实验报告(基于51单片机)

                  

        滨江学院

          

微机原理与接口技术综合实验报告

                 简易电子琴设计       

 

                              

           学 号

                                                                   

              学生姓名    王兴江                       

                              

              院    系   滨江学院                     

专    业                                           

 

指导教师    

二O一二     

【摘要】................................................... 2

一、引言................................................... 3

1.1 电子琴设计的背景..................................... 3

1.2 电子琴设计的意义..................................... 3

1.3 电子琴设计的目标..................................... 3

二.系统整体设计........................................... 3

1.设计任务............................................... 3

2.功能描述............................................... 4

3.软硬件描述............................................. 4

4.模块描述............................................... 4

三 . 硬件电路设计及描述.................................... 5

1. 4x4矩阵键盘控制模块.................................. 6

2. 发声模块.............................................. 8

3. 显示模块.............................................. 9

四. 软件设计思想及流程..................................... 13

五.硬件的调试过程及调试方法............................... 14

六.重要程序及源代码...................................... 15

七. 课程设计体会.......................................... 17

八.参考文献............................................... 18

                         【摘要】

由于音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用单片定时/计数器T产生不同的频率的组合,从而构成音乐。本次设计实现的大体功能:当系统扫描到键盘上有键子被按下,则快速检测出是那一个键子,然后单片机的定时就会发出相应的音调。定时器被启动,发出一定频率的脉冲,该频率的脉冲通过P3串口并驱动喇叭发音。同时键值显示在LED显示器上。

【关键词】   单片机  电子琴   AT89C51

一、引言

1.1 电子琴设计的背景

随着电子科技的飞速发展,电子技术正在逐渐改善着人们的学习、生活、工作,因此开发本系统希望能够给人们多带来一点生活上的乐趣。

基于当前市场上的玩具市场需求量大,其中电子琴就是一个很好的应用方面。单片机技术使我们可以利用软硬件实现电子琴的功能,从而实现电子琴的微型化,可以用作玩具琴、音乐转盘以及音乐童车等等。并且可以进行一定的功能扩展。鉴于传统电子琴可以用键盘上的“k0”到“k16”键演奏从低So到高DO等16个音,从而可以用来弹奏喜欢的乐曲。

1.2 电子琴设计的意义

该设计具有以下优点:

(1)可以随意弹奏想要表达的音乐;

(2)制作简单,成本低。

   (3)比传统电子琴功能更完善。

1.3 电子琴设计的目标

由于本设计主要用于人们娱乐方面,因此在设计上尽量使其安全以及简单易操作。其次,在这次设计可行性上进行分析如下:

1、经济可行性:

所谓经济可行性,即在这次设计上需要投入资金的多少,由于课程设计是提高我们的动手能力以及资金有限。因此在经济上必须能够承受,比较理想化的对于我们课程设计来说是不可行的。通过分析后,无论是在器件价格或是常见度上均是可行的。

2、技术可行性:

技术可行性主要是分析技术条件上是否能够顺利开展并完成课程设计的主要问题,硬件、软件能否满足设计者的需要等。通过分析各种软件环境,硬件仿真环境等均已经具备。

综上所述,本系统设计目标已经明确,在经济与技术上均可行,因此本系统的开发是完全可行的。

二.系统整体设计

1.设计任务

基于MCS系列单片机AT89C51。设计一个简易电子琴

2.功能描述

1)利用所给键盘的1,2,3,4,5,6,7,8八键,能够发出8个不同的音符。

2)并且要求按下按键发声,松开延时一段时间停止,中间再按别的键则发出另一音符的声音。

3)使用LED数码管显示8个不同的音调。

4)如果在一个按下的键发声的同时有另一键被按下,前面键的发音停止,转到后按的键的发音。

5)@增加变调钮“UP1”,“UP2”,“DN1”,“DN2”,在按下“0—8”音符时,变调键,产生相应的变调,使用LED数码管显示变调情况。

6)☆其它功能

3.软硬件描述

该课题主要由软件及其硬件两个基本部分共同完成。硬件主要部分:4x4矩阵式键盘(主要用于音符的输入以及变调的键值输入,其与单片机的P0口连接). MCS51-AT89单片机芯片.  两位LED数码管显示器.以及一些基本外围电路。软件主要部分:运用c语言进行相应的编程,其主要包括控制按键扫描程序,发声主程序,以及显示程序。

4.模块描述

总体方案:本系统采用单片机AT89C51为电子琴的控制核心,系统主要包括播放模块.按键控制模块以及显示模块。

电路设计总体框图

2步骤:

A. 根据设计题目的具体要求及题目的设计提示,

B. 利用Proteus软件来画原理图(硬件)。

C. 利用Keil软件进行程序的编写,执行,及仿真。从而生成HEX文件调

D. 将HEX文件导入原理图的AT89C51中进行仿真

E. 试并实现相应的功能

三 . 硬件电路设计及描述

总体原理图:

1. 4x4矩阵键盘控制模块

其与单片机的具体连接方式如下:

1)矩阵式键盘的结构与工作原理

在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式,如图所示。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口P1就可以构成4*4=16个按键。矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,上图中,列线通过电阻接正电源,并将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口则作为输入。这样,当按键没有按下时,所有的输入端都是高电平,代表无键按下。行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。具体的识别及编程方法如下所述。

(2)矩阵式键盘的按键识别方法

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

a.判断键盘中有无键按下 将全部行线置低电平,然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。若所有列线均为高电平,则键盘中无键按下。

b.判断闭合键所在的位置 在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。

程序扫描法就是调用键盘扫描程序,查询键盘并给予处理的方法。        1)查询是否有键盘按下

2)延时去除抖动

3)确定下来按键所在的行. 列位置

具体框图如下

2. 发声模块

扬声器与单片机的连接方式如图

扬声器连接在P3.0口,当有键盘按下时候,单片机会通过程序调用相应键值,由P3.0输出对应的频率信号,从而驱动扬声器发声。

具体框图如下:

3. 显示模块

2位LED数码管与单片机的连接图

图中:1、2是公共端,控制位码,控制那个数码管亮(左右),如果是共阴的则接低电平,若为供阳的则相反。,a-g、dp是控制断码,控制9个二极管的亮暗,可以直接接51的输出口(P0要加上拉电阻),如果是共阴的则接高电平来使数码管亮,若为供阳的则相反。用8位码控制,用16进制表示!二极管从最上面顺时针分别为a,b,c,d,e,f中间横线为g,点为dp。

4设计的核心部件及其外围基本电路

AT89C51简介

  AT89C51是一种带4K字节FLASH存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。AT89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。外形及引脚排列

  VCC:供电电压。

  GND:接地。

  P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P0口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。

  P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。

  P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。

  P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。

P3口也可作为AT89C51的一些特殊功能口,口管脚 备选功能

  P3.0 RXD(串行输入口)

  P3.1 TXD(串行输出口)

  P3.2 /INT0(外部中断0)

  P3.3 /INT1(外部中断1)

  P3.4 T0(记时器0外部输入)

  P3.5 T1(记时器1外部输入)

  P3.6 /WR(外部数据存储器写选通)

  P3.7 /RD(外部数据存储器读选通)

  P3口同时为闪烁编程和编程校验接收一些控制信号。

  RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。

  ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。

  /PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。

  /EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。

  XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。

XTAL2:来自反向振荡器的输出。

四. 软件设计思想及流程

在程序中根据相应的音符只做一个频率表,当单片机检测到键值的时候,主程序将自动调用表格中的程序,发出相应的信号驱动扬声器发声,同时LED数码管显示其键值(音调)。本设计的题目包括,按键程序,主程序等几个部分组成。具体流程图如下:

 


五.硬件的调试过程及调试方法

1)由于本次设计并没有进行实际硬件的实做,所以我们本次对硬件的调试过程仅仅局限于电路图的修改调试。一开始仿照题目进行画图仿真,我们并没得到相应的结果。

2)对于软件我们便是不断检查并修改C程序,从而形成合格的HEX文件。驱动单

片机实现相应的功能。

六.重要程序及源代码

/*************************************************************

程序功能 : 对4×4矩阵键盘进行扫描,显示键值和输出声音

**************************************************************/

#include <reg51.h>

#include <intrins.h>

#define uint unsigned int

#define uchar unsigned char

sbit SPK = P3^0;                 //P3.0外接扬声器

uint FreqTemp;

unsigned int code Key[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

unsigned int code Freqtab[] = { //定时半周期的初始值

    64021,64103,64260,64400,     //低音3 4 5 6

    64524,64580,64684,64777,     //低音7,中音1 2 3

    64820,64898,64968,65030,     //中音4 5 6 7

    65058,65110,65157,65178};    //高音1 2 3 4

/*************************************************************

* 函数功能 : 用扫描法读 P1 外接 4×4 键盘

* 函数返回 : 按下键:返回0~15、如无键按下:返回0

**************************************************************/

uchar Keyscan(void)

{

    uchar i, j, temp, Buffer[4] = {0xfe, 0xfd, 0xfb, 0xf7};

    for(j = 0; j <4 ; j++) {   //循环四次,扫描四行

      P1 = Buffer[j];          //在低四位分别输出一个低电平

     temp = 0x80;             //计划先读出P1.7位

      for(i = 0; i < 4; i++) { //循环四次,检查四列

        if(!(P1 & temp)) {     //从高四位,截取1位

          return (i + j *4     ); //返回取得的按键值

        }

        temp >>= 1;            //换右边一位

    } }

    return 16;                 //没有键按下就返回16   作为误判动作

/**************************************************************

* 名称: Display(uchar k)

* 功能:显示键值(音调或者音符)

* 输入: k (键盘数值)

* 输出: P0口输出七段码,P2口输出位选码(根据要求这里只输出一位)

***************************************************************/

void Display(uchar k)

{

    P0 = Key[k];

}

/**************************************************************

* 主函数

***************************************************************/

void Main(void)

{

    uchar Key_Value = 16, Key_Temp1, Key_Temp2;//读出的键值

    TMOD = 0x01;                  //T0定时方式1

    ET0 = 1;                      //允许T0中断

    EX0 = 1;                      //允许X0中断

    EA = 1;

    while(1) {

      TR0 = 0;                    //暂不发音

      Key_Temp1 = Keyscan();      //读入按键

      if(Key_Temp1 != 16) {       //有键按下

        Display(Key_Value);       //显示键值、延时消抖

        Key_Temp2 = Keyscan();    //再读一次

        if (Key_Temp1 == Key_Temp2) {//两次相等

          Key_Value = Key_Temp1;    //就确认下来

       FreqTemp = Freqtab[Key_Value]; //根据键值,取出定时半周期的初始值

          Display(Key_Value);     //显示

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

          while (Keyscan() < 16); //等待释放

          SPK = 1;                //停止发音

  } } } }

//==============================================================

void T0_INT(void) interrupt 1

{

    TL0 = FreqTemp;               //载入定时半周期的初始值

    TH0 = FreqTemp >> 8;

    SPK = ~SPK;                   //发音

}

七. 课程设计体会

两个周的实训时间很快就结束了,比起一个学期的单片机学习。真的很短很短!但这期间的学习及其收获却很多很多。说句实话,我们这组的两个成员单片机基础只是不是很好。因此选题时都不敢选太难的,但是通过这几天的不断学习不断探索。虽然最后的结果部是太令我们满意,但是我们通过这次单片机课程设计,加深了对单片机理论的理解,将理论很好地应用到实际当中去,而且我还学会了如何去查阅所需的资料。这个过程中,我们花费了大量的时间和精力,更重要的是,我们在学会创新的基础上,同时还懂得合作精神的重要性,学会了与他人合作。

另外很感谢学校和老师给我们安排了这次课程设计,通过这次实训我们发现现在书本上的知识与实际的应用存在着不小的差距,书本上的知识很多都是理想化后的结论,忽略了很多实际的因素,或者涉及的不全面,可在实际的应用时这些是不能被忽略的,我们不得不考虑这方的问题,这让我们无法根据书上的理论就轻易得到预想中的结果,有时结果甚至很差别很大。通过这次实践使我更深刻的体会到了理论联系实际的重要性,我们在今后的学习工作中会更加的注重实际,努力提高自己的动手能力。

八.参考文献

1.周向红.  51单片机课程设计。武汉:华中科技大学出版社,2011.

2.吴亦锋.  单片机原理与接口技术。北京:电子工业出版社,2010.

3.杜洋.  爱上单片机。北京:人民邮电出版社,2010.

4.王守中.  51单片机开发入门与典型实例。北京:人民邮电出版社.

5.唐浩强.  C程序设计。 北京:清华大学出版社,2005.

相关推荐