找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机红外遥控电子琴汇编语言示例源程序

[复制链接]
跳转到指定楼层
楼主
用51单片机实现的用红外线控制电子琴的部分程序,可借用。
    该程序可以实现用红外遥控器控制JD51蜂鸣器发出不同音调与歌曲,其中1~7分别发出dou rai mi fa so la ti的音调,8和9分别会播放一首歌曲。
    另附有“红外接收与控制”子程序,请大家务必先单独运行子程序,弄明白遥控器上1~9对应的二进制编码方式,并模仿示例中的操作,进行补充完善。
    说明:该例子除了没有按键2~7,9的功能,还缺少歌曲播放中的中断程序实现,请大家完善,谢谢!


单片机汇编语言源程序如下:
  1.         ORG 0030H
  2. public infrared
  3. ;DELAYY SEGMENT CODE
  4. ;RSEG   AELAYY

  5. INFRARED:
  6.     JNB    P3.2,IR        ;遥控扫描
  7.     LJMP   INFRARED           ;在正常无遥控信号时,一体化红外接收头输出是高电平,程序一直在循环。

  8. ;=================================================
  9. ;   解码程序
  10. IR:
  11.     ;以下对遥控信号的9000微秒的初始低电平信号的识别
  12.     MOV    R6,#10
  13. IR_SB:
  14.     ACALL  DELAY882        ;调用882微秒延时子程序
  15.     JB     P3.2,IR_ERROR   ;延时882微秒后判断P2.2脚是否出现高电平如果有就退出解码程序
  16.     DJNZ   R6,IR_SB        ;重复10次,目的是检测在8820微秒内如果出现高电平就退出解码程序

  17.     ;识别连发码,和跳过4.5ma的高电平。
  18.     JNB     P3.2, $         ;等待高电平避开9毫秒低电平引导脉冲
  19.     ACALL  DELAY2400
  20.     JNB     P3.2,IR_Rp    ;这里为低电平,认为是连发码信号,见图6。
  21.     ACALL  DELAY2400      ;延时4.74毫秒避开4.5毫秒的结果码

  22.     ;以下32数据码的读取 ,0和1的识别 请看图2
  23.     MOV     R1,#1AH        ;设定1AH为起始RAM区
  24.     MOV     R2,#4
  25. IR_4BYTE:
  26.     MOV     R3,#8
  27. IR_8BIT:   
  28.     JNB     P3.2,$         ;等待地址码第一位的高电平信号
  29.     LCALL  DELAY882        ;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态
  30.     MOV    C,P3.2          ;将P2.2引脚此时的电平状态0或1存入C中
  31.     JNC     IR_8BIT_0      ;如果为0就跳转到IR_8BIT_0
  32.     LCALL  DELAY1000
  33. IR_8BIT_0:
  34.     MOV    A,@R1           ;将R1中地址的给A
  35.     RRC    A               ;将C中的值0或1移入A中的最低位
  36.     MOV    @R1,A           ;将A中的数暂时存放在R1中
  37.     DJNZ   R3,IR_8BIT      ;接收地址码的高8位
  38.     INC    R1              ;对R1中的值加1,换下一个RAM
  39.     DJNZ   R2,IR_4BYTE     ;接收完16位地址码和8位数据码和8位数据,
  40.                            ;存放在1AH/1BH/1CH/1DH的RAM中
  41.      ;解码成功
  42.     JMP    IR_GOTO

  43. IR_Rp:
  44.     ;这里为重复码执行处
  45.     ;按住遥控按键时,每过108ms就到这里来
  46.     JMP    IR_GOTO

  47. IR_ERROR:
  48.     ;错语退出
  49.     LJMP   INFRARED ;退出解码子程序

  50. ;=================================================
  51. ;遥控执行部份
  52. IR_GOTO:
  53.     ;这里还要判断1AH和1BH 两个系统码或用户码,用于识别不同的遥控器
  54.     ;MOV   A,1AH
  55.     ;CJNE  A,#xxH,IR_ERROR   ;用户码1不对则退出
  56.     ;MOV   A,1BH
  57.     ;CJNE  A,#xxH,IR_ERROR   ;用户码2不对则退出



  58.     ;判断两个数据码是否相反
  59.     MOV    A,1CH
  60.     CPL    A
  61.     CJNE   A,1DH,IR_ERROR    ;两个数据码不相反则退出
  62.     ;遥控执行部份
  63.     ;MOV   A,1DH             ;判断对应按键
  64.     ;CJNE  A,#xxH,$+6
  65.     ;LJMP  -à跳到对应按键执行处
  66.     ;CJNE  A,#xxH,$+6
  67.     ;LJMP  -à跳到对应按键执行处
  68.     ;.
  69.     MOV     R0,1DH         ;
  70. KEYP0:   
  71.       CLR TR0
  72.       SETB P2.4     ;关蜂鸣器
  73.      SETB P2.3                           ;关数码管
  74. //        MOV  P1,R0
  75.         CJNE R0,#11110011B,L1          ;!!!非常关键的一步,遥控器上的按键1对应的二进制码为 11110011,所以此处判断是否是按键1按下,获得的功能相当于板子的S1
  76.                                                        ; 如果不是按键1,则跳转继续判断是否是别的按键,此处弱化了功能,只写了按键1 和8,
  77.                                                            ;所以此时大家的任务就是参考这个例子和原有的电子音调发生器程序,继续添加按键2~7,以及9的内容,从而完善功能
  78.     SETB P2.4        ;蜂鸣器置于高电平
  79.         MOV R4,#200  
  80. MAIN01:MOV TMOD,#01H   
  81.        MOV TL0,#021H         ;写入计数初值
  82.        MOV TH0,#0F9H
  83.        SETB TR0
  84. WAIT1:JNB TF0,WAIT1
  85.      CLR TF0
  86.      CPL P2.4            ;蜂鸣器响
  87.           CLR P2.3            ;数码管显示2
  88.           MOV A,#11111001B
  89.                  MOV P0,A
  90.      DJNZ R4,MAIN01      ;数码管显示1
  91.          
  92.                                                                   

  93. L1:CJNE R0,#10101101B,L2   ;   判断是否是按键8按下,如果是,发出一段音乐

  94. MUSTART1:                     
  95.      MOV R0,#00H               ;节拍表指针置零
  96.      MOV R1,#00H               ;音符表指针置零
  97. RTAB:MOV A,R0
  98.      MOV DPTR,#RYTH
  99.      MOVC A,@A+DPTR            ;查表法将一个节拍数据取出放R2计数器中
  100.      MOV R2,A
  101. TTAB:MOV A,R1
  102.      MOV DPTR,#TONE
  103.      MOVC A,@A+DPTR
  104.      MOV R3,A                  ;取出音符表高8位
  105.      INC R1                    ;指针加1
  106.      MOV A,R1
  107.      MOV DPTR,#TONE
  108.      MOVC A,@A+DPTR
  109.      MOV R4,A                  ;取出低8位
  110.      SETB P2.4  

  111. LOOP:MOV R5,#3BH
  112. JMP MAIN
  113. L2:JMP L3
  114. MAIN:MOV TMOD,#01H
  115.      MOV TL0,R4
  116.      MOV TH0,R3
  117.      SETB TR0
  118. WAIT:JNB TF0,WAIT
  119.      CLR TF0
  120.      CPL P2.4

  121. RA:  DJNZ R5,MAIN             ;无打断则继续放第一首歌
  122.      DJNZ R2,LOOP
  123. INC R0                        ;两个表的指针都加1
  124. INC R1
  125. CJNE R1,#88,RTAB              ;判断是否取完
  126. LJMP KEYP0
  127. TONE:
  128. DB 0FBH,68H,0FDH,6EH,0FDH,45H,0FCH,0EFH,0FCH,8FH,0FCH,8FH,0FCH,8FH,0FCH,5BH,0FCH,8FH
  129. DB 0FCH,0EFH,0FDH,45H,0FBH,68H,0FBH,68H,0FCH,8FH,0FCH,5BH,0FBH,0E9H,0FBH,68H,0FBH,68H
  130. DB 0FAH,0DBH,0FAH,8CH,0F9H,21H,0FAH,8CH,0FAH,0D8H,0FBH,68H,0FBH,68H,0FBH,68H,0FBH,68H
  131. DB 0FBH,0E9H,0FBH,0E9H,0FBH,68H,0FBH,0E9H,0FCH,5BH,0FAH,8CH,0FCH,8FH,0FCH,8FH,0FCH,5BH
  132. DB 0FCH,8FH,0FCH,0EFH,0FCH,0EFH,0FCH,0EFH,0FCH,8FH,0FDH,45H,0FDH,6EH,0FCH,0EFH
  133. RYTH:
  134. DB 04,04,04,04,04,04,04,04,04,04
  135. DB 04,05,04,04,04,04,04,04,04,04
  136. DB 04,04,04,06,04,04,04,07,04,04
  137. DB 04,04,04,06,04,04,04,07,04,04
  138. DB 04,04,04,04

  139. L3:


  140.     ;清除遥控值使连按失效
  141.     MOV    1AH,#00H
  142.     MOV    1BH,#00H
  143.     MOV    1CH,#00H
  144.     MOV    1DH,#00H
  145.     LJMP   INFRARED
  146. ;=================================================
  147. ; 延时子程序
  148. ;=============================882
  149. ;1.085x ((202x4)+5)=882
  150. DELAY882:   
  151.     MOV R7,#202
  152. DELAY882_A:
  153.     NOP
  154.     NOP
  155.     DJNZ   R7,DELAY882_A
  156. RET

  157. ;=============================1000
  158. ;1.085x ((229x4)+5)=999.285
  159. DELAY1000:
  160.     MOV R7,#229
  161. DELAY1000_A:
  162.     NOP
  163.     NOP
  164.     DJNZ   R7,DELAY1000_A
  165. RET
  166. ;=============================2400
  167. ……………………

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

红外遥控电子琴示例程序.zip

4.91 KB, 下载次数: 94, 下载积分: 黑币 -5

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:468878 发表于 2021-6-15 08:48 | 只看该作者
厉害,其实汇编语言的单步思维,还比较容易学,就是可移植性不太好。
回复

使用道具 举报

板凳
ID:1021140 发表于 2022-4-24 09:34 | 只看该作者
点赞楼主思维
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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