基于单片机的电子琴
基于单片机的微型电子琴建模

基于单片机的微型电子琴建模随着科技的不断发展,单片机技术在各个领域得到了广泛的应用。
基于单片机的微型电子琴便是其中之一。
微型电子琴不仅可以模拟各种乐器的声音,还可以通过按键演奏出音乐。
本文将介绍基于单片机的微型电子琴的建模过程,并探讨其实现原理和工作原理。
一、微型电子琴的整体建模思路1.1 硬件架构设计微型电子琴的硬件架构主要包括按键模块、音频输出模块、单片机模块和电源模块。
按键模块用于模拟琴键,音频输出模块用于输出声音,单片机模块用于集成控制和信号处理,电源模块用于为整个系统提供电源。
这些模块共同组成了微型电子琴的硬件架构。
1.2 软件算法设计微型电子琴的软件算法设计是基于单片机的程序设计。
主要包括按键扫描算法、声音合成算法和音频输出算法。
按键扫描算法用于检测按键输入,声音合成算法用于合成不同乐器的声音,音频输出算法用于将合成的声音输出到音频设备上。
1.3 系统集成与调试在硬件架构和软件算法设计完成后,需要进行系统集成与调试。
即将硬件模块和软件程序集成到一起,并通过调试测试确保系统的正常运行和稳定性。
二、微型电子琴的实现原理2.1 按键扫描原理按键扫描原理是微型电子琴能够检测到按键输入的基础。
在单片机中设置一个定时器,在定时器中断时扫描按键的状态。
当有按键按下时,单片机会接收到对应的按键信号,并触发相应的处理程序。
2.2 声音合成原理声音合成原理是微型电子琴能够合成不同乐器的声音。
声音合成基于数字信号处理技术,通过对不同乐器的声音波形进行采样和分析,再通过数学模型生成对应的声音信号。
2.3 音频输出原理音频输出原理是微型电子琴最终能够将合成的声音输出到音频设备上。
通过单片机控制音频输出模块,将合成的声音转换为模拟信号并输出到音频设备上,实现音乐的播放。
3.1 按键输入处理当按键按下时,按键模块会发送对应的按键信号给单片机。
单片机接收到信号后,会触发对应的处理程序,如播放对应的音符、改变乐器的声音等。
基于51单片机bluesky开发板的电子琴程序

#include<STC12C5A60S2.h>#include<LCD1602.h> //包含LCD1602的显示函数等#include<KEY_SCAN.h> //包含键值扫描函数,输出key_num#define FSCLK 11059200 //晶振频率sbit BEEP=P1^4; //蜂鸣器输出脚unsigned int fre[16]={100,200,300,400,500,600,700,800,900,1000,1100,1200,1300,1 400,1500,1600};//存好预定的频率值,可以设定任意想要的频率/********************************************************** ********************** 函数功能:延时函数,函数名Delay_ms() ** 函数说明:利用软件延时,占用CPU,经调试最小单位大约为1ms ** 入口参数:time:需要延时的时间,单位ms** 出口参数:无void Delay_ms(unsigned int time)unsigned int i,j;for(i = 0;i < time;i ++)for(j = 0;j < 930;j ++);** 函数功能:定时翻转跟蜂鸣器相连的引脚的电平,输出一定频率的脉冲信号** 函数说明:定时器0中断服务函数** 入口参数:无** 出口参数:无void time0() interrupt 1 //使用定时器0的工作方式2,定时器中断服务程序TH0 = (65536-FSCLK/(12*fre[piano]))/256; //每次中断,重新配置定时器的高8位TL0 = (65536-FSCLK/(12*fre[piano]))%256; //每次中断,程序配置定时器的低8位BEEP=!BEEP; //然后取反音乐输出,输出一个反电平} //短时间内多次取反则输出一定频率的脉冲/********************************************************** ********************** 函数功能:主函数** 入口参数:无** 出口参数:无void main()unsigned char piano=0,key=0; //初始值LCD_1602_Init(); //液晶显示前进行初始化TMOD = 0X01; //定时器使能TH0 = (65536-FSCLK/(12*fre[0]))/256; //配置定时器的高8位TL0 = (65536-FSCLK/(12*fre[0]))%256; //配置定时器的低8位ET0 = 1; //允许定时器0中断EA = 1; //打开总中断Write_1602_String("Welcome",0X80); //开机显示欢迎语:WelcomeWrite_1602_String("By 20192305007",0X80+0x40); //显示作者:20192305007Delay_ms(5000); //延时5s后开始进入正式程序LCD_1602_Init(); //液晶屏初始化Write_1602_String("Happy Play",0X80); //显示开始使用:Happy Playwhile(1){ //在这段函数中,不断扫描键值,每当键值不等于0时,说明有键被按下,//此时开始播放对应的音阶。
基于51单片机的简易电子琴设计

