找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于AT89c51单片机的音乐盒制作 proteus仿真加源码

  [复制链接]
跳转到指定楼层
楼主
1. 有时会出现程序一点错误也没有,但就是不能正常运行的现象,最后我们发行是因为程序中有的指令书写得不规范导致的,例如有的 RET 返回指令一定要按正确格式书写或在两 行指令间最好不要留空行。

2. 程序中的跳转指令的运用很重要,为保险起见,都用 LJMP,我们就遇到过跳转指令用错 程序无法正常运行的现象。当用 JNZ 指令时,跳转范围比较少,这时要用一个标号中转。

3. 编程时要注意,在程序开始时,要写入各定时器中断的入口地址。

4. 编程过程中要注意加注释或分割线,否则,在程序过长时容易变得很乱,不便于查找或更改。

5. 程序的结构要设计的合理,避免上下乱调用的现象,这样会使程序更加清晰化。

6. 编程前要加流程图, 这样会使思路清晰, 例如数字音乐盒的设计思路完全可以按着 MP3 的工作方式列写流程图。

7 LCD 计时正常显示的解决办法:

a. 两个定时器同时工作,存在中断时序问题,刚开始时我们把定时器 1 设定在方式 3,计 250us,由于定时中断过于频繁,使 CPU 负载过大,导致音乐不能正常播放,时间不能正常 显示。解决办法:将定时器 1 设定在工作方式 116 位计数,计 50ms,效果有很大改观。但还有问题。

b. 当音乐为全 4 拍起始时,此时音乐节奏与定时器 T1 中断频率错开,LCD 显示和音乐播 放都会好一些。

c. 另外,在歌曲中,当遇到一个音符发音为 4 拍,在编曲中为*CH,托因时间较长,当定 时器 T1 此时来中断时,就会对歌曲播放产生影响,若改为发音一拍,中断对歌曲播放影响 减弱,但音乐效果变差。

d. 改进方案:若采用可以定时时间更长的单片机,可以避免所有问题。



