很詳細的紅外學習型遙控器,儲存在24c64中的匯編子程序,在你自己的設計中只要修改一下IO調(diào)用它就可以了,是本人的工程驗證能學習市面常用的絕大部分紅外線遙控器
用的是stc89c52單片機,下面是匯編代碼:
;************************************************ ;********************************** ;---------------------AT24C64 CODE------------------------- ;========================================================== ICSTART: ;I2C 開始 SETB SDA NOP NOP NOP NOP SETB SCK NOP NOP NOP NOP CLR SDA NOP NOP NOP NOP CLR SCK RET ;========================================================== ICSTOP: ;I2C 結束 CLR SDA NOP NOP NOP NOP CLR SCK NOP NOP NOP NOP SETB SCK NOP NOP NOP NOP SETB SDA RET ;========================================================== ICACK: ;I2C 應答 CLR SDA NOP NOP NOP NOP SETB SCK NOP NOP NOP NOP CLR SCK RET ;========================================================== NOACK: ;I2C 無應答 SETB SDA NOP NOP NOP NOP SETB SCK NOP NOP NOP NOP CLR SCK RET ;========================================================== ICREADBIT: ;I2C 讀取一位 SETB SDA NOP NOP NOP NOP SETB SCK NOP NOP NOP NOP MOV C,SDA CLR SCK RET ;---------------------------------------------------------- ICREADACK: MOV R7,#200 SETB SDA NOP NOP NOP NOP SETB SCK NOP NOP NOP NOP READACKS: JNB SDA,ACKEND DJNZ R7,READACKS SETB C CLR SCK RET ACKEND: CLR C CLR SCK RET ;========================================================== ICREADBYTE: ;I2C 讀取一個字節(jié) MOV R7,#8 READLOOP: LCALL ICREADBIT RLC A DJNZ R7,READLOOP MOV R7,A RET ;========================================================== ICWRITEBIT: ;I2C 寫一位 MOV SDA,C NOP NOP NOP NOP SETB SCK NOP NOP NOP NOP CLR SCK RET ;========================================================== ICWRITEBYTE: ;I2C 寫一個字節(jié) MOV A,R7 MOV R7,#8 WRITELOOP: RLC A LCALL ICWRITEBIT DJNZ R7,WRITELOOP RET ;========================================================== READAT: MOV A,R7 ;計算I2C地址 MOV B,#208 ;144 MUL AB MOV R2,B MOV R3,A LCALL ICSTART ;I2C 數(shù)據(jù)讀入緩沖區(qū) MOV R7,#0A0H ;R2R3 I2C地址 LCALL ICWRITEBYTE ;R0 緩沖區(qū)地址 LCALL ICREADACK ;R1 數(shù)據(jù)個數(shù) JNC RACKEND RET ; RACKEND: MOV A,R2 MOV R7,A LCALL ICWRITEBYTE LCALL ICREADACK MOV A,R3 MOV R7,A LCALL ICWRITEBYTE LCALL ICREADACK LCALL ICSTART MOV R7,#0A1H LCALL ICWRITEBYTE LCALL ICREADACK MOV R0,#LRDBUF MOV R1,#208 ;144 READDATAS: LCALL ICREADBYTE LCALL ICACK MOV @R0,A INC R0 DJNZ R1,READDATAS LCALL NOACK LCALL ICSTOP RET ;========================================================== WRITEAT: ;緩沖區(qū)數(shù)據(jù)寫入 I2C MOV A,R7 ;計算I2C地址 MOV B,#208 ;;144 MUL AB MOV R2,B MOV R3,A MOV R5,#13 ;9 13*16=208 MOV R0,#LRDBUF ICWRITENEXT: LCALL ICSTART MOV R7,#0A0H LCALL ICWRITEBYTE LCALL ICREADACK JNC WACKEND ; ; WACKEND: MOV A,R2 MOV R7,A LCALL ICWRITEBYTE LCALL ICREADACK MOV A,R3 MOV R7,A LCALL ICWRITEBYTE LCALL ICREADACK MOV R1,#16 WRITEDATAS: MOV A,@R0 INC R0 MOV R7,A LCALL ICWRITEBYTE LCALL ICREADACK DJNZ R1,WRITEDATAS LCALL ICSTOP MOV R7,#250 DELAY_D: MOV R6,#20 DJNZ R6,$ DJNZ R7,DELAY_D MOV A,R3 ADD A,#16 MOV R3,A MOV A,R2 ADDC A,#0 MOV R2,A DJNZ R5,ICWRITENEXT RET ;***************************************************************** ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ LRDREAD: ;紅外代碼讀取 MOV R0,#LRDBUF ;代碼緩沖區(qū)清零 MOV R1,#208 ;144 CLR A CLRLRDBUF: MOV @R0,A INC R0 DJNZ R1,CLRLRDBUF MOV R0,#LRDBUF SETB LRDR LRDTEST: SETB TR2 SETB ES ;紅外代碼起始檢測 JB RI,LLOOP ;這里是檢測有鍵按下時。。。。。。 CLR TR2 JNB LRDR,READSTART JB HWXX,LRDTEST ;紅外學習標志位 LJMP LLLOOP LLOOP: ; CLR RI MOV A,SBUF MOV R0,#250 MOV R1,#250 LP4: JB RI,LP3 DJNZ R0,LP4 DJNZ R1,LP4 LJMP LRDTEST LP3: CLR RI CLR ES MOV A,SBUF MOV A,#00H LP2: CLR HONGWAI ;紅外按鈕標志位 CLR P3.3 CLR HWXX MOV SBUF,#37H JNB TI,$ CLR TI DEC SP DEC SP LJMP LOOP LLLOOP: RET ;-------------------------------------- READSTART: CLR EA ;SETB P0.6 MOV TH1,#0 MOV TL1,#12 SETB LRDR ;-------------------------------------- READLOOP_S: SETB TR1 CLR TF1 TEST_LRDR: MOV A,TH1 JB TF1,LRDOVER JNB LRDR,TEST_LRDR CLR TR1 ; INC R0 MOV A,TL1 MOV @R0,A INC R0 MOV A,TH1 MOV @R0,A INC R1 ;紅外線時間 1 ;-------------------------------------- ;-------------------------------------- MOV TH1,#0 MOV TL1,#12 SETB TR1 CLR TF1 TESTLRD: MOV A,TH1 JB TF1,LRDOVER JB LRDR,TESTLRD CLR TR1 INC R0 MOV A,TL1 MOV @R0,A INC R0 MOV A,TH1 MOV @R0,A ;代碼 2 INC R1 ;************************************** TEST_DATA: MOV TH1,#0 MOV TL1,#12 SETB TR1 CLR TF1 MOV A,R1 SUBB A,#101 ;44H JC READLOOP_S ;下一代碼 ;-------------------------------------- LRDOVER: CLR TR1 SETB EA MOV A,R1 MOV LRDBUF,A ;代碼個數(shù)緩沖 RET ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ LRD1SEND: CLR EA MOV R1,LRDBUF MOV R0,#LRDBUF MOV A,R1 JZ LRD_END SUBB A,#101 ;72 JNC LRD_END CLR EA MOV TH1,#0 LRD1OUTLOOP: CLR TR1 INC R0 MOV A,@R0 CPL A MOV TL1,A INC R0 MOV A,@R0 CPL A MOV TH1,A SETB TR1 CLR TF1 ;-------------------------------------- LRD1CONT: CPL LRD1 NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP ;發(fā)送紅外波形 38K HZ JNB TF1,LRD1CONT ;紅外前導代碼 CLR LRD1 DJNZ R1,SEND_DATA LJMP LRD_END SEND_DATA: ;-------------------------------------- CLR TR1 INC R0 MOV A,@R0 CPL A MOV TL1,A INC R0 MOV A,@R0 CPL A MOV TH1,A SETB TR1 CLR TF1 DJNZ R1,OUT_1_CODE LRD_END: CLR TR1 CLR TF1 SETB EA RET OUT_1_CODE: JNB TF1,$ ;紅外代碼 ;-------------------------------------- LJMP LRD1OUTLOOP RET ;取下一個代碼 ;========================================================== ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ DELAY: MOV R7,#200 DEL_L: MOV R6,#30 DJNZ R6,$ DJNZ R7,DEL_L RET DELY_2: MOV R7,#250 DEL_2: LJMP DELAY DJNZ R7,DEL_2 MOV R7,#250 DEL_3: LJMP DEL_2 DJNZ R7,DEL_3 RET