(玩电子) 电子技能学习与研讨
当时方位:单片机教程网 >> 基础教程 >> 阅览文章

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

宣布谈论】【告知老友】【保藏此文】【封闭窗口

文章谈论

相关文章

m88 188bet uedbet 威廉希尔 明升 bwin 明升88 bodog bwin 明升m88.com 18luck 188bet unibet unibet Ladbrokes Ladbrokes casino m88明升 明升 明升 m88.com 188bet m88 明陞 uedbet赫塔菲官网 365bet官网 m88 help