;================================================= ; 红外遥控接收 ;================================================= ; ; zsMCU51实验板配套学习例程 ; ; 中山单片机学习网 智佳科技 ; ; 作者:逸风 QQ:105558851 ; ; http://www.zsmcu.com ; E-mail:info@zsmcu.com ;================================================= ORG 0000H LJMP START;转入主程序 ORG 0010H START: MAIN: JNB P2.2,IR LJMP MAIN ;以下为进入P3.2脚外部中断子程序,也就是解码程序 IR: MOV R6,#9 SB: ACALL DELAY882 ;调用882微秒延时子程序 JB P2.2,EXIT ;延时882微秒后判断P2.2脚是否出现高电平如果有就退出解码程序 DJNZ R6, SB ;重复10次,目的是检测在8820微秒内如果出现高电平就退出解码程序 ;以上完成对遥控信号的9000微秒的初始低电平信号的识别。 JNB P2.2, $ ;等待高电平避开9毫秒低电平引导脉冲 ACALL DELAY2400 JNB P2.2,IR_Rp ; ACALL DELAY2400 ;延时4.74毫秒避开4.5毫秒的结果码 MOV R1,#1AH ;设定1AH为起始RAM区 MOV R2,#4 PP: MOV R3,#8 JJJJ: JNB P2.2,$ ;等待地址码第一位的高电平信号 LCALL DELAY882 ;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态 MOV C,P2.2 ;将P3.2引脚此时的电平状态0或1存入C中 JNC UUU ;如果为0就跳转到UUU LCALL DELAY1000 UUU: MOV A,@R1 ;将R1中地址的给A RRC A ;将C中的值0或1移入A中的最低位 MOV @R1,A ;将A中的数暂时存放在R1中 DJNZ R3,JJJJ ;接收地址码的高8位 INC R1 ;对R1中的值加1,换下一个RAM DJNZ R2,PP ;接收完16位地址码和8位数据码和8位数据,存放在1AH/1BH/1CH/1DH的RAM中 MOV P1,1DH ;将按键的键值通过P1口的8个LED显示出来! CLR P2.3 ;蜂鸣器鸣响-嘀嘀嘀-的声音,表示解码成功 LCALL DELAY2400 LCALL DELAY2400 LCALL DELAY2400 SETB P2.3;蜂鸣器停止 LJMP MAIN IR_Rp: LJMP MAIN EXIT: LJMP MAIN ;退出解码子程序 ;=============================882 DELAY882: ;1.085x ((202x4)+5)=882 MOV R7,#202 DELAY882_A: NOP NOP DJNZ R7,DELAY882_A RET ;=============================1000 DELAY1000: ;1.085x ((229x4)+5)=999.285 MOV R7,#229 DELAY1000_A: NOP NOP DJNZ R7,DELAY1000_A RET ;=============================2400 DELAY2400: ;1.085x ((245x9)+5)=2397.85 MOV R7,#245 DELAY2400_A: NOP NOP NOP NOP NOP NOP NOP DJNZ R7,DELAY2400_A RET END ;================================================= ; 红外遥控接收 ;================================================= ; ; 改为 PIC 汇编语言 ; 说明:以下有些指令有些有象51 其实是 宏替换 INCLUDE ; 本人 已由汇编 改用 PICC 编写程序 建议大家都用 C 语言 ; 作者:树叶 QQ:316362373 ; MSN:ycskkk@MSN.COM ; http://CS168.YS168.COM ; E-mail:bigtree@56.com ; ;------------------------------------------------------------------------------ ;程序名称:检测红外接收程序0 ;入口参数:临时使用寄存器 M,N ;出口参数:IrDataA,IrDataB,IrDataC,IrDataD 用户码低8位_ 用户码高8位_8位键数据码_8位键数据码反码 共32位 ;------------------------------------------------------------------------------- ;★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ;// 红外遥控接收程序 IR.asm 2006-03-23 ;// 编程条件:PIC16F876A或PIC16F877A,1.8432M,WDT=OFF,XT MODE ;★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ; ERRORLEVEL -205 ;Found directive in column 1. (ENDM) ; ERRORLEVEL -302 ;Register in operand not in bank 0. INCLUDE INCLUDE ;MACRO.INC包含以下宏 ;SET_OPTION MACRO VAL ;SET_TRIS MACRO PORT,VAL ;MOVLF MACRO FX,VAL ;MOVFF MACRO FX2,FX1 ;FX1-->FX2 注意方向 ;COMPARE MACRO FX10,FX11,LARGER,EQUAL,SMALLER ;FX10-FX11比大小 ;JNB MACRO FX,BIT,TABLE ;当测试位为0时 跳转到TABLE ;JB MACRO FX,BIT,TABLE ;当测试位为1时 跳转到TABLE ;CPL MACRO FX,BIT ;寄存器某一位清取反 ;----------------------------------------------------------------------- W_TEMP EQU 7FH ;为W在体0和体1定义两个备份寄存器 ;W_TEMP EQU 0FFH ;(若是16F873/874,则需保留FFH单元) PCLATH_TEMP EQU 7EH ;PCLATH内容备份 STATUS_TEMP EQU 7DH ;STATUS内容备份 OPTION_TEMP EQU 7CH ;选项寄存器 VALUE EQU 7BH ;存放烧写EEPROM的数据 ADDR EQU 7AH ;存放读、写EEPROM的地址 PORTB_TEMP EQU 79H ;PORTB暂存 M_TEMP EQU 78H N_TEMP EQU 77H ;R0 EQU FSR ;@R0 EQU INDF R1 EQU FSR R0 EQU INDF RMT EQU RA1 BUZ EQU RC6 CLK EQU RB3 DAT EQU RB2 NUM_D EQU 20H ;显示位数 4位 NUM_B EQU 21H ;每字节位数 8位 DIR_TEMP EQU 23H ;数据暂存器 M EQU 24H ;临时占用在延时250us,10ms,100MS子程序 N EQU 25H KEY_FLAG EQU 26H ;有键按下时,中断后给的标志 B5H 以便进入设置参数程序分支 FLAGS EQU 27H IrDataA EQU 28H IrDataB EQU 29H IrDataC EQU 2AH ;30H ★调试心得 29后面是2A 记住 IrDataD EQU 2BH ;31H 记住★ A EQU 32H ;COMFB宏中用到 R2 EQU 33H R3 EQU 34H R4 EQU 35H R5 EQU 36H R6 EQU 37H R7 EQU 38H A_DATA EQU 39H ;A_DATA寄存器存放数据首地址 IRA EQU 3BH IRB EQU 3CH IRC EQU 3DH IRD EQU 3EH ;-------------以下是ICD2注意事项--------------------------------------------------------------------- ;70H~7FH 适合作中断保护备份寄存器 ;20H~6FH ;A0H~EFH \ ;110H~16FH -- 注意:STATUS IRP RP1 RP0 ;190H~1EAH / ;0x1EB 0x1EC 0x1ED 0x1EE 0x1EF 被ICD占用 脱机是可用 ;MPLAB-ICD占用的PIC16F876/877目标单片机的文件存储器和程序存储器 ;0x70, 0xF0,0x170,0x1F0 后三个映射到0x70 ,0x18E 0x18F(原就保留) 0x1EB 0x1EC 0x1ED 0x1EE 0x1EF 六个文件存储器被保留 ;0x1F00-0x1FFF 256个程序存储单元被保留 ;BCF INTCON,GIE ;如果在程序中需对INTCON的 ;BSF INTCON,XX ;某一中断允许位进行修改, ;BSF INTCON,GIE ;则应事先 GIE-0,再GIE-1 ; SLEEP ;中断唤醒 相应使能位必须置1 ; NOP ;后面放一条空操作NOP指令 ;------------ 复位向量 中断向量------------------------------------------------------------------ ORG 0000H ;定义程序存放区域的起始地址 NOP ;放置一条ICD必须的空操用指令 CLRF PCLATH GOTO START ; ORG 0004H GOTO SERV MAIN BTFSS PORTA,RMT ;是否有遥控器按下 GOTO RCV ;跳转遥控接收程序 GOTO MAIN RCV BTFSC PORTA,RMT GOTO MAIN IR MOVLF R6,.10 SB CALL DELAY882 ;调用882微秒延时子程序 BTFSC PORTA,RMT ;延时882微秒后判断P3.2脚是否出现高电平如果有就退出解码程序 GOTO MAIN ;判断电平 DECFSZ R6,F ;重复10次,目的是检测在8820微秒内如果出现高电平就退出解码程序 GOTO SB NOP NOP ; MOVLF IrDataC,8 ; MOVLF IrDataD,18H SJ ;以上完成对遥控信号的9000微秒的初始低电平信号的识别。 JNB RA,RMT,SJ ;等待高电平避开9毫秒低电平引导脉冲 LCALL DELAY2400 JNB RA,RMT,IR_Rp LCALL DELAY2400 ;延时4.74毫秒避开4.5毫秒的结果码 MOVLF FSR,IrDataA ;设定1AH为起始RAM区 MOVLF R2,.4 PP ; MOVLF R3,.32 MOVLF R3,.8 JJJJ JNB RA,RMT,JJJJ ;等待地址码第一位的高电平信号 LCALL DELAY882 ;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态 BTFSS RA,RMT ;MOV C,P2.2 ;将RA1引脚此时的电平状态0或1存入C中 CLRC BTFSC RA,RMT SETC JNC UUU ;如果为0就跳转到UUU CALL DELAY250uS ;LCALL DELAY1000 CALL DELAY250uS ;晶振现是8M 所以调8次 CALL DELAY250uS ;默认是4M CALL DELAY250uS ;CALL DELAY250uS ;CALL DELAY250uS ;CALL DELAY250uS ;CALL DELAY250uS UUU ; RRF IrDataD ; RRF IrDataC ; RRF IrDataB ; RRF IrDataA MOVFF A,INDF ;将R1中地址的给A *补充 A不是W RRF A ;将C中的值0或1移入A中的最低位 MOVFF INDF,A ;将A中的数暂时存放在R1中 DJNZ R3,JJJJ ;接收地址码的高8位 INCF FSR,F ;对R1中的值加1,换下一个RAM DJNZ R2,PP ;接收完16位地址码和8位数据码和8位数据,存放在1AH/1BH/1CH/1DH的RA中 NOP NOP NOP SETB RC,BUZ CALL DELAY2400 CALL DELAY2400 CALL DELAY2400 CALL DELAY2400 CLRB RC,BUZ LJMP MAIN IR_Rp LJMP MAIN EXIT LJMP MAIN ;退出解码子程序 ;*********************宏替换******************************** ; MACRO.INC ;SET_OPTION MACRO VAL ;SET_TRIS MACRO PORT,VAL ;MOVLF MACRO FX,VAL ;MOVFF MACRO FX2,FX1 ;FX1-->FX2 注意方向 ;COMPARE MACRO FX10,FX11,LARGER,EQUAL,SMALLER ;FX10-FX11比大小 ;W00HZ1 MACRO TABLE ;JUMP_0 MACRO FX,BIT,TABLE ;当测试位为0时 跳转到TABLE ;JUMP_1 MACRO FX,BIT,TABLE ;当测试位为1时 跳转到TABLE ;JNB MACRO FX,BIT,TABLE ;当测试位为0时 跳转到TABLE ;JB MACRO FX,BIT,TABLE ;当测试位为1时 跳转到TABLE ;COMFB MACRO FX,BIT ;寄存器某一位清取反 ;CPL MACRO FX,BIT ;寄存器某一位清取反 ; ;定义一用于设置OPTION的宏 SET_OPTION MACRO VAL BANKSEL OPTION_REG MOVLW VAL ;取宏参数 MOVWF OPTION_REG CLRF STATUS ;回到BANK0 ENDM ;定义一用于设定I/O方向的宏 SET_TRIS MACRO PORT,VAL BANKSEL PORT|0X80 MOVLW VAL MOVWF PORT|0X80 CLRF STATUS ENDM ;立即数送寄存器的宏 MOVLF MACRO FX,VAL MOVLW VAL MOVWF FX ENDM ;寄存器送寄存器的宏 MOVFF MACRO FX2,FX1 ;FX1-->FX2 注意方向 MOVFW FX1 MOVWF FX2 ENDM COMPARE MACRO FX10,FX11,LARGER,EQUAL,SMALLER MOVF FX11,W ;先将FX11→W SUBWF FX10,W ;FX10-W→W BTFSC 3,Z ;Z=0,不相等,跳 GOTO EQUAL ;FX10=FX11,跳到分支EQUAL BTFSC 3,C ;C=0,跳 GOTO LARGER ;FX10>FX11,跳到分支LARGER GOTO SMALLER ;FX10<F11 ENDM ;W=00H,即Z=1是 跳转到 TABLE标号 不然程序继续执行 W00HZ1 MACRO TABLE BTFSC STATUS,Z ;注意:Z=1 才说明 W = 00H 按键已释放 GOTO TABLE ENDM JUMP_0 MACRO FX,BIT,TABLE ;当测试位为0时 跳转到TABLE BTFSS FX,BIT GOTO TABLE ENDM JUMP_1 MACRO FX,BIT,TABLE ;当测试位为1时 跳转到TABLE BTFSC FX,BIT GOTO TABLE ENDM JNB MACRO FX,BIT,TABLE ;当测试位为0时 跳转到TABLE BTFSS FX,BIT GOTO TABLE ENDM JB MACRO FX,BIT,TABLE ;当测试位为1时 跳转到TABLE BTFSC FX,BIT GOTO TABLE ENDM JNC MACRO TABLE BTFSS STATUS,C GOTO TABLE ENDM JC MACRO TABLE BTFSC STATUS,C GOTO TABLE ENDM ;寄存器某一位清取反 COMFB MACRO FX,BIT MOVLF R6,BIT INCF R6 SETC CLRF R7 RLF R7 DECFSZ R6 GOTO $-2 MOVFW R7 XORWF FX ENDM ;寄存器某一位清取反 CPL MACRO FX,BIT MOVLF R6,BIT INCF R6 SETC CLRF R7 RLF R7 DECFSZ R6 GOTO $-2 MOVFW R7 XORWF FX ENDM SETB MACRO FX,BIT BSF FX,BIT ENDM CLRB MACRO FX,BIT BCF FX,BIT ENDM JMP MACRO TABLE GOTO TABLE ENDM AJMP MACRO TABLE GOTO TABLE ENDM LJMP MACRO TABLE GOTO TABLE ENDM ACALL MACRO TABLE CALL TABLE ENDM ;减1判0,不等跳到TABLE DJNZ MACRO FX,TABLE DECFSZ FX,1 GOTO TABLE ENDM RRC MACRO FX ;A EQU XX 主文件已有定义 RRF FX,1 ENDM INC MACRO FX INCF FX ENDM RTCC EQU H'0001' RA EQU H'0005' RB EQU H'0006' RC EQU H'0007' ;----- PORTA -------------------------------------------------------- RA7 EQU H'0007' RA6 EQU H'0006' RA5 EQU H'0005' RA4 EQU H'0004' RA3 EQU H'0003' RA2 EQU H'0002' RA1 EQU H'0001' RA0 EQU H'0000' ;----- PORTB -------------------------------------------------------- RB7 EQU H'0007' RB6 EQU H'0006' RB5 EQU H'0005' RB4 EQU H'0004' RB3 EQU H'0003' RB2 EQU H'0002' RB1 EQU H'0001' RB0 EQU H'0000' ;----- PORTC -------------------------------------------------------- RC7 EQU H'0007' RC6 EQU H'0006' RC5 EQU H'0005' RC4 EQU H'0004' RC3 EQU H'0003' RC2 EQU H'0002' RC1 EQU H'0001' RC0 EQU H'0000'