找回密码
 立即注册

QQ登录

只需一步,快速开始

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

音乐盒设计 驱动蜂鸣器

[复制链接]
楼主
ID:261703 发表于 2017-12-14 20:02 | 只看该作者
  1. 件3:音乐程序
  2.         shuzhi EQU 3fh           ;选曲目的地址
  3.         song EQU p1.2        ;扬声器播放
  4.         play EQU p3.0               ;播放停止键
  5.         addone EQU p3.1           ;曲目加一键
  6.         subone EQU p3.2           ;曲目减一键
  7.         dul EQU P1           ;段选
  8.         wel EQU P2           ;位选
  9.         ORG 0000H
  10.         LJMP START
  11.         ORG 000BH                    ;定时器0溢出中断入口地址
  12.         AJMP cont
  13.         ORG 0013H                    ;外部中断一入口地址
  14.         AJMP pause                    ;指向外部中断程序
  15.     ORG 0100H
  16. START:
  17.     MOV SP,#50H
  18.         MOV TH0,#0DBH             ;定时器赋初值
  19.         MOV TL0,#0FFH
  20.         MOV TMOD,#01H       ;设定T1工作于方式2
  21.         MOV IE,#86H                    ;开中断
  22.         MOV TCON,#00H
  23.         MOV R0,#00H
  24.         MOV shuzhi,#00H
  25. (是否顺序播放音乐)
  26. MAIN:                    
  27.     JNB play,first           ;判断P3.0键是否按下
  28.         SJMP MAIN

  29. first:
  30.     ACALL del20
  31.         JNB play,first         
  32.         MOV shuzhi,#00H
  33.         MOV dul,#06H           ;共阴数码管显示1
  34.         MOV wel,#80H
  35.         MOV DPTR,#dat1         ;dat1首地址赋给DPTR
  36.     ACALL music0
  37.         ACALL next
  38.         RET
  39. next:
  40.     INC shuzhi
  41.         MOV A,shuzhi
  42.         CJNE A,#01,LOOP3                    ;A是否=1,不等就跳转到LOOP3
  43.     MOV DPTR,#dat2                                 ;表2首地址送DPTR
  44.         MOV dul,#5BH                                 ;显示数值2
  45.         MOV wel,#80H
  46.         ACALL music0
  47.         INC A
  48. LOOP3:
  49.     CJNE A,#02,LOOP4                   ;A是否=2,不等就跳转到LOOP4
  50.         MOV DPTR,#dat3                            ;表3首地址送DPTR
  51.         MOV dul,#4FH                            ;显示数值3
  52.         MOV wel,#80H
  53.         ACALL music0
  54.         INC A
  55. LOOP4:
  56.     CJNE A,#03,next
  57.         ACALL first
  58.         RET
  59. (按键播放上一首音乐)
  60. last:
  61.     DEC shuzhi
  62.         MOV        a,shuzhi
  63.         CJNE        a,#02,last1
  64.         MOV        dptr,#dat3
  65.         MOV        dul,#4Fh
  66.         MOV        wel,#80h
  67.         ACALL        music0
  68. last1:        cjne        a,#01,last2
  69.         MOV        dptr,#dat2
  70.         MOV        dul,#5Bh
  71.         MOV        wel,#80h
  72.         ACALL        music0
  73. last2:        cjne        a,#00,last
  74.         MOV        dptr,#dat1
  75.         MOV        dul,#06h
  76.         MOV        wel,#80h
  77.         ACALL        music0
  78.         RET       

  79. music0:               
  80.         MOV        20h,#00h              ;中断计数单元清0
  81. music1:        clr        a               
  82.         MOVC        a,@a+dptr          ;查表取音阶常数
  83.         JZ        end0                       ;累加器判0看是否是结束符
  84.         CJNE        a,#0ffh,music5        ;是休止符?
  85.         LJMP        music3                     ;产生100ms停顿
  86. music5:
  87.         NOP

  88. key:       
  89.     JNB        play,k0                         ;判断P3.0键是否按下
  90.         JNB        addone,k1                 ;判断P3.2键是否按下
  91.         JNB        subone,k2                 ;判断P3.1键是否按下
  92.         MOV        r6,a                         ;音阶常数送R6
  93.         INC        dptr                            ;DPTR+1   
  94.         MOV        a,#0
  95.         MOVC        a,@a+dptr              ;取常数送R7
  96.         MOV        r7,a               
  97.         SETB        tr0                           ;启动定时器T0

  98. music2:        nop
  99.         CJNE        r0,#0,$               
  100.         CPL        song                                  ;输出电平取反
  101.         MOV        a, r6
  102.         MOV        r3,a                                  ;音阶常数送R3
  103.         LCALL        del20
  104.         MOV        a, r7                                       ;节拍常数送A
  105.         CJNE        a,20h,music2              ;节拍时间到否  
  106.         MOV        20h,#00h                             ;为取下一音阶作准备
  107.         INC        DPTR               
  108.         LJMP        music1

  109. music3:       
  110.     NOP                                           ;休止100ms
  111.         CLR        tr0                              ;关闭定时器
  112.         MOV        r2, #14h        

  113. music4:        NOP
  114.         MOV        r3, #250                  ;R3=250
  115.         LCALL        del20
  116.         DJNZ        r2, music4
  117.         INC        dptr                          ;为取下一音阶作准备  
  118.         LJMP        music1
  119. end0:        MOV        r2, #200               ;歌曲结束后,延时1s后继续

  120. music6:        MOV        r3, #250
  121.         LCALL        del20
  122.         DJNZ        r2,music6
  123. (按键选择)
  124. k1:        ACALL        del20                       ;调用延时子程序
  125.         JNB        addone,k1                  ;判断P3.2键是否释放
  126.         ACALL        next
  127. k2:        ACALL        del20
  128.         JNB        subone,k2                  ;判断P3.1键是否释放
  129.         ACALL        last
  130. k0:        ACALL        del20
  131.         JNB        play,k0             ;判断3.0键是否释放
  132.         LJMP        start
  133.         RET
  134. del20:        MOV        r4,#05h           ;延时子程序
  135. del4:        NOP
  136.         DJNZ        r4,del4
  137.         DJNZ        r3,del20
  138.         RET
  139. cont:        INC        20h                               ;计数单元+1
  140.         MOV        th0,#0dbh               ;重新10ms定时初值
  141.         MOV        tl0,#0ffh
  142.         RETI                             ;跳出中断      
  143. (停止播放)
  144. pause:        ACALL        del20
  145.         JNB        p3.0,pause                 ;判断P3.0键是否有释放
  146.         MOV        a,r0                         ;把R0的值给A
  147.         CPL        a                          ;A值取反   
  148.         MOV        r0,a
  149.         RETI
  150. dat1:
  151. db 3bh,20h,3bh,20h,30h,20h,33h,20h,3bh,80h,0ffh
  152. db 3bh,20h,3bh,20h,26h,20h,2bh,20h,26h,80h,0ffh
  153. db 26h,20h,26h,20h,20h,20h,26h,20h,2bh,20h,2bh,20h,30h,20h,33h,10h,33h,10h
  154. db 3bh,60h,40h,20h,4ch,80h,0ffh
  155. db 3bh,20h,3bh,20h,30h,20h,33h,20h,3bh,80h,0ffh
  156. db 3bh,20h,3bh,20h,26h,20h,2bh,20h,26h,80h,0ffh
  157. db 26h,20h,26h,20h,20h,20h,26h,20h,2bh,20h,2bh,20h,2bh,20h,30h,20h
  158. db 33h,20h,3bh,20h,3bh,20h,40h,2bh,3bh,80h,0ffh
  159. db 19h,20h,1ch,40h,26h,20h,19h,20h,1ch,40h,26h,20h,0ffh
  160. db 20h,20h,1ch,20h,1ch,20h,20h,20h,26h,80h,0ffh
  161. db 19h,20h,1ch,40h,26h,20h,19h,20h,1ch,40h,26h,20h,0ffh
  162. db 20h,20h,1ch,20h,1ch,20h,20h,20h,26h,80h,0ffh
  163. db 2bh,20h,2bh,40h,3bh,20h,2bh,20h,2bh,40h,2bh,20h,0ffh
  164. db 26h,20h,2bh,20h,2bh,20h,30h,20h,2bh,80h,0ffh
  165. db 2bh,20h,2bh,40h,3bh,20h,30h,20h,30h,40h,2bh,20h,0ffh
  166. db 33h,20h,3bh,20h,3bh,20h,40h,20h,3bh,80h,0ffh,0ffh
  167. dat2:
  168. db 18h,30h,1ch,10h,20h,40h,1ch,10h
  169. db 18h,10h,20h,10h,1ch,10h,18h,40h
  170. db 1ch,20h,20h,20h,1ch,20h,18h,20h
  171. db 20h,80h,0ffh,20h,30h,1ch,10h,18h
  172. db 20h,15h,20h,1ch,20h,20h,20h,26h
  173. db 40h,20h,20h,2bh,20h,26h,20h,20h
  174. db 20h,30h,80h,0ffh,20h,20h,1ch,10h
  175. db 18h,10h,20h,20h,26h,20h,2bh,20h
  176. db 30h,20h,2bh,40h,20h,20h,1ch,10h
  177. db 18h,10h,20h,20h,26h,20h,2bh,20h
  178. db 30h,20h,2bh,40h,20h,30h,1ch,10h
  179. db 18h,20h,15h,20h,1ch,20h,20h,20h
  180. db 26h,40h,20h,20h,2bh,20h,26h,20h
  181. db 20h,20h,30h,80h,20h,30h,1ch,10h
  182. db 20h,10h,1ch,10h,20h,20h,26h,20h
  183. db 2bh,20h,30h,20h,2bh,40h,20h,15h
  184. db 1fh,05h,20h,10h,1ch,10h,20h,20h
  185. db 26h,20h,2bh,20h,30h,20h,2bh,40h       
  186. db 20h,30h,1ch,10h,18h,20h,15h,20h
  187. db 1ch,20h,20h,20h,26h,40h,20h,20h
  188. db 2bh,20h,26h,20h,20h,20h,30h,30h
  189. db 20h,30h,1ch,10h,18h,40h,1ch,20h
  190. db 20h,20h,26h,40h,13h,60h,18h,20h
  191. db 15h,40h,13h,40h,18h,80h,00h
  192. dat3:
  193. db 26h,20h,20h,20h,20h,20h,26h,10h,20h,10h,20h,80h,26h,20h,30h,20h       
  194. db 30h,20h,39h,10h,30h,10h,30h,80h,26h,20h,20h,20h,20h,20h,1ch,20h       
  195. db 20h,80h,2bh,20h,26h,20h,20h,20h,2bh,10h,26h,10h,2bh,80h,26h,20h       
  196. db 30h,20h,30h,20h,39h,10h,26h,10h,26h,60h,40h,10h,39h,10h,26h,20h       
  197. db 30h,20h,30h,20h,39h,10h,26h,10h,26h,80h,26h,20h,2bh,10h,2bh,10h       
  198. db 2bh,20h,30h,10h,39h,10h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,20h
  199. db 20h,10h,20h,10h,2bh,10h,26h,30h,30h,80h,18h,20h,18h,20h,26h,20h
  200. db 20h,20h,20h,40h,26h,20h,2bh,20h,30h,20h,30h,20h,1ch,20h,20h,20h
  201. db 20h,80h,1ch,20h,1ch,20h,1ch,20h,30h,20h,30h,60h,39h,10h,30h,10h
  202. db 20h,20h,2bh,10h,26h,10h,2bh,10h,26h,10h,26h,10h,2bh,10h,2bh,80h
  203. db 18h,20h,18h,20h,26h,20h,20h,20h,20h,60h,26h,10h,2bh,20h,30h,20h
  204. db 30h,20h,1ch,20h,20h,20h,20h,80h,26h,20h,30h,10h,30h,10h,30h,20h
  205. db 39h,20h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,10h,40h,10h,20h,10h
  206. db 20h,10h,2bh,10h,26h,30h,30h,80h,00h
  207. END
