?? main.asm
字號:
/**紅外遙控解碼范例**/
/**作者:田開坤**/
/**較網上可以下載到的程序相比,本代碼考慮了解碼過程容易死機的問題,采取辦法解決了,可以解碼失敗,但決不死機**/
DQ equ 0ebh ;P4.3定義接口,參考STC89C51數據手冊
EX2 equ 0c2h ;外部中斷2,參考STC89C51數據手冊
SEG1 equ 0ffech ;數碼管1(最右)
SEG2 equ 0ffedh ;數碼管2
SEG3 equ 0ffeeh ;數碼管3
SEG4 equ 0ffefh ;數碼管4(最左)
BYT_DLY equ 5FH ;延時函數參數變量
DA_BUF equ 40H ;解碼出的數據緩沖區,包括41H
ORG 0000h
LJMP main
ORG 003bh ;外部中斷2入口地址,參考STC89C51數據手冊
LJMP EINT3
ORG 40h
main: MOV SP,#60h
SETB EA
SETB EX2
SJMP $ ;原地踏步,等中斷解碼
//中斷接收解碼模塊
EINT3: CLR EA//關閉
MOV R6,#10
SB: MOV BYT_DLY,#13 ;834uS
ACALL DELAY ;調用834微秒延時子程序
JB DQ,EXIT ;延時834微秒后判斷DQ腳是否出現高電平如果有就退出解碼程序
DJNZ R6, SB ;重復 10 次,目的是檢測在 9000 微秒內如果出現高電平就退出解碼程序
;-------------------------------;以上完成對遙控信號 起始碼 的 9000 微秒的初始低電平信號的識別!!!!!
JNB DQ, $ ;等待,避開 起始碼 低電平
JB DQ,$ ;避開結果碼
/*;測試按鍵一次有多少位低電平,不同遙控器不一樣*/
/*;電工電子中心投影遙控器只有32位,這對后邊程序參數設置關系重大
CLR A
ADDLOOP: JNB DQ,$
ADD A,#1
MOV P1,A
JB DQ,cADD
sjmp $
*/
MOV R7,#16 ;忽略前16位系統識別碼 (即地址碼)
AAQQ: JNB DQ,$ ;通過低電平段
;JB DQ,$ ;以下6行代碼可以用本行替換,但這樣容易出現死機。
MOV R6,#255
CTN2: JNB DQ,DER7 ;等待有效低電平到來,避開 結果碼 高電平
MOV BYT_DLY,#3 ;42uS
ACALL DELAY ;調用42微秒延時子程序,延時太短,計數器R6不夠大,延時太長,會錯過最佳檢測點
DJNZ R6,CTN2
LJMP EXIT ;防止死機
DER7: DJNZ R7,AAQQ
MOV R1,#DA_BUF ;設定1AH為起始RAM區
MOV R2,#2 ;接收從DA_BUF到DA_BUF+1的2個內存,用于存放操作碼 (即數據碼) 和操作反碼
PP: MOV R3,#8 ;每組數據為8位
JJJJ: JNB DQ,$ ;等待通過數據碼的低電平信號,等高電平到來后出去;
MOV BYT_DLY,#13 ;834uS
ACALL DELAY ;高電平開始后用840(560<t<1125,)微秒的時間尺去判斷信號此時的高低電平狀態
MOV C,DQ ;將DQ引腳此時的電平狀態0或1存入C中
JNC UUU ;如果為0就跳轉到UUU
;JB DQ,$ ;以下6行代碼可以用本行替換,但這樣容易出現死機。
MOV R6,#255
CTN3: JNB DQ,UUU ;等待有效低電平到來,避開 結果碼 高電平
MOV BYT_DLY,#3 ;42uS
ACALL DELAY ;調用840微秒延時子程序
DJNZ R6,CTN3
LJMP EXIT ;防止死機
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 ;接收完8位數據碼和8位數據反碼,存放在1AH/1BH中
MOV A,DA_BUF
CPL A ;對1AH取反后和1BH比較
CJNE A,DA_BUF+1,EXIT ;如果不等表示接收數據發生錯誤,放棄
MOV R7,DA_BUF ;將按鍵的鍵值通過數碼管顯示出來!
ACALL DISP
CLR P1.0 ;蜂鳴器鳴響-嘀嘀嘀-的聲音,表示解碼成功
MOV BYT_DLY,#50
ACALL DELAY
SETB P1.0 ;蜂鳴器停止
EXIT: SETB EA
reti
;-------------------------延時子程序---------------------------------
;晶振22.1184M
DELAY: PUSH BYT_DLY
DEL31: PUSH BYT_DLY
DEL32: DJNZ BYT_DLY,DEL32
POP BYT_DLY
DJNZ BYT_DLY,DEL31
POP BYT_DLY
DJNZ BYT_DLY,DELAY
RET
//數碼管顯示,數據由R7傳入
DISP: mov dptr,#ledmap
mov a,r7
anl a,#0fh
movc a,@a+dptr
mov dptr,#SEG1
cpl a
movx @dptr,a
mov dptr,#ledmap
mov a,r7
swap a
anl a,#0fh
movc a,@a+dptr
mov dptr,#SEG2
cpl a
movx @dptr,a
mov dptr,#SEG3
mov a,#0ffh
movx @dptr,a
mov dptr,#SEG4
movx @dptr,a
ret
ledmap: db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,77h,7ch,39h,5eh,79h,71h,00
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -