单片机电子琴.docx

上传人:b****2 文档编号:758893 上传时间:2023-04-30 格式:DOCX 页数:15 大小:18.14KB
下载 相关 举报
单片机电子琴.docx_第1页
第1页 / 共15页
单片机电子琴.docx_第2页
第2页 / 共15页
单片机电子琴.docx_第3页
第3页 / 共15页
单片机电子琴.docx_第4页
第4页 / 共15页
单片机电子琴.docx_第5页
第5页 / 共15页
单片机电子琴.docx_第6页
第6页 / 共15页
单片机电子琴.docx_第7页
第7页 / 共15页
单片机电子琴.docx_第8页
第8页 / 共15页
单片机电子琴.docx_第9页
第9页 / 共15页
单片机电子琴.docx_第10页
第10页 / 共15页
单片机电子琴.docx_第11页
第11页 / 共15页
单片机电子琴.docx_第12页
第12页 / 共15页
单片机电子琴.docx_第13页
第13页 / 共15页
单片机电子琴.docx_第14页
第14页 / 共15页
单片机电子琴.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

单片机电子琴.docx

《单片机电子琴.docx》由会员分享,可在线阅读,更多相关《单片机电子琴.docx(15页珍藏版)》请在冰点文库上搜索。

单片机电子琴.docx

单片机电子琴

一 设计原理   ……………………………………………………5

二 硬件电路图 ……………………………………………………6

三 软件设计 ………………………………………………………7

(一)延时程序编写…………………………………………………11

(二)T值表的建立…………………………………………………12

(三) 键盘扫描程序编写…………………………………………13

四 电子琴程序设计………………………………………………14

五 结束语 …………………………………………………………15

六 参考文献…………………………………………………………16

1设计原理

 乐音实际上是有固定周期的信号,要产生音频脉冲,只要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期的时间。

利用定时器计时这个半周期的时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期时间对I/O反相,就可以在I/O脚上得到此频率的脉冲。

利用8051(晶振12HZ)的内部定时器使其工作在MODE1下,改变计数值TH0及TL0以产生不同频率的方法。

例如:

要发出中音DO的音,首先知道中音DO的频率是523Hz(查表可以得知),其周期是T=1/523=1912us,因此只要令计数器计时956us/1us=956,在每计数956次时将I/O反向,就可得到中音DO。

其T值的计算方法如下:

T=65536—N;

N=Fi/2/Fr;        N:

计数值;

    Fi:

内部计时一次为1us,故其频率为1MHz;

                   Fr:

要产生的频率;

中音DO的T=65536—500000/523=64580。

C调各音符频率与T值表

音符 频率(Hz) 简谱码(T值) 音符 频率(Hz) 简谱码(T值)

低1DO 262 63628  #4FA# 740 64860

#1DO# 277 63731  中5SO 784 64898

低2RE 294 63835  #5SO# 831 64934

#2RE# 311 63928  中6 880 64968

低3M 330 64021  #6# 932 64994

低4FA 349 64103  中7SI 988 65030

#4FA# 370 64185  高1DO 1046 65058

低5SO 392 64260  #1DO# 1109 65085

#5SO# 415 64331  高2RE 1175 65110

低6LA 440 64400  #2RE# 1245 65134

#6# 466 64463  高3M 1318 65157

低7SI 494 64524  高4FA 1397 65178

中1DO 523 64580  #4FA# 1480 65198

#1DO# 554 64633  高5SO 1568 65217

中2RE 587 64684  #5SO# 1661 65235

#2RE# 622 64732  高6LA 1760 65252

中3M 659 64777  #6# 1865 65268

中4FA 698 64820  高7SI 1967 65283

建立音乐的步骤:

1. 先把乐谱的音符找出,然后按照上表建立T值表的顺序。

2. 把T值表建立在TABLE1,构成发音符的计数值放在“TABLE”。

3. 简谱码为一个字节,节拍为一个字节,音符的节拍码放在“TABLE”处。

4. 节拍时间的设定,如果1拍的时间是0.4秒,1/4拍的时间就是0.1秒,只要设定延时时间就可以求得节拍的时间。

假如1/4拍为1DELAY,则1拍应为4DELAY。

以此类推。