基于51单⽚机的简易电⼦琴设计基于51单⽚机的简易电⼦琴设计⼀、设计任务及要求1、在该简易电⼦琴设计中,设置8个按键,8个按键可以发出do、re、mi、fa、sol、la、si、Do 8个⾳阶。
2、设计三个拨码开关,三个拨码开关可以调节⾼⾳、中⾳、低⾳三个⾳调。
3、画出电路的总体⽅框图和电路原理图。
⼆、设计原理⾳乐由许多不同的⾳阶组成的,⽽每个⾳阶对应着不同的频率,这样,我们就可以利⽤不同的频率组合,构成我们想要的⾳乐。
简易电⼦琴是摁下拨码开关时,单⽚机AT89C51会发出声⾳,声⾳从P1.0端⼝经过LM386,经过放⼤以后传⼊喇叭。
声⾳主要是经过单⽚机4×4矩阵键盘的按键产⽣,这⾥只⽤到8个按键来产⽣⾼中低的8个⾳阶,来产⽣do re mi fa sol la si Do。
下⾯是计数初值:三、设计⽅案本次设计的电⼦琴主要是利⽤AT89C51单⽚机为核⼼控制元件,同时还包括键盘、拨码开关和扬声器等控制模块,由键盘选择⼋个⾳阶。
1、电路原理图的总体设计总体电路需要c51单⽚机⼀⽚,⾳乐按键及喇叭等外围电路,要进⾏⾳调控制和⾳频放⼤,设计好的电路图如下图所⽰:2、键盘控制模块的设计矩阵按键部分由8个轻触按键按照2⾏4列排列,连接到P3端⼝。
将⾏线所接的单⽚机的I/O⼝作为输出端,⽽列线所接的I/O,则作为输⼊。
⾏线输出是低电平,有健按下,则输⼊线就会被拉低,这样,通过读输⼊线的状态就可得知是否有键按下。
3、键盘消抖当⽤⼿按下⼀个键时,如图所⽰,往往按键在闭合位置和断开位置之间跳⼏下才稳定到闭合状态的情况;在释放⼀个键时,也回会出现类似的情况。
这就是抖动。
抖动的持续时间随键盘材料和操作员⽽异,不过通常总是不⼤于10ms。
⽤软件⽅法可以很容易地解决抖动问题,这就是通过延迟10ms来等待抖动消失,此后再读⼊键盘码。
⼀个单⽚机⼯作于12M晶振,它的时钟周期是1/12(微秒)。
它的⼀个机器周期是12*(1/12)也就是1微秒。
基于单片机的电子琴设计

