基于单片机的16键电子琴的设计方案及课程设计

日基于单片机的16键电子琴一、电子琴设计的目的、要求与设计方法1.1设计目的现代乐器中,电子琴是高新科技在音乐领域的一个代表,体现了人类电子技术和艺术的完美结合。1.2设计要求本设计主要是用AT89C52单片机为核心控制元件,设计一个微缩版的电子琴。

(2) 设置定时器产生不同频率的方波,从I/O口输出,放大后从扬声器发出声音。 (3) 使用4×4矩阵键盘弹奏16个音符(低XI到高DO)。 2 电子键盘的设计方案及原理 2.1 总体设计方案 本系统采用AT89C52 作为主控芯片。 输入电路有16个按键。 通过按键可以随意表达音符,并以电平的形式传送到主电路。 中央处理器将识别和解码音符并将其输出,以在扬声器中产生有效的声音。 1个音乐按钮用于播放音乐和切换歌曲。 该按钮可以触发中断,重置定时器的初始值,并在另一个扬声器中发出有效的声音。 总体设计框图如下图1所示。 图1 基于单片机的电子键盘电路原理框图 2.2 声音产生原理 利用AT89C52内部定时器工作在计数器模式(MODE1)下,改变计数值TH0和TL0来产生不同的频率,产生不同的音阶,为例如,频率为523Hz,其周期T=1/523=1912μs,那么只要计数器计数956μs/1μs=956,I/O每翻转956次,即可得到中频DO(523Hz) 。 计数脉冲值与频率的关系为:N=fi÷2÷fr。 式中,N为计数值; fi 为机器频率(晶振为12MHz时,其频率为1MHz); fr 是您想要生成的频率。 ?电子键盘的硬件设计。 基于AT89C51单片机的电子键盘电路由按键控制电路、数码管显示电路、音频播放电路、时钟复位电路、音乐切换电路和电源电路六部分组成。

3.1 按键控制电路 按键控制电路作为人机接触的输入部分,也是间接控制数码显示器和音响放大器的重要组成部分。 键盘按连接方式可分为独立键盘和矩阵键盘。 3.1.1 矩阵键盘 如图2所示,是一个4X4矩阵键盘电路。 16键键盘可由4X4行列结构组成。 ?矩阵中无按钮按下时,行线为高电平; 当按下按钮时,行线的电平状态将由与行线连接的列线的电平决定。 如果列线电平低,则行线电平低;如果列线电平低,则行线电平低。 如果列线的电平高,则行线的电平也高。 这是判断按钮是否被按下的关键。 图2 矩阵键盘 3.1.2 独立键盘? 独立键盘的特点是一键一行。 每个键都是相互独立的。 每个按键都连接到一条 I/O 端口线。 通过检测I/O输入线的电平状态,可以判断哪个按钮被按下。 ?3.1.3? 解决方案比较? 表 2 键盘类型比较 键盘类型优缺点 独立电路简单,编程简单 占用 I/O 口线 多矩阵式占用 I/O 口线少 编程较复杂 由于本次设计的按键 控制电路需要16个按键,所以纯粹从I/O口线占用的角度来看,独立型需要16个I/O线,而矩阵型只需要8个。因此,选择矩阵键盘电路更为合理。 3.2 数码管显示电路 LED(Light?Emitting?Diode)发光二极管的缩写。 LED数码管由发光二极管组成。

常见的LED数码管呈“8”字形,共有8段。 一般来说有共阳极和共阴极两种连接方式。 3.2.1 LED数码管静态显示? 静态显示方式是指无论有多少个LED数码管同时处于显示状态。 如果每个LED数码管显示的字符的段码确定,则相应I/O口锁存器锁存的段码输出将保持不变,直到发送另一个字符的段码。 3.2.2 LED数码管动态显示? 静态显示方式是指任何时候只有一只LED数码管处于显示状态,即单片机采用“扫描”方式控制每只数码管轮流显示。 ?3.3.3方案比较? 以上两种数码管驱动电路的优缺点比较如表3所示。由于静态驱动方式的显示无闪烁、亮度高、编程简单,而本次设计的数码管显示电路仅需要两个数码管,并将两部分引脚分别连接,选择静态驱动方式显示数码管。 比较合理。 图3所示为数码管显示电路,采用静态驱动方式、共阳极接法。 表3 数码管显示方式、驱动方式、优缺点比较,静态显示,无闪烁,亮度较高,编程简单,数码管越多,需要电流越大,功率要求越高,动态显示电路为简单来说,数码管越多,比静态显示的亮度优势就更明显,可能会出现闪烁。 图3 数码管静态显示电路 3.3 音乐切换电路通过按键将电平拉低,触发中断0。 3.4 音频播放电路采用两个扬声器,一个作为按键输出,一个作为一首音乐输出。

