測試的時候發現有兩個結果 一個是正確的解碼了 一個是錯誤的解碼 然后錯誤的解碼好像少接收了兩位 不知道哪里出錯了 應該不是因為干擾 我沒有弄驗證數據的 因為我用別人的程序的時候 感覺沒有任何出錯 每次都是解碼成功 我的這個錯誤的解碼得到的結果也是反碼補碼是對的上的 錯誤的和正確的差兩位 比如一個是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
復制代碼
|