单片机源程序(汇编语言):
  1. RS   BIT   P2.0        ;引脚定义,定义液晶显示端口标号
  2. RW   BIT   P2.1
  3. E    BIT   P2.2
  4. L50MS   EQU   60H        ;工作内存定义
  5. L1MS    EQU   61H
  6. L250MS  EQU   62H
  7. SEC     EQU   65H
  8. MIN     EQU   64H
  9. HOU     EQU   63H
  10.         ORG         0000H
  11.         LJMP         MAIN
  12.         ORG         000BH  ;定时器T0溢出中断入口地址
  13.         LJMP         TT0
  14.         ORG         001BH  ; 定时器T1溢出中断入口地址
  15. LJMP         T1INT
  16.         ORG         1000H
  17. MAIN:                   ;液晶初始化
  18.            MOV           SP,#70H   
  19.        MOV           P0,#01H  ;清屏
  20.        CALL          DISPLAY
  21.        MOV           P0,#38H  ;8位,2行显示
  22.        LCALL          DISPLAY
  23.        MOV           P0,#0FH  ;屏显on,光标on,闪烁on
  24.        LCALL          DISPLAY
  25.        MOV           P0,#06H  ;计数地址加1,显示幕on
  26.        LCALL          DISPLAY
  27. LCALL         INITIL     ;内存初始化
  28. WAIT:  LCALL         KEY   ;键盘扫描,是否有键按下,否则等待
  29. LCALL         MODD         
  30.               LJMP         WAIT
  31. KEY:          NOP
  32.               NOP
  33.               LCALL         KS
  34.               JNZ         K1              ;有按键转到K1
  35.               LCALL         KAIJI
  36.               LCALL         SOP
  37. XN:           LJMP         KEY
  38. K1:           LCALL         MODD
  39.               LCALL         MODD
  40.               LCALL         KS
  41.               JNZ         K2
  42.               LJMP         KEY
  43. K2:           MOV         R2,#0FEH   ;读键盘
  44.               MOV         R4,#00H
  45. K3:           MOV         A,R2
  46.               MOV         P1,A
  47.               MOV         A,P1
  48. JB             ACC.4,L1     ;为1跳转,第一行无按键
  49.               MOV         A,#00H
  50.               LJMP         LK
  51. L1:           JB         ACC.5,L2
  52.               MOV         A,#04H
  53.               LJMP         LK
  54. L2:           JB         ACC.6,L3
  55.               MOV         A,#08H
  56.               LJMP         LK
  57. L3:           JB         ACC.7,NEXT1
  58.               MOV         A,#0CH
  59. LK:           ADD         A,R4
  60.               PUSH         ACC
  61. K4:           LCALL         DELAY1   ;若同时有其他按键,则等待
  62.               LCALL         KS
  63.               JNZ         K4
  64.               MOV         R3,#07H     
  65.               CLR         A
  66.               MOV         R0,#30H
  67.               MOV         R1,#31H
  68. MM1:          MOV         A,@R1
  69.               MOV         @R0,A
  70.               INC         R0
  71.               INC         R1
  72.               DJNZ         R3,MM1
  73.               POP         ACC
  74.               MOV         @R0,A
  75.               RET
  76. NEXT1:         INC         R4           ;列扫描
  77.                MOV         A,R2
  78.                JNB         ACC.3,N2
  79.                LJMP         N1
  80. N2:            LJMP         KEY
  81. N1:            RL         A
  82.                MOV         R2,A
  83.                LJMP         K3
  84. KS:           MOV         A,#0F0H     ;判断P1口
  85.               MOV         P1,A
  86.               NOP
  87.               NOP
  88.               MOV         A,P1
  89.               CPL         A
  90.               ANL         A,#0F0H
  91.               RET
  92. DELAY1:SETB         RS0
  93. DL:     MOV         R5,#0AH
  94. DL2:    MOV         R6,#63
  95. DL3:    NOP
  96.         NOP
  97.         DJNZ         R6,DL3
  98.         DJNZ         R5,DL2
  99.         CLR         RS0     
  100.         RET
  101. INITIL:                    ;30H-37H初值为零
  102.         MOV         R3,#08H
  103.               MOV         R0,#30H
  104. M1:           MOV         @R0,#00H
  105.               INC         R0
  106.               DJNZ         R3,M1         
  107.               RET
  108. MODD:                     ;显示
  109.         MOV           P0,#8EH
  110.         CALL          DISPLAY         
  111.         MOV         A,37H
  112.         MOV         DPTR,#TABLE3         
  113.         MOVC         A,@A+DPTR
  114.         CALL         WRITE2      
  115.         RET
  116. KAIJI:          MOV         A,37H      ;开机提示字
  117.         CJNE         A,#0FH,DFF
  118.         MOV           P0,#80H    ;设光标地址
  119.         CALL          DISPLAY
  120.         MOV           DPTR,#TABLE1;写数据
  121.         CALL          WRITE1         
  122. DFF:            RET
  123. ;按键值播放歌曲
  124. SOP:           MOV         A,37H
  125.                CJNE         A,#01H,A11
  126.                LCALL         MODD
  127.                MOV         52H,#HIGH TABLE10
  128.                MOV         53H,#LOW TABLE10
  129.                LCALL         INITILE2
  130.                LCALL         MAIN0
  131. A11:           CJNE         A,#02H,A22
  132.                LCALL         MODD
  133.                MOV         52H,#HIGH TABLE20
  134.                MOV         53H,#LOW TABLE20
  135.                LCALL         INITILE2      
  136.                lcall         MAIN0
  137. A22:           CJNE         A,#03H,A33
  138.                LCALL         MODD
  139.                MOV         52H,#HIGH TABLE30
  140.                MOV         53H,#LOW TABLE30
  141.                LCALL         INITILE2      
  142.                lcall         MAIN0      
  143. A33:           CJNE         A,#04H,A44
  144.                LCALL         MODD
  145.                MOV         52H,#HIGH TABLE40
  146.                MOV         53H,#LOW TABLE40
  147.                LCALL         INITILE2      
  148.                lcall         MAIN0
  149. A44:           CJNE         A,#05H,A55
  150.                LCALL         MODD
  151.                MOV         52H,#HIGH TABLE50
  152.                MOV         53H,#LOW TABLE50
  153.                LCALL         INITILE2      
  154.                lcall         MAIN0
  155. A55:           CJNE         A,#06H,A66
  156.                LCALL         MODD
  157.                MOV         52H,#HIGH TABLE60
  158.                MOV         53H,#LOW TABLE60
  159.                LCALL         INITILE2      
  160.                lcall         MAIN0   
  161. A66:           CJNE         A,#07H,A77
  162.                LCALL         MODD
  163.                MOV         52H,#HIGH TABLE70
  164.                MOV         53H,#LOW TABLE70
  165.                LCALL         INITILE2      
  166.                lcall         MAIN0      
  167. A77:           CJNE         A,#08H,A88
  168.                LCALL         MODD
  169.                MOV         52H,#HIGH TABLE80
  170.                MOV         53H,#LOW TABLE80
  171.                LCALL         INITILE2      
  172.                lcall         MAIN0
  173. A88:           CJNE         A,#09H,A99
  174.                LCALL         MODD
  175.                MOV         52H,#HIGH TABLE90
  176.                MOV         53H,#LOW TABLE90
  177.                LCALL         INITILE2      
  178.                lcall         MAIN0      
  179. A99:           CJNE         A,#0AH,AAA
  180.                LCALL         MODD
  181.                MOV         52H,#HIGH TABLE100
  182.                MOV         53H,#LOW TABLE100
  183.                LCALL         INITILE2      
  184.                lcall         MAIN0      
  185. AAA:           RET           
  186. INITILE2:
  187.            MOV         L50MS,#20
  188.            MOV         L1MS,#00H
  189.            MOV         L250MS,#00H
  190.            MOV         SEC,#00H
  191.            MOV         MIN,#00H
  192.            MOV         HOU,#00H
  193. MOV         A,HOU
  194.           MOV         B,#10
  195.           DIV         AB
  196.           ADD         A,#30H         ;将BCD吗转化为ASIIC码
  197. MOV           P0,#0C8H    ;显示小时十位
  198.           CALL          DISPLAY
  199.           CALL          WRITE2
  200.           MOV         A,B
  201.           ADD         A,#30H
  202.           MOV           P0,#0C9H    ;显示小时个位
  203.           CALL          DISPLAY
  204.           CALL         WRITE2
  205.           MOV         A,#3AH
  206.           MOV           P0,#0DH    ;显示冒号
  207.           CALL          DISPLAY
  208.           CALL         WRITE2
  209.           MOV         A,MIN
  210.           MOV         B,#10
  211.           DIV         AB
  212.           ADD         A,#30H
  213.           MOV           P0,#0CBH    ;显示分十位
  214.           CALL          DISPLAY
  215.           CALL         WRITE2
  216.           MOV         A,B
  217.           ADD         A,#30H
  218.           MOV           P0,#0CCH    ;显示分个位
  219.           CALL          DISPLAY
  220.           CALL         WRITE2
  221.           MOV         A,#3AH
  222.           MOV           P0,#0CDH    ;显示冒号
  223.           CALL          DISPLAY
  224.           CALL         WRITE2
  225.           MOV         A,SEC
  226.           MOV         B,#10
  227.           DIV         AB
  228.           ADD         A,#30H
  229.     MOV           P0,#0CEH    ;显示秒十位
  230.           CALL          DISPLAY
  231.           CALL         WRITE2
  232.           MOV         A,B
  233.           ADD         A,#30H
  234.           MOV           P0,#0CFH    ;显示秒个位
  235.           CALL          DISPLAY
  236.           CALL         WRITE2
  237.           MOV           P0,#0C0H    ;设光标地址
  238.           CALL          DISPLAY
  239.           MOV           DPTR,#TABLE2;写数据
  240.           CALL          WRITE1         
  241.           RET
  242. DISPLAY:         CLR           RS  ;写指令
  243.                 CLR           RW
  244.                 CLR           E
  245.                 LCALL          DELAY
  246.                 SETB          E
  247.                 RET
  248. WRITE1:         MOV           R1,#00H     ;写数据
  249. A1:             MOV           A,R1
  250.                 MOVC          A,@A+DPTR
  251.                 CALL          WRITE2
  252.                 INC           R1
  253.                 CJNE          A,#0FEH,A1   ;未到字符串末尾继续
  254.                 RET
  255. WRITE2:         MOV           P0,A
  256.                 SETB          RS
  257.                 CLR           RW
  258.                 CLR           E
  259.                 CALL          DELAY
  260.                 SETB          E
  261.                 RET
  262. DELAY:          MOV           R4,#05
  263. D1:             MOV           R5,#0FFH
  264.                 DJNZ          R5,$
  265.                 DJNZ          R4,D1
  266.                 RET         
  267. TAB:    DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H
  268.         DB 80H,90H,88H,83H,0C6H,0A1H,86H,8EH
  269. TAB1:   DB 89H,86H,0C7H,0C7H,0C0H
  270. TAB2:   DB 0C6H,88H,0C0H
  271. TABLE1: DB    'WELCOM HERE',0FEH
  272. TABLE2: DB    'DFF WB ',0FEH
  273. TABLE4: DB    'CAU',0FEH
  274. TABLE3: DB    30H,31H,32H,33h   
  275.         DB    34H,35H,36H,37H
  276.         DB    38h,39H,41H,42H
  277.         DB    43H,44H,45H,46H                               
  278. MAIN0:        MOV         TMOD,#11H     ;播放歌曲程序      
  279.             MOV         IE,#8aH
  280.         MOV TH1,  #3cH
  281.         MOV TL1,  #0b0H          
  282.               LCALL         KS
  283.             JNZ         TTM12           
  284.             MOV         40H,#00H
  285. NEXT20: MOV         A,40H
  286.             MOV         DPH,52H
  287.             MOV         DPL,53H
  288.             MOVC        A,@A+DPTR
  289.             MOV         R2,A
  290.             JZ         STOP
  291.             ANL         A,#0FH
  292.             MOV         R1,A
  293.             MOV         A,R2
  294.             SWAP         A
  295.             ANL         A,#0FH
  296.             JNZ         SING
  297.             CLR         TR0
  298.             JMP         W1
  299. SING:   DEC         A
  300.             MOV         22H,A
  301.             RL         A
  302.             MOV         DPTR,#TABLE00
  303.             MOVC         A,@A+DPTR
  304.             MOV         TH0,A
  305.             MOV         21H,A
  306.             MOV         A,22H
  307.             RL         A
  308.             INC         A
  309.             MOVC         A,@A+DPTR
  310.             MOV         TL0,A
  311.             MOV         20H,A
  312.             SETB         TR0
  313.             SETB          TR1
  314. W1:     LCALL         DELAY30
  315.             INC         40H
  316.             LCALL         KS                ;有键跳出
  317.             JNZ         STOP
  318.             LJMP         NEXT20
  319. STOP:  CLR         TR0
  320.             CLR         TR1
  321.         LJMP          MAIN0
  322. TTM12: LCALL         K2
  323.             MOV         A,37H
  324.             CJNE         A,#0EH,TTM13
  325.             CLR         TR1
  326.                LCALL         DELAY1
  327. TTM120:        LCALL         KS
  328.             LCALL         DELAY1
  329.             JZ         TTM120
  330.         LCALL         K2
  331.             MOV         A,37H
  332.             CJNE         A,#0EH,TTM120
  333.             SETB         TR1
  334.         LJMP         NEXT20
  335. TTM13: CJNE        A,#0CH,TTM14
  336.             MOV         A,52H
  337.             INC         A
  338.             MOV         52H,A
  339.             MOV         A,53H
  340.             INC         A
  341.             MOV         53H,A
  342.             MOV         A,36H
  343.             INC         A
  344.             MOV         37H,A
  345.             LJMP         TTM2
  346. TTM14:        CJNE        A,#0DH,TTM2
  347.             MOV         A,52H
  348.             DEC         A
  349.             MOV         52H,A
  350.             MOV         A,53H
  351.             DEC         A
  352.             MOV         53H,A
  353.             MOV         A,36H
  354.             DEC         A
  355.             MOV         37H,A
  356. TTM2:        RET
  357. TT0:           PUSH         ACC ;定时器中断子程序0
  358.             PUSH         PSW
  359.             MOV         TL0,20H
  360.             MOV         TH0,21H
  361.             CPL         P3.7
  362.             POP         PSW
  363.             POP         ACC
  364.             RETI
  365. ;定时器中断子程序1
  366. T1INT:  MOV         TH1,  #3CH  ;定时器中断子程序1
  367.         MOV         TL1,  #0B0H
  368.         DJNZ         L50MS,X4
  369.               MOV         L50MS,#20
  370. SECSET:           ;每秒种时钟刷新秒显示一次
  371. MOV         A,SEC
  372.         MOV         B,#10
  373.              DIV         AB
  374.               ADD         A,#30H
  375.         MOV           P0,#0CEH    ;显示秒十位
  376.             CALL          DISPLAY
  377.              CALL         WRITE2
  378. MOV         A,B
  379.              ADD         A,#30H
  380.               MOV           P0,#0CFH    ;显示秒个位
  381.               CALL          DISPLAY
  382.               CALL         WRITE2
  383.         MOV         A,SEC
  384.              INC         A
  385.             MOV         SEC,A
  386.         XRL         A,#60
  387. X4:          JNZ         OUT
  388. MINSET: MOV         SEC,#00H   ; *每分钟刷新分显示一次
  389.              MOV         A,MIN
  390.                INC         A
  391.              MOV         MIN,A
  392.         MOV         B,#10
  393.             DIV         AB
  394.             ADD         A,#30H
  395. MOV           P0,#0CBH    ;显示分十位
  396.         CALL          DISPLAY
  397.               CALL         WRITE2
  398. MOV         A,B
  399.               ADD         A,#30H
  400.               MOV           P0,#0CCH    ;显示分个位
  401.               CALL          DISPLAY
  402.               CALL         WRITE2
  403.               MOV         A,MIN
  404.               MOV         B,#3
  405.               MUL         AB
  406.         MOV         B,#100
  407.              DIV         AB
  408.               MOV         R2,A
  409.               MOV         A,#10
  410.               XCH         A,B
  411.               DIV         AB
  412.         MOV         A,MIN
  413.               XRL         A,#60
  414.               JNZ         OUT
  415. HOUSET:
  416.               MOV         MIN,#00H  ;每小时刷新小时显示一次  
  417.              MOV         A,HOU
  418.               MOV         B,#10
  419.               DIV         AB
  420.              ADD         A,#30H         ;将BCD吗转化为ASIIC码
  421.         MOV           P0,#0C8H    ;显示小时十位
  422.             CALL          DISPLAY
  423.               CALL          WRITE2
  424. MOV         A,B
  425.               ADD         A,#30H
  426.               MOV           P0,#0C9H    ;显示小时个位
  427.              CALL          DISPLAY
  428.               CALL         WRITE2
  429.         MOV         A,HOU
  430.              INC         A
  431.             MOV         HOU,A
  432.            XRL         A,#10
  433.             JNZ         OUT
  434.             SJMP         OVERFLOW
  435. OUT:           RETI;溢出处理
  436. OVERFLOW:
  437.                MOV         L50MS,#20
  438.                MOV         L1MS,#00H
  439.                MOV         L250MS,#00H
  440.                MOV         SEC,#00H
  441.                MOV         MIN,#00H
  442.                MOV         HOU,#00H
  443.                RETI
  444. DELAY30:         
  445.         MOV         R7,#2
  446. W2:     MOV         R4,#125
  447. W3:     MOV         R3,#248
  448.         DJNZ         R3,$
  449.         DJNZ         R4,W3
  450.         DJNZ         R7,W2
  451.         DJNZ         R1,DELAY30
  452.         RET
  453. TABLE00:
  454.         DW 64580,64684,64777,64820
  455.         DW 64898,64968,65030,64260
  456.         DW 64400,64524,65058,63835,64021
  457. TABLE10:          ;第一首《精忠报国》


  458. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码