3.5 时钟复位电路 3.5.1 时钟电路? 时钟频率直接影响单片机的速度,时钟电路的好坏也直接影响单片机系统的稳定性。 常用的时钟电路方式有两种,一种是内部时钟方式,一种是外部时钟方式。 ?本设计采用内部时钟方式制作时钟电路。 3.5.2 复位电路? 在实际的单片机系统中,复位操作一般有两种形式:上电复位和手动复位。 ?每次单片机系统上电时都会执行上电复位。 手动复位用于系统出现操作错误或程序运行不正确时。 ?由于本设计的需要,同时使用了这两种复位方式。 整体电路图如下图4所示。 图4 总体硬件设计 电子键盘软件设计 系统功能的实现一般包括硬件部分和软件部分。 硬件确定了,软件要实现的功能也就确定了。 为了使编程思路清晰,首先要画出程序流程图。 ?4.1? 系统硬件接口定义? 表 4 系统硬件接口定义 引脚名称 接口说明 备注 P0.0~P0.7 按键数码管与单片机通讯 数码管显示电路 P2.0~P2.7 轨道数码管与单片机通讯 数码管显示电路 P3.2 (INT0) 外部中断源输入端音乐切换电路 P1.0~P1.7 矩阵键盘接口按键控制电路 P3.0、P3.7 控制扬声器音频播放电路 4.2 主要功能? 主函数流程框图如图5所示,采用模块化的思想,主函数只执行初始化函数、键盘扫描函数、音频处理函数和数码管显示函数。

图5 主函数流程图 4.3 初始化函数 初始化流程图如图6 所示。该函数对所需的I/O 口、外部中断0、定时器0、定时器T1 和数码管进行初始化和配置。 TMOD=0x11; //T0模式1,T1模式1IP=0x01; //INT0中断优先级最高 EA=1;ET0=1;ET1=1;EX0=1; //使能中断TR0=0; //关闭定时器0P1=0xbf; //键盘初始化标志=0; //标志位置0 图6 初始化流程图 4.4 数码管显示和音频处理函数 根据键值扫描函数读取到的键码,扬声器发出声音并与数码管显示结合起来。 图7 数码管显示流程图 4.5 中断功能 中断功能采用外部中断和定时器中断。 外部中断的流程图如图8所示,当按键按下时,外部信号触发外部中断,执行键值扫描功能,读取对应的键值。 定时中断的流程图如图9所示,定时器溢出中断后,重新加载初始值,并进行相应的音频控制操作。 4.6 键值扫描功能将输入端设置为高电平,输出端设置为低电平。 这样,当没有按键时,所有输入端都没有变化,说明没有按键被按下。 一旦按下某个键,由于输出线的影响,输入线被拉低。 这样,通过读取输入线的状态,就可以知道是否有按键被按下。 流程图如图10所示。

图 8 外部键盘中断流程图 图 9 定时器中断流程图 图 10 键值扫描流程图 电子键盘系统仿真 5.1 部分仿真结果 表 5 仿真结果 按键编号 声音提示音 数码管显示 备注 0 低 XI0,-1 中DO1 , -2 in RI2, – 不播放曲目并停止 1, 2, 或 – 重复按切换音乐 图 11 当音乐显示为“-”或不显示时,按 DO 键有效 图 12 按音乐按键播放音乐 1、按键播放无效。 5.2 调试过程中出现的问题及解决方案 电子键盘的设计并不是一帆风顺的。 这期间,遇到了很多问题。 我们来谈谈几个关键问题。 首先是数码管显示乱码的问题。 我原本以为是数码管字体代码表里的代码写错了。 经过多次检查,发现代码库是正确的。 后来看了硬件图才知道,硬件图中的数码管是共阳极连接的。 ,软件中的数码管字形码表为共阴极。 第二个是在引入按键中断检测时遇到的问题。 按音乐键后,按键无法发声和显示,浪费了很多时间。 最后发现是程序的判断条件有问题。 第三个问题是扬声器发出的声音不对,甚至没有声音。 这个问题后来无法解决。 最后放弃了LM386功放电路,直接连接扬声器,但这导致部分按键声音出现杂音。 总结 在设计八通道多功能答录机的过程中,我使用AT89C52单片机和外围接口来实现电子键盘。 我利用单片机的定时器/计数器定时计数原理,实现了播放、播放的功能。 我使用Proteus和Keil软件设计了实验电路并完成了课程任务。