所以只要求得1/4拍的时间DELAY时间,其余的节拍就是它的倍数。

2硬件电路图

如图,按键1—7表示发中音1—7,按键8表示唱一首完整的歌曲,当在唱歌时需要进行按键发音则按一下按键9即可。

LM386为音频小功放,输出到扬声器。

晶振选择12MZ,采用开关复位方式。

LM386功放电路参阅《8051单片机实践与应用》。

745

    

单片机电子琴设计

软件设计

1.延时程序的编写

1/4拍的延时时间=187毫秒,这个时间由歌曲本身来决定,歌曲不同这个1/4拍的时间也不同,这里1/4拍的时间就取为187毫秒。

DELAY:

MOV  R7,#02

 D2:

MOV  R4,#187

 D3:

MOV  R3,#248

   DJNZ  R3,$

    DJNZ  R4,D3

   DJNZ  R7,D2

   DJNZ  R5,DELAY

   RET

R5表示为1/4拍的倍数。

T值表的建立

T值表建立在TABLE1中:

TABLE1:

DW  63628,63731,63835,63928,64021,64103

        DW  64185,64260,64331,64400,64463,64524

   DW  64580,64633,64684,64732,64777,64820

        DW  64860,64898,64934,64968,64994,65030

        DW  65058,65085,65110,65134,65157,65178

        DW  65198,65217,65235,65252,65268,65283

键盘扫描程序的编写

KEY:

MOV  R3,  #00H     /R3中的数表示是那个键按下/

JNB    P2.0,  LOOP

INC    R3

    JNB    P2.1,  LOOP

  INC    R3

    JNB    P2.2,  LOOP

      INC    R3

      JNB    P2.3,  LOOP

      INC    R3

      JNB    P2.4,  LOOP

      INC    R3

      JNB    P2.5,  LOOP

      INC    R3

      JNB    P2.6,  LOOP

  INC    R3

      JNC    P2.7,  LOOP

      SETB  F0        /没有键按下则F0=0/

      SJMP  DO

LOOP:

CLR  F0        /有键按下则F0=1/

 DO:

NOP

      RET

此程序可以判断是那个键按下,如果有键按下则F0=0,没有键按下则F0=1。

按键数存放在R3中。

这样就可以根据按键来发音了。

如果是按键8按下则表示是要唱一首完整的歌曲。

可以通过设定中断来实现它。

当按键8按下时产生中断,系统马上响应中断进入中断服务程序,进行查表TABLE可以得到歌曲的简谱码和节拍数然后按照歌曲的规律进行下去,这样就可以唱出一首完整的歌曲了。

TABLE表格的建立,,每个音符先编音符码然后编节拍数,音符码和节拍数各占一个字节。

程序如下:

ORG   0000H

SJMP   BEGIN

ORG   000BH

SJMP   TIM0

BEGIN:

 MOV   TMOD,  #01H    /设TIMER在MODE1/

   MOV   IE,     #82H     /中断使能/

REPE:

   MOV   30H,    #00H    /取简谱码指针/

NEXT:

 MOV    A,     30H     /简谱码指针存入A/

        MOV   DPTR, #TABLE

   MOVC  A,   @A+DPTR

        MOV  R2,     A        /音符码存入R2中/

CJNE  A,#0FFH,GOOT  /是否取到了规定的结束码                           “FFH”/

SJMP  END0

GOOT:

INC   30H

   MOV  A,  30H

   MOVC  A,@A+DPTR

      MOV  R5,  A   /节拍数存放在R5中/

        MOV  A,  R2  /音符码存入A中/

   CJNE  A,#24H,SING /取到的音符码是否为“24H”/

        CLR   TR0    /是,则不发音/

     JMP   D1

SING:

 MOV 31H, A   /音符码存入31H中/

   RL   A

   MOV DPTR, #TABLE1

MOVC  A,@DPTR+A  /找到TABLE1中对应的T值/

MOV  32H,  A  /取到T值的高字节存入32H中/

MOV TH0,A

MOV  A,31H

RL    A

INC   A

MOVC  A,@DPTR+A        

MOV  33H,  A  /取到T值的高字节存入33H中/

MOV TL0,A

SETB TR0   /启动TIMER0/