资料下载:
音乐盒.zip (62.11 KB, 下载次数: 99)


评分

参与人数 2黑币 +7 收起 理由
欢666 + 2 很给力!
348652560 + 5 很给力!

查看全部评分

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

使用道具 举报

沙发
ID:206903 发表于 2017-6-4 00:39 | 只看该作者
此帖仅作者可见

使用道具 举报

板凳
ID:206903 发表于 2017-6-4 00:40 | 只看该作者
此帖仅作者可见

使用道具 举报

地板
ID:75050 发表于 2017-6-13 12:59 | 只看该作者
此帖仅作者可见

使用道具 举报

5#
ID:211258 发表于 2017-6-15 17:45 | 只看该作者
此帖仅作者可见

使用道具 举报

6#
ID:269398 发表于 2017-12-31 09:33 | 只看该作者
此帖仅作者可见

使用道具 举报

7#
ID:269052 发表于 2018-1-4 17:29 | 只看该作者
此帖仅作者可见

使用道具 举报

8#
ID:268524 发表于 2018-1-5 09:42 | 只看该作者
此帖仅作者可见

使用道具 举报

9#
ID:559512 发表于 2019-6-11 08:48 | 只看该作者
此帖仅作者可见

使用道具 举报

10#
ID:559512 发表于 2019-6-11 08:49 | 只看该作者
此帖仅作者可见

使用道具 举报

11#
ID:377234 发表于 2019-6-19 14:21 | 只看该作者
此帖仅作者可见

使用道具 举报

12#
ID:377234 发表于 2019-6-19 14:22 | 只看该作者
此帖仅作者可见

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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