📄 fan.a51
字号:
INCLUDE REG_52.PDF
ZERO EQU P3.3 ; Zero Crossing Input
DIS_A EQU P0.2
DIS_B EQU P0.3
DIS_C EQU P0.4
DIS_D EQU P0.6
DIS_E EQU P0.5
DIS_F EQU P0.1
DIS_G EQU P0.0
DIS1 EQU P0.7
DIS2 EQU P2.7
DIS3 EQU P2.6
DIS4 EQU P2.5
PLUS EQU P1.0
MINUS EQU P1.1
AUTO EQU P1.2
AUTO_LED EQU P1.3
SENSOR1 EQU P2.0
FAN EQU P2.1
RB0 EQU 000H ; Select Register Bank 0
RB1 EQU 008H ; Select Register Bank 1 ...poke to PSW to use
DSEG ; This is internal data memory
ORG 20H ; Bit adressable memory
SENP: DS 1
SENP1 BIT SENP.0
SENP2 BIT SENP.1
SENP3 BIT SENP.2
SENP4 BIT SENP.3
SCRLBIT BIT SENP.4
EPROM BIT SENP.5
MINUS BIT SENP.6
FLAGS1: DS 1
RECEIVED BIT FLAGS1.0
MIN1 BIT FLAGS1.3
COUNT: DS 1
SPED: DS 1
VALUE_1: DS 1
VALUE_2: DS 1
VALUE_3: DS 1
VALUE_4: DS 1
NUMB1: DS 1
NUMB2: DS 1
NUMB3: DS 1
NUMB4: DS 1
TEMP1: DS 1
TEMP2: DS 1
TEMP3: DS 1
TEMP4: DS 1
TEMP5: DS 1
TEMP6: DS 1
TEMP7: DS 1
TEMP8: DS 1
TEMP9: DS 1
TEMP10: DS 1
TEMPS: DS 1
SPEED1: DS 1
SPEED2: DS 1
SPEED3: DS 1
SPEED4: DS 1
SPEED5: DS 1
SPEED6: DS 1
SPEED7: DS 1
SPEED8: DS 1
SPEED9: DS 1
SPEED10: DS 1
SPEEDS: DS 1
SPEED: DS 1
RAM: DS 9
TEP1: DS 1
TEP2: DS 1
TEMP1E: DS 1 ;TEMPERATURE ALARM DATAS 1
TEMP1L: DS 1
TEMP1LD: DS 1
TEMP1H: DS 1
TEMP1HD: DS 1
TEMP1S: DS 1 ;STORE TEMPERATURES
TEMP1D: DS 1
STACK: DS 1
CSEG AT 0 ; RESET VECTOR
;---------==========----------==========---------=========---------
; PROCESSOR INTERRUPT AND RESET VECTORS
;---------==========----------==========---------=========---------
ORG 00H ; Reset
JMP MAIN
ORG 000BH ;Timer Interrupt0
JMP TRIGGER
ORG 0013H ; External Interrupt 1
JMP ZERO_CROSS
ORG 001BH ;Timer Interrupt1
JMP REFRESH
;---------==========----------==========---------=========---------
MAIN:
MOV PSW,#RB0 ; Select register bank 0
MOV SP,STACK
SETB IP.2
MOV SPED,#00H
MOV SPEED,#00H
MOV COUNT,#00H
MOV NUMB1,#00H
MOV NUMB2,#04H
MOV NUMB3,#00H
MOV NUMB4,#00H
CLR AUTO_LED
CALL SET_TEMPERATURE
MOV VALUE_1,#15H ;Switch off all displays
MOV VALUE_2,#15H
MOV VALUE_3,#15H
MOV VALUE_4,#15H
CLR DIS1
CLR DIS2
CLR DIS3
CLR DIS4
MOV TMOD,#11H ;enable timer0 for scanning
MOV TL1,#00H
MOV TH1,#0FDH
SETB ET1
SETB ET0
SETB EX1
CLR IT1 ; triggered by a high to low transition
SETB EA
SETB TR1 ;Start the Timer
UPP:
CALL READ_TEMP1
MOV A,TEMP1S
ANL A,#0F0H
SWAP A
MOV VALUE_1,A
MOV A,TEMP1S
ANL A,#0FH
MOV VALUE_2,A
MOV A,TEMP1D
ANL A,#0F0H
SWAP A
MOV VALUE_3,A
MOV VALUE_4,SPEED
MOV A,TEMP1S
MOV TEMPS,A
SETB AUTO
MOV R3,#02H
RZPA3: MOV R1,#0FFH
RZPA2: MOV R2,#0FFH
RZPA1: JNB AUTO,SET_SPEED ;GOTO MANNUAL CONTROL
DJNZ R2,RZPA1
DJNZ R1,RZPA2
DJNZ R3,RZPA3
CALL CHECK_TEMPERATURE
AJMP UPP
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
; AUTO CONTROL
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
CHECK_TEMPERATURE:
MOV A,TEMPS
CJNE A,TEMP1,JKL1
MOV SPEED,SPEED1
RET
JKL1: CJNE A,TEMP2,JKL2
MOV SPEED,SPEED2
RET
JKL2: CJNE A,TEMP3,JKL3
MOV SPEED,SPEED3
RET
JKL3: CJNE A,TEMP4,JKL4
MOV SPEED,SPEED4
RET
JKL4: CJNE A,TEMP5,JKL5
MOV SPEED,SPEED5
RET
JKL5: CJNE A,TEMP6,JKL6
MOV SPEED,SPEED6
RET
JKL6: CJNE A,TEMP7,JKL7
MOV SPEED,SPEED7
RET
JKL7: CJNE A,TEMP8,JKL8
MOV SPEED,SPEED8
RET
JKL8: CJNE A,TEMP9,JKL9
MOV SPEED,SPEED9
RET
JKL9: MOV SPEED,SPEED10
RET
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
; MANUAL CONTROL
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
SET_SPEED:
SETB AUTO_LED
JNB AUTO,$
MOV VALUE_1,#17H ;Display Auto
MOV VALUE_2,#18H
MOV VALUE_3,#19H
MOV VALUE_4,#20H
JNB AUTO,$
CALL DELAY
CALL DELAY
CALL DELAY
MOV VALUE_1,#20H ;Display on
MOV VALUE_2,#22H
MOV VALUE_3,#21H
MOV VALUE_4,#21H
CALL DELAY
CALL DELAY
CALL DELAY
UAPP: CALL READ_TEMP1
MOV A,TEMP1S
ANL A,#0F0H
SWAP A
MOV VALUE_1,A
MOV A,TEMP1S
ANL A,#0FH
MOV VALUE_2,A
MOV A,TEMP1D
ANL A,#0F0H
SWAP A
MOV VALUE_3,A
MOV VALUE_4,SPEED
MOV A,TEMP1S
MOV TEMPS,A
SETB PLUS
SETB MINUS
SETB AUTO
MOV R3,#02H
RAPA3: MOV R1,#0FFH
RAPA2: MOV R2,#0FFH
RAPA1: JNB PLUS,MAN_SPEEDINCR
JNB MINUS,MAN_SPEEDDECR
JNB AUTO,GOTO_MAIN
DJNZ R2,RAPA1
DJNZ R1,RAPA2
DJNZ R3,RAPA3
AJMP UAPP
;**************************************************
GOTO_MAIN:
CLR AUTO_LED
JNB AUTO,$
MOV VALUE_1,#17H ;Display Auto
MOV VALUE_2,#18H
MOV VALUE_3,#19H
MOV VALUE_4,#20H
JNB AUTO,$
CALL DELAY
CALL DELAY
CALL DELAY
MOV VALUE_1,#20H ;Display on
MOV VALUE_2,#22H
MOV VALUE_3,#16H
MOV VALUE_4,#16H
CALL DELAY
CALL DELAY
CALL DELAY
AJMP UPP
;##########################################################
MAN_SPEEDINCR:
CALL DELAY
JNB PLUS,$
MOV A,SPEED
CJNE A,#09H,DFG1
AJMP UAPP
DFG1: INC SPEED
MOV VALUE_4,SPEED
AJMP UAPP
MAN_SPEEDDECR:
CALL DELAY
JNB MINUS,$
MOV A,SPEED
CJNE A,#00H,DFG2
AJMP UAPP
DFG2: DEC SPEED
MOV VALUE_4,SPEED
AJMP UAPP
;**************************************************************************
DELAYS: ;One second delay routine
MOV R6, #00H ;put 0 in register R6 (R6 = 0)
MOV R5, #004H ;put 5 in register R5 (R5 = 4)
LOOPB:
INC R6 ;increase R6 by one (R6 = R6 +1)
ACALL DELAYMS ;call the routine above. It will run and return to here.
MOV A, R6 ;move value in R6 to A
JNZ LOOPB ;if A is not 0, go to LOOPB
DEC R5 ;decrease R5 by one. (R5 = R5 -1)
MOV A, R5 ;move value in R5 to A
JNZ LOOPB ;if A is not 0 then go to LOOPB.
RET
;**************************************************************************
DELAYMS: ;millisecond delay routine
; ;
MOV R7,#00H ;put value of 0 in register R7
LOOPA:
INC R7 ;increase R7 by one (R7 = R7 +1)
MOV A,R7 ;move value in R7 to Accumlator (also known as A)
CJNE A,#0FFH,LOOPA ;compare A to FF hex (256). If not equal go to LOOPA
RET ;return to the point that this routine was called from
;**************************************************************************
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
; SENSOR 1
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
READ_TEMP1:
CLR SENP1 ;ASSUME ALL SENSORS OK
MOV A,#0CCH ;SKIP ROM
CALL TEWB
MOV A,#044H ;READ CONVERT
CALL TEWB
CALL TERES
CALL TECHK
JC ASX1 ;JMP IF sensor PRESENT
MOV TEMP1S,#0FFH
MOV TEMP1D,#0FFH
SETB SENP1 ;SET FOR NO SENSOR
JMP DCFG1
ASX1: MOV R2,#0
DJNZ R2,$
CALL TERES
CALL TEPRE
MOV R2,#0
DJNZ R2,$
MOV A,#0CCH ;SKIP ROM
CALL TEWB
MOV A,#0BEH ;READ SCRATCHPAD
CALL TEWB
MOV R6,#9
MOV R0,#RAM
TCOTEM2: CALL TERB ;Read Temperature from SCRATCHPAD
MOV @R0,A
INC R0
DJNZ R6,TCOTEM2
CALL TERES ;RESET
CALL TEPRE
CALL ds1820crc_ok
JNC DCFG1 ;jump if CRC Check failure
CALL CALCULATE
MOV A,TEP1
CJNE A,#85H,REP1
JMP READ_TEMP1
REP1: MOV TEMP1S,TEP1
MOV TEMP1D,TEP2
CLR MIN1 ;ASSUME +VE
MOV A,RAM+1
JNB ACC.0,DCFG1
SETB MIN1 ;minus temp
DCFG1: RET
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
; CALCULATE TEMP FOR HIGH RESOLUTION
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CALCULATE:
MOV A,RAM+1 ;MSB restore
RRC A
MOV MINUS,C
JNB MINUS,DLC4
MOV A,RAM
CPL A
INC A
MOV RAM,A
DLC4: MOV A,RAM
ANL A,#01H
JZ DLC2
DEC RAM
DLC2: MOV A,RAM
MOV B,#50
MUL AB
ADD A,#25
MOV R6,A
MOV A,B
ADDC A,#00H
MOV R7,A ;LSB=R11 ,MSB=R12
MOV A,RAM+7
CLR C
SUBB A,RAM+6
MOV B,#100
MUL AB
ANL A,#0F0H
SWAP A
MOV TEP1,A
MOV A,B
ANL A,#0FH
SWAP A
ORL A,TEP1
ADD A,R6
MOV R6,A
MOV A,R7
ADDC A,#00H
MOV R7,A
MOV A,R6
MOV R2,A ;CONVERT HEX VALUE TO BCD
MOV A,R7
MOV R1,A
MOV R3,#00D
MOV R4,#00D
MOV R5,#00D
MOV R6,#00D
CALL HEX2BCD
MOV A,R4
SWAP A
ORL A,R3
MOV TEP2,A
MOV A,R6
SWAP A
ORL A,R5
MOV TEP1,A
RET
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;**************************************************
HEX2BCD:
MOV B,#10D
MOV A,R2
DIV AB
MOV R3,B ;
MOV B,#10 ; R7,R6,R5,R4,R3
DIV AB
MOV R4,B
MOV R5,A
CJNE R1,#0H,HIGH_BYTE ; CHECK FOR HIGH BYTE
SJMP ENDD
HIGH_BYTE:
MOV A,#6
ADD A,R3
MOV B,#10
DIV AB
MOV R3,B
ADD A,#5
ADD A,R4
MOV B,#10
DIV AB
MOV R4,B
ADD A,#2
ADD A,R5
MOV B,#10
DIV AB
MOV R5,B
CJNE R6,#00D,ADD_IT
SJMP CONTINUE
ADD_IT:
ADD A,R6
CONTINUE:
MOV R6,A
DJNZ R1,HIGH_BYTE
MOV B, #10D
MOV A,R6
DIV AB
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -