找回密码
 立即注册

QQ登录

只需一步,快速开始

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

程序错误 keil+proteus仿真AT89C51单片机实现蜂鸣器播放音乐

[复制链接]
跳转到指定楼层
楼主
AT89C51单片机实现蜂鸣器播放音乐
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include <reg51.h>

  2. sbit SPK = P2^7;

  3. void main(void)
  4. {
  5. /* NOTE: this program can not work correctly */
  6. /*
  7. #pragma asm
  8. ORG                001BH                                        ;timer/counter 1 interrupt entry
  9.                 mov                th1, r1                        ;restore timer initial count
  10.                 mov                tl1, r0                        ;
  11. ;                setb        p3.7                        ;
  12.                 cpl                p2.7                        ;p1.0 output square wave
  13.                 reti                                        ;
  14. ORG                100H                                        ;main function
  15. ASM_ENTRY:
  16.                 mov                tmod, #01H                ;timer/counter 1 works in mode 1
  17.                 mov                ie, #88H                ;enable timer/counter 1 interrupt
  18.                 mov                dptr, #TAB                ;table start address
  19. LOOP:        
  20.                 clr                a                                ;
  21.                 movc        a, @a + dptr        ;read table item
  22.                 mov                r1, a                        ;high 8 bits of timer/counter 1 saves in r1
  23.                 inc                dptr                        ;
  24.                 clr                a                                ;
  25.                 movc        a, @a+dptr                ;read next table item
  26.                 mov                r0, a                        ;low 8 bits of timer/counter 1 saves in r0
  27.                 orl                a, r1                        ;
  28.                 jz                NEXT0                        ;all 0 indicating a silence music symbol
  29.                 mov                a, r0                        ;
  30.                 anl                a, r1                        ;
  31.                 cjne        a, #0FFH, NEXT        ;all 1 indicating a end music symbol
  32.                 sjmp        ASM_ENTRY                ;begin to play another music cycle
  33. NEXT:
  34.                 mov                th1, r1                        ;store in timer/counter 1
  35.                 mov                tl1, r0                        ;
  36.                 setb        tr1                                ;run timer/counter 1
  37.                 sjmp        NEXT1                        ;
  38. NEXT0:        clr                tr1                                ;
  39. NEXT1:        clr                a                                ;
  40.                 inc                dptr                        ;
  41.                 movc        a, @a + dptr        ;read delay constant
  42.                 mov                r2, a                        ;
  43. LOOP1:
  44.                 lcall        D200                        ;call delay 200ms subroutine
  45.                 djnz        r2, LOOP1                ;control delay count
  46.                 inc                dptr                        ;
  47.                 ajmp        LOOP                        ;process next music symbol
  48. D200:        mov                r4, #81H                ;delay 20ms subroutine
  49. D200B:        mov                a, #0FFH                ;
  50. D200A:        dec                a                                ;
  51.                 jnz                D200A                        ;
  52.                 dec                r4                                ;
  53.                 cjne        r4, #00H, D200B        ;
  54.                 ret                                                ;
  55. TAB:
  56.                 DB                0FEH, 25H, 02H, 0FEH, 98H, 08H;
  57. ;                DB                0FEH, 84H, 02H, 0FEH, 84H, 02H;
  58. ;                DB                0FEH, 84H, 04H, 0FEH, 25H, 04H;
  59. ;                DB                0FEH, 25H, 02H, 0FEH, 84H, 02H;
  60. ;                DB                0FEH, 0C0H, 04H, 0FEH, 0C0H, 04H;
  61. ;                DB                0FEH, 98H, 02H, 0FEH, 84H, 02H;
  62. ;                DB                0FEH, 57H, 08H, 00H, 00H, 04H;
  63. ;                DB                0FFH, 0FFH;
  64. #pragma endasm
  65. */

  66. /* play music using polling method */
  67. /*
  68. #pragma asm
  69. ORG                0
  70.                 ljmp        ASM_ENTRY
  71. ORG                0030H
  72. ASM_ENTRY:
  73.                 mov                r3, #0                        ;used as a index, pointer to the begin of a music score
  74. READ_NOTE:                                                ;read currect indexed music note.
  75.                 mov                dptr, #SCORE        ;load music score address
  76.                 mov                a, r3                        ;
  77.                 movc        a, @a + dptr        ;read note
  78.                 jz                ASM_ENTRY                ;0 is the end music symbol then loop
  79.                 mov                r7, a                        ;note saves in r7
  80.                 inc                r3                                ;ready for reading note time
  81.                 mov                a, r3                        ;
  82.                 movc        a, @a + dptr        ;read time
  83.                 mov                r2, a                        ;time saves in r2
  84.                 acall        PLAY_NOTE                ;
  85.                 inc                r3                                ;ready for reading next note
  86.                 sjmp        READ_NOTE                ;

  87.                 mov                a, r2                        ;get time
  88.                 jnz                PLAY_NOTE
  89.                 acall        DELAY                        ;stop a second for replay
  90. PLAY_NOTE:
  91.                 acall        ONE_EIGHT                ;
  92.                 djnz        r2, PLAY_NOTE        ;
  93.                 ret
  94. ONE_EIGHT:
  95.                 mov                a, r7                        ;get note
  96.                 mov                dptr, #TONE_FREQUENCY        ;
  97.                 movc        a, @a + dptr        ;
  98.                 mov                r4, a                        ;
  99.                 mov                a, r7                        ;
  100.                 mov                dptr, #TONE_LENGTH                ;
  101.                 movc        a, @a + dptr        ;
  102.                 mov                r5, a                        ;
  103. DELAY:
  104.                 acall        SOUND                        ;
  105.                 djnz        r5, DELAY                ;
  106.                 ret                                                ;
  107. SOUND:
  108.                 setb        SPK                                ;
  109.                 acall        SDELAY                        ;
  110.                 clr                SPK                                ;
  111.                 acall        SDELAY                        ;
  112. ;                cpl                SPK                                ;add begin
  113. ;                acall         SDELAY                        ;add end
  114.                 ret                                                ;
  115. SDELAY:
  116.                 mov                a, r4                        ;
  117.                 mov                r0, a                        ;
  118. D1:                mov                r1, #03H                ;

  119. D2:                nop                                                ;
  120.                 djnz        r1, D2                        ;

  121.                 djnz        r0, D1                        ;
  122.                 ret                                                ;

  123. _DELAY_US:                                                ;delay for 8us
  124.                 nop;nop;                                ;4 * nop + call + ret =
  125.                 nop;nop;                                ;4us + 2us + 2us = 8us
  126.                 ret                                                ;
  127. DELAY_US:                                                ;granularity is 10us
  128. LOOP:
  129.                 lcall        _DELAY_US                ;_DELAY + djnz = 8us + 2us = 10us
  130.                 djnz        r5, LOOP                        ;argument is saved in r5
  131.                 ret                                                ;real is n * 10us + call + ret = 10n + 4us
  132. _DELAY_MS:
  133. ;                push        r5                                ;protect r5 previous value
  134.                 mov                r5, #98                        ;(980us + 4us) + 8us = 992us
  135.                 lcall        DELAY_US                ;
  136.                 nop;nop;nop;                        ;
  137.                 nop;nop;nop;                        ;
  138.                 ret                                                ;
  139. ;                pop                r5                                ;restore r5 previous value

  140. DELAY_MS:
  141.                 mov                dptr, #DELAY_PARAMETER        ;which number = 250 * r7 + r6
  142.                 mov                a, #0                        ;
  143.                 movc        a, @a + dptr        ;0-250
  144.                 mov                r6, a                        ;
  145.                 inc                a                                ;
  146.                 movc        a, @a + dptr        ;0-3, in which domain[250n, 250n+250)
  147.                 mov                r7, a                        ;
  148. ;                push        r7                                ;
  149. ;                push        r6                                ;

  150. LOOP1:        mov                a, r7                        ;
  151.                 jz                DONE1                        ;
  152.                 dec                r7                                ;
  153. LOOP2:        mov                a, r6                        ;
  154.                 jz                DONE2                ;
  155.                 dec                r6                                ;
  156.                 acall        _DELAY_MS                ;loop2 one iterate time = 992us + 8us = 1000us
  157.                 sjmp        LOOP2                        ;
  158. DONE2:
  159.                 mov                r6, #250                ;
  160.                 sjmp        LOOP1                        ;
  161. DONE1:
  162. ;                pop                r6                                ;
  163. ;                pop                r7                                ;
  164.                 ret                                                ;

  165. DELAY_PARAMETER:
  166. DW 00H                                                        ;0 - 1000, low 8 bits represents 0-250, bit 8-9 represents a select.
  167.                
  168. TONE_LENGTH:
  169. DS 1DH                                                         ;reserve 29 bytes
  170. DB 15H,16H,00
  171. DB 19H,00H,1CH,00H,1FH,21H,00H,25H
  172. DB 00H,29H,2CH,00H,31H,34H,37H,00H
  173. DB 3EH,41H,00H,49H,00H,52H,57H,00H
  174. DB 62H
  175.                
  176. TONE_FREQUENCY:
  177. DS 1DH                                                        ;reserve 29 bytes
  178. DB 7EH,77H,00H
  179. DB 6AH,00H,5EH,00H,54H,4FH,00H,46H
  180. DB 00H,3FH,3BH,00H,35H,32H,2FH,00H
  181. DB 2AH,27H,00H,23H,00H,1FH,1DH,0C0H
  182. DB 1AH

  183. SCORE:
  184. DW 2202H,2902H,2902H,2902H,2906H,2702H ;
  185. DW 2502H,2702H,2502H,2402H,2208H ;
  186. DW 2E02H,2E02H,2E02H,2E02H,2E06H,2C02H ;
  187. DW 2902H,2C02H,2D02H,2A02H,2908H ;
  188. DW 2902H,2E02H,2E02H,2C02H,2906H,2702H ;
  189. DW 2502H,2702H,2502H,2402H,2206H,1D02H ;
  190. DW 1D02H,2502H,2502H,2402H,2206H,2902H ;
  191. DW 2702H,2502H,2402H,2002H,2208H ;
  192. DW 0000H                                
  193. #pragma endasm
  194. */

  195. /* play music using interrupt method */

  196. /*
  197. #pragma asm
  198. ;                spk eql p2.7
  199. ORG                0
  200.                 ljmp        ASM_ENTRY
  201. ORG                0030H
  202. ASM_ENTRY:
  203.                 mov                r3, #00H                ;table index, clear to 0
  204. NEXT:        
  205.                 mov                a, r3
  206.                 mov                dptr, #TABLE        ;load table start address
  207.                 movc        a, @a + dptr        ;
  208.                 jz                ASM_ENTRY                ;0 is the end music symbol then loop
  209.                 mov                r7, a                        ;r7 is current searched code byte
  210.                 inc                r3                                ;read next code byte
  211.                 mov                a, r3                        ;
  212.                 movc        a, @a + dptr        ;
  213.                 mov                r2, a                        ;next byte stores in r2
  214.                 acall        SONG                        ;
  215.                 inc                r3                                ;
  216.                 sjmp        NEXT                        ;
  217. SONG:
  218.                 mov                a, r2                        ;get rhythm
  219.                 rl                a                                ;
  220.                 jnz                KEEP                        ;
  221.                 mov                a, #01H                        ;
  222. KEEP:
  223.                 mov                r2, a                        ;
  224. REPEAT:
  225.                 acall        ONE_EIGHT                ;
  226.                 djnz        r2, REPEAT                ;
  227.                 ret                                                ;
  228. ONE_EIGHT:                                                ;generate one eight        delay
  229.                 mov                a, r7                        ;
  230.                 mov                dptr, #DELAY_T        ;
  231.                 movc        a, @a + dptr        ;
  232.                 mov                r4, a                        ;
  233.                 mov                a, r7                        ;
  234.                 mov                dptr, #S_PARA        ;
  235.                 movc        a, @a + dptr        ;
  236.                 mov                r5, a
  237. NEXT_CYC:
  238.                 acall        SOUND
  239.                 djnz        r5, NEXT_CYC        ;
  240.                 ret                                                ;
  241. SOUND:
  242.                 setb        SPK                                ;
  243.                 acall        SDELAY                        ;
  244.                 clr                SPK                                ;
  245.                 acall        SDELAY                        ;
  246.                 ret                                                ;
  247. SDELAY:
  248.                 mov                a, r4                        ;
  249.                 mov                r0, a                        ;
  250. XL2:        mov                r1, #03H                ;
  251. DL1:        
  252.                 nop                                                ;
  253.                 djnz        r1, DL1                        ;
  254.                 djnz        r0, XL2                        ;
  255.                 ret                                                ;
  256. S_PARA:
  257. ;DS 01H
  258. DS 1DH
  259. DB 15H,16H,00
  260. DB 19H,00H,1CH,00H,1FH,21H,00H,25H
  261. DB 00H,29H,2CH,00H,31H,34H,37H,00H
  262. DB 3EH,41H,00H,49H,00H,52H,57H,00H
  263. DB 62H

  264. DELAY_T:
  265. DS 1DH
  266. DB 7EH,77H,00H
  267. DB 6AH,00H,5EH,00H,54H,4FH,00H,46H
  268. DB 00H,3FH,3BH,00H,35H,32H,2FH,00H
  269. DB 2AH,27H,00H,23H,00H,1FH,1DH,0C0H
  270. DB 1AH

  271. TABLE:
  272. DW 2202H,2902H,2902H,2902H,2906H,2702H ;
  273. DW 2502H,2702H,2502H,2402H,2208H ;
  274. DW 2E02H,2E02H,2E02H,2E02H,2E06H,2C02H ;
  275. DW 2902H,2C02H,2D02H,2A02H,2908H ;
  276. DW 2902H,2E02H,2E02H,2C02H,2906H,2702H ;
  277. DW 2502H,2702H,2502H,2402H,2206H,1D02H ;
  278. DW 1D02H,2502H,2502H,2402H,2206H,2902H ;
  279. DW 2702H,2502H,2402H,2002H,2208H ;
  280. DW 0000H        
  281. #pragma endasm
  282. */

  283. }
复制代码

所有资料51hei提供下载:
musicPlayer.zip (73.23 KB, 下载次数: 73)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:968613 发表于 2022-3-3 10:13 | 只看该作者
嘛用都没有啊,只有嗡嗡的声音
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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