找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 11640|回复: 0
打印 上一主题 下一主题
收起左侧

基于51单片机的建议电子琴 代码与原理

[复制链接]
跳转到指定楼层
楼主

这个是我最近的课程设计,做完了给大家分享一下吧
基本要求:基于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


若有不足还请大家指出




评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表