D1:

   CALL  DELAY

   INC  30H

        SJMP  NEXT

END0:

 CLR   TR0

   SJMP  REPE

TIM0:

 PUSH  ACC

     PUSH  PSW

        MOV  TH0,32H

        MOV   TL0,33H

        CPL     P1.0

   POP     ACC

      POP     PSW

        RETI 

DELAY:

MOV  R7,#02

 D2:

MOV  R4,#187

 D3:

MOV  R3,#248

   DJNZ  R3,$

    DJNZ  R4,D3

   DJNZ  R7,D2

   DJNZ  R5,DELAY

   RET

TABLE1:

DW  63628,63731,63835,63928,64021,64103

        DW  64185,64260,64331,64400,64463,64524

    DW  64580,64633,64684,64732,64777,64820

        DW  64860,64898,64934,64968,64994,65030

        DW  65058,65085,65110,65134,65157,65178

        DW  65198,65217,65235,65252,65268,65283

TABLE:

 13H,  02H,  24H,  01H,  13H,  01H,  15H, 04H   13H,   04H,   18H,   04H,  17H,   04H

        24H,  04H,  13H,  02H,  24H,  01H,  13H,  01H,  15H,   04H,   13H,   04H,   1AH,  04H

        18H,   04H,   24H,   04H,  13H,  02H,  24H,  01H,   13H,   01H,   1FH,  04H,  1CH,   04H

        0FFH

        END

对于不同的歌曲只要根据歌曲来建立TABLE即可。

上TABLE表是根据生日快乐歌曲建立的。

按键发音的过程,首先进行键盘扫描,判断是那个键按下,记下键数,存入R3中,然后查表得到相应的T值,并载入到定时器0中同时启动定时器,继续进行键盘扫描,判断是否有键按下,有则表示键一直是按下的,继续发音(因为扫描的时间很短最多也只有几十微秒,所以可以认为是同一个键按下的)。

没有则进行循环扫描。

 

ORG  0000H

        SJMP  COOM

        ORG  000BH

        SJMP  TIMOY

COOM:

MOV   TMOD,#01H

        MOV    IE,#82H

L1:

    CALL   KEY

      JB      F0, L1 /没有键按下则继续扫描/

        MOV    A,R3

        CJNE   A,#07H,SOPP

   SJMP   #####  /这里是为下面两个程序综合准备/

SOPP:

 MOV    DPTR,#TABLE2

        MOVC   A,@A+DPTR

        MOV    35H,  A    /T值高字节放入35H中/

   MOV   TH0,   A 

   MOV   A,   R3

      RL    A

        INC   A

   MOVC  A,  @A+DPTR

        MOV   36H,  A   /T值高字节放入36H中/

        MOV   TL0,  A

        SETB   TR0

L2:

    CALL  KEY

        JB      F0,  L3

     SJMP   L2

L3:

   CPL    TR0

SJMP   L1

KEY:

 MOV  R3,  #00H     /R3中的数表示是那个键按下/

JNB    P2.0,  LOOP

INC    R3

    JNB    P2.1,  LOOP

  INC    R3

    JNB    P2.2,  LOOP

      INC    R3

      JNB    P2.3,  LOOP

      INC    R3

      JNB    P2.4,  LOOP

      INC    R3

      JNB    P2.5,  LOOP

      INC    R3

      JNB    P2.6,  LOOP

  INC    R3

      JNC    P2.7,  LOOP

      SETB  F0

      SJMP  DO

LOOP:

CLR  F0

      

单片机电子琴设计

 DO:

    NOP

          RET

TIMOY:

  PUSH   ACC

          PUSH   PSW

   MOV   TH0,  #35H

   MOV   TL0,  #36H

   CPL   P1.0

          POP    ACC

          POP    PSW

          RETI

TABLE2:

  DW  64580,64684,64777,64820,64898,64968,65030

          END

只要将这两个程序综合起来就可以完成设计要求了,注意因为在这两个程序分开考虑的时候都是用定时器0来完成的。

而综合起来是只要改变其中一个为定时器1即可。

程序如下:

   ORG   0000H

   SJMP   BEGIN

         ORG    000BH

         LJMP   TIM0

         ORG    001BH

         LJMP   TIM1