摘要电子琴又名键盘乐器,是现代电子科技与音乐结合的产物。
基于单片机技术的电子琴由微处理器基本应用单元、键盘、音阶指示、音频放大、工作电源等五部分构成。
AT89C51单片机形成所期望的音阶频率信号;4×4矩阵式键盘产生音阶控制信号;八个发光二极管来以实时显示不同频率的音阶变化;LM386音频放大器以驱动扬声器发声。
采用软件Protel 进行原理图设计,并用软件Keil编写装置程序源代码,利用Proteus软件进行功能仿真,即每按一个按键,产生对应的音阶以及相对应的二极管亮。
通过仿真分析,验证了设计的可行性,达到了课题设计要求。
系统硬件电路简单,运行稳定,具有一定的实用和参考价值。
关键词电子琴;单片机;音阶指示;扬声器ABSTRACTElectronic organ is a modern electronic music technology and the product is a new type of keyboard instruments ,the main content is AT89C51 control of the core components design of a electronic organ. The main content is AT89C51 control of the core components, design of a electronic organ. SCM as a host to the core, with the keyboard, speaker and other core modules. In the main control module has 16 keys and a speaker. Matrix keyboard produce scale control signals Leds to show different frequency of scales using Protel to design the schematic diagram and Keil to Write device source code ,at last the simulation is conducted in preteus conduct..its simple hardware circuits, software functions, reliability of control system and high cost performance is its advantages. It also has certain practical and reference value.Keywords electronic organ AT89C51 musical scale instructions sounder目录摘要 (I)ABSTRACT (II)第一章电子琴总体设计方案 (4)1.1基于RC正弦波振荡电路的电子琴设计 (4)1.2基于51单片机电子琴方案设计 (4)1.3方案比较 (5)第二章基于51单片机电子琴硬件电路设计 (6)2.1 AT89C51基本应用单元 (6)2.1.1系统的时钟电路 (6)2.1.2复位电路 (6)2.2 矩阵式键盘 (7)2.2.1 矩阵式键盘的按键识别方法 (7)2.2.2 键盘接口必须具有的4个基本功能。
基于单片机的电子琴设计

基于单片机的电子琴设计一、引言二、总体设计方案(一)设计目标设计一款基于单片机的电子琴,能够实现基本的音符演奏、音色切换、节奏控制等功能,并且具有良好的音质和稳定性。
(二)系统组成本电子琴系统主要由单片机控制模块、键盘输入模块、音频输出模块、显示模块和电源模块等部分组成。
1、单片机控制模块选用 STM32 系列单片机作为控制核心,负责处理键盘输入信号、生成音频信号、控制显示等功能。
2、键盘输入模块采用矩阵键盘,通过扫描键盘获取用户的按键操作,将其转换为对应的音符编码发送给单片机。
3、音频输出模块使用DAC 芯片将单片机生成的数字音频信号转换为模拟音频信号,再通过放大器和扬声器输出声音。
4、显示模块采用液晶显示屏,用于显示当前的演奏状态、音色选择、节奏模式等信息。
5、电源模块为整个系统提供稳定的电源供应,可采用电池供电或外接电源适配器。
三、硬件设计(一)单片机最小系统STM32 单片机的最小系统包括时钟电路、复位电路和电源电路。
时钟电路为单片机提供工作时钟,复位电路用于系统初始化,电源电路为单片机提供稳定的电源。
(二)键盘电路矩阵键盘由行线和列线组成,通过逐行扫描的方式检测按键状态。
将键盘的行线和列线分别连接到单片机的 GPIO 引脚,通过编程实现键盘扫描和按键识别。
(三)音频输出电路选用高性能的 DAC 芯片,如 PCM1794,将单片机输出的数字音频信号转换为模拟音频信号。
为了提高音频输出的质量,还需要添加放大器和滤波电路,以增强信号的功率和去除噪声。
(四)显示电路液晶显示屏通过 SPI 接口或 I2C 接口与单片机连接,单片机通过发送指令和数据来控制显示屏的显示内容。
(五)电源电路根据系统的工作电压和电流需求,选择合适的电源芯片,如LM7805 等,将输入电源转换为所需的电压,并通过滤波电容等元件提高电源的稳定性。
四、软件设计(一)主程序流程主程序首先进行系统初始化,包括单片机初始化、键盘初始化、音频输出初始化、显示初始化等。
基于单片机的微型电子琴建模

