基于AT89C52电子琴的设计(含文档、源码与proteus仿真,以及系统详细介绍)

本篇文章论述的是基于AT89C52电子琴的设计的详情介绍,如果对您有帮助的话,还请点赞、收藏、转发,关注一下哦,如果有资源方面的需要可以联系我。

目录

中文摘要

硬件总体设计图

仿真图

代码

系统论文

资源下载


中文摘要

微型计算机是大规模集成电路技术发展的产物,属第四代电子计算机,它具有高性能、高速度、体积小、价格低廉、稳定可靠、应用广泛的特点。就因为它的应用非常广泛,因此,单片机的开发应用已成为高科技和工程领域的一项重大课题。而音乐现在也成了人们生活的一部分,生活的压力,学习的压力,工作的压力,一切的不顺利可以在音乐声中放松下来,让人们心情舒畅,听着音乐放松心情,让我们提高生活质量。本论文设计一个基于单片机的简易电子琴。电子琴是现代电子科技与音乐结合的产物,是一种键盘乐器。本系统是以51系列单片机AT89S52为主芯片,附有矩阵键盘、LED显示管、扬声器组成。系统完成显示输入信息、播放相应音符等基本功能。本系统运行稳定,其优点是硬件电路简单,软件功能完善,控制系统可靠,性价比较高等,具有一定的实用和参考价值。

关键词:AT89S52,矩阵键盘,LED显示管,扬声器。


硬件总体设计图


仿真图


代码(部分)


#include <reg51.h>
#include <absacc.h> 
#include <stdio.h> 
#include <math.h> 
#define uchar unsigned char         //宏定义
#define uint unsigned int           //宏定义
uchar STH0;         //定时器计数初值
uchar STL0; 
bit FY=0;           //放乐曲时FY=1,电子琴弹奏时FY=0
uchar Song_Index=0,Tone_Index=0;     //放音乐的参数
uchar k, key; 
sbit SPK=P3^7 ;            //定义蜂鸣器端口
sbit LED1=P1^0 ;          //LED1端口定义  
sbit LED2=P1^1 ;           //led2端口定义
uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71};
uchar code Song[][50]=      //歌曲的旋律
{ {1,2,3,1,1,2,3,1,3,4,5,3,4,5,5,6,5,3,5,6,5,3,5,3,2,1,2,1,-1},
{3,3,4,5,5,5,5,6,5,3,5,3,2,1,5,6,5,3,3,2,1,1,-1}, 
{3,2,1,3,2,1,1,2,3,2,1,2,3,1,3,4,5,3,4,5,5,6,5,3,5,3,2,1,3,2,1,1,-1},
{10,10,10,9,10,9,10,9,9,6,6,7,8,9,8,7,6,5,6,-1}, 
{10,10,10,9,10,13,12,13,12,12,9,9,10,11,12,11,10,9,8,10,10,-1},
{13,14,13,12,12,10,12,10,12,9,13,12,10,9,10,10.-1}, 
{9,13,13,13,8,13,13,13,13,14,15,14,13,14,13,14,10,10,-1}, 
{13,14,13,12,12,10,12,10,12,13,14,13,14,13,14,10,-1}, 
{9,13,13,13,8,13,13,13,13,14,15,14,13,13,14,12,13,-1}, 
{5,5,10,9,8,5,5,5,5,10,9,8,6,6,6,11,10,9,6,-1}, 
{6,12,12,11,9,10,8,5,5,10,9,8,5,5,5,10,9,8,6,-1}, 
{6,6,11,10,9,12,12,12,12,13,12,11,9,8,10,10,10,-1}, 
{10,10,10,10,12,8,9,10,11,1,11,11,11,10,10,10,10,10,9,9,8,9,12,12,12,11, 9,8,-1}, 
{13,13,8,13,13,13,13,14,15,14,13,14,13,14,10,10,13,14,13,12,12,10,12,10, 12,13,14,13,14,13,14,10,9,13,13,13,8,13,13,13,13,14,15,14,13,13,14,12,13,-1}, 
{6,6,11,10,9,12,12,12,12,13,12,11,9,8,10,10,10,10,10,10,10,12,8,9,10,11,11,11,11,11,10,10,10,10,10,9,9,8,9,12,12,12,11,9,8,-1},
{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,-1}
};
uchar code Len[][50]=              //上面对应的节拍,间隔时间
{{1,1,1,1,1,1,1,1,1,1,2,1,1,2,1,1,1,1,1,1,1,1,1,1,1,2,2,2,-1},
{1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,2,2,-1}, 
{1,1,2,1,1,2,1,1,1,1,1,1,1,1,1,1,2,1,1,2,1,1,1,1,1,1,1,2,1,1,2,2,-1},
{1,1,1,1,2,1,1,1,1,0,1,1,0,1,1,0,1,1,2,1}, 
{1,1,1,1,0,1,1,1,1,1,0,1,1,0,1,1,0,1,1,3,1,-1}, 
{0,1,1,0,1,1,2,1,1,0,1,1,0,1,1,2,-1}, 
{0,1,1,2,0,1,1,0,1,1,0,1,1,0,1,1,2,1,-1}, 
{0,1,1,0,1,1,2,1,1,0,1,1,0,1,1,4,-1}, 
{0,1,1,2,0,1,1,0,1,1,0,1,1,0,1,4,-1}, 
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1}, 
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1}, 
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1}, 
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1},
{1,1,2,0,1,1,0,1,1,0,1,1,0,1,1,2,1,0,1,1,0,1,1,2,1,1,0,1,1,0,1,1,4,0,1,1,2,0,1,1,0,1,1,0,1,1,0,1,4,-1}, 
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1}, 
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1} 
};
/*音符与计数值班对应表*/
uint code tab[]=
{0,63628,63835,64021,64103,64260,64400,64524, 
 64580,64684,64777,64820,64898,64968,65030, 
 65058,65110,65157,65178,65217,65252,65283 
};
void delay1 (uint ms)          //播放歌曲时实现节拍的延时函数
{
 uchar t;
 while (ms--) for (t=0;t<120;t++);
} 
/*键消抖延时函数*/

