找回密码
 立即注册

QQ登录

只需一步,快速开始

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

多功能单片机电子琴电路+汇编语言源代码

[复制链接]
跳转到指定楼层
楼主
ID:184978 发表于 2021-5-13 12:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
分享一个已验证的多功能电子琴

单片机源程序如下:
  1. RS EQU P3.5
  2. RW EQU P3.6
  3. E EQU P3.7
  4. ORG 00H
  5. SJMP MAIN
  6. ORG 00BH
  7. MOV TH0,33H
  8. MOV TL0,34H
  9. CPL P3.4
  10. RETI


  11. ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  12. ORG     001BH
  13.         INC     3CH             ;中断服务,中断计数器加1
  14.         MOV     TH1,#0D8H
  15.         MOV     TL1,#0EFH       ;12M晶振,形成10毫秒中断
  16.        RETI

  17. ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!





  18. ORG 30H
  19. MAIN : SETB P3.4           ;关闭扬声器
  20. LCALL CSH1602              ;初始化1602
  21. MOV      TMOD,#11H         ;设置定时器0为工作模式1
  22. SETB     EA                ;开总中断
  23. SETB     ET0               ;开定时器0中断
  24. HUANYING: MOV P1,#80H      ;欢迎语显示地址
  25. LCALL ENABLE
  26. MOV DPTR,#TAB_HY
  27. MOV 30H,#00
  28. LP: MOV A,30H
  29. MOVC A,@A+DPTR
  30. JZ KEY
  31. LCALL DELAY_100MS
  32. LCALL WRITE_1602
  33. INC 30H
  34. SJMP LP
  35. KEY:   MOV P1,#01H               ;清屏
  36.        ACALL ENABLE
  37.        MOV P1,#80H
  38.        LCALL ENABLE
  39.        MOV DPTR,#TAB_YANZHOU
  40.        MOV 30H,#00
  41. LP7:   MOV A,30H
  42.        MOVC A,@A+DPTR
  43.        JZ KEY_0
  44.        LCALL WRITE_1602
  45.        INC 30H
  46.        SJMP LP7
  47. KEY_0: MOV P1,#0C0H                ;音符的显示地址
  48.        LCALL ENABLE
  49.        MOV 38H,#16                 ;写入1602的显示地址指针
  50.        MOV 35H,#2                  ;控制节拍
  51. KEY_1: MOV P2,#0FFH                ;置P2为输入
  52.        JB P2.0,KEY_2               ;K1键没按下,转移
  53.        LCALL DELAY_10MS            ;延时消抖
  54.        JNB P2.0,$
  55.        MOV 36H,#0                  ;装入1的音符码相对地址
  56.        LCALL     BOFANG_YF
  57. KEY_2:   
  58.        JB P2.1,KEY_3               ;K2键没按下,转移
  59.        LCALL DELAY_10MS            ;延时消抖
  60.        JNB P2.1,$
  61.        MOV 36H,#2
  62.        LCALL     BOFANG_YF
  63. KEY_3:
  64.        JB P2.2,KEY_4            ;K3键没按下,转移
  65.        LCALL DELAY_10MS            ;延时消抖
  66.        JNB P2.2,$
  67.        MOV 36H,#4
  68.        LCALL     BOFANG_YF
  69. KEY_4:
  70.        JB P2.3,KEY_5            ;K4键没按下,转移
  71.        LCALL DELAY_10MS            ;延时消抖
  72.        JNB P2.3,$
  73.        MOV 36H,#6
  74.        LCALL     BOFANG_YF
  75. KEY_5:
  76.        JB P2.4,KEY_6            ;K5键没按下,转移
  77.        LCALL DELAY_10MS            ;延时消抖
  78.        JNB P2.4,$
  79.        MOV 36H,#8
  80.        LCALL     BOFANG_YF
  81. KEY_6:
  82.        JB P2.5,KEY_7            ;K6键没按下,转移
  83.        LCALL DELAY_10MS            ;延时消抖
  84.        JNB P2.5,$
  85.        MOV 36H,#10
  86.        LCALL     BOFANG_YF
  87. KEY_7:
  88.        JB P2.6,KEY_9            ;K7键没按下,转移
  89.        LCALL DELAY_10MS         ;延时消抖
  90.        JNB P2.6,$
  91.        MOV 36H,#12
  92.        LCALL     BOFANG_YF
  93. KEY_9:
  94.        JB P3.2,KEY_1             ;K9键没按下,重新扫描
  95.        LCALL DELAY_10MS          ;延时消抖
  96.        JNB P3.2,$
  97.        LCALL DELAY_10MS

  98. ;-----------播放音乐程序段---------------
  99.        MOV P1,#01H              ;清屏
  100.        ACALL ENABLE
  101.        MOV P1,#80H
  102.        LCALL ENABLE
  103.        MOV DPTR,#TAB_PLAY
  104.        MOV 30H,#00
  105. LP8:   MOV A,30H
  106.        MOVC A,@A+DPTR
  107.        JZ PLAY
  108.        LCALL WRITE_1602
  109.        INC 30H
  110.        SJMP LP8
  111. PLAY:  MOV P2,#0FFH              ;置P2为输入
  112.        JB P2.0,PLAY_2            ;K1键没按下,转移
  113.        MOV DPTR,#TAB_GEQU1                ;存曲目标志
  114.        LCALL     BOFANG_GEQU
  115. PLAY_2:   
  116.        JB P2.1,PLAY_3            ;K2键没按下,转移
  117.        SETB ET1
  118. MOV 3BH,TMOD
  119. MOV      TMOD,#11H
  120. mov dptr,#tab2
  121. mov p1,#0c0h
  122. lcall enable
  123. lcall write1
  124. MOV     DPTR,#DAT2
  125.       LCALL MUSIc0
  126.       CLR TR1
  127.       CLR ET1
  128.       MOV TMOD,3BH
  129. PLAY_3:
  130.       JB P2.2,PLAY_4               ;K3键没按下,转移
  131. SETB ET1
  132. MOV 3BH,TMOD
  133. MOV      TMOD,#11H
  134. mov dptr,#tab1
  135. mov p1,#0c0h
  136. lcall enable
  137. lcall write1
  138. MOV     DPTR,#DAT1
  139.       LCALL MUSIc0
  140.       CLR TR1
  141.       CLR ET1
  142.       MOV TMOD,3BH
  143. PLAY_4:
  144.        JB P2.3,PLAY_9
  145.        MOV R1,#50H
  146.        LCALL BOFANG_LUYIN
  147. PLAY_9: JB P3.2,PLAY               ;K8键没按下,重新扫描
  148.         LCALL DELAY_10MS          ;延时消抖
  149.         JNB P3.2,$
  150.         LCALL DELAY_10MS

  151. ;------------录音程序段---------------
  152.        MOV P1,#01H              ;清屏
  153.        ACALL ENABLE
  154.        MOV P1,#80H
  155.        LCALL ENABLE
  156.        MOV DPTR,#TAB_RECORD
  157.        MOV 30H,#00
  158. LP9:   MOV A,30H
  159.        MOVC A,@A+DPTR
  160.        JZ RECORD_0
  161.        LCALL WRITE_1602
  162.        INC 30H
  163.        SJMP LP9
  164. RECORD_0: MOV R1,#50H                ;录取音符存放地址
  165.         MOV 35H,#3                 ;控制节拍
  166.         MOV P1,#0C0H               ;音符的显示地址
  167.         LCALL ENABLE
  168.         MOV 38H,#16                 ;写入1602的显示地址指针
  169. ;---------写入录音的名字---------
  170.         MOV 30H,#00
  171. C5:     MOV A,30H
  172.         LCALL TAB_RECORDING
  173.         MOV @R1,A
  174.         INC R1
  175.         INC 30H
  176.         CJNE A,#0FEH,C5
  177. RECORD_1: MOV P2,#0FFH                ;置P2为输入
  178.        JB P2.0,RECORD_2               ;K1键没按下,转移
  179.        LCALL DELAY_10MS               ;延时消抖
  180.        JNB P2.0,$
  181.        MOV 36H,#0                  ;装入1的音符码相对地址
  182.        LCALL     BOFANG_YF      
  183.        LCALL CUNCU                 ;调存音符子程序
  184. RECORD_2:   
  185.        JB P2.1,RECORD_3               ;K2键没按下,转移
  186.        LCALL DELAY_10MS            ;延时消抖
  187.        JNB P2.1,$
  188.        MOV 36H,#2
  189.        LCALL     BOFANG_YF
  190.        LCALL CUNCU
  191. RECORD_3:
  192.       JB P2.2,RECORD_4            ;K3键没按下,转移
  193.        LCALL DELAY_10MS            ;延时消抖
  194.        JNB P2.2,$
  195.        MOV 36H,#4
  196.        LCALL     BOFANG_YF
  197.        LCALL CUNCU
  198. RECORD_4:
  199.        JB P2.3,RECORD_5            ;K4键没按下,转移
  200.        LCALL DELAY_10MS            ;延时消抖
  201.        JNB P2.3,$
  202.        MOV 36H,#6
  203.        LCALL     BOFANG_YF
  204.        LCALL CUNCU
  205. RECORD_5:
  206.        JB P2.4,RECORD_6            ;K5键没按下,转移
  207.        LCALL DELAY_10MS            ;延时消抖
  208.        JNB P2.4,$
  209.        MOV 36H,#8
  210.        LCALL     BOFANG_YF
  211.        LCALL CUNCU
  212. RECORD_6:
  213.        JB P2.5,RECORD_7            ;K6键没按下,转移
  214.        LCALL DELAY_10MS            ;延时消抖
  215.        JNB P2.5,$
  216.        MOV 36H,#10
  217.        LCALL     BOFANG_YF
  218.        LCALL CUNCU
  219. RECORD_7:
  220.        JB P2.6,RECORD_8            ;K7键没按下,转移
  221.        LCALL DELAY_10MS            ;延时消抖
  222.        JNB P2.6,$
  223.        MOV 36H,#12
  224.        LCALL     BOFANG_YF
  225.        LCALL CUNCU
  226. RECORD_8:
  227.        JB P2.7,RECORD_9            ;K8键没按下,转移
  228.        LCALL DELAY_10MS            ;延时消抖
  229.        JNB P2.7,$
  230.        MOV 36H,#42                 ;休止符标志存36H
  231.        LCALL DELAY_100MS
  232.        LCALL CUNCU
  233. RECORD_9:
  234.           JNB P3.2,J0               ;K8键没按下,重新扫描
  235.           LJMP RECORD_1
  236. J0:       LCALL DELAY_10MS          ;延时消抖
  237.           JNB P3.2,$
  238.           LCALL DELAY_10MS
  239.           MOV @R1,#255              ;写入歌曲结束标志
  240.           LJMP KEY                  ;回演奏模式






  241. ;***********子程序区***************
  242. ;=======初始化1602显示器========
  243. CSH1602: MOV P3,#0FFH
  244. MOV P1,#01H
  245. ACALL ENABLE
  246. MOV P1,#38H
  247. ACALL ENABLE
  248. MOV P1,#0CH
  249. ACALL ENABLE
  250. MOV P1,#06H
  251. ACALL ENABLE
  252. RET

  253. ;====1602发命令子程序====
  254. ENABLE: CLR RS         
  255. CLR RW
  256. CLR E
  257. ACALL DELAY_2MS
  258. SETB E
  259. RET

  260. ;=====读1602IR中命令子程序======
  261. ENABLE_1: CLR RS
  262. SETB RW
  263. CLR E
  264. ACALL DELAY_2MS
  265. SETB E
  266. RET

  267. ;====写数据子程序(1602)====
  268. WRITE_1602: MOV P1,A        
  269. SETB RS
  270. CLR RW
  271. CLR E
  272. MOV R5,#50       ;延时100us(12M晶振)
  273. DJNZ R5,$
  274. SETB E
  275. RET

  276. ;===========播放一个音符并显示音符和频谱=========
  277. BOFANG_YF: MOV A,36H
  278.       LCALL TAB_YF
  279.       MOV 33H,A
  280.       MOV A,36H
  281.       INC A
  282.       LCALL TAB_YF
  283.       MOV 34H,A
  284.       MOV TH0,33H
  285.       MOV TL0,34H
  286.       SETB TR0                  ;启动定时器0
  287.       MOV A,36H                 ;取音符的显示码   
  288.       LCALL TAB_YF1      
  289.       LCALL WRITE_1602
  290.       DEC 38H
  291.       MOV A,36H
  292.       INC A
  293.       LCALL TAB_YF1
  294.       LCALL WRITE_1602
  295.       DJNZ 38H,D2               ;1602一行没写满,转移
  296.       MOV 30H,#16               ;1602满行清行并从头开始写
  297.       MOV P1,#0C0H              
  298.       LCALL ENABLE
  299.       MOV A,#' '
  300. LP10: LCALL WRITE_1602
  301.       DJNZ 30H,LP10
  302.       MOV 38H,#16
  303.       MOV P1,#0C0H              
  304.       LCALL ENABLE
  305. ;----------显示频谱分析条程序段----------
  306. D2:   MOV A,36H                 ;音符码转换为相应键值
  307.       MOV B,#2
  308.       DIV AB
  309.       ADD A,#1
  310.       MOV 39H,A
  311.       MOV 3AH,39H               ;保护音符码对应的键值
  312.       MOV P1,#85H               ;设定频谱分析条显示初地址
  313.       LCALL ENABLE
  314.       MOV A,#'>'
  315. D5:   LCALL WRITE_1602
  316.       DJNZ 39H,D5
  317. ;--------控制节拍时长程序段---------
  318.       MOV 37H,35H                   ;保护循环次数控制(节拍)      
  319. LP1:  ACALL DELAY_100MS
  320.       DJNZ 35H,LP1                  ;延时次数控制
  321.       MOV 35H,37H
  322. ;---------发音结束,清除频谱分析条------------
  323.       MOV P1,#85H               ;频谱分析条显示的初地址
  324.       LCALL ENABLE
  325.       MOV A,#' '
  326.       MOV 39H,3AH      
  327. D6:   LCALL WRITE_1602
  328.       DJNZ 39H,D6
  329.       MOV A,#10H                 ;释放音符码显示地址
  330.       CLR C
  331.       SUBB A,38H
  332.       ADD A,#0C0H
  333.       MOV P1,A
  334.       LCALL ENABLE
  335.       CLR TR0                   ;关定时器0
  336.       RET

  337. ;===========播放一个音符并显示频谱=========
  338. BOFANG_YF_1: MOV A,36H
  339.       LCALL TAB_YF
  340.       MOV 33H,A
  341.       MOV A,36H
  342.       INC A
  343.       LCALL TAB_YF
  344.       MOV 34H,A
  345.       MOV TH0,33H
  346.       MOV TL0,34H
  347.       SETB TR0                  ;启动定时器0      
  348. ;----------显示频谱分析条程序段----------
  349.       MOV A,36H                 ;音符码转换为相应键值
  350.       MOV B,#2
  351.       DIV AB
  352.       ADD A,#1
  353.       MOV 39H,A
  354.       MOV 3AH,39H               ;保护音符码对应的键值
  355.       MOV P1,#85H               ;设定频谱分析条显示初地址
  356.       LCALL ENABLE
  357.       MOV A,#'>'
  358. D7:   LCALL WRITE_1602
  359.       DJNZ 39H,D7
  360. ;--------控制节拍时长程序段---------
  361.       MOV 37H,35H                   ;保护循环次数控制(节拍)      
  362. LP11: ACALL DELAY_100MS
  363.       DJNZ 35H,LP11                  ;延时次数控制
  364.       MOV 35H,37H
  365. ;---------发音结束,清除频谱分析条------------
  366.       MOV P1,#85H               ;频谱分析条显示的初地址
  367.       LCALL ENABLE
  368.       MOV A,#' '
  369.       MOV 39H,3AH      
  370. D8:   LCALL WRITE_1602
  371.       DJNZ 39H,D8
  372.       CLR TR0                   ;关定时器0
  373.       RET

  374. ;============播放一首歌并显示歌名=============
  375. ;------(一个音符2字节存储,音符码存低字节,节拍存高字节;254为歌曲名结束标志,255为歌曲结束标志)----------
  376. BOFANG_GEQU: MOV P1,#0C0H                    ;歌名显示地址
  377.              LCALL ENABLE
  378.              MOV 30H,#00
  379. LP2:             MOV A,30H
  380.              MOVC A,@A+DPTR
  381.              INC 30H
  382.              CJNE A,#254,XIANSHI_GEMING
  383.              SJMP C1
  384. XIANSHI_GEMING: MOV P1,A
  385.                 LCALL WRITE_1602
  386.                 SJMP LP2
  387. C1:                MOV P1,#0C0H                 ;歌词显示地址
  388.                 LCALL ENABLE
  389. LP3:                MOV A,30H
  390.                 MOVC A,@A+DPTR               ;取音符码
  391.                 CJNE A,#0FFH,C6
  392.                 SJMP S0


  393. C6:                CJNE A,#42,C0             ;音符码为休止符不开定时器,直接调用延时
  394.                 INC 30H
  395.                 MOV A,30H
  396.                 MOVC A,@A+DPTR
  397.                 INC 30H
  398.                 MOV 35H,A
  399. LP12:           LCALL DELAY_100MS
  400.                 DJNZ 35H,LP12
  401.                 SJMP LP3



  402. C0:                MOV 36H,A
  403.                 INC 30H
  404.                 MOV A,30H
  405.                 MOVC A,@A+DPTR
  406.                 MOV 35H,A
  407.                 INC 30H
  408.                 LCALL BOFANG_YF_1
  409.                 SJMP LP3
  410. S0:                RET

  411. ;============播放一录音并显示歌名和歌词=============
  412. ;------(一个音符2字节存储,音符码存低字节,节拍存高字节;254为歌曲名结束标志,255为歌曲结束标志)----------
  413. BOFANG_LUYIN: MOV P1,#0C0H                    ;歌名显示地址
  414.              LCALL ENABLE            
  415. LP4:             MOV A,@R1
  416.              INC R1
  417.              CJNE A,#254,XIANSHI_LUYIN
  418.              SJMP C2
  419. XIANSHI_LUYIN: MOV P1,A
  420.                 LCALL WRITE_1602
  421.                 SJMP LP4
  422. C2:                MOV P1,#0C0H                 ;歌词显示地址
  423.                 LCALL ENABLE
  424. LP5:                MOV A,@R1               ;取音符码
  425.                 CJNE A,#255,C3
  426.                 SJMP S2
  427. C3:                CJNE A,#42,C4             ;音符码为休止符不开定时器,直接调用延时
  428.                 INC R1
  429.                 MOV A,@R1
  430.                 MOV 35H,A
  431.                 INC R1
  432. LP6:            LCALL DELAY_100MS
  433.                 DJNZ 35H,LP6
  434.                 SJMP LP5
  435. C4:             MOV 36H,A
  436.                 INC R1
  437.                 MOV A,@R1
  438.                 MOV 35H,A
  439.                 INC R1
  440.                 LCALL BOFANG_YF_1
  441.                 SJMP LP5
  442. ……………………

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

完整代码:
电子琴.rar (67.51 KB, 下载次数: 18)


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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