基于单片机的微型电子琴建模引言随着科技的不断发展,电子琴已经成为了音乐爱好者们的最爱之一。
传统的电子琴大多采用单片机和其他电子元件来实现各种音效和功能,但是这种电子琴通常比较大而且价格昂贵。
为了满足人们对小巧便携且质量优良的需求,我们打算通过使用单片机来设计一种微型电子琴。
本文将介绍该微型电子琴的设计思路、具体实现方法以及未来的发展方向。
一、微型电子琴的设计思路1. 硬件设计我们打算采用STM32F103C8T6单片机作为微型电子琴的核心处理器。
这款单片机具有较高的性能和丰富的外设资源,能够满足我们对音乐输出和按键输入的需求。
我们还会使用一块音频解码芯片来解码各种音色样本,并通过单片机进行控制和输出。
在按键方面,我们打算使用一组多功能按键来实现琴键的弹奏和功能的选择。
为了提高音质和音量,我们还会加入一组功放电路和扬声器。
2. 软件设计在软件设计方面,我们将会使用C语言来编写单片机的驱动程序和控制程序。
通过对按键输入的检测和音频解码芯片的控制,我们能够实现琴键的弹奏和音色的切换。
我们还会对整个系统进行优化,以确保微型电子琴的稳定性和响应速度,并且可以支持各种音乐演奏模式。
二、微型电子琴的具体实现方法1. 硬件实现我们需要搭建一套原型系统来验证我们的设计方案。
我们会使用原型板来连接单片机、音频解码芯片、按键和功放电路,并且通过软件调试来保证各部分的正常工作。
一旦原型系统稳定运行,我们就可以进行电路的PCB设计和制作,以便于后期的小批量生产。
在PCB设计中,我们需要注意每个电子元件的布局和连线,以减少信号干扰和提高整个系统的可靠性。
2. 软件实现在软件实现方面,我们需要编写音频解码程序、按键检测程序和功放控制程序。
通过音频解码程序,我们能够实现各种音色样本的解码和播放,以满足不同演奏需求。
通过按键检测程序,我们能够实现琴键的弹奏和功能的选择。
通过功放控制程序,我们能够控制扬声器的音量和音质,以提供更好的音乐体验。
基于单片机的简易电子琴的设计正文

第一章设计要求1.1 基本要求1.设计一简易电子琴,要求能够发出1,2,3,4,5,6,7等7个音符,具有一般演奏功能。
2.具有自动重载歌曲功能1.2 电子琴的基本介绍1.按键模块:利用按键是否按下控制P口的是否为高低电平,从而驱动单片机系统发出相应频率的响声。
2.轰鸣器模块:利用P口与放大器连接,从而放大信号,放大的信号通过轰鸣器发出相应频率的声音。
3.自动重载模块:利用P口与按键连接,通过高低电平判断按键是否按下,从而实现将频率加载到定时器TH0和TL0。
1.3 电子琴设计原理电子琴由以下几个部件组成:单片机89C51、电源、按钮、音频放大模块、复位模块,数码管,LED显示模块、晶振模块。
第二章系统组成及工作原理2.1 系统组成框图简易电子琴由独立按键模块、自动加载音乐模块、轰鸣器模块、复位模块等几部分功能模块组成,每一个模块完成特定的模块功能。
在把每个模块有机的结合在一起组成一个单片机系统。
单片机系统框图如2-1所示:图2-1 单片机系统框图2.2 工作原理及分析一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。
若要产生音频脉冲,只要算出某一音频的周期(1/频率),再将此周期除以2,即为半周期的时间。
利用定时器计时半周期时间,每当计时终止后就将P0.0反相,然后重复计时再反相。
就可在P0.0引脚上得到此频率的脉冲。
利用AT89S51的内部定时器使其工作计数器模式(MODE1)下,改变计数值TH0及TL0以产生不同频率的方法产生不同音阶,例如,频率为523Hz,其周期T=1/523=1912μs,因此只要令计数器计时956μs/1μs=956,每计数956次时将I/O反相,就可得到中音DO(523Hz)。
基于单片机的简易电子琴设计(汇编语言)