/*外部中断0,这里是弹唱按键*/
void EXO_IXT() interrupt 0
{ 
  FY=0;LED1=1;LED2=0;
} 
/*外部中断线,这里是播放按键*/
void EX1_INT() interrupt 2
{ 
   FY=1;LED1=0;LED2=1;
}
/*定时器0中断服务子程序*/
void time0_int(void) interrupt 1 using 0
{     
   /*设置计数初值*/ 
   TH0 = STH0; 
   TL0 = STL0; 
    SPK=!SPK;         //反相,产生输出脉冲*/  
   P2=DSY_CODE[k];
} 
void main(void)
{ LED1=1;
  LED2=0; 
  P2=0x3f;
  IE=0x87;
  TMOD=0x01;
  IT0=1;
  IT1=1;
  while(1)
   {
      P0=0xf0;                                      //发全0列扫描码
      if((P0&0xf0)!=0xf0)                             //若有键按下
        { 
         delay();                                    //延时去抖动 
         if((P0&0xf0)!=0xf0)                   //延时后再判断一次,去除抖动影响
          {
            key=getkey();                       //调用键盘扫描函数
            switch(key)                         //根据获取的按键位置得到K值
              {
              case 0x88:
	          k = 0;
                  break; 
              case 0x48:    
                  k = 1; 
                  break;                
               case 0x28:   
                  k = 2 ; 
                  break;  
              case 0x18:   
                  k = 3 ; 
                  break;  
              case 0x84:    
                  k = 4 ; 
                  break; 
              case 0x44:    
                  k = 5 ; 
                  break; 
              case 0x24:    
                  k = 6 ; 
                  break; 
              case 0x14:   
                  k = 7 ; 
                  break; 
              case 0x82:    
                  k = 8 ; 
                  break; 
              case 0x42:    
                  k = 9 ; 
                  break; 
              case 0x22:    
                  k = 10 ; 
                  break; 
              case 0x12:    
                  k = 11 ; 
                  break;
              case 0x81:    
                  k = 12 ; 
                  break; 
              case 0x41:    
                  k = 13 ; 
                  break; 
              case 0x21:    
                  k = 14 ; 
                  break; 
              case 0x11:    
                  k = 15 ; 
                  break; 
              default :
                  break; 
                       }
 if(FY==0)
{
           /*根据所得的K值设定计数器1的计数初值*/
            STH0 = tab[k]/256;
            STL0 = tab[k]%256;
            TR0 = 1;                     //开始计数
            while ((P0&0xf0)!=0xf0);       //若没有松开按键,则等待,等待期间弹奏该音符
            TR0=0;                //若按键松开,则停止计数,不产生脉冲输出  
            } 
              else 
               { 
                 while (FY==1) 
                  { 
                   if(Song[k][Tone_Index]==-1) 
                 Tone_Index=0;
                   STH0=(tab[Song[k][Tone_Index]])/256;
                   STL0=(tab[Song[k][Tone_Index]])%256;
                   P2=DSY_CODE[Song[k][Tone_Index]]; 
                   TR0 = 1; 
                   delay1(300*Len[k][Tone_Index]); 
                   Tone_Index++; 
                  TR0=0; 
            }

          }
       }
     }
   }
}

系统论文(部分)


ABSTRACT