BEGIN:

 MOV   TMOD,#11H

         MOV   IE,   #8AH

L1:

    CALL   KEY

      JB      F0, L1 /没有键按下则继续扫描/

        MOV    A,R3

        CJNE   A,#07H,SOPP

   SJMP   REPE  

SOPP:

 MOV    DPTR,#TABLE2

        MOVC   A,@A+DPTR

        MOV    35H,  A    /T值高字节放入35H中/

   MOV   TH1,   A 

   MOV   A,   R3

      RL    A

        INC   A

   MOVC  A,  @A+DPTR

        MOV   36H,  A   /T值高字节放入36H中/

        MOV   TL1,  A

        SETB   TR1

L2:

    CALL  KEY

        JB      F0,  L3

     SJMP   L2

L3:

   CPL    TR1

SJMP   L1

KEY:

MOV  R3,  #00H     /R3中的数表示是那个键按下/

JNB    P2.0,  LOOP

INC    R3

    JNB    P2.1,  LOOP

  INC    R3

    JNB    P2.2,  LOOP

      INC    R3

      JNB    P2.3,  LOOP

      INC    R3

      JNB    P2.4,  LOOP

      INC    R3

      JNB    P2.5,  LOOP

      INC    R3

      JNB    P2.6,  LOOP

  INC    R3

      JNC    P2.7,  LOOP

      SETB  F0

      SJMP  DO

LOOP:

CLR  F0

 DO:

 NOP

       RET

TIM1:

   PUSH   ACC

          PUSH   PSW

   MOV   TH1,  #35H

   MOV   TL1,  #36H

   CPL   P1.0

          POP    ACC

          POP    PSW

          RETI

REPE:

    MOV   30H,    #00H    /取简谱码指针/

NEXT:

  MOV    A,     30H     /简谱码指针存入A/

         MOV   DPTR, #TABLE

   MOVC  A,   @A+DPTR

         MOV  R2,     A        /音符码存入R2中/

CJNE A,#0FFH,GOOT/是否取到了规定的结束码                    “FFH”/

SJMP  END0

GOOT:

 INC   30H

   MOV  A,  30H

   MOVC  A,@A+DPTR

      MOV  R5,  A   /节拍数存放在R5中/

        MOV  A,  R2  /音符码存入A中/

   CJNE  A,#24H,SING /取到的音符码是否为“24H”/

        CLR   TR0    /是,则不发音/

      JMP   D1

SING:

 MOV 31H, A   /音符码存入31H中/

   RL   A

   MOV DPTR, #TABLE1

MOVC  A,@DPTR+A  /找到TABLE1中对应的T值/

MOV  32H,  A  /取到T值的高字节存入32H中/,

      

单片机电子琴设计

MOV TH0,A

MOV  A,31H

RL    A

INC   A

MOVC  A,@DPTR+A        

MOV  33H,  A  /取到T值的高字节存入33H中/

MOV TL0,A

SETB TR0   /启动TIMER0/

D1:

   CALL  DELAY

   INC  30H

        SJMP  NEXT

END0:

 CLR   TR0

   SJMP  REPE

TIM0:

 PUSH  ACC

      PUSH  PSW

        MOV  TH0,32H

         

      POP     PSW

        RETI 

DELAY:

MOV  R7,#02

 D2:

MOV  R4,#187

 D3:

MOV  R3,#248

   DJNZ  R3,$

    DJNZ  R4,D3

   DJNZ  R7,D2

   DJNZ  R5,DELAY

   RET

TABLE1:

DW  63628,63731,63835,63928,64021,64103

        DW  64185,64260,64331,64400,64463,64524

   DW  64580,64633,64684,64732,64777,64820

        DW  64860,64898,64934,64968,64994,65030

        DW  65058,65085,65110,65134,65157,65178

        DW  65198,65217,65235,65252,65268,65283

TABLE:

 13H,  02H,  24H,  01H,  13H,  01H,  15H, 04H   13H,   04H,   18H,   04H,  17H,   04H

        24H,  04H,  13H,  02H,  24H,  01H,  13H,  01H,  15H04H,   13H,   04H,   1AH,  04H

        18H,   04H,   24H,   04H,  13H,  02H,  24H,  01H,   

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2