在这门课程中,我认识到了理论知识与实践相结合的重要性。 对于单片机这样的课程,仅仅了解课本上的知识是不够的。 通过使用软件模拟和焊接电路,很大程度上提高了我的自学能力,提高了我的动手能力。 我们在课程设计过程中遇到了很多问题。 例如,在仿真过程中,我错误地将共阴极数码管字体用作共阳极,导致数码管无法正常显示。 查了资料才明白,共阴极数码管是高电平驱动的,公共端是负极。 共阳极数码管由低电平驱动,公共端为正极。 类似的问题还有很多。 经过一一核对,我们终于完成了课程作业。 结果表明,努力就会有回报。 抓住要点,克服困难,学以致用,对于牢牢掌握知识非常有用。 在这门课程中,我学到了很多东西,通过不断改正自己的错误,我认识到了自己的不足。 我对知识的掌握还没有达到深刻的理解和记忆。 我相信这些教训将为我今后的学习提供帮助。 打下了良好的基础,始终牢记团队合作、坚持和努力的重要性。 参考文献[1]王思明,张晋民,苟俊年. 单片机原理及应用系统设计[M]. 北京:人民邮电出版社,2008.[2]冯玉昌,邹小兵。 单片机系统设计及实例指导[M]. 西安:西安电子科技大学出版,2004.[3]彭伟. 单片机C语言编程训练实例100[M]. 北京:电子工业出版社,2009.[4]单丹,马淑云。 基于AT89C51单片机的电子键盘设计[J]. 中国高新技术企业,2002年。附录#include#define uchar unsigned char#define uint unsigned int//共阳极数码管Ucharcode LED[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80 ,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};sbit beep=P3^0;uchar key;//按键号 sbit humer=P3^7;uchar dis_buf;uchar flag;//注释延时表uint code Tone_Delay_Table[]={64524,64580,64684,64777,64820,64896,64966,65030,65058,65110,65157,65178,65217,65252,65283,65316};//音调和节拍uchar code Song1_T一[] ={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,15,14,13,12,11,10,9,8, 7,6,5,4,3,2,1,0,0xff};uchar 代码 Time1_Tone[]={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,0xff};uchar代码Song2_Tone[]={ 3,5,5,3,2,1,2,3,5,3,2,3,5,5,3,2,1,2,3,2,1,1,0xff} ;uchar 代码 Time2_Tone []={2,1,1,2,1,1,1,2,1,1,1,2,1,1,2,1,1,1,2,1,1,1,0xff} ;uchar 代码 Song3_Tone[]={1,1,5,5,6,6,5,4,4,3,3,2,2,1,0xff};uchar 代码 Time3_Tone[]={ 1,1, 1,1,1,1,1,1,1,1,1,1,1,1,0xff};//定义键号 uchar keyno;//音乐片段索引,音符索引 uchar Song_index= 0;uchartone_index =0;//音符指针,延迟指针 uchar *tone_pointer,*delay_pointer;//从当前数组中取出音符的位置 uchar i =0;//毫秒延迟 void delayms(uint ms){uchar t;while( ms–) for(t=0;t>4)^0x0f;//将起始值0,4,8,12分别赋给第0~3行 switch(temp){case 1:k+=0 ;break ;case 2:k+=4;break;case 4:k+=8;break;case 8:k+=12;break;default:return;}keyno=k;} *///矩阵键盘扫描子程序 void key_scan(void ){ uchar 温度; P1=0x0F;//低四位输入delayms(2); //轻微延迟 temp=P1;//读取P1端口 temp=temp&0x0F; //取低四位 temp=~ (temp|0xF0); if(temp==1) //检测按下的按键的列号,第一列key=0; else if(temp==2) //第二列中 key=1 ; else if(temp==4) //第三列中的key=2; else if(temp==8) //第四列key=3; 其他键=16; //否则显示 – P1=0xF0; //高四位输入delayms(2); temp=P1;//读取P1口 temp=temp&0xF0; 温度=~((温度>>4)|0xF0); if(temp==1)//检测按下按键的行号,在第一行key=key+0; else if(temp==2) //第二行中 key=key+4; else if(temp==4) //第三行中 Row key=key+8; else if(temp==8) //第四行 key=key+12; elsekey=16;//否则显示 – /* 根据行号和列号获取按下的按键号 */dis_buf=LED[key]; //从表中查找键值}//T1中断,声音DO RI MI。

。 。 。 void play()中断3{TH1=Tone_Delay_Table[key]/256;TL1=Tone_Delay_Table[key]%256;beep=~beep;} //主程序 void main(){TMOD=0x11; //T0模式1,T1模式1IP=0x01; //INT0中断优先级最高 EA=1;ET0=1;ET1=1;EX0=1; //允许中断 TR0=0;P1=0xbf;flag=0;while(1){ //if(flag==0){P1=0xf0;//发送扫描码 if(P1!=0xf0)//按键按下{ if(song_index!=2&&song_index!=1){key_scan();P0 = dis_buf; //键值分配给P0口并显示 TR1=1;}}else{TR1=0;//停止播放} //}if(flag==1&&song_index!=0){delayms(2);tone_index =tone_pointer[i];if(tone_index==0xff){i=0;delayms(2000);继续;}TR0=1;delayms(delay_pointer[tone_index]*240);TR0=0;i++;switch(song_index) { 案例 2:P2=LED[2];break;案例 1:P2=LED[1];break;案例 0:P2=0xbf;break;}}}}

单片机

AT8989CC5151单片机I/O口接线LED显示

2024-4-7 6:04:41

单片机

人工种植树莓的成本收益是怎样的?种植前景分析

2024-4-7 7:04:05

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索