Microcomputers are large scale integrated circuit technology development of the fourth generation of the product, electronic computers, it has high performance, high speed, small volume, low prices, stable and reliable, widely characteristics. Just because it's very extensive, therefore, SCM for the development and application of high-tech and engineering field has become a major issue. But music now also become a part of life, life pressure, the pressure of learning, working pressure, all is not well in music can relax and let people in a relaxed mood, listen to music to relax, let us improve the quality of life. This paper is based on single chip design a simple keyboard. Modern electronic technology and keyboard is the combination of music, is a kind of keyboard instrument. SCM has strong control function and flexible programmable achieve properties, it has into modern people's life, become part of the entertainment and leisure. This system is mainly 51 series microcontroller AT89S52, accompanied by matrix keyboard, chip, speaker ,LED. System completes display input information, the basic function such as broadcast corresponding notes. This system stable operation, its advantage is hardware circuit is simple, software function consummation, the control system is reliable, cost-effective higher, has certain practical and reference value.

Keywords: AT89S52, matrix, LED, speaker

第一章 引言

 1.1课题设计的背景和意义

随着生活水平的提高,人们的需求不再仅仅是物质上的满足,更多的是要求精神上的放松。在放松自己的同时又能提高各个方面的能力。学习和欣赏音乐可以在人们疲劳的时候得到放松,同时提高人们的精神品质和素养。如今爱好音乐的人越来越多,有不少人自己练习乐器作为业余爱好来陶冶情操,可鉴于一些乐器学习难度大,需要太多的时间,并且价格又太过于高昂,使得一部分有这种想法的人不得不放弃。而一些简易的电子乐器价格相对便宜,学习简单,价格相对便宜,能够了满足一般爱好者的需求。因此简易电子乐器的研制具有一定的社会意义。

单片机是在一块芯片内集成了计算机的各个功能部件,构成一种单片式的微型计算机。单片机的发展迅速,应用不断深入,新技术层出不穷。并已广泛应用到人类生活的各个领域,如家电、通讯设备、玩具、智能卡、汽车及防盗、医用保健、仪表、工业过程控制等,成为当今科学技术现代化不可缺的重要工具。

之所以以单片机电子琴选题,目的在于从日常生活能接触到的细微处着手,通过理论与实践的结合,更明确自己的所学所用,也在实践中发现理论上的不足,对目前日益广泛应用的单片机有了更加理性化和感性化的认识,使理论和实践相得益彰。当前市场上的玩具市场需求量大,其中电子产品占有重要的位置,然而电子琴也是一个很好的应用方面。单片机技术使我们可以利用软硬件实现电子琴的功能,从而实现电子琴的微型化,可以用于玩具琴、音乐盒中、儿童车里等等。

设计主要对使用单片机设计简易电子琴进行了分析,并介绍了基于单片机电子琴统硬件组成。利用单片机产生不同频率来获得我们要求的音阶。并且分别从原理图,主要芯片,各模块原理及各模块的程序的调试来详细阐述。系统是简易电子琴的设计,按下键盘矩阵中的按键会使数码管显示当前按键,扬声器播放器对应的音符。通过设计本系统可了解单片机的基本功能。对单片机的了解有一个小的飞跃

1.2课题主要研究的内容

本课题主要研究基于单片机的电子琴设计,以AT89S52芯片作为主要核心部件,4*4的矩阵键盘作为输入部分,数码管显示字符,扬声器作为主要输出设备,结合KEIL和PROTUES等软件的功能,通过编译程序结合仿真,实现电子琴内置音乐的播放和弹奏音乐的功能,同时通过两个LED灯的亮灭表示当时弹奏或播放的状态,数码管显示按键的16个字符“0—9,A—F”来表示当前所按下的键。

第二章 系统设计

  2.1系统设计要求

本系统分为两个部分,音乐播放和音乐的弹奏。

  1. 要求达到电子琴的基本功能,可以用弹奏出简单的乐曲。
  2. 用键盘作出电子琴的按键,每个键代表一个音符。
  3. 各音符按一定的顺序排列,必须符合电子琴的按键排列顺序。
  4. 固定音乐播放有按键控制:“播放”、“弹奏/停止”。
  5. 弹奏电子琴时能播放出准确的声音,不弹奏时可以播放内置音乐。

2.2系统框图

单片机因体积小、功能强、价格低而得到诪泛应用。本系统只要以51单片机为主控核心,扩展一组矩阵键盘、扬声器、LED显示管模块和一组发光二极管来指示电子琴的工作状态一起组合而成。

具体如下图2-1: 

             图2-1 电子琴的框图

用P0口的高四位和P0口的低四位作4*4矩阵式按键的接口,用P2口作数码管的接口,用P3.7作信号输出口。

参考文献

[1] 张齐,朱宁西.单片机系统设计与开发[M].广州:华南理工大学出版社.2008:16-41,199-202.

[2] 谭浩强. C语言程序设计[M]. 北京:清华大学出版社.2000:14-21,87-91.

[3] 宋杰 ,汪志宏, 江敏.微机原理及接口技术设计[M].机械工业出版社.2005-4.

[4] 孙涵芳.MCS-51系列单片机原理及应用.北京:北京航空航天大学出版社.1996:184-190.


资源下载


如果有需要这个系统的源码、仿真、论文等资源的可以私信我。感谢你的阅读~

  • 29
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱喝奶茶的喵喵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值