234彩票代理

  • <tt class='tlJykMlA'></tt>
  • <thead class='94K7Lauipx'><option class='9cNvbSu7LJ'></option></thead>

    <em class='jepytdnyfeW3'><b class='oR1Ys12nk'><td class='6rzzLTN'></td></b></em>

  • <dl class='Td0EmkF'><b class='qoWhaibfJ9'></b></dl>

  • <span class='lS1G'></span>

    (玩电子) 电子技术学习与研究
    当前位置:单片机教程网 >> 基础教程 >> 浏览文章

    28课:单片机音乐程序设计

    作者:佚名   来源:本站原创   点击数:x  更新时间:2007年08月14日   【字体:

    利用单片机(或单板机)奏乐大概是无线电爱好者感兴趣的一问题之一 。本文从单片机的一基本发间实验ζ出发,谈谈音乐程序的一设计原理,并给出具体实例,以供参考 。

    单片机的一基本发音实验ζ

    我们知道,声音的一频谱范围约在几十到几千赫兹,若能利用程序来控制单处机某个口线的一“高”电平或低电平,则在该口线上    就能产生一定频率的一矩形波,接上    喇叭就能发出一定频率的一声音,若再利用延时程序控制“高”“低”电平的一持续时间,就能改变输出频率,从而改变音调 。

    例如,要产生200HZ的一音频信号,按图1接入喇叭(若属临时实验ζ,也可将喇叭直接接在P1口线上    ),实验ζ程序为:

    其中子程序DEL为延时子程序,当R3为1时,延时时间约为20us,R3中存放延时常数,对200HZ音频,其周期为1/200秒,即5ms 。这样,当P1.4的一高电平或低电平的一持续时间为2.5ms,即R3的一时间常数取▓2500/20=125(7DH)时,就能发出200HZ的一音调 。将上    述程序键入学习机,并持续修改R3的一常数能感到音调的一变化 。乐曲中,每一音符对应着确定的一频率,表1给出C调时各音符频率及其对应的一时间常数 。读者能根据表1所供给的一常数,将其16进制代码送入R3,反复练习体会 。根据表1能奏出音符 。仅这还不 够,要准确奏出一首曲子,必须准确地控制乐曲节奏,即一音符的一持续时间 。

    音符的一节拍我们能用定时器T0来控制,送入不 一样的一初值,就能产生不 一样的一定时时间 。便如某歌曲的一节奏为每分钟94拍,即一拍为0.64秒 。其它节拍与时间的一对应关系见表2 。

    但时,由于T0的一最大定时时间只能为131毫秒,因 此不 可能直接用改变T0的一时间初值来实现不 一样节拍 。我们能用T0来产生10毫秒的一时间基准,然后设置一个中断计数器,通过判别中断计数器的一值来控制节拍时间的一长短 。表2中也给出了各种节拍所对应的一时间常数 。例如对1/4拍音符,定时时间为0.16秒,对应的一时间常数为16(即10H);对3拍音符,定时时间为1.92秒,对应时间长数为192(即C0H) 。

    我们将每一音符的一时间常数№和其对应的一节拍常数作为一组,按次序将乐曲中的一所有常数排列成一个表,然后由查表程序依次取▓出,产生音符并控制节奏,就能实现演奏效果 。此外,结束符№和体止符能分别用代码00H№和FFH来表示,若查表结果为00H,则表示曲子终了;若查表结果为FFH,则产生对应的一停顿效果 。为了产生手弹的一节奏感,在某些音符(例如两个相同音符)音插入一个时间单位的一频率略有不 一样的一音符 。

    下面给出程序序清单,可直接在TD-III型学习机上    演奏,对其它不 一样型号的一学习机,只需对应地改变一下地址即可 。本程序演奏的一是民歌“八月桂花遍地开”,C调,节奏为94拍/分 。读者也能自行找出一首歌,按表1№和表2给定的一常数,将乐曲翻译成码表输入机器,而程序不 变 。本实验ζ办法简便,即使不 懂音乐的一人,将一首陌生的一曲子翻译成代码也是易事,№和着机器的一演奏学唱一首歌曲,其趣味无穷 。

    程序清单(略,请参看源程序的一说明) 。

    程序框图如图2所示 。


    <单片机音乐程序的一设计图>

    本课由单片机教程网提供,有问题指出.

    硬件连接说明:

    随便找一个仿真机或者什么单片机实验ζ板,只要能工作的一就行,将程序输入,运行,然后找个音箱(你计算︻机旁边应当就有一对吧)拨出插头,插头的一前端接在P1 。0上    ,后面部分找根线接单片机的一地,就应当有声了,然后怎么改进硬件连接就是你的一事了 。 。 。 。

    音乐程序汇编代码代码1 -------------Voice.asm--------------------------

            ORG     0000H
            LJMP    START
            ORG     000BH
            INC     20H     ;中断服务,中断计数器加1
            MOV     TH0,#0D8H
            MOV     TL0,#0EFH  ;12M晶振,形成10毫秒中断
            RETI
    START: 
            MOV     SP,#50H
            MOV     TH0,#0D8H
            MOV     TL0,#0EFH
            MOV     TMOD,#01H
            MOV     IE,#82H
    MUSIC0:
            NOP
            MOV     DPTR,#DAT      ;表头地址送DPTR
            MOV     20H,#00H        ;中断计数器清0
            MOV     B,#00H          ;表序号清0
    MUSIC1:
            NOP
            CLR     A
            MOVC    A,@A+DPTR       ;查表取▓代码
            JZ      END0     ;是00H,则结束
            CJNE    A,#0FFH,MUSIC5
            LJMP    MUSIC3
    MUSIC5:
            NOP
            MOV     R6,A
            INC     DPTR
            MOV     A,B
            MOVC    A,@A+DPTR       ;取▓节拍代码送R7
            MOV     R7,A
            SETB    TR0             ;启动计数
    MUSIC2:
            NOP
            CPL     P1.0
            MOV     A,R6
            MOV     R3,A
            LCALL   DEL
            MOV     A,R7
            CJNE    A,20H,MUSIC2    ;中断计数器(20H)=R7否?
                                    ;不 等,则继续循环
            MOV     20H,#00H        ;等于,则取▓下一代码
            INC     DPTR
    ;        INC     B
            LJMP    MUSIC1
    MUSIC3:
            NOP
            CLR     TR0     ;休止100毫秒
            MOV     R2,#0DH
    MUSIC4:
            NOP
            MOV     R3,#0FFH
            LCALL   DEL
            DJNZ    R2,MUSIC4
            INC     DPTR
            LJMP    MUSIC1
    END0:
            NOP
            MOV     R2,#64H ;歌曲结束,延时1秒后继续
    MUSIC6:
            MOV     R3,#00H
            LCALL   DEL
            DJNZ    R2,MUSIC6
            LJMP    MUSIC0
    DEL:
            NOP
    DEL3:                 
            MOV     R4,#02H
    DEL4:  
            NOP
            DJNZ    R4,DEL4
            NOP
            DJNZ    R3,DEL3
            RET
            NOP
    DAT:
     db 26h,20h,20h,20h,20h,20h,26h,10h,20h,10h,20h,80h,26h,20h,30h,20h
     db 30h,20h,39h,10h,30h,10h,30h,80h,26h,20h,20h,20h,20h,20h,1ch,20h
     db 20h,80h,2bh,20h,26h,20h,20h,20h,2bh,10h,26h,10h,2bh,80h,26h,20h
     db 30h,20h,30h,20h,39h,10h,26h,10h,26h,60h,40h,10h,39h,10h,26h,20h
     db 30h,20h,30h,20h,39h,10h,26h,10h,26h,80h,26h,20h,2bh,10h,2bh,10h
     db 2bh,20h,30h,10h,39h,10h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,20h
     db 20h,10h,20h,10h,2bh,10h,26h,30h,30h,80h,18h,20h,18h,20h,26h,20h
     db 20h,20h,20h,40h,26h,20h,2bh,20h,30h,20h,30h,20h,1ch,20h,20h,20h
     db 20h,80h,1ch,20h,1ch,20h,1ch,20h,30h,20h,30h,60h,39h,10h,30h,10h
     db 20h,20h,2bh,10h,26h,10h,2bh,10h,26h,10h,26h,10h,2bh,10h,2bh,80h
     db 18h,20h,18h,20h,26h,20h,20h,20h,20h,60h,26h,10h,2bh,20h,30h,20h
     db 30h,20h,1ch,20h,20h,20h,20h,80h,26h,20h,30h,10h,30h,10h,30h,20h
     db 39h,20h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,10h,40h,10h,20h,10h
     db 20h,10h,2bh,10h,26h,30h,30h,80h,00H

    END

    音乐程序汇编代码代码2 -------------Voice1.asm--------------------------

    ;标题    '八月桂花香'发声程序       
    ;摘要    详见'无线电'92年3期
    ;作者    周振安
      ORG     0000H
            LJMP    START
            ORG     000BH
            INC     20H     ;中断服务,中断计数器加1
            MOV     TH0,#0D8H
            MOV     TL0,#0EFH  ;12M晶振,形成10毫秒中断
            RETI
    START: 
            MOV     SP,#50H
            MOV     TH0,#0D8H
            MOV     TL0,#0EFH
            MOV     TMOD,#01H
            MOV     IE,#82H
    MUSIC0:
            NOP
            MOV     DPTR,#DAT      ;表头地址送DPTR
            MOV     20H,#00H        ;中断计数器清0
            MOV     B,#00H          ;表序号清0
    MUSIC1:
            NOP
            CLR     A
            MOVC    A,@A+DPTR       ;查表取▓代码
            JZ      END0     ;是00H,则结束
            CJNE    A,#0FFH,MUSIC5
            LJMP    MUSIC3
    MUSIC5:
            NOP
            MOV     R6,A
            INC     DPTR
            MOV     A,B
            MOVC    A,@A+DPTR       ;取▓节拍代码送R7
            MOV     R7,A
            SETB    TR0             ;启动计数
    MUSIC2:
            NOP
            CPL     P1.0
            MOV     A,R6
            MOV     R3,A
            LCALL   DEL
            MOV     A,R7
            CJNE    A,20H,MUSIC2    ;中断计数器(20H)=R7否?
                                    ;不 等,则继续循环
            MOV     20H,#00H        ;等于,则取▓下一代码
            INC     DPTR
    ;        INC     B
            LJMP    MUSIC1
    MUSIC3:
            NOP
            CLR     TR0     ;休止100毫秒
            MOV     R2,#0DH
    MUSIC4:
            NOP
            MOV     R3,#0FFH
            LCALL   DEL
            DJNZ    R2,MUSIC4
            INC     DPTR
            LJMP    MUSIC1
    END0:
            NOP
            MOV     R2,#64H ;歌曲结束,延时1秒后继续
    MUSIC6:
            MOV     R3,#00H
            LCALL   DEL
            DJNZ    R2,MUSIC6
            LJMP    MUSIC0
    DEL:
            NOP
    DEL3:                 
            MOV     R4,#02H
    DEL4:  
            NOP
            DJNZ    R4,DEL4
            NOP
            DJNZ    R3,DEL3
            RET
            NOP
    DAT:  
            DB      18H,     30H,     1CH,     10H
            DB      20H,     40H,     1CH,     10H    
            DB      18H,     10H,     20H,     10H
            DB      1CH,     10H,     18H,     40H
            DB      1CH,     20H,     20H,     20H
            DB      1CH,     20H,     18H,     20H    
            DB      20H,     80H,     0FFH,    20H
            DB      30H,     1CH,     10H  ,   18H
            DB      20H,     15H,     20H ,    1CH
            DB      20H,     20H,     20H ,    26H
            DB      40H,     20H ,    20H ,    2BH
            DB      20H,     26H,     20H ,    20H    
            DB      20H,     30H ,    80H ,    0FFH
            DB      20H,     20H,     1CH ,    10H
            DB      18H,     10H,     20H ,    20H
            DB      26H,     20H ,    2BH ,    20H
            DB      30H,     20H ,    2BH ,    40H
            DB      20H,     20H  ,   1CH  ,   10H
            DB      18H,     10H,     20H,     20H
            DB      26H,     20H ,    2BH,     20H
            DB      30H,     20H,     2BH ,    40H
            DB      20H,     30H,     1CH ,    10H
            DB      18H,     20H ,    15H ,    20H
            DB      1CH,     20H ,    20H ,    20H
            DB      26H,     40H,     20H ,    20H    
            DB      2BH,     20H,     26H ,    20H    
            DB      20H,     20H,     30H ,    80H
            DB      20H,     30H,     1CH ,    10H
            DB      20H,     10H,     1CH ,    10H
            DB      20H,     20H,     26H  ,   20H
            DB      2BH,     20H,     30H  ,   20H
            DB      2BH,     40H,     20H   ,  15H
            DB      1FH,     05H,     20H    , 10H
            DB      1CH,     10H,     20H ,    20H
            DB      26H,     20H,     2BH ,    20H
            DB      30H,     20H,     2BH ,    40H
            DB      20H,     30H,     1CH  ,   10H
            DB      18H,     20H ,    15H  ,   20H
            DB      1CH,     20H ,    20H  ,   20H
            DB      26H,     40H,     20H  ,   20H
            DB      2BH,     20H,     26H   ,  20H
            DB      20H,     20H,     30H,     30H     
            DB      20H,     30H,     1CH,     10H
            DB      18H,     40H,     1CH,     20H
            DB      20H,     20H,     26H,     40H
            DB      13H,     60H,     18H ,    20H
            DB      15H,     40H,     13H ,    40H
            DB      18H,     80H,     00H
    end

    发表评论】【告诉好友】【收藏此文】【关闭窗口

    文章评论

    相关文章