電路圖:
;*************************************
上位機軟件及pcb文件下載地址: http://www.zg4o1577.cn/bbs/dpj-19233-1.html
;STC89C51RC單片機,6M晶振
;P0.7為紅外輸入
;P0.6為無線電信號輸入
;P0.5為外部信號輸入
;*************************************
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復位*********
FW: MOV A,#05H
MOV P2,A
CLR CS
SETB A0 ;寫復位命令
CLR DX
NOP
NOP ;50NS就可以
SETB DX
LCALL DYL
JSCS: JB GET,$
MOV A,#22H ;接受中斷數據
ACALL XML ;調用CH372寫命令
ACALL DSJ ;調用CH372讀數據
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 ;捕獲輸入信號。
AJMP TIM
F1: CJNE A,#0A2H,F2 ;如果收到A2則復位主程序。
AJMP AMIT
F2: CJNE A,#0A3H,F3 ;紅外輸入。
AJMP HWX
F3: CJNE A,#0A4H,F4 ;無線電信號輸入。
AJMP WXD
F4: CJNE A,#0A5H,JSCS ;外部信號輸入。
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
;***********數據采集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
;***********數據采集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
;************數據采集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
;*************數據發送***********
FZCX: MOV R7,#122
MOV R0,#08H
ZDDS: MOV A,#2AH ;CH372中斷命令通知PC機
ACALL XML
NOP
NOP
MOV A,#02H ;可輸入8個字節
ACALL XSJ
MOV A,@R0 ;送入要上傳的數據
ACALL XSJ
INC R0
MOV A,@R0 ;送入要上傳的數據
ACALL XSJ
INC R0
ACALL FYL
MOV A,#22H ;接受中斷數據
ACALL XML
ACALL DSJ
ACALL FYL
ACALL INO
DJNZ R7,ZDDS
MOV R0,#08H
MOV R7,#61
AJMP JSCS
;********CH372讀出數據**********
OUT2: MOV A,#28H ;讀端口2的命令
ACALL XML
ACALL DSJ
NOP
ACALL DSJ
NOP
RET
;****************
OUT1: NOP
PEND: NOP
LEEP: NOP
AJMP AMIT
;******釋放緩沖區子程序*****
INO: MOV A,#2BH ;釋放當前USB 緩沖區
ACALL XML
NOP
NOP
RET
;*******寫入數據子程序*******
XSJ: CLR A0 ;寫入數據
NOP
NOP ;延時2US,根據主頻來確定NOP的值
MOV P2,A
NOP
NOP ;50NS就可以
SETB DX
NOP
NOP ;延時1.2US根據主頻調整
RET
;*********延時子程序******
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