久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 13950|回復: 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空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:968613 發表于 2022-3-3 10:13 | 只看該作者
嘛用都沒有啊,只有嗡嗡的聲音
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 人人做人人澡人人爽欧美 | 成人av影院| 亚洲视频免费在线看 | 美女黄18岁以下禁止观看 | 日本久久网 | 亚洲午夜精品 | 国产一区二区自拍 | 亚洲一区二区三区四区在线观看 | 九九亚洲 | 久久99精品久久久97夜夜嗨 | 国产精品久久久久久久久久免费看 | 九九综合 | 午夜一区二区三区在线观看 | 精品国产一区二区三区四区在线 | 午夜影院在线观看 | 一区二区蜜桃 | 白浆在线 | 99视频免费 | 久久国产精品免费一区二区三区 | 国产一区三区在线 | 亚洲日本中文字幕在线 | 日一区二区 | 久久久精品久 | 日韩视频一区在线观看 | 欧美13videosex性极品 | 99re6热在线精品视频播放 | 亚洲国产精品va在线看黑人 | 一区二区三区不卡视频 | 午夜免费成人 | av一级毛片 | 精品一区二区三区在线视频 | 国产高清精品在线 | 在线播放中文字幕 | 日日操视频 | 欧美激情精品久久久久 | 亚洲成人免费视频在线观看 | 欧美一级片 | 国产综合在线视频 | 最新国产精品精品视频 | 97国产精品视频人人做人人爱 | 久久久这里都是精品 |