電路圖:
;*************************************
上位機(jī)軟件及pcb文件下載地址: http://www.zg4o1577.cn/bbs/dpj-19233-1.html
;STC89C51RC單片機(jī),6M晶振
;P0.7為紅外輸入
;P0.6為無線電信號(hào)輸入
;P0.5為外部信號(hào)輸入
;*************************************
CS EQU P0.0
A0 EQU P0.1
DX EQU P0.3
CE EQU P0.4
GET EQU P0.2
ORG 0000H
LJMP AMIT
ORG 0030H
AMIT: MOV SP,#0FBH
MOV P0,#0FFH
MOV P1,#0FFH
MOV P2,#0FFH
MOV P3,#0FFH
MOV R0,#08H
MOV R7,#68
MOV R2,#00H
CLR P0.7
MOV TMOD,#01H
MOV TL0,#00H
MOV TH0,#00H
CLR TR0
;********CH372復(fù)位*********
FW: MOV A,#05H
MOV P2,A
CLR CS
SETB A0 ;寫復(fù)位命令
CLR DX
NOP
NOP ;50NS就可以
SETB DX
LCALL DYL
JSCS: JB GET,$
MOV A,#22H ;接受中斷數(shù)據(jù)
ACALL XML ;調(diào)用CH372寫命令
ACALL DSJ ;調(diào)用CH372讀數(shù)據(jù)
CJNE A,#01H,G1
AJMP OUT1
G1: CJNE A,#0F2H,G2
ACALL OUT2 ;如果CH372返回0F2則讀端口2的命令
AJMP CHKOF
G2: CJNE A,#0F5H,G3
AJMP PEND
G3: CJNE A,#0F6H,G4
AJMP LEEP
G4: CJNE A,#0F9H,G5
ACALL INO
AJMP JSCS
G5: CJNE A,#0FAH,JSCS
ACALL INO
AJMP JSCS
;*******采集子程序********
CHKOF: CJNE A,#0A1H,F1 ;捕獲輸入信號(hào)。
AJMP TIM
F1: CJNE A,#0A2H,F2 ;如果收到A2則復(fù)位主程序。
AJMP AMIT
F2: CJNE A,#0A3H,F3 ;紅外輸入。
AJMP HWX
F3: CJNE A,#0A4H,F4 ;無線電信號(hào)輸入。
AJMP WXD
F4: CJNE A,#0A5H,JSCS ;外部信號(hào)輸入。
SETB P0.7
SETB P0.6
CLR P0.5
MOV R2,#02H
AJMP JSCS
HWX: SETB P0.5
SETB P0.6
CLR P0.7
MOV R2,#00H
AJMP JSCS
WXD: SETB P0.5
SETB P0.7
CLR P0.6
MOV R2,#01H
AML: AJMP JSCS
;***********判斷輸入端***********
TIM: CJNE R2,#0F1H,TI1
AJMP WTT
TI1: CJNE R2,#0F2H,TI2
AJMP UTT
TI2: CJNE R2,#0F0H,AML
;***********數(shù)據(jù)采集1紅外輸入************
CT: JNB GET,QH_1
JB P3.7,CT
SETB TR0
THO: JNB P3.7,$
CLR TR0
MOV A,TH0
MOV R1,TL0
MOV TL0,#01H
MOV TH0,#00H
SETB TR0
MOV @R0,A
INC R0
MOV A,R1
MOV @R0,A
JB P3.7,$
CLR TR0
MOV A,TH0
MOV R1,TL0
MOV TL0,#01H
MOV TH0,#00H
SETB TR0
INC R0
MOV @R0,A
INC R0
MOV A,R1
MOV @R0,A
INC R0
DJNZ R7,THO
CLR TR0
AJMP FZCX
QH_1: AJMP JSCS
;***********數(shù)據(jù)采集2無線輸入************
WTT: JNB GET,QH_2
JB P3.6,WTT
SETB TR0
THA: JNB P3.6,$
CLR TR0
MOV A,TH0
MOV R1,TL0
MOV TL0,#01H
MOV TH0,#00H
SETB TR0
MOV @R0,A
INC R0
MOV A,R1
MOV @R0,A
JB P3.6,$
CLR TR0
MOV A,TH0
MOV R1,TL0
MOV TL0,#01H
MOV TH0,#00H
SETB TR0
INC R0
MOV @R0,A
INC R0
MOV A,R1
MOV @R0,A
INC R0
DJNZ R7,THA
CLR TR0
AJMP FZCX
QH_2: AJMP JSCS
;************數(shù)據(jù)采集3外部輸入************
UTT: JNB GET,QH_2
JB P3.5,UTT
SETB TR0
THB: JNB P3.5,$
CLR TR0
MOV A,TH0
MOV R1,TL0
MOV TL0,#01H
MOV TH0,#00H
SETB TR0
MOV @R0,A
INC R0
MOV A,R1
MOV @R0,A
JB P3.5,$
CLR TR0
MOV A,TH0
MOV R1,TL0
MOV TL0,#01H
MOV TH0,#00H
SETB TR0
INC R0
MOV @R0,A
INC R0
MOV A,R1
MOV @R0,A
INC R0
DJNZ R7,THB
CLR TR0
;*************數(shù)據(jù)發(fā)送***********
FZCX: MOV R7,#122
MOV R0,#08H
ZDDS: MOV A,#2AH ;CH372中斷命令通知PC機(jī)
ACALL XML
NOP
NOP
MOV A,#02H ;可輸入8個(gè)字節(jié)
ACALL XSJ
MOV A,@R0 ;送入要上傳的數(shù)據(jù)
ACALL XSJ
INC R0
MOV A,@R0 ;送入要上傳的數(shù)據(jù)
ACALL XSJ
INC R0
ACALL FYL
MOV A,#22H ;接受中斷數(shù)據(jù)
ACALL XML
ACALL DSJ
ACALL FYL
ACALL INO
DJNZ R7,ZDDS
MOV R0,#08H
MOV R7,#61
AJMP JSCS
;********CH372讀出數(shù)據(jù)**********
OUT2: MOV A,#28H ;讀端口2的命令
ACALL XML
ACALL DSJ
NOP
ACALL DSJ
NOP
RET
;****************
OUT1: NOP
PEND: NOP
LEEP: NOP
AJMP AMIT
;******釋放緩沖區(qū)子程序*****
INO: MOV A,#2BH ;釋放當(dāng)前USB 緩沖區(qū)
ACALL XML
NOP
NOP
RET
;*******寫入數(shù)據(jù)子程序*******
XSJ: CLR A0 ;寫入數(shù)據(jù)
NOP
NOP ;延時(shí)2US,根據(jù)主頻來確定NOP的值
MOV P2,A
NOP
NOP ;50NS就可以
SETB DX
NOP
NOP ;延時(shí)1.2US根據(jù)主頻調(diào)整
RET
;*********延時(shí)子程序******
DYL: MOV R6,#100
D1: MOV R5,#50
DJNZ R5,$
DJNZ R6,D1
RET
FYL: MOV R6,#2
FD1: MOV R5,#68
DJNZ R5,$
DJNZ R6,FD1
RET
END