;+++++ Car Boiler Temperature Sensor +++ ;+++++++++ 4-11-07 ++++++++++++ ;++++++++ www.Guidecircuit.com +++++ SDA BIT P3.1 SCL BIT P3.0 SW_UP BIT P3.7 SW_DOWN BIT P1.7 RELAY BIT P3.5 COM1 BIT P3.2 COM2 BIT P3.4 COM3 BIT P3.3 TEMP_H EQU 08 TEMP_L EQU 09 BUF_1 EQU 10 BUF_2 EQU 11 BUF_3 EQU 12 PP_H EQU 13 PP_L EQU 14 BB_H EQU 15 BB_M EQU 16 BB_L EQU 17 DD_H EQU 18 DD_L EQU 19 I2C_DATA EQU 20 TEMP EQU 21 SET_TEMP_L EQU 22 TH EQU 23 TL EQU 24 COUNT1 EQU 25 COUNT2 EQU 26 COUNT3 EQU 27 FLAG EQU 28 MIN_L EQU 29 MIN_H EQU 30 MAX_L EQU 31 MAX_H EQU 32 OVER EQU 33 EEPROM_CODE1 EQU 10100000B PCF8591_CODE1 EQU 10010000B ORG 0000H MAIN: MOV SP,#40 MOV P1,#11111111B MOV P3,#11111111B CLR RELAY SETB 18H LCALL DELAY_100MS LCALL READ_EEPROM1 MOV A,FLAG CJNE A,#0FFH,START MOV TEMP,#00H MOV MIN_H,#09H MOV MIN_L,#80H MOV MAX_H,#10H MOV MAX_L,#00H MOV FLAG,#00H LCALL WRITE_EEPROM1 START: JB 18H,B0 CPL RELAY B0: LCALL PCF8591_READ1 MOV A,I2C_DATA ORL A,#00000000B MOV TEMP,A LCALL CONVERT_TEMP LCALL CONVERT LCALL DISPLAY MOV R0,#00 B1: JB SW_UP,B2 JB SW_DOWN,B2 JNB 18H,B3 LJMP SET_TEMP_MAX B2: LCALL DISPLAY LCALL DISPLAY LCALL DISPLAY LCALL FINE_ON_RELAY LCALL FINE_OFF_RELAY DJNZ R0,B1 LJMP START B3: CLR RELAY SETB 18H LJMP START CONVERT_TEMP: LCALL CON_HEX_DEC LCALL MOV_TEMP_1 MOV TH,BB_M MOV TL,BB_L MOV R4,TH MOV R3,TL RET MOV_TEMP_1: MOV A,BB_M ANL A,#11110000B MOV OVER,A MOV A,BB_M SWAP A ANL A,#11110000B MOV BB_M,A MOV A,BB_L ANL A,#11110000B SWAP A ADD A,BB_M MOV BB_M,A MOV A,BB_L ANL A,#00001111B SWAP A MOV BB_L,A RET CON_HEX_DEC: MOV PP_L,TEMP MOV PP_H,#00H MOV DD_H,#00H MOV DD_L,#00H MOV BB_L,#00H MOV BB_M,#00H MOV BB_H,#00H FA1: MOV A,BB_L ADD A,#01 DA A MOV BB_L,A CJNE A,#00H,FA2 MOV A,BB_M ADD A,#01 DA A MOV BB_M,A CJNE A,#00H,FA2 MOV A,BB_H ADD A,#01 DA A MOV BB_H,A FA2: INC DD_L MOV A,DD_L CJNE A,#00H,FA3 INC DD_H FA3: MOV A,DD_L CJNE A,PP_L,FA1 MOV A,DD_H CJNE A,PP_H,FA1 RET SET_TEMP_MAX: MOV COUNT1,#00 MOV COUNT2,#15 MOV R4,MAX_H MOV R3,MAX_L DE1: LCALL CONVERT LCALL DISPLAY JNB SW_UP,DE1 DE2: JB SW_UP,DE4 JB SW_DOWN,DE4 DE3: LCALL CONVERT LCALL DISPLAY JNB SW_UP,DE3 LCALL SET_MIN LJMP START DE4: JB SW_UP,DE5 LJMP SET_UP_MAX DE5: JB SW_DOWN,DE6 LJMP SET_DOWN_MAX DE6: LCALL DISPLAY DJNZ COUNT1,DE2 LCALL DELAY_100MS LCALL DELAY_100MS DJNZ COUNT2,DE1 LCALL SET_MIN LJMP START SET_UP_MAX: MOV A,MAX_L SWAP A ANL A,#00001111B ADD A,#01H DA A SWAP A MOV MAX_L,A CJNE A,#01H,Y1 MOV MAX_L,#00 MOV A,MAX_H ADD A,#01H DA A MOV MAX_H,A Y1: MOV A,MAX_H CJNE A,#20H,Y2 MOV MAX_H,#05H MOV MAX_L,#00H Y2: MOV R4,MAX_H MOV R3,MAX_L LCALL SCAN_WAIT JNB SW_UP,SET_UP_MAX LCALL WRITE_EEPROM1 MOV COUNT1,#00 MOV COUNT2,#15 LJMP DE2 SET_DOWN_MAX: MOV A,MAX_L ANL A,#11110000B CJNE A,#00H,X1 MOV MAX_L,#90H SJMP X4 X1: MOV A,MAX_L SWAP A MOV MAX_L,A DEC MAX_L MOV A,MAX_L ANL A,#0FH CJNE A,#0FH,X2 X2: MOV A,MAX_L JC X3 ADD A,#0AH SUBB A,#10H X3: SWAP A MOV MAX_L,A SJMP X7 X4: DEC MAX_H MOV A,MAX_H ANL A,#0FH CJNE A,#0FH,X5 X5: MOV A,MAX_H JC X6 ADD A,#0AH SUBB A,#10H X6: MOV MAX_H,A X7: MOV A,MAX_H CJNE A,#04H,X8 MOV A,MAX_L CJNE A,#90H,X8 MOV MAX_H,#20H MOV MAX_L,#00H X8: MOV R4,MAX_H MOV R3,MAX_L LCALL SCAN_WAIT JNB SW_DOWN,SET_DOWN_MAX LCALL WRITE_EEPROM1 MOV COUNT1,#00. MOV COUNT2,#15 LJMP DE2 SET_MIN: MOV MIN_L,MAX_L MOV MIN_H,MAX_H MOV R0,#02 Z0: MOV A,MIN_L ANL A,#11110000B CJNE A,#00H,Z1 MOV MIN_L,#90H SJMP Z4 Z1: MOV A,MIN_L SWAP A MOV MIN_L,A DEC MIN_L MOV A,MIN_L ANL A,#0FH,Z2 Z2: MOV A,MIN_L JC Z3 ADD A,#0AH SUBB A,#10H Z3: SWAP A MOV MIN_L,A SJMP Z7 Z4: DEC MIN_H MOV A,MIN_H ANL A,#0FH CJNE A,#0FH,Z5 Z5: MOV A,MIN_H JC Z6 ADD A,#0AH SUBB A,#10H Z6: MOV MIN_H,A Z7: DJNZ R0,Z0 RET FINE_ON_RELAY: MOV A,TH CJNE A,MIN_H,V4 MOV A,TL CJNE A,MIN_L,V5 SJMP V6 V4: CLR C MOV A,TH SUBB A,MIN_H JC V6 RET V5: CLR C MOV A,TL SUBB A,MIN_L JC V6 RET V6: CLR RELAY SETB 18H RET FINE_OFF_RELAY: MOV A,TH CJNE A,MAX_H,V7 MOV A,TL CJNE A,MAX_L,V8 SJMP V9 V7: CLR C MOV A,TH SUBB A,MAX_H JNC V9 RET V8: CLR C MOV A,TL SUBB A,MAX_L JNC V9 RET V9: SETB RELAY CLR 18H RET TABLE: DB 10000001B DB 11001111B DB 10010010B DB 10000110B DB 11001100B DB 10100100B DB 10100000B DB 10001111B DB 10000000B DB 10000100B DB 11111110B DB 11111110B CONVERT: MOV A,R4 SWAP A ANL A,#0FH MOV DPTR,#TABLE MOVC A,@A+DPTR MOV BUF_1,A MOV A,R4 ANL A,#0FH MOV DPTR,#TABLE MOVC A,@A+DPTR MOV BUF_2,A MOV A,R3 SWAP A ANL A,#0FH MOV DPTR,#TABLE MOVC A,@A+DPTR MOV BUF_3,A RET DISPLAY: MOV A,BUF_1 CJNE A,#10000001B,DI1 SJMP DI2 DI1: MOV P1,BUF_1 CLR COM1 LCALL DELAY_2 SETB COM1 DI2: MOV P1,BUF_2 CLR COM2 LCALL DELAY_2 SETB COM2 MOV P1,BUF_3 CLR COM3 LCALL DELAY_2 SETB COM3 MOV P1,#11111111B RET DELAY_2: MOV B,#00H DL: NOP DJNZ B,DL RET SCAN_WAIT: MOV COUNT3,#120 LCALL CONVERT SC1: LCALL DISPLAY DJNZ COUNT3,SC1 RET WRITE_EEPROM1: LCALL I2C_START MOV I2C_DATA,#EEPROM_CODE1 LCALL I2C_WR MOV I2C_DATA,#00H LCALL I2C_WR MOV I2C_DATA,MIN_H LCALL I2C_WR MOV I2C_DATA,MIN_L LCALL I2C_WR MOV I2C_DATA,MAX_H LCALL I2C_WR MOV I2C_DATA,MAX_L LCALL I2C_WR MOV I2C_DATA,FLAG LCALL I2C_WR LCALL I2C_STOP RET READ_EEPROM1: LCALL I2C_START MOV I2C_DATA,#EEPROM_CODE1 LCALL I2C_WR MOV I2C_DATA,#00H LCALL I2C_WR LCALL EEPROM_RD1 MOV MIN_H,I2C_DATA LCALL EEPROM_RD1 MOV MIN_L,I2C_DATA LCALL EEPROM_RD1 MOV MAX_H,I2C_DATA LCALL EEPROM_RD1 MOV MAX_L,I2C_DATA LCALL EEPROM_RD1 MOV FLAG,I2C_DATA RET PCF8591_READ1: LCALL I2C_START MOV I2C_DATA,#PCF8591_CODE1 LCALL I2C_WR MOV I2C_DATA,#01000011B LCALL I2C_WR MOV I2C_DATA,#00 LCALL I2C_WR LCALL I2C_STOP LCALL I2C_START MOV I2C_DATA,#PCF8591_CODE1+1 LCALL I2C_WR LCALL I2C_RD LCALL I2C_STOP RET I2C_WR: PUSH ACC MOV A,I2C_DATA MOV R5,#08 I2C_WR_1: RLC A MOV SDA,C LCALL I2C_CLK DJNZ R5,I2C_WR_1 SETB SDA LCALL I2C_DELAY SETB SCL LCALL I2C_DELAY JB SDA,I2C_WR_2 I2C_WR_2: CLR SCL POP ACC RET I2C_RD: PUSH ACC CLR A MOV R5,#08 I2C_RD_1: ACALL I2C_DELAY SETB SCL ACALL I2C_DELAY MOV C,SDA RLC A CLR SCL DJNZ R5,I2C_RD_1 MOV I2C_DATA,A POP ACC RET EEPROM_RD1: LCALL I2C_START MOV I2C_DATA,#EEPROM_CODE1+1 LCALL I2C_WR LCALL I2C_RD LCALL I2C_STOP RET I2C_START: SETB SCL SETB SDA LCALL I2C_DELAY CLR SDA LCALL I2C_DELAY CLR SCL RET I2C_STOP: CLR SDA LCALL I2C_DELAY SETB SCL LCALL I2C_DELAY SETB SDA RET I2C_CLK: LCALL I2C_DELAY SETB SCL LCALL I2C_DELAY CLR SCL RET I2C_DELAY: MOV R6,#03 I2C_DELAY_1: NOP NOP DJNZ R6,I2C_DELAY_1 RET DELAY_10MS: MOV R7,#10 DELAY_10MS_1: MOV R6,#0E6H DELAY_10MS_2: NOP NOP DJNZ R6,DELAY_10MS_2 DJNZ R7,DELAY_10MS_1 RET DELAY_100MS: MOV R7,#100 DELAY_100MS_1: MOV R6,#0E6H DELAY_100MS_2: NOP NOP DJNZ R6,DELAY_100MS_2 DJNZ R7,DELAY_100MS_1 RET DELAY_1S: MOV R5,#100 DELAY_1S_1: ACALL DELAY_10MS DJNZ R5,DELAY_1S_1 RET END