这个是我最近的课程设计,做完了给大家分享一下吧 基本要求:基于51单片机的多音阶电子琴可以采用16个按键矩阵,设计成16个音阶,来实现随意弹奏想要表达的音乐。 设计提示: 1)掌握键盘的扫描识别编程方法; 2)理解数码管动态显示原理。 3)可先利用单片机定时器T0或T1实现基准时间(如20ms)
利用51开发板以及外接的矩阵键盘,以及数码管和蜂鸣器,设计出功能简单的电子琴,从而了解蜂鸣器发出不同音调的原理,加深对蜂鸣器原理的认识。同时了解矩阵键盘的扫描原理以及加深数码管动态显示的原理。 另外,元件的使用以及画总电路图使用到了PROTEL软件,代码的编写下载使用keil软件,本次大作业也会让我对这两个软件的使用更加熟练。
实验原理 音节由不同频率的方波产生,音节与频率的关系见下面的表格。要产生音频方波,只要算出某一咅频的周期(频率的倒数),然后将此周期除以2,即为半周期的时间。利用计时器计时此半周期时间,每当计时到后就将输出信号的I/O反相,然后重复计时此半周期时间再对I/O 反相,就可在I/O脚得到此频率的方波。在51单片机上,产生方波的I/O脚选用P2.5,P2.5输出不同频率的方波,蜂 鸣器便会发出不同的声音。另外,音乐的节拍是由延时实现的,如果1拍为0.4秒,1/4拍是 0.1秒。只要设定延时时间,就可求得节拍的时间。延时作为基本延时时间,节拍值只能是它的整数倍。
系统设计
本课题只要给蜂鸣器不同频率的信号既可以实现不同音调的发声。单片机实验板上的数码显示管可以显示四位数字,但是并行口只有八个,所以只能选用动态扫描方式。键盘由于板子上没有键盘,只能使用外接键盘,插在P1口,蜂鸣器接在P2.5口,数码显示管接在P0口。 功能单元框图如下图:
功能描述: 矩阵键盘:输入不同的按键信号,用来选择蜂鸣器频率以及数码管的显示。 AT89S51: 主控制模块。 74HC573: 锁存器,数码管采取动态扫描方式,为了选择数码管显示的是第几个七段数码管,需要借助锁存器。 数码管:显示数字。 蜂鸣器:发出声音 时钟与复位电路:提供时钟信号与复位信号。
硬件设计 (本章用来论述各个功能单元的具体实现电路,并详细介绍设计过程,如元器件的选型、特点以及具体原理电路图)
单元一: 4*4键盘矩阵
按键数目较多的场合常常采用矩阵式键盘,也称行列式键盘。键盘由行线和列线组成,按键位于行列线的交叉点上。一个4*4的行列结构可以构成一个16个按键的键盘,需要一个8位的并行IO口。很明显,再按键数目较多的场合,矩阵式键盘要比独立式键盘节省较多的IO口线。本实验中矩阵键盘接在P1口。
单元二:SST89E51芯片 SST89E51是一个低功耗,高性能CMOS 8位单片机,片内含4k Bytes ISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,SST89E51在众多嵌入式控制应用系统中得到广泛应用。
单元三:时钟与复位电路 时钟信号分为内部时钟信号与外部时钟信号,本实验中使用的是外部时钟信号,CPU外面有一个11.0592Mhz的外接晶振。复位操作是单片机的初始化操作,只需要给AT89S51单片机的复位引脚RST加上大于两个机器周期的高电平就可以使得单片机复位。
单元四:锁存器74HC573 74HC573是拥有八路输出的透明锁存器,输出为三态门,是一种高性能硅栅CMOS器件。当输入的数据消失时,在锁存器芯片的输出端,数据仍然保持。 单元五:数码管显示
单元六:蜂鸣器电路
有源蜂鸣器是一种一体化结构的电子迅响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。蜂鸣器在电路中用字母“H”或“HA”(旧标准用“FM”、“LB”、“JD”等)表示。
软件设计
接下来的代码为初始化各值: ORG 0000H AJMP KEY1 ORG 0030H MOV A,#0 MOV R7,#0 SETB P2.5
下面为键盘扫描的主程序: KEY1: MOV P1,#0F0H ;给列送高电平 LCALL DELAY ;延时,使电路稳定下来 MOV R4,00H MOV A,P1 ;取P1口的值 ANL A,#0F0H ;屏蔽行线的影响 CJNE A,#0F0H,L ;如果有键按下,就跳转到L
下面为数码管显示的程序,2.0为第一个锁存器的使能端,首先通过给P0口赋值#07H,让第一块锁存器的输出值锁定,选定四个数码管显示我们只使用第四个。然后关闭使能端,第二块锁存器的输出控制一个数码管的显示数字。 通过查表法给数码管送入不同的数值。 DISPLAY: CLR P2.0 ; SETB P2.1 MOV P0,#07H CLR P2.1 SETB P2.0 MOV DPTR,#TABLE MOV A,R7 MOVC A,@A+DPTR MOV P0,A 下面是发出声音的代码: MUSIC: MOV R3,#200 MOV A,R7 JZ KEY1 LCALL FENGMING AJMPKEY1
下面是键盘扫描程序的子程序:
L: LCALL DELAY ;延时去除抖动 MOV A,P1 ;重新取值 JB ACC.4,L1 ;P1.4这一列有键按下?没有则跳转到L1 MOV R3,#00H ;R3用作记列号 AJMP Q1 L1: JB ACC.5,L2 MOV R3,#01H AJMP Q1 L2: JB ACC.6,L3 MOV R3,#02H AJMP Q1 L3: JB ACC.7,KEY1 MOV R3,#03H AJMP Q1 Q1: MOV P1,#0FH ;给行送高电平 LCALL DELAY ;延时,稳定电路 MOV A,P1 ;取值 ANL A,#0FH ;屏蔽高四位 JB ACC.0,Q2 ;判断是不是第0行,不是则转移 MOV R4,#00H ;如果是,那把0送给R4(R4存行(转换为键号)) AJMP JIA Q2: JB ACC.1,Q3 MOV R4,#04H AJMP JIA Q3: JB ACC.2,Q4 MOV R4,#08H AJMP JIA Q4: JB ACC.3,KEY1 MOV R4,#0CH AJMP JIA JIA: MOV A,R3 ;行号加上列号就是改键的值 ADD A,R4 MOV R7,A ;调整后放在R7寄存器中 AJMP KEY1 DELAY: MOV R6,#20H ;仿真时测试延时为13ms Q6: MOV R5,#0BBH DJNZ R5,$ DJNZ R6,Q6 RET
蜂鸣器的子程序:控制不同的计数器初值,从而达到分频的效果。建立了两个表格TABLE2和TABLE3,利用查表法取出初值分别装入TH0和TL0。计数器工作时我没有采用中断,而是通过判断TF溢出位来查看计数是否完成。R3是为了进行两百个循环,即增长响声时间。
FENGMING: MOV R3,#200 SETBP2.5 MAIN01: MOV TMOD,#01H MOV DPTR,#TABLE2 MOVA,R7 MOVC A,@A+DPTR MOV R5,A MOV DPTR,#TABLE3 MOVA,R7 MOVC A,@A+DPTR MOV R6,A MOV TH0,R6 MOV TL0,R5 SETB TR0 WAIT: JNB TF0, WAIT;判断是否溢出 CLR TF0 CPL P2.5 ;蜂鸣器响 DJNZ R3,MAIN01 ;蜂鸣器的延时程序 RET
下面为代码中用到的三个表格,分别为数码管显示的表格和计数器高低位TL0和TH0的表格。
TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H ,7FH,6FH,77H DB 7CH,39H,5EH,79H,71H; TABLE2: DB25H,080H,84H,0D9H,68H,0B9H,5BH,78H,79H, DB 0E4H,0A8H,0E6H,6FH,88H,40H,66H TABLE3:DB 0FEH,0FDH,0FEH,0FAH,0FBH,0FBH,0FDH,0FEH, DB 0FDH,0FEH,0FAH,0FBH,0FBH,0FDH,0FBH,0FBH
若有不足还请大家指出
|