测试的时候发现有两个结果 一个是正确的解码了 一个是错误的解码 然后错误的解码好像少接收了两位 不知道哪里出错了 应该不是因为干扰 我没有弄验证数据的 因为我用别人的程序的时候 感觉没有任何出错 每次都是解码成功 我的这个错误的解码得到的结果也是反码补码是对的上的 错误的和正确的差两位 比如一个是00000000(正确的) 一个是00000011(错误的) 都是少偏移了两位一样
单片机源程序如下:
- ORG 000H
- MOV TMOD,#20H
- MOV TH1,#0FDH
- MOV TL1,#0FDH
- SETB TR1
- MOV SCON,#01000000B
- MAIN:
- JB P3.2,$;等待遥控信号出现
- MOV R6,#8
- SB: ACALL YS1 ;调用888微秒延时子程序
- JB P3.2,MAIN ;延时888微秒后判断P3.2脚是否出现高电平如果有就退出解码程序
- DJNZ R6, SB;重复10次,目的是检测在8880微秒内如果出现高电平就退出解码程序
- ;以上完成对遥控信号的9000微秒的初始低电平信号的识别。
- JNB P3.2, $ ;等待高电平避开9毫秒低电平引导脉冲
- JB P3.2,$;等待高电平的引导码过去
- ;CALL YS2 ;延时4.74毫秒避开4.5毫秒的结果码
- MOV R1,#24H ;设定24H为起始RAM区
- MOV R2,#4
- PP: MOV R3,#8
- JJJJ:JNB P3.2,$;等待地址码第一位的高电平信号
- ACALL YS3 ;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态
- MOV C,P3.2 ;将P3.2引脚此时的电平状态0或1存入C中
- JNC UUU;如果为0就跳转到UUU
- JB P3.2,$;如果为1就等待高电平信号结束
- 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位数据反码,存放在24H/25H/26H/27H的RAM中
- CPL P1.1
- LCALL SEND3
- JMP MAIN
- YS1: MOV R4,#20 ;
- D1: MOV R5,#19 ;
- DJNZ R5,$;
- DJNZ R4,D1;
- RET;延时888us左右
- YS3: MOV R4,#35 ;
- D3: MOV R5,#10 ;
- DJNZ R5,$;
- DJNZ R4,D3;
- RET;一共846.9us
- YS2: MOV R4,#17 ;
- D2: MOV R5,#125;
- DJNZ R5,$;
- DJNZ R4,D2;
- RET;大概921us
- SEND3:
- MOV A,26H
- MOV SBUF,A
- JNB TI,$
- CLR TI
- RET
- END
复制代码
|