$NOMOD51 $INCLUDE(89C2051.MCU) DIS_A EQU P1.5 DIS_B EQU P1.4 DIS_C EQU P1.3 DIS_D EQU P1.1 DIS_E EQU P1.2 DIS_F EQU P1.6 DIS_G EQU P1.7 DIS1 EQU P1.0 DIS2 EQU P3.7 DIS3 EQU P3.5 SENSOR1 EQU P3.2 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 MINUS BIT SENP.1 MIN1 BIT SENP.2 COUNT: DS 1 SPEED: DS 1 VALUE_1: DS 1 VALUE_2: DS 1 VALUE_3: DS 1 TEMP1: DS 1 TEMP1D: DS 1 RAM: DS 9 TEP1: DS 1 TEP2: DS 1 STACK: DS 1 ; Stack begins here CSEG ; Code begins here ;---------==========----------==========---------=========--------- ; PROCESSOR INTERRUPT AND RESET VECTORS ;---------==========----------==========---------=========--------- ORG 0000H ; Reset JMP MAIN ORG 001BH ;Timer Interrupt1 JMP REFRESH ;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ; MAIN PROGRAM ;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& MAIN: MOV PSW,#RB0 ; Select register bank 0 MOV SP,#STACK MOV SPEED,#00H MOV COUNT,#00H CLR DIS1 CLR DIS2 CLR DIS3 MOV TMOD,#16H ;enable timer0 for scanning MOV TL1,#00H MOV TH1,#0FDH SETB ET1 SETB EA SETB TR1 ;Start the Timer MOV VALUE_1,#15h MOV VALUE_2,#15h MOV VALUE_3,#15h MAINS:CALL READ_TEMP1 JB SENP1,NOT_OK MOV A,TEMP1 ;DISPLAY HIGHER DIGITS FOR SENSOR 1 ANL A,#0F0H SWAP A MOV VALUE_1,A MOV A,TEMP1 ANL A,#0FH MOV VALUE_2,A MOV A,TEMP1D ;DISPLAY DECIMAL DIGITS FOR SENSOR 1 ANL A,#0F0H SWAP A MOV VALUE_3,A CALL DELAY CALL DELAY CALL DELAY AJMP MAINS NOT_OK: MOV VALUE_1,#15H MOV VALUE_2,#15H MOV VALUE_3,#15H CALL DELAY CALL DELAY CALL DELAY AJMP MAINS ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ; 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 TEMP1,#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 TEMP1,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 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DS1820CRC_OK: ; EXTERN BIT DS1820CRC_OK(VOID); MOV R5, #9 ; 8+1 BYTE CRC MOV R7, #0 ; CLEAR CRC REGISTER MOV DPTR, #DOWCRC_TABLE MOV R0, #RAM CRC: MOV A, @R0 ; SCRATCHAD VALUE XRL A, R7 MOVC A, @A+DPTR MOV R7, A INC R0 DJNZ R5, CRC JZ OK CLR CY RET OK: SETB CY RET ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% dowcrc_table: DB 0, 94, 188, 226, 97, 63, 221, 131 DB 194, 156, 126, 32, 163, 253, 31, 65 DB 157, 195, 33, 127, 252, 162, 64, 30 DB 95, 1, 227, 189, 62, 96, 130, 220 DB 35, 125, 159, 193, 66, 28, 254, 160 DB 225, 191, 93, 3, 128, 222, 60, 98 DB 190, 224, 2, 92, 223, 129, 99, 61 DB 124, 34, 192, 158, 29, 67, 161, 255 DB 70, 24, 250, 164, 39, 121, 155, 197 DB 132, 218, 56, 102, 229, 187, 89, 7 DB 219, 133, 103, 57, 186, 228, 6, 88 DB 25, 71, 165, 251, 120, 38, 196, 154 DB 101, 59, 217, 135, 4, 90, 184, 230 DB 167, 249, 27, 69, 198, 152, 122, 36 DB 248, 166, 68, 26, 153, 199, 37, 123 DB 58, 100, 134, 216, 91, 5, 231, 185 DB 140, 210, 48, 110, 237, 179, 81, 15 DB 78, 16, 242, 172, 47, 113, 147, 205 DB 17, 79, 173, 243, 112, 46, 204, 146 DB 211, 141, 111, 49, 178, 236, 14, 80 DB 175, 241, 19, 77, 206, 144, 114, 44 DB 109, 51, 209, 143, 12, 82, 176, 238 DB 50, 108, 142, 208, 83, 13, 239, 177 DB 240, 174, 76, 18, 145, 207, 45, 115 DB 202, 148, 118, 40, 171, 245, 23, 73 DB 8, 86, 180, 234, 105, 55, 213, 139 DB 87, 9, 235, 181, 54, 104, 138, 212 DB 149, 203, 41, 119, 244, 170, 72, 22 DB 233, 183, 85, 11, 136, 214, 52, 106 DB 43, 117, 151, 201, 74, 20, 246, 168 DB 116, 42, 200, 150, 21, 75, 169, 247 DB 182, 232, 10, 84, 215, 137, 107, 53 ;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ; SENSOR 1 ;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ; ********** TEPRE SUB ********** ; TEMP MEMORY PRESENCE ; REG = R2 TEPRE: JB SENSOR1,$ ;PRESENCE (RX) JNB SENSOR1,$ MOV R2,#8 DJNZ R2,$ RET ; ********** TERES SUB ********** ; TEMP MEMORY RESET ; REG = R2 TERES: CLR SENSOR1 ;RESET (TX) MOV R2,#200 ;APP. 900 uS TERES1: NOP NOP DJNZ R2,TERES1 SETB SENSOR1 MOV R2,#8 DJNZ R2,$ RET ; ********** TECHK SUB ********** ; TEMP MEMORY CHECK PRESENCE AT FIRST ; OUT = CY 0=NO 1=OK ; REG = R2,R3 TECHK: MOV R2,#8 TECHK1: MOV R3,#0 TECHK2: JNB SENSOR1,TECHK5 ;PRESENCE (RX) DJNZ R3,TECHK2 DJNZ R2,TECHK1 CLR C RET TECHK5: JNB SENSOR1,$ MOV R2,#8 DJNZ R2,$ SETB C RET ; ******************************************************** ; TEMP MEMORY WRITE BYTE ; IN = A ; REG = A,R2,R3 ; ******************************************************** TEWB: MOV R3,#8 ;WRITE BYTE TEWB1: RRC A JC TEWB2 CALL TEW0 SJMP TEWB3 TEWB2: CALL TEW1 TEWB3: DJNZ R3,TEWB1 RET TEW0: CLR SENSOR1 ;WRITE 0 MOV R2,#15 ;65 uS TEW01: NOP NOP DJNZ R2,TEW01 SETB SENSOR1 NOP ;4 uS NOP NOP NOP RET TEW1: CLR SENSOR1 ;WRITE 1 NOP ;4 uS NOP NOP NOP SETB SENSOR1 MOV R2,#15 ;65 uS TEW11: NOP NOP DJNZ R2,TEW11 RET ; ********** TERB SUB ********** ; TEMP MEMORY READ BYTE ; OUT = A ; REG = A,R2,R3 TERB: MOV R3,#8 ;READ BYTE TERB1: CALL TEBIT RRC A DJNZ R3,TERB1 RET TEBIT: CLR SENSOR1 ;READ BIT NOP NOP SETB SENSOR1 NOP NOP NOP NOP MOV C,SENSOR1 MOV R2,#15 ;65 uS TEBIT2: NOP NOP DJNZ R2,TEBIT2 RET ;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ; 7 SEGMENT DISPLAY ROUTINE ;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& DISP: MOV R2,SPEED CJNE R2,#00H,AAS1 CLR DIS_A CLR DIS_B CLR DIS_C CLR DIS_D CLR DIS_E CLR DIS_F SETB DIS_G RET AAS1: CJNE R2,#01H,AS2 CLR DIS_B CLR DIS_C SETB DIS_A SETB DIS_D SETB DIS_E SETB DIS_F SETB DIS_G RET AS2: CJNE R2,#02H,AS3 CLR DIS_A CLR DIS_B CLR DIS_D CLR DIS_E CLR DIS_G SETB DIS_C SETB DIS_F RET AS3: CJNE R2,#03H,AS4 CLR DIS_A CLR DIS_B CLR DIS_C CLR DIS_D CLR DIS_G SETB DIS_E SETB DIS_F RET AS4: CJNE R2,#04H,AS5 CLR DIS_B CLR DIS_C CLR DIS_F CLR DIS_G SETB DIS_A SETB DIS_D SETB DIS_E RET AS5: CJNE R2,#05H,AS6 CLR DIS_A CLR DIS_C CLR DIS_D CLR DIS_F CLR DIS_G SETB DIS_B SETB DIS_E RET AS6: CJNE R2,#06H,AS7 CLR DIS_A CLR DIS_C CLR DIS_D CLR DIS_E CLR DIS_F CLR DIS_G SETB DIS_B RET AS7: CJNE R2,#07H,AS8 CLR DIS_A CLR DIS_B CLR DIS_C SETB DIS_D SETB DIS_E SETB DIS_F SETB DIS_G RET AS8: CJNE R2,#08H,AS9 CLR DIS_A CLR DIS_B CLR DIS_C CLR DIS_D CLR DIS_E CLR DIS_F CLR DIS_G RET AS9: CJNE R2,#09H,AS10 CLR DIS_A CLR DIS_B CLR DIS_C CLR DIS_D CLR DIS_F CLR DIS_G SETB DIS_E RET AS10: CJNE R2,#15H,AS11 ;symbol for - SETB DIS_A SETB DIS_B SETB DIS_C SETB DIS_D SETB DIS_E SETB DIS_F CLR DIS_G RET AS11: CJNE R2,#16H,AS12 ;switch off all disp SETB DIS_A SETB DIS_B SETB DIS_C SETB DIS_D SETB DIS_E SETB DIS_F SETB DIS_G RET AS12: MOV SPEED,#00H AJMP DISP ;********************************************************** ; INTRRUPT ROUTINE TO REFRESH THE DISPLAY ;********************************************************** REFRESH: PUSH PSW ; save current registerset MOV PSW,#RB1 PUSH ACC INC COUNT MOV R4,COUNT QA1: CJNE R4,#01H,QA2 MOV SPEED,VALUE_1 SETB DIS1 CLR DIS2 CLR DIS3 CALL DISP AJMP DOWN QA2: CJNE R4,#02H,QA3 MOV SPEED,VALUE_2 CLR DIS1 SETB DIS2 CLR DIS3 CALL DISP AJMP DOWN QA3: CJNE R4,#03H,QA4 MOV SPEED,VALUE_3 CLR DIS1 CLR DIS2 SETB DIS3 CALL DISP AJMP DOWN QA4: MOV COUNT,#01H MOV R4,COUNT AJMP QA1 DOWN: MOV TL1,#0FFH MOV TH1,#0F0H POP ACC POP PSW RETI ;********************************************************** DELAY1: MOV R0,#05H REPA2: MOV R1,#99H REPA1: NOP DJNZ R1,REPA1 DJNZ R0,REPA2 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 MOV R6,B MOV R7,A ENDD: RET ;*************************************************************************** ;********************************************************** DELAY: MOV R1,#0FFH REP2: MOV R6,#0FFH RAP1: NOP DJNZ R6,RAP1 DJNZ R1,REP2 RET ;********************************************************** DELAYS: MOV R1,#0FFH REPS: DJNZ R1,REPS RET END