复制代码
回复

使用道具 举报

沙发
ID:261728 发表于 2017-12-14 20:30 | 只看该作者
/************************************************************************  
[文件名]  C51音乐程序(八月桂花)  
[功能]    通过单片机演奏音乐  
  
/**********************************************************************/   
#include <REG52.H>   
#include <INTRINS.H>   
//本例采用89C52, 晶振为12MHZ   
//关于如何编制音乐代码, 其实十分简单,各位可以看以下代码.   
//频率常数即音乐术语中的音调,而节拍常数即音乐术语中的多少拍;   
//所以拿出谱子, 试探编吧!   

sbit Beep =  P2^1 ;
   
unsigned char n=0;  //n为节拍常数变量   
unsigned char code music_tab[] ={   
0x18, 0x30, 0x1C , 0x10, //格式为: 频率常数, 节拍常数, 频率常数, 节拍常数,   
0x20, 0x40, 0x1C , 0x10,   
0x18, 0x10, 0x20 , 0x10,   
0x1C, 0x10, 0x18 , 0x40,   
0x1C, 0x20, 0x20 , 0x20,   
0x1C, 0x20, 0x18 , 0x20,   
0x20, 0x80, 0xFF , 0x20,   
0x30, 0x1C, 0x10 , 0x18,   
0x20, 0x15, 0x20 , 0x1C,   
0x20, 0x20, 0x20 , 0x26,   
0x40, 0x20, 0x20 , 0x2B,   
0x20, 0x26, 0x20 , 0x20,   
0x20, 0x30, 0x80 , 0xFF,   
0x20, 0x20, 0x1C , 0x10,   
0x18, 0x10, 0x20 , 0x20,   
0x26, 0x20, 0x2B , 0x20,   
0x30, 0x20, 0x2B , 0x40,   
0x20, 0x20, 0x1C , 0x10,   
0x18, 0x10, 0x20 , 0x20,   
0x26, 0x20, 0x2B , 0x20,   
0x30, 0x20, 0x2B , 0x40,   
0x20, 0x30, 0x1C , 0x10,   
0x18, 0x20, 0x15 , 0x20,   
0x1C, 0x20, 0x20 , 0x20,   
0x26, 0x40, 0x20 , 0x20,   
0x2B, 0x20, 0x26 , 0x20,   
0x20, 0x20, 0x30 , 0x80,   
0x20, 0x30, 0x1C , 0x10,   
0x20, 0x10, 0x1C , 0x10,   
0x20, 0x20, 0x26 , 0x20,   
0x2B, 0x20, 0x30 , 0x20,   
0x2B, 0x40, 0x20 , 0x15,   
0x1F, 0x05, 0x20 , 0x10,   
0x1C, 0x10, 0x20 , 0x20,   
0x26, 0x20, 0x2B , 0x20,   
0x30, 0x20, 0x2B , 0x40,   
0x20, 0x30, 0x1C , 0x10,   
0x18, 0x20, 0x15 , 0x20,   
0x1C, 0x20, 0x20 , 0x20,   
0x26, 0x40, 0x20 , 0x20,   
0x2B, 0x20, 0x26 , 0x20,   
0x20, 0x20, 0x30 , 0x30,   
0x20, 0x30, 0x1C , 0x10,   
0x18, 0x40, 0x1C , 0x20,   
0x20, 0x20, 0x26 , 0x40,   
0x13, 0x60, 0x18 , 0x20,   
0x15, 0x40, 0x13 , 0x40,   
0x18, 0x80, 0x00   
};   
   
