基于12T 51內核的紅外解碼匯編程序,移植到1T STC單片機上,需要修改頻率來達到比較精確的延時
紅外遙控解碼記憶開關接線圖:
1672818593276.png (55.52 KB, 下載次數: 42)
下載附件
2023-1-4 16:17 上傳
1672820069127.png (79.85 KB, 下載次數: 48)
下載附件
2023-1-4 16:17 上傳
單片機紅外遙控解碼記憶開關匯編語言源程序如下:
- ;;;;;;紅外遙控解碼記憶;;;;;開機同時,按住按鍵直到蜂鳴器叫一次再松開,按遙控器認定按鈕,待蜂鳴器叫一次后,完成解碼記憶
- ;;;;RC頻率30M,分頻系數1/16,采用15F104EA ;;2015-4-16;;
- IAP_DATA EQU 0C2H ;IAP數據寄存器
- IAP_ADDRH EQU 0C3H ;IAP地址寄存器高字
- IAP_ADDRL EQU 0C4H ;IAP地址寄存器低字
- IAP_CMD EQU 0C5H ;IAP命令寄存器
- IAP_TRIG EQU 0C6H ;IAP命令觸發寄存器
- IAP_CONTR EQU 0C7H ;IAP控制寄存器
- CMD_IDLE EQU 0 ;空閑模式
- CMD_READ EQU 1 ;IAP字節讀命令
- CMD_PROGRAM EQU 2 ;IAP字節編程命令
- CMD_ERASE EQU 3 ;IAP扇區擦除命令
- ENABLE_IAP EQU 83H ;if SYSCLK<12MHz
- IAP_ADDRESS EQU 0000H ;測試地址(15L204EA的EEPROM空間為1K,分兩個扇區,每個512字節)
- CLK_DIV DATA 97H ;RC頻率30M,分頻系數1/16,采用15F104EA
- ID DATA 30H ;燈組個數狀態值
- HONG DATA 31H ;紅外數據緩存區
- ANJIAN BIT 26H.0 ;按鍵選擇標志
- FENG BIT P3.3 ;蜂鳴器
- KEY BIT P3.0 ;解碼記憶選擇開關
- PH BIT P3.4 ;紅外一體化接受頭
- SW BIT P3.5
- ORG 0000H
- AJMP MAIN1
- ORG 0040H
- MAIN1: MOV CLK_DIV,#1 ;分頻設置
- MOV ID,#00H
- MOV P3,#0FFH
- SETB ANJIAN
- JB KEY,START1 ;按鍵判斷
- MOV R7,#50
- D4: ACALL YS3
- DJNZ R7,D4
- JB KEY,START1
- CLR FENG ;聲音延時
- MOV R7,#50
- D5: ACALL YS3
- DJNZ R7,D5
- SETB FENG
- CLR ANJIAN
- START1:MOV DPTR,#IAP_ADDRESS ;讀取EEPOM紅外數據到緩存區 ;設置ISP/IAP/EEPROM地址
- LCALL IAP_READ ;讀IAP數據
- MOV 31H,A
- START:JB PH,$ ;等待遙控信號出現
- SB:MOV R4,#8
- SBA:MOV R5,#250
- SBB:JB PH,SXB1
- DJNZ R5,SBB
- DJNZ R4,SBA
- MOV R4,#2
- JMP SBC
- SXB1: MOV R5,#5
- SXB2: JNB PH,SBB
- DJNZ R5,SXB2
- JMP EXIT
- SBC:MOV R5,#250
- SB1:JB PH,SB2 ;2MS內不為高電平錯誤
- DJNZ R5,SB1
- DJNZ R4,SBC
- JMP EXIT
- SB2: MOV R5,#5
- SB2_A:JNB PH,SB1
- DJNZ R5,SB2_A
- MOV R4,#3
- SB2_1:MOV R5,#250
- SB3: JNB PH,SXC
- DJNZ R5,SB3
- DJNZ R4,SB2_1
- MOV R4,#2
- JMP SB3_1
- SXC:MOV R5,#5
- SXC1:JB PH,SB3
- DJNZ R5,SXC1
- JMP EXIT
- SB3_1:MOV R5,#250
- SB3_2:JNB PH,SB4
- DJNZ R5,SB3_2
- DJNZ R4,SB3_1
- JMP EXIT
- SB4: MOV R5,#5
- SB4_1:JB PH,SB3_2
- DJNZ R5,SB4_1
- MOV R1,#1AH ;設定1AH為起始RAM區
- MOV R2,#4
- PP: MOV R3,#8
- JJJJ:MOV R5,#250
- JJJJ2:JB PH,JJJJ3
- DJNZ R5,JJJJ2
- JMP EXIT
- JJJJ3:LCALL YS1
- MOV C,PH
- JNC UUU
- MOV R5,#250
- JJJJ4:JNB PH,UUU
- NOP
- DJNZ R5,JJJJ4
- JMP EXIT
- UUU: MOV A,@R1 ;將R1中地址的給A
- RRC A ;將C中的值移入A中的最低位
- MOV @R1,A ;將A中的數暫存在R1中
- DJNZ R3,JJJJ ;接收地址碼的高8位
- INC R1 ;對R1加1,換成下一個RAM
- DJNZ R2,PP ;以下對代碼是否正確和定義進行識別
- MOV A,1AH ;比較高8位地址碼
- XRL A,#00000000B ;判斷1AH的值是否等于00000000,相等的話A為0
- JNZ EXIT ;如果不等解碼失敗退出
- MOV A,1BH ;比較低8位地址
- XRL A,#11111111B ;再判高8位地址是否正確
- JNZ EXIT ;如果不相等說明解碼失敗退出
- LCALL YS3
- MOV A,1CH ;比較數據碼和數據反碼是否正確?
- CPL A
- XRL A,1DH ;將1CH的值取反后和1DH比較 不同則無效丟棄,核對數據是否準確
- JNZ EXIT ;如果不相等說明解碼失敗退出
- JB ANJIAN,MAIN2
- MOV DPTR,#IAP_ADDRESS ;設置ISP/IAP/EEPROM地址
- LCALL IAP_ERASE ;扇區擦除
- MOV A,1CH
- MOV DPTR,#IAP_ADDRESS ;設置ISP/IAP/EEPROM地址
- LCALL IAP_PROGRAM ;字節編程
- CLR FENG ;紅外數據寫入成功蜂鳴器叫一次指示
- MOV R7,#50
- D6: ACALL YS3
- DJNZ R7,D6
- SETB FENG
- SETB ANJIAN
- MOV 31H,1CH ;;;寫入成功,建議關機重啟
- EXIT: AJMP START
- MAIN2: MOV A,31H
- CJNE A,1CH,EXIT ;;;判斷紅外遙控次數決定遙控燈組個數;;;;
- CPL SW
- LJMP START
- IAP_IDLE: ;;;關閉IAP;;;
- MOV IAP_CONTR,#0 ;關閉IAP功能
- MOV IAP_CMD,#0 ;清除命令寄存器
- MOV IAP_TRIG,#0 ;清除觸發寄存器
- MOV IAP_ADDRH,#80H ;將地址設置到非IAP區域
- MOV IAP_ADDRL,#0
- RET
- IAP_READ: ;;;從ISP/IAP/EEPROM區域讀取一字節;;;
- MOV IAP_CONTR,#ENABLE_IAP ;使能IAP
- MOV IAP_CMD,#CMD_READ ;設置IAP命令
- MOV IAP_ADDRL,DPL ;設置IAP低地址
- MOV IAP_ADDRH,DPH ;設置IAP高地址
- MOV IAP_TRIG,#5AH ;寫觸發命令(0x5a)
- MOV IAP_TRIG,#0A5H ;寫觸發命令(0xa5)
- NOP ;等待ISP/IAP/EEPROM操作完成
- MOV A,IAP_DATA ;讀IAP數據
- LCALL IAP_IDLE ;關閉IAP功能
- RET
- IAP_PROGRAM: ;;;寫一字節數據到ISP/IAP/EEPROM區域;;;
- MOV IAP_CONTR,#ENABLE_IAP ;使能IAP
- MOV IAP_CMD,#CMD_PROGRAM ;設置IAP命令
- MOV IAP_ADDRL,DPL ;設置IAP低地址
- MOV IAP_ADDRH,DPH ;設置IAP高地址
- MOV IAP_DATA,A ;寫IAP數據
- MOV IAP_TRIG,#5AH ;寫觸發命令(0x5a)
- MOV IAP_TRIG,#0A5H ;寫觸發命令(0xa5)
- NOP ;等待ISP/IAP/EEPROM操作完成
- LCALL IAP_IDLE ;關閉IAP功能
- RET
- IAP_ERASE: ;;;扇區擦除;;;
- MOV IAP_CONTR,#ENABLE_IAP ;使能IAP
- MOV IAP_CMD,#CMD_ERASE ;設置IAP命令
- MOV IAP_ADDRL,DPL ;設置IAP低地址
- MOV IAP_ADDRH,DPH ;設置IAP高地址
- MOV IAP_TRIG,#5AH ;寫觸發命令(0x5a)
- MOV IAP_TRIG,#0A5H ;寫觸發命令(0xa5)
- NOP ;等待ISP/IAP/EEPROM操作完成
- LCALL IAP_IDLE ;關閉IAP功能
- RET
- YS1: MOV R4,#20 ;延時子程序1, 882微秒
- D1: MOV R5,#20
- DJNZ R5,$
- DJNZ R4,D1
- RET
- YS3: MOV R4,#2 ;延時程序3, 1000微秒
- D3:MOV R5,#248
- DJNZ R5,$
- DJNZ R4,D3
- RET
- END
復制代碼
|