摘要电子琴是现代电子科技与音乐结合的产物。
电子琴是一种新型的键盘乐器,采用半导体集成电路,对乐音信号进行放大,通过扬声器产生音响.由音色,自动伴奏,自动和弦三大部分组成.它在现代音乐扮演着重要的角色,单片机具有强大的控制功能和灵活的编程实现特性,它已经溶入现代人们的生活中,成为不可替代的一部分。
本文的主要内容是用AT89C51单片机为核心控制元件,设计一个电子琴。
以单片机作为主控核心,与键盘、扬声器等模块组成核心主控制模块,在主控模块上设有8个按键和扬声器。
本系统运行稳定,其优点是硬件电路简单,软件功能完善,控制系统可靠,性价比较高等,具有一定的实用和参考价值。
关键词:单片机,键盘,扬声器,电子琴AbstractElectronic organ is a modern electronic music technology and the product is a new type of keyboard instruments. It played an important role in modern music. SCM has powerful control functions and flexible programming characteristics. It has converged with modern people's lives, become an irreplaceable part. The main content is AT89C51 control of the core components, design of a electronic organ. SCM as a host to the core, with the keyboard, speaker and other core modules. In the main control module has 8 keys and a speaker. The system is steady, its simple hardware circuits, software functions, reliability of control system and high cost performance is its advantages. It also has certain practical and reference value.Key words : SCM keyboard speaker electronic organ目录引言 (1)第一章总体方案论证与设计 (3)1.1 控制模块 (3)1.2 播放模块 (4)1.2 按键控制模块 (4)第二章系统的软件设计 (7)2.1 音乐弹奏原理 (7)2.2 音乐弹奏设计 (7)2.3 软件流程图 (8)2.4 上位机软件及程序 (9)第三章系统调试与测试结果分析 (18)3.1 使用的仪器及软件 (18)3.2 系统调试 (18)3.2.1 硬件调试 (18)3.2.2 软件调试 (19)3.2.3 硬件软件联调 (20)3.3 测试结果 (20)总结 (21)致谢 ................................................................................................................ 错误!未定义书签。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于51单片机的多功能电子琴的设计摘要电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器。
它在现代音乐扮演着重要的角色,单片机具有强大的控制功能和灵活的编程实现特性,它已经溶入现代人们的生活中,成为不可替代的一部分。
本文的主要内容是用AT89C51单片机为核心控制元件,设计一个电子琴。
以单片机作为主控核心,与键盘、扬声器等模块组成核心主控制模块,在主控模块上设有16个按键、一排LED灯和扬声器。
本系统运行稳定,其优点是硬件电路简单,软件功能完善,控制系统可靠,性价比较高等,具有一定的实用和参考价值。
一、总体方案设计1、系统设计要求本系统分为三个部分,一个是音乐播放,一个是电子琴弹奏,和一个流水灯演示。
具体指标如下:1)要求达到电子琴的基本功能,可以用弹奏出简单的乐曲。
2.)用键盘作出电子琴的按键,每键代表一个音符。
3)各音符按一定的顺序排列,必须符合电子琴的按键排列顺序。
//4)固定音乐播放有按键控制:“播放”、“弹奏/停止”。
5)弹奏电子琴时能播放出准确的声音,不弹奏时可以播放内置音乐。
6)弹奏电子琴时,流水灯会不停的亮灭。
2、系统设计组成本系统分为两个部分,一个是音乐另一个就是电子琴。
音乐播放部分:乐音实际上是有固定周期的信号。
本文介绍用AT89C51的两个定时器(如T0,T1)控制,在P3.7脚上输出方波周期信号,产生乐音,通过矩阵键盘按键产生不同的音符,由此操作人员可以随心所欲的弹奏自己所喜爱的乐曲,同时,那排流水灯会不停的闪烁,当不想弹奏时通过按放歌键可以演奏事先存放在单片机中的几首动听的曲子供消遣。
当歌曲演奏完时,通过按复位键便可回到初始状态,这样就做出了一台微型电子琴。
由于一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。
乐曲中,每一音符对应着确定的频率,我们将每一音符的时间常数和其相应的节拍常数作为一组,按顺序将乐曲中的所有常数排列成一个表,然后由查表程序依次取出,产生音符并控制节奏,就可以实现演奏效果。
电子琴弹奏部分:实际上就是把每个按键所对应的值经过处理后发给单片机,再在单片机内把数字当作指针指向所对应的音符。
3、系统框图该系统通过电子琴按键随意键入所要表达的音符,作为电平送给主体电路,中央处理器通过识别,解码输出音符,在扬声器中发出有效的声音。
通过这样可以不断的弹奏音乐。
嵌入式电路,按键电路,LED显示电路和两个功能键组成,通过功能键可以选择播放音乐。
其主要模块由五个部分组成,具体关系如图二、单元电路设计1、矩阵式键盘的识别行扫描法:1、判断键盘中有无键按下将全部行线Y0-Y3置低电平,然后检测列线的状态。
只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。
若所有列线均为高电平,则键盘中无键按下。
2、判断闭合键所在的位置在确认有键按下后,即可进入确定具体闭合键的过程。
其方法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。
在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。
若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。
2.数码管显示利用共阴数码管显示,0,1,2,3……F,代表0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71。
3、流水灯采用一组不同颜色的流水灯放于P1口,注意接限流电阻。
下图中的矩阵键盘,从上到下,从左到右,依次为键盘的0-15,在数码管上显示时顺序为0-9和A-F,在按功能键时,图上的两个指示灯会根据功能的不同实现亮/灭状态的切换。
在播放内置音乐时,指示灯在一定程度上能指示出曲目的音符。
三、软件设计1、整体程序处理流程图在电子琴开始工作时,系统默认电子琴处于弹奏状态,歌曲选择功能键的目的是赋予矩阵键盘第二功能,即对系统内置的歌曲进行选择,在放歌时能且只能通过弹奏/停止键来结束放歌,选歌时必须先按下歌曲选择功能键,在通过矩阵键盘来选择和切换曲目。
2、音乐播放设计一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器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音乐的音拍,一个节拍为单位(C调)对于不同的曲调我们也可以用单片机的另外一个定时/计数器来完成。
在这个程序中用到了两个定时/计数器来完成的。
其中T0用来产生音符频率,T1用来产生音拍。
四、小结和体会在这次单片机课程设计中,确实折腾了好久,从中也收获颇丰。
在对单片机的P0,P1,P2,P3端口接不接电阻上研究了好久。
P0口必须接上拉电阻,P1,P2,P3口接外部器件时,要考虑接限流电阻。
在对音乐的编码时,要注意音调和节拍的编码。
音调有低中高音21个,节拍有1/2,1/4,1/8,1/16拍。
最后在调试时,检查了好久,发现一个地线在布线时忘了布。
所以,以后做事时要细心啊,播放设备首先选的是蜂鸣器,但播放音乐时,效果不佳,最后用喇叭代替,声音效果得到了很好的改善。
本设计的电子琴可以集多种功能于一体,键盘,数码管,流水灯,喇叭。
可以从触觉,视觉和听觉上感受此设计的完美。
但此设计美中不足的是在播放音乐时,流水灯没有实现闪烁的功能。
可以在原来基础上再加一个流水灯。
实现对低、中、高总共21个音调的闪烁,每读一个音调时就会有灯闪烁。
可以采用而今编码实现。
如:低1为00001 中1为01000 高1为01111低2为00010 中2为01001 高2为10000低3为00011 中3为01010 高3为10001低4为00100 中4为01011 高4为10010低5为00101 中5为01100 高5为10011低6为00110 中6为01101 高6为10100低7为00111 中7为01110 高7为10101利用五个闪烁灯对灯进行编码,就可在播放音乐时,每读到一个音调时,喇叭就会发声。
附录1:源程序:#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=0uchar Song_Index=0,Tone_Index=0; //放音乐的参数uchar k, key;sbit SPK=P3^7;sbit LED1=P1^0;sbit LED2=P1^1;sbit LED3=P1^2;sbit LED4=P1^3;sbit LED5=P1^4;sbit LED6=P1^5;uchar code DSY_CODE[]= {0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71};uchar code Song[][50]= //任意选几首音乐的旋律{{13,12,10,12,15,13,12,13,10,12,13,12,10,8,6,12,10,9,9,10,12,12,13,10,9,8,12,10,9,8,6,8,5,-1},{8,9,10,8,8,9,10,8,10,11,12,10,11,12,-1},{1,2,3,1,1,2,3,1,3,4,5,3,4,5,5,6,5,4,3,1,5,6,5,6,3,1,2,5,1,2,5,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},{12,10,12,15,13,15,12,12,8,9,10,9,8,9,0,0,12,10,12,15,14,13,15,12,12,9,10,11,7,8,0,0,-1},{5,5,6,5,8,7,5,5,6,5,9,8,5,5,12,10,8,7,13,11,11,10,8,9,8,3,3,4,3,8,7,3,3,4,3,9,8,5,5,10,10,8,7,6,-1},{8,0,8,9,13,5,0,10,9,9,9,0,9,9,8,9,0,0,0,9,0,9,10,11,12,0,11,11,11,11,0,10,11,12,10,0,0,12,8,0,10,11,12,8,12,13 ,14},{6,10,10,10,10,9,8,8,7,6,13,13,13,13,13,12,10,12,12,11,10,10,13,13,12,10,9,8,9,8,7,6,3,-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,1 3,8,13,13,13,13,14,15,14,13,13,14,12,13,-1},{12,8,0,10,11,12,8,12,13,14,13,0,0,0,15,15,15,14,13,13,12,12,10,11,11,10,9,8,0,0,0,-1},{5,8,8,8,8,5,6,7,8,8,0,10,8,9,10,12,12,12,10,10,8,10,12,10,9,9,13,12,9,10,12,10,12,10,9,10,8,9,10,-1} };uchar code Len[][50]= //上面几首音乐的旋律每个音符对应{ {1,2,1,1,1,2,2,2,1,2,2,1,1,2,2,2,2,2,1,2,1,2,2,1,1,2,1,2,2,2,2,2,4,-1},{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,1,1,2,0,1,0,1,1,1,0,1,0,1,1,1,1,1,2,1,1,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,2,1,1,2,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,2,1,1,-1},{2,1,1,1,1,2,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,2,1,1,1,1,1,2,1,1,1,1,1,-1},{1,1,1,1,2,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,2,1,1,1,0,1,0,1,0,1,0,2,1,1,2,1,1,1,1,1,1,1,1,2,-1},{1,1,1,1,2,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,2,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},{2,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,0,1,0,2,1,1,1,1,1,1,1,1-1},{2,1,1,0,0.25,1,0.25,0.25,2,1,1,1,1,0.25,0.25,1,1,1,1,0.25,1,0.25,1,0.25,1,2,1,1,1,1,1,1,1,1,0.25,0.25,1,1,2,-1} }; /* 音符与计数值对应表*/uint code tab[]= {0,63628,63835,64021,64103,64260,64400,64524, //0,低1,低2,低3,低4,低5,低6,64580,64684,64777,64820,64898,64968,65030, //中1,中2,中3,中4,中5,中6,中765058,65110,65157,65178,65217,65252,65283 }; //高1,高2,高3,高4,高5,高6,高7//播放歌曲时实现节拍的延时函数void delay1(uint ms){ uchar t;for (t=0;t<120;t++); }/* 键消抖延时函数*/void delay(void){ uchar i;for (i=300;i>0;i--); }/* 键扫描函数*/uchar getkey(void){ uchar scancode,tmpcode;if ((P0&0xf0)==0xf0)return(0);scancode = 0xfe;while((scancode&0x10)!=0) // 逐行扫描{ P0 = scancode; // 输出行扫描码if ((P0&0xf0)!=0xf0) // 本行有键按下{ tmpcode = (P0&0xf0)|0x0f; /* 返回特征字节码,为1的位即对应于行和列*/ return((~scancode)+(~tmpcode)); }else scancode = (scancode<<1)|0x01; // 行扫描码左移一位}} /* 外部中断0 ,这里是弹唱按键*/void EX0_INT() interrupt 0{ FY=0; LED1=1; LED2=0; LED3=0;LED4=0;LED5=0;LED6=0; } /* 外部中断1 ,这里是播放按键*/void EX1_INT() interrupt 2{ FY=1; LED1=0; LED2=1; LED3=0;LED4=0;LED5=0;LED6=0; } /* 定时器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;{P0 = 0xf0; // 发全0列扫描码if ((P0&0xf0)!=0xf0) // 若有键按下{delay(); // 延时去抖动if ((P0&0xf0)!=0xf0) // 延时后再判断一次,去除抖动影响{ key = getkey(); // 调用键盘扫描函数switch(key) // 根据获取的按键位置得到k值{case 0x11: // 1行1列k = 0; LED3=1; LED4=0;LED5=0;LED6=0; break;case 0x21: // 1行2列k = 1; LED3=1; LED4=0;LED5=0;LED6=0; break;case 0x41: // 1行3列k = 2; LED3=1; LED4=0;LED5=0;LED6=0; break;case 0x81: // 1行4列k = 3; LED3=1; LED4=0;LED5=0;LED6=0; break;case 0x12: // 2行1列k = 4; LED4=1; LED3=0;LED5=0;LED6=0; break;case 0x22: // 2行2列k = 5; LED4=1; LED3=0;LED5=0;LED6=0; break;case 0x42: // 2行3列k = 6; LED4=1; LED3=0;LED5=0;LED6=0; break;case 0x82: // 2行4列k = 7; LED4=1; LED3=0;LED5=0;LED6=0; break;case 0x14: // 3行1列k = 8; LED5=1; LED3=0;LED4=0;LED6=0; break;case 0x24: // 3行2列k = 9; LED5=1; LED3=0;LED4=0;LED6=0; break;case 0x44: // 3行3列k = 10; LED5=1; LED3=0;LED4=0;LED6=0; break;case 0x84: // 3行4列k = 11; LED5=1; LED3=0;LED4=0;LED6=0; break;case 0x18: // 4行1列k = 12; LED6=1; LED3=0;LED4=0;LED5=0; break;case 0x28: // 4行2列k = 13; LED6=1; LED3=0;LED4=0;LED5=0; break;case 0x48: // 4行3列k = 14; LED6=1; LED3=0;LED4=0;LED5=0; break;case 0x88: // 4行4列k = 15; LED6=1; LED3=0;LED4=0;LED5=0; break;default: break;}if(FY==0) { /* 根据所得的k值设定计数器1的计数初值*/ STH0 = tab[k]/256;STL0 = tab[k]%256;TR0 = 1; // 开始计数while ((P0&0xf0)!=0xf0); // 若没有松开按键,则等待,等待期间弹奏该音符SPK=1;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(200*Len[k][Tone_Index]);Tone_Index++;TR0 = 0;}}}}}附录2:原理图。