void int0()  interrupt 1   //采用中断0 控制节拍   
{  TH0=0xd8;   
   TL0=0xef;   
   n--;   
}   
   
void delay (unsigned char m)   //控制频率延时   
{   
unsigned i=3*m;   
while(--i);   
}   
   
void delayms(unsigned char a)  //豪秒延时子程序   
{   
  while(--a);                  //采用while(--a) 不要采用while(a--); 各位可编译一下看看汇编结果就知道了!   
}   
   
void main()   
{ unsigned char p,m;   //m为频率常数变量   
  unsigned char i=0;   
  TMOD&=0x0f;   
  TMOD|=0x01;   
  TH0=0xd8;TL0=0xef;   
  IE=0x82;   
play:   
   while(1)   
    {   
    a: p=music_tab[i];   
       if(p==0x00)       { i=0, delayms(1000); goto play;}     //如果碰到结束符,延时1秒,回到开始再来一遍   
       else if(p==0xff)  { i=i+1;delayms(100),TR0=0; goto a;}  //若碰到休止符,延时100ms,继续取下一音符   
            else         {m=music_tab[i++], n=music_tab[i++];}  //取频率常数 和 节拍常数   
             TR0=1;                                             //开定时器1   
           while(n!=0) Beep=~Beep,delay(m);                         //等待节拍完成, 通过P1口输出音频(可多声道哦!)   
       TR0=0;                                             //关定时器1   
    }   
}  
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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