用51单片机实现的用红外线控制电子琴的部分程序,可借用。
该程序可以实现用红外遥控器控制JD51蜂鸣器发出不同音调与歌曲,其中1~7分别发出dou rai mi fa so la ti的音调,8和9分别会播放一首歌曲。
另附有“红外接收与控制”子程序,请大家务必先单独运行子程序,弄明白遥控器上1~9对应的二进制编码方式,并模仿示例中的操作,进行补充完善。
说明:该例子除了没有按键2~7,9的功能,还缺少歌曲播放中的中断程序实现,请大家完善,谢谢!
单片机汇编语言源程序如下:
- ORG 0030H
- public infrared
- ;DELAYY SEGMENT CODE
- ;RSEG AELAYY
-
- INFRARED:
- JNB P3.2,IR ;遥控扫描
- LJMP INFRARED ;在正常无遥控信号时,一体化红外接收头输出是高电平,程序一直在循环。
-
- ;=================================================
- ; 解码程序
- IR:
- ;以下对遥控信号的9000微秒的初始低电平信号的识别
- MOV R6,#10
- IR_SB:
- ACALL DELAY882 ;调用882微秒延时子程序
- JB P3.2,IR_ERROR ;延时882微秒后判断P2.2脚是否出现高电平如果有就退出解码程序
- DJNZ R6,IR_SB ;重复10次,目的是检测在8820微秒内如果出现高电平就退出解码程序
-
- ;识别连发码,和跳过4.5ma的高电平。
- JNB P3.2, $ ;等待高电平避开9毫秒低电平引导脉冲
- ACALL DELAY2400
- JNB P3.2,IR_Rp ;这里为低电平,认为是连发码信号,见图6。
- ACALL DELAY2400 ;延时4.74毫秒避开4.5毫秒的结果码
-
- ;以下32数据码的读取 ,0和1的识别 请看图2
- MOV R1,#1AH ;设定1AH为起始RAM区
- MOV R2,#4
- IR_4BYTE:
- MOV R3,#8
- IR_8BIT:
- JNB P3.2,$ ;等待地址码第一位的高电平信号
- LCALL DELAY882 ;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态
- MOV C,P3.2 ;将P2.2引脚此时的电平状态0或1存入C中
- JNC IR_8BIT_0 ;如果为0就跳转到IR_8BIT_0
- LCALL DELAY1000
- IR_8BIT_0:
- MOV A,@R1 ;将R1中地址的给A
- RRC A ;将C中的值0或1移入A中的最低位
- MOV @R1,A ;将A中的数暂时存放在R1中
- DJNZ R3,IR_8BIT ;接收地址码的高8位
- INC R1 ;对R1中的值加1,换下一个RAM
- DJNZ R2,IR_4BYTE ;接收完16位地址码和8位数据码和8位数据,
- ;存放在1AH/1BH/1CH/1DH的RAM中
- ;解码成功
- JMP IR_GOTO
-
- IR_Rp:
- ;这里为重复码执行处
- ;按住遥控按键时,每过108ms就到这里来
- JMP IR_GOTO
-
- IR_ERROR:
- ;错语退出
- LJMP INFRARED ;退出解码子程序
-
- ;=================================================
- ;遥控执行部份
- IR_GOTO:
- ;这里还要判断1AH和1BH 两个系统码或用户码,用于识别不同的遥控器
- ;MOV A,1AH
- ;CJNE A,#xxH,IR_ERROR ;用户码1不对则退出
- ;MOV A,1BH
- ;CJNE A,#xxH,IR_ERROR ;用户码2不对则退出
-
-
-
- ;判断两个数据码是否相反
- MOV A,1CH
- CPL A
- CJNE A,1DH,IR_ERROR ;两个数据码不相反则退出
- ;遥控执行部份
- ;MOV A,1DH ;判断对应按键
- ;CJNE A,#xxH,$+6
- ;LJMP -à跳到对应按键执行处
- ;CJNE A,#xxH,$+6
- ;LJMP -à跳到对应按键执行处
- ;.
- MOV R0,1DH ;
- KEYP0:
- CLR TR0
- SETB P2.4 ;关蜂鸣器
- SETB P2.3 ;关数码管
- // MOV P1,R0
- CJNE R0,#11110011B,L1 ;!!!非常关键的一步,遥控器上的按键1对应的二进制码为 11110011,所以此处判断是否是按键1按下,获得的功能相当于板子的S1
- ; 如果不是按键1,则跳转继续判断是否是别的按键,此处弱化了功能,只写了按键1 和8,
- ;所以此时大家的任务就是参考这个例子和原有的电子音调发生器程序,继续添加按键2~7,以及9的内容,从而完善功能
- SETB P2.4 ;蜂鸣器置于高电平
- MOV R4,#200
- MAIN01:MOV TMOD,#01H
- MOV TL0,#021H ;写入计数初值
- MOV TH0,#0F9H
- SETB TR0
- WAIT1:JNB TF0,WAIT1
- CLR TF0
- CPL P2.4 ;蜂鸣器响
- CLR P2.3 ;数码管显示2
- MOV A,#11111001B
- MOV P0,A
- DJNZ R4,MAIN01 ;数码管显示1
-
-
- L1:CJNE R0,#10101101B,L2 ; 判断是否是按键8按下,如果是,发出一段音乐
- MUSTART1:
- MOV R0,#00H ;节拍表指针置零
- MOV R1,#00H ;音符表指针置零
- RTAB:MOV A,R0
- MOV DPTR,#RYTH
- MOVC A,@A+DPTR ;查表法将一个节拍数据取出放R2计数器中
- MOV R2,A
- TTAB:MOV A,R1
- MOV DPTR,#TONE
- MOVC A,@A+DPTR
- MOV R3,A ;取出音符表高8位
- INC R1 ;指针加1
- MOV A,R1
- MOV DPTR,#TONE
- MOVC A,@A+DPTR
- MOV R4,A ;取出低8位
- SETB P2.4
- LOOP:MOV R5,#3BH
- JMP MAIN
- L2:JMP L3
- MAIN:MOV TMOD,#01H
- MOV TL0,R4
- MOV TH0,R3
- SETB TR0
- WAIT:JNB TF0,WAIT
- CLR TF0
- CPL P2.4
- RA: DJNZ R5,MAIN ;无打断则继续放第一首歌
- DJNZ R2,LOOP
- INC R0 ;两个表的指针都加1
- INC R1
- CJNE R1,#88,RTAB ;判断是否取完
- LJMP KEYP0
- TONE:
- DB 0FBH,68H,0FDH,6EH,0FDH,45H,0FCH,0EFH,0FCH,8FH,0FCH,8FH,0FCH,8FH,0FCH,5BH,0FCH,8FH
- DB 0FCH,0EFH,0FDH,45H,0FBH,68H,0FBH,68H,0FCH,8FH,0FCH,5BH,0FBH,0E9H,0FBH,68H,0FBH,68H
- DB 0FAH,0DBH,0FAH,8CH,0F9H,21H,0FAH,8CH,0FAH,0D8H,0FBH,68H,0FBH,68H,0FBH,68H,0FBH,68H
- DB 0FBH,0E9H,0FBH,0E9H,0FBH,68H,0FBH,0E9H,0FCH,5BH,0FAH,8CH,0FCH,8FH,0FCH,8FH,0FCH,5BH
- DB 0FCH,8FH,0FCH,0EFH,0FCH,0EFH,0FCH,0EFH,0FCH,8FH,0FDH,45H,0FDH,6EH,0FCH,0EFH
- RYTH:
- DB 04,04,04,04,04,04,04,04,04,04
- DB 04,05,04,04,04,04,04,04,04,04
- DB 04,04,04,06,04,04,04,07,04,04
- DB 04,04,04,06,04,04,04,07,04,04
- DB 04,04,04,04
- L3:
-
- ;清除遥控值使连按失效
- MOV 1AH,#00H
- MOV 1BH,#00H
- MOV 1CH,#00H
- MOV 1DH,#00H
- LJMP INFRARED
- ;=================================================
- ; 延时子程序
- ;=============================882
- ;1.085x ((202x4)+5)=882
- DELAY882:
- MOV R7,#202
- DELAY882_A:
- NOP
- NOP
- DJNZ R7,DELAY882_A
- RET
-
- ;=============================1000
- ;1.085x ((229x4)+5)=999.285
- DELAY1000:
- MOV R7,#229
- DELAY1000_A:
- NOP
- NOP
- DJNZ R7,DELAY1000_A
- RET
- ;=============================2400
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
|