DIY编程器网

标题: 单片机音乐盒DIY—生日快乐歌程序 [打印本页]

作者: liyf    时间: 2012-1-16 16:45
标题: 单片机音乐盒DIY—生日快乐歌程序
基于STC89C52单片机的七彩迷你音乐盒。在单片机最小系统的基础上,对其他两个I/O口连接硬件电路。P1.0接一个七彩快闪LED灯。P1.5口接一个NPN型三极管的放大电路,再连接一个无源蜂鸣器(用来播放乐曲)。
这样一个迷你音乐盒就完成了。硬件电路非常简单,其中单片机任意一个I/O口都可以作为乐曲的输出,信号经过NPN三极管放大驱动蜂鸣器发出电子乐曲。
紧接着就是为单片机设计运行的程序了,这里我用汇编写了一段《生日快乐》的程序。大家可以仿照,我的思路修改乐曲。
DIY手记:用C52这么大块头的单片机,确实很浪费。因为一共有32个I/O引脚,设计音乐盒只用了其中的两个,非常的浪费。大家可以用其他的单片机代替,例如16引脚的单片机。价格相对会便宜一点。
单片机汇编源代码分享:
  org 0000h
  ajmp main
  org 000bh
  jmp tim0
  org 0030h
  main: ;主程序
  setb p1.1
  clr p1.4
  setb p3.0
  mov tmod,#01h ;设定时方式
  mov ie,#82h ;开中断
  start0:
  mov 30h,#00h ;
  next:mov a,30h
  mov dptr,#table
  movc a,@a+dptr ;查表取音调和节拍
  mov r2,a
  jz end0 ;为零,不进行处理.
  anl a,#0fh
  mov r5,a ;将节拍存入R5
  mov a,r2
  swap a
  anl a,#0fh
  jnz sing ;根据音调决定是否演奏.
  clr tr0
  jmp d1
  sing:dec a
  mov 22h,a ;将音调存入22H.
  rl a
  mov dptr,#table1
  movc a,@a+dptr ;根据音调决定定时器初值.
  mov th0,a ;放入TH0
  mov 21h,a
  mov a,22h
  rl a
  inc a
  movc a,@a+dptr
  mov tl0,a ;放入TL0
  mov 20h,a
  setb tr0 ;启动定时
  d1: call delay
  inc 30h
  jmp next
  end0:clr tr0
  jmp start0
  tim0: ;定时器中断服务程序
  push acc
  push psw
  mov tl0,20h ;重赋初值.
  mov th0,21h
  cpl p1.7
  pop psw
  pop acc
  retidelay:mov r7,#02h ;延时子程序
  d2: mov r4,#130
  d3: mov r3,#248
  djnz r3,$
  djnz r4,d3
  djnz r7,d2
  djnz r5,delay
  ret
  table1: ;决定音调的定时初值.
  dw 64260,64400,64524,64580
  dw 64684,64777,64820,64898
  dw 64968,65030,65058,65110
  dw 65157,65178,65217
  table: ;决定音调和节拍的表格,不同的歌曲只是此表不同
  ;1
  db 82h,01h,81h,94h,84h,0b4h,0a4h,04h,82h,01h,81h,94h,84h,0c4h,0b4h,04h
  ;2
  db 82h,01h,81h,0f4h,0d4h,0b4h,0a4h,94h,0e2h,01h,0e1h,0d4h,0b4h,0c4h,0b4h,04h
  ;3
  db 82h,01h,81h,94h,84h,0b4h,0a4h,04h,82h,01h,81h,94h,84h,0c4h,0b4h,04h
  ;4
  db 82h,01h,81h,0f4h,0d4h,0b4h,0a4h,94h,0e2h,01h,0e1h,0d4h,0b4h,0c4h,0b4h,04h,00
  end
?
                          
                       
                          
                               




欢迎光临 DIY编程器网 (http://diybcq.com/) Powered by Discuz! X3.2