C52单片机实现简易电子琴(文末附代码)

实现效果

【基于AT89C52的简易电子琴设计】实现效果icon-default.png?t=N7T8http:// https://www.bilibili.com/video/BV1JM411Z7ZY/?share_source=copy_web&vd_source=26a77bd024a4670f0f4f7b12ca0b25cf
 

简易电子琴设计报告

1.设计目的、作用

1、掌握52单片机最小系统的设计;

2、掌握按键电路设计;

3、掌握C52的编程方式

2.设计要求

1. 通过单片机编程控制,对按下的按键进行识别,然后控制喇叭发声。电子琴模式下1-7七个按键可弹出“哆、来、咪、发、梭、拉、西”。

2. 当喇叭发声时,用一个数码管反应音符。

附加要求如下:

1. 当音乐切换按键时,可切换播放某首曲子。

3.设计的具体实现

3.1设计原理

本次设计提出了用AT89C52单片机为核心控制元件,设计一个简易的电子琴. 本方案以AT89C52单片机作为主控核心,与键盘、扬声器等模块组成核心主控制模块在主控模块上设有8个按键和1个扬声器.根据使用者的操作随意弹奏想要表达的音乐。一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号。

3.2系统设计

播放模块是喇叭构成。它几乎不存在噪声,音响效果较好。而且由于所需驱动功率较小,且价格低廉,所以,被广泛应用。

电子琴设有8个按键,其中7个作为音符输入,另外1个作为歌曲按键,实现用户播放歌曲。7个按键分别代表7个音符,包括中音段的全部音符。用户可通过7个按键实现自己弹奏音乐,并通过song按键播放预设歌曲。

3.3系统实现

为使该模块化电子琴控制系统具有更加方便和灵活性,我们对系统的硬件做了精心设计。硬件电路包括中心控制模块、播放模块、按键控制模块三大模块。

3.3.1 中心控制模块的硬件设计

本次设计中中心控制模块是采用AT89C52单片机来控制整个系统。其中P3.7口作为输出口,连接蜂鸣器驱动电路,而P1口连接按键控制电路, 从而实现播放音乐的功能,P0口显示按下的音阶。

3.3.2 播放模块的硬件设计

如下图3-2所示,播放模块其实就是喇叭,它接到P3.7口上当有按键按下时,它就会发出声音…

图示, 示意图  描述已自动生成

图 3-2 播放模块硬件连接图

3.3.3 按键控制模块的硬件设计

在P1口连有8个按键一端接地.在仿真时,只要有一个键被按下,并被单片机扫描到,则会使播放器发出声音.

图3-3 按键模块硬件连接图

3.3.4 数码管显示模块的硬件设计

图表  描述已自动生成

在P0口连接数码管,数码管接电源,检测单片机P1处按键按下,显示按下的键值。如图3-4

图 3-4 数码管连接

3.4软件设计

软件是该电子琴控制系统的重要组成部分,在系统的软件设计中我们也才用了模块化设计,将系统的各部分功能编写成子模块的形式,这样增强了系统软件的可读性和可移植性。

3.4.1 下位机软件流程

本系统中下位机(单片机AT89C52)的主要功能就是实现音乐播放功能。其主程序流程如图4-1所示。

 

图4-1 软件程序流程图

3.4.2上位机软件

本系统的上位机软件主要是编辑电子琴播放状态的内容,在设计中采用c语言编写了电子琴控制系统控制和播放内容的程序。

4.总结

经过两周的忙碌,我的电子琴终于仿真成功.虽然失败了几次,但经过老师对硬件连接图的纠正,自己又调整.了程序最后终于方仿真成功.心情很激动,一方面:觉得很有成就感;另一方面:收获很大,:不但锻炼了编程的能力,而且通过编程对硬件的整个流程了解了。在仿真过程中,我犯了两个低级错误:一个是用了没有模型的元件,另一个是喇叭可以不用驱动就能发出声音。经老师提醒,我改正了连接图。结果成功了。用单片机控制播放模块和按键控制模块制作出的电子琴,结构简单,可靠性高,并且价格低廉,具有实用的价值。

参考文献

附录

附录1

元器件明细表

名称

规格

数量

名称

规格

数量

名称

数量

电阻

82Ω

1

电容

30p

2

9014

1

电阻

1k

2

电容

10uf

3

4p排针

1

电阻

100k

1

LED

1

自锁开关

1

电源头

1

按键

8

STC89C52

1

电源线

1

喇叭

1

芯片座

1

PCB

1

线

2p

1

12MHz晶振

1

程序清单

#include <reg52.h>

#define uchar unsigned char

#define uint unsigned int

    

sbit speaker=P3^7;

void delayms(uchar t);//声明延时函数

//输入基础音符

uint mu[]={65058,65110,65157,65178,65217,65252,65283



};//64580,64684,64777,64820,64898,64968,65030//中音

//数码管

uchar num[]={

0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x90

};

uint n,m,o;

//

uchar p[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,

0x7f};

//输入歌曲

code uint s[33]={64580,64684,64777,64580,

                                 64580,64684,64777,64580,

                                 64777,64820,64898,

                                 64777,64820,64898,

                                 64898,64968,64968,64820,64777,64580,

                                 64898,64968,64968,64820,64777,64580,

                                 64580,64898,64580,

                                 64580,64898,64580

};

//输入节拍

code uchar q[]={

            4,4,4,4, 4,4,4,4, 4,4,8, 4,4,8, 2,1,2,1,4,4, 2,1,2,1,4,4 ,4,4,8, 4,4,8

};

void main(){

    

     TMOD |=0x01;//计时器1

     IE=0x82;

     TR0=0;

    

     while(1){

            for(n=0;n<9;n++){

                   if (P1==p[n]){

                          switch(n+1){

                                 case 1:TR0=1;m=0;P0=num[0];break;

                                 case 2:TR0=1;m=1;P0=num[1];break;

                                 case 3:TR0=1;m=2;P0=num[2];break;

                                 case 4:TR0=1;m=3;P0=num[3];break;

                                 case 5:TR0=1;m=4;P0=num[4];break;

                                 case 6:TR0=1;m=5;P0=num[5];break;

                                 case 7:TR0=1;m=6;P0=num[6];break;

                                 case 8:TR0=1;m=7;P0=num[7];for(o=0;o<50;o++){

                                                             delayms(q[o]);};TR0=0;break;

                                 default:TR0=0;break;

                          }

                   }

                   else TR0=0;

            }

     }

}

void T0Sev(void) interrupt 1{

     if(m<7){

     TH0=mu[m]/256;

     TL0=mu[m]%256;//处理频率

     speaker=~speaker;//扬声器接反

     }

     else{



            TH0=s[o]/256;

            TL0=s[o]%256;

            speaker=~speaker;//扬声器接反

           

     }

}

//定义延时函数

void delayms(uchar t){

     uint i,k;

     for(k=0;k<t;k++){

            for(i=0;i<20000;i++){;}

     }

}

  • 21
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值