Dear all,
A simple thermometer using PIC16F88 and LM35.
Here we are using TWO common anode 7 segment display for the OUTPUT indication.
The two 7 segment displays are multiplexed. Switching of the displays are happening with the help of two BC547 transistor.
Lm35 sensor is connected to the AN1(18 th pin of IC).
The connections of the seven segment display is shown in the below fig.
ASM code :
LIST P=16F88
#INCLUDE <P16F88.INC>
CBLOCK 0X30
COUNT
COUNT4
COUNT6
COUNT3
D1
RES1
RES2
RES3
RES4
A1
A2
B1
B2
NEG_FLAG
SHIFTH
SHIFTM
SHIFTL
BCOUNT
NRATORH
NRATORM
NRATORL
DENOMH
DENOMM
DENOML
REMAINH
REMAINM
REMAINL
LOWBYTE
HIGHBYTE
HUNS
TENS
ONES
ENDC
ORG 0X0000
NOP
NOP
NOP
NOP
CLRF PORTA
CLRF PORTB
BSF STATUS,RP0 ; SELECT BANK 1
BCF STATUS,RP1
BSF OSCCON,6 ; SETUP THE INTERNAL OSCILLATOR
BSF OSCCON,5 ; TO USE 4MHZ
MOVLW H'07' ; TURN OFF THE COMPARATORS
MOVWF CMCON
MOVLW B'00000011'
MOVWF TRISA
MOVLW B'00000000'
MOVWF TRISB
MOVLW B'00000011'
MOVWF ANSEL
BCF STATUS,RP0 ; SELECT BANK 0
BCF STATUS,RP1
GOTO START
ADC_INITIALISE
BCF STATUS,RP0 ; SELECT BANK 0
BCF STATUS,RP1
BCF ADCON0,GO
BCF ADCON0,ADCS1 ; SELECTING THE FOSC FOR THE A/D
BSF ADCON0,ADCS0 ; HERE WE HAVE SELECTED FOSC/16
BCF ADCON0,CHS2
BCF ADCON0,CHS1
BSF ADCON0,CHS0
BSF STATUS,RP0 ; SELECT BANK 1
BCF STATUS,RP1
BCF ADCON1,ADFM
BSF ADCON1,ADCS2
BCF ADCON1,VCFG1 ; SELECT THE SOURCE OF THE VREF
BCF ADCON1,VCFG0
BCF STATUS,RP0 ; SELECT BANK 0
BCF STATUS,RP1
BSF ADCON0,ADON ; TURN ON THE A/D MODULE
; CALL DELAY ; WAIT FOR THE AQUISTION TIME
BSF ADCON0,GO
; CALL DELAY ; WAIT FOR SOME TIME
HERE BTFSC ADCON0,GO
GOTO HERE
MOVF ADRESH,0
MOVWF LOWBYTE
CLRF HIGHBYTE
RETURN
MULTIPLY:
CLRF RES4
CLRF RES3
CLRF RES2
MOVLW 0X80
MOVWF RES1
CLRF NEG_FLAG
BTFSS A2,7
GOTO A_POS
COMF A2,F
COMF A1,F
INCF A1,F
BTFSC STATUS, Z
INCF A2,F
INCF NEG_FLAG, F
A_POS
BTFSS B2,7
GOTO NEXTBIT
COMF B2,F
COMF B1,F
INCF B1,F
BTFSC STATUS, Z
INCF B2,F
INCF NEG_FLAG, F
NEXTBIT
RRF A2,F
RRF A1,F
BTFSS STATUS, C
GOTO NOBIT_L
MOVF B1,W
ADDWF RES2,F
MOVF B2, W
BTFSC STATUS, C
INCFSZ B2, W
ADDWF RES3, F
BTFSC STATUS, C
INCF RES4, F
BCF STATUS, C
NOBIT_L
BTFSS A1, 7
GOTO NOBIT_H
MOVF B1,W
ADDWF RES3,F
BTFSC STATUS, C
INCF RES4,F
MOVF B2,W
ADDWF RES4,F
NOBIT_H
RRF RES4,F
RRF RES3,F
RRF RES2,F
RRF RES1,F
BTFSS STATUS, C
GOTO NEXTBIT
BTFSS NEG_FLAG, 0
GOTO NO_INVERT
COMF RES4,F
COMF RES3,F
COMF RES2,F
COMF RES1,F
INCF RES1,F
BTFSC STATUS,Z
INCF RES2,F
BTFSC STATUS,Z
INCF RES3,F
BTFSC STATUS,Z
INCF RES4,F
NO_INVERT
RETURN
DIVIDE: MOVLW .24
MOVWF BCOUNT
MOVF NRATORH,W
MOVWF SHIFTH
MOVF NRATORM,W
MOVWF SHIFTM
MOVF NRATORL,W
MOVWF SHIFTL
CLRF NRATORH
CLRF NRATORM
CLRF NRATORL
CLRF REMAINH
CLRF REMAINM
CLRF REMAINL
DLOOP BCF STATUS,C
RLF SHIFTL,F
RLF SHIFTM,F
RLF SHIFTH,F
RLF REMAINL,F
RLF REMAINM,F
RLF REMAINH,F
MOVF DENOMH,W
SUBWF REMAINH,W
BTFSS STATUS,Z
GOTO NOCHK
MOVF DENOMM,W
SUBWF REMAINM,W
BTFSS STATUS,Z
GOTO NOCHK
MOVF DENOML,W
SUBWF REMAINL,W
NOCHK BTFSS STATUS,C
GOTO NOGO
MOVF DENOML,W
SUBWF REMAINL,F
BTFSS STATUS,C
DECF REMAINM,F
MOVF REMAINM,W
XORLW 0XFF
BTFSC STATUS,Z
DECF REMAINH,F
MOVF DENOMM,W
SUBWF REMAINM,F
BTFSS STATUS,C
DECF REMAINH,F
MOVF DENOMH,W
SUBWF REMAINH,F
BSF STATUS,C
NOGO:
RLF NRATORL,F
RLF NRATORM,F
RLF NRATORH,F
DECFSZ BCOUNT,F
GOTO DLOOP
RETURN
HEX2DEC INCF LOWBYTE ; PRE-LOAD TEMPHI + 1
CLRF HUNS ; HUNS = 0000 0000
MOVLW D'246' ; MOVE DECIMAL'246' TO W
MOVWF TENS ; TENS GPR = 1111 0101
MOVWF ONES ; ONES GPR = 1111 0101
DECFSZ LOWBYTE, F ; DECREMENT TEMPHI REGISTER
GOTO $+D'2' ; NOT 0, SKIP NEXT INSTRUCTION
GOTO $+D'7'
INCFSZ ONES, F
GOTO $-D'4'
INCFSZ TENS, F
GOTO $-D'7'
INCF HUNS, F
GOTO $-D'10'
SUBWF TENS, F
SUBWF ONES, F
RETURN
DELAY
MOVLW 0XFF
MOVWF COUNT3
MOVLW 0X0A
MOVWF COUNT4
WAIT DECFSZ COUNT3,F
GOTO WAIT
DECFSZ COUNT4,F
GOTO WAIT
RETURN
DISPLAY
MOVLW 0X30
MOVWF COUNT6
HERE1 BSF PORTA,3
BCF PORTA,2
MOVF TENS,0
CALL TABLE1
MOVWF PORTB
CALL DELAY
BCF PORTA,3
BSF PORTA,2
MOVF ONES,0
CALL TABLE1
MOVWF PORTB
CALL DELAY
DECFSZ COUNT6,F
GOTO HERE1
RETURN
TABLE1 ADDWF PCL,F
RETLW B'00010001' ; 0
RETLW B'11010111' ; 1
RETLW B'00110010' ; 2
RETLW B'10010010' ; 3
RETLW B'11010100' ; 4
RETLW B'10011000' ; 5
RETLW B'00011000' ; 6
RETLW B'11010011' ; 7
RETLW B'00010000' ; 8
RETLW B'10010000' ; 9
START NOP
CALL ADC_INITIALISE
; 2000 = H'7D0'
CLRF A2
MOVLW 0X3C
MOVWF A1
MOVF HIGHBYTE,W
MOVWF B2
MOVF LOWBYTE,W
MOVWF B1
CALL MULTIPLY ; 125*ANALOG READ
MOVF RES3,W
MOVWF NRATORH
MOVF RES2,0
MOVWF NRATORM
MOVF RES1,0
MOVWF NRATORL
CLRF DENOMH
MOVLW H'00' ; 256 = H'FF'
MOVWF DENOMM
CLRF DENOML
MOVLW 0XFF
MOVWF DENOML
CALL DIVIDE
MOVF NRATORM,0
MOVWF HIGHBYTE ; TENTHS DEGREES
MOVF NRATORL,0
MOVWF LOWBYTE ; TENTHS
CALL HEX2DEC
CALL DISPLAY
GOTO START
END
HEX file:
:020000040000FA :100000000000000000000000850186018316031334 :100010000F178F1607309C000330850000308600D4 :1000200003309B0083120313D828831203131F117C :100030009F131F179F121F129F15831603139F13E1 :100040001F179F121F12831203131F141F151F194E :1000500027281E08CB00CC010800B801B701B60163 :100060008030B500BD01BA1F3B28BA09B909B90AE9 :100070000319BA0ABD0ABC1F4328BC09BB09BB0A45 :100080000319BC0ABD0ABA0CB90C031C50283B0862 :10009000B6073C0803183C0FB7070318B80A03104B :1000A000B91F58283B08B7070318B80A3C08B80717 :1000B000B80CB70CB60CB50C031C43283D1C6B28C0 :1000C000B809B709B609B509B50A0319B60A03197B :1000D000B70A0319B80A08001830C1004208BE0068 :1000E0004308BF004408C000C201C301C401C801E5 :1000F000C901CA010310C00DBF0DBE0DCA0DC90D47 :10010000C80D45084802031D8B2846084902031DF7 :100110008B2847084A02031C9C284708CA02031C74 :10012000C9034908FF3A0319C8034608C902031C5A :10013000C8034508C8020314C40DC30DC20DC10B8A :100140007A280800CB0ACD01F630CE00CF00CB0BC9 :10015000AA28B028CF0FA728CE0FA628CD0AA528F9 :10016000CE02CF020800FF30B3000A30B100B30B5B :10017000B728B10BB72808003030B200851505113B :100180004E08CD208600B320851105154F08CD20DF :100190008600B320B20BBE28080082071134D73482 :1001A00032349234D43498341834D33410349034F4 :1001B00000001520BA013C30B9004C08BC004B08C7 :1001C000BB002D203708C2003608C3003508C40024 :1001D000C5010030C600C701FF30C7006C204308CE :0C01E000CC004408CB00A220BC20D82892 :00000001FF

No comments:
Post a Comment