本帖最后由 erhohen 于 2013-9-27 08:20 编辑
/* --------------------------------------------------------------------------------------
; PT2221发送的红外编码最前面为13.5ms的引导码,而后为32位的数据,32位数据的前16位为用户码,
;用于区别各个厂家的遥控器的不同,而后16位为数据码,分前8位和后8位,前后8位互为反码,用于检验
;这里我们接收了32位的数据, 【用户码】、【用户反码】;【操作码】、【操作反码】
;一体化接P0.0, 我用的是查询P0.0这个普通IO口检测红瓦信号的。
;数码管: P1口送段码,
;程序中采用12M晶振
--------------------------------------------------------------------------------------*/
ORG 0000H
AJMP MAIN ;转入主程序
MAIN:
SETB IT0 ;设定的触发方式(CLA IT0也行,反正设置了IT0就行)。(没有这个条指令,就会没反应)
;我纳闷的地反是这里,我根本没有使用什么中断,要设置IT0干嘛?
SETB P0.0
JNB P0.0,$
ACALL DECODE_START
DECODE_START:
MOV R6,#10
LOOP: ACALL Delay_882uS ;调用882微秒延时子程序
JB P0.0,EXIT ;延时882微秒后判断P0.0脚是否出现高电平如果有就退出解码程序,
;(882uS就出现高电平说明是干扰信号)
DJNZ R6, LOOP ;重复10次,目的是检测在8820微秒内如果出现高电平就退出解码程序
;=======以上完成对遥控信号的9ms的初始低电平信号的识别======================
JNB P0.0, $ ;等待高电平避开9毫秒低电平引导脉冲
ACALL Delay_4740uS ;延时4.74毫秒避开4.5毫秒的结果码
;==============到此为止,已跳过13.5ms的引导码=====================
MOV R1,#1AH ;设定1AH为起始RAM区
MOV R2,#4 ;接收从1AH到1DH的4个内存,用于存放:
;【用户码】、【用户反码】;【操作码】、【操作反码】
SHIFT8BIT: MOV R3,#8 ;每组数据为8位
BIT_DETECT:
JNB P0.0,$ ;等待地址码第一位的高电平信号
LCALL Delay_882uS ;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态
MOV C,P0.0 ;将P0.0引脚此时的电平状态0或1存入C中
JNC STORE_DATA ;如果为0就跳转到STORE_DATA
LCALL Delay_1mS ;检测到高电平1的话延时1毫秒等待脉冲高电平结束,然后把C中的1存入R1
STORE_DATA:
MOV A,@R1 ;将R1中的数据给A
RRC A ;将C中的值0或1移入A中的最低位
MOV @R1,A ;将A中的数暂时存放在R1数值的内存中
DJNZ R3,BIT_DETECT ;接收满8位换一个内存
INC R1 ;对R1中的值加1,换下一个RAM
DJNZ R2,SHIFT8BIT ;接收完8位数据码和8位数据反码,存放在1AH/1BH中
;==================上面的程序已完成了32位数据码的接收工作,下面进行检验==================
MOV A,1CH
CPL A ;对1AH取反后和1BH比较
CJNE A,1DH,EXIT ;如果不等表示接收数据发生错误,放弃
;====================校验正确则继续执行下面程序,不正确则作为干扰丢弃===================
MOV P1,1CH ;操作码传P1口
CPL P0.1 ; P0.0口上的LED闪烁一次,表示解码成功
;==================退出子程序,解码出错时退出解码子程序========================
EXIT: RETI ;退出解码子程序
;=============延时子程序1,精确延时882微秒=======================================
Delay_882uS: ;MOV R4,#17 ;11.0592M晶振请用此句延时
MOV R4,#20 ;12M晶振请用此句延时
D1: MOV R5,#20
DJNZ R5,$
DJNZ R4,D1
RET
;============延时子程序2,精确延时4740微秒==========================================
Delay_4740uS: MOV R4,#10
D2: ;MOV R5,#217 ;11.0592M晶振请用此句延时
MOV R5,#235 ;12M晶振请用此句延时
DJNZ R5,$
DJNZ R4,D2
RET
;=============延时程序3,精确延时1000微秒===========================================
Delay_1mS: MOV R4,#2
D3: ;MOV R5,#230 ;11.0592M晶振请用此句延时
MOV R5,#248 ;12M晶振请用此句延时
DJNZ R5,$
DJNZ R4,D3
RET
;=========================
END |