Vai al contenuto
PLC Forum


Termometro con pic16f877a, lm35 e display 16x2


ilario92

Messaggi consigliati

ciao voglio realizzare un TERMOMETRO CON PIC 16F877A, SENSORE TEMPERATURA LM35 E DISPLAY 16x2.
Il progetto ha un messaggio iniziale con shift verso destra.
Funziona su un range di temperatura da 0 - 100 °C con step di temperatura ogni 0.5°C.
Dopo i 100°C viene visualizzato un messaggio lampeggiante Tc>100°C.

ORA VORREI AGGIUNGERE ANCHE LE TEMPERATURE NEGATIVE...MA NON RIESCO!!! .!

grazie a tutti


Immagine.png.1ab788d956b60a51baf1c033e1d18f18.png
 

 

;TERMOMETRO CON PIC16F877A, SENSORE LM35, DISPLAY 16x2
;RANGE DA 0 - 100 °C, STEP TEMPERATURA DI 0.5°C CON MISURAZIONE OGNI 5 MINUTI


            PROCESSOR   16F877A
            RADIX       DEC
            INCLUDE     "P16F877A.inc" 
;------------------------------------------------------------------ 
   org      32
   cblock 0x20 
   count1
   count2
   count3
   count4   
   sample 
   shift 
   DATOH
   DATOL
   POINT
   POINT0
   endc 

;---------------------------------CONTROLLO COMANDI LCD--------------------------------- 
#define      RS      PORTC,2 
#define      E      PORTC,1
 
portlcd      equ      PORTD 
CLEAN       equ    b'00000001'       ;CLEAR DISPLAY 
SELECT_ROW1 equ    b'10000000'       ;SELECT ROW 1
SELECT_ROW2 equ    b'11000000'       ;SELECT ROW 2 
shiftdl    equ    b'00011100'       ;MOVE DISPLAY TO LEFT
shiftdr    equ    b'00011000'       ;MOVE DISPLAY TO RIGHT 
shiftcl    equ    b'00010100'       ;MOVE CURSOR TO LEFT 
shiftcr    equ    b'00010000'       ;MOVE CURSOR TO RIGHT
 
   org    0x00                   ;VETTORE RESET 
   GOTO   INIT
   org    0x04                   ;VETTORE INTERRUPT 

INIT
   bsf    STATUS,RP0              
   clrf    TRISD                   ;PORTD OUT
   bcf    TRISC,1                ;PORTC,1 OUT (E)
   bcf    TRISC,2                ;PORTC,2 OUT (RS) 
   bcf    STATUS,RP0              
   clrf    PORTD                   ;AZZERO PORTD 
   clrf    PORTC                   ;AZZERO PORTC 
   call    INIT_CONFIG_ADC              
   call    INIT_LCD              

;---------------------------------SCRIVI TESTO INIZIALE + MOVIMENTO E TEMPERATURA---------------------------------
;SCRIVI TESTO INIZIALE
START 
   CLRF   POINT
   call    MESS                   ;CALL START MESSAGE
   movlw    .11                     ;NUMBER LETTER TO MOVE (SHIFT)
   movwf    shift                   ;COPY NUMBER ROW TO "SHIFT"
   
;MOVIMENTO   
ROTATE 
   call    DELAY 
   movlw    shiftdr                ;COMMAND ROTAZIONE 
   call    cmd 
   decfsz    shift,F 
   goto    ROTATE 

   movlw    CLEAN                   ;COMMAND CLEAN DISPLAY 
   call    cmd 
   GOTO   OPERA0                  ;SALTA IL DELAY5MIN E MISURA SUBITO LA TEMPERATURA
   
;SCRIVI GRADI MISURATI
OPERA 
   call   DELAY_5MIN               ;DELAY5MIN - TEMPO DI OGNI MISURAZIONE
OPERA0
   movlw    SELECT_ROW1             ;SCRIVI SU 1 RIGA 
   call    cmd                 
   call    ACQUISIZIONE_ADC         ;CALL ACQUISIZIONE DATO DALL ADC
;SCRIVI TESTO TEMPERATURA
   movlw    "T" 
   call    dato 
   movlw    "e" 
   call    dato 
   movlw    "m" 
   call    dato
   movlw    "p" 
   call    dato 
   movlw    "e" 
   call    dato 
   movlw    "r" 
   call    dato
   movlw    "a" 
   call    dato 
   movlw    "t" 
   call    dato 
   movlw    "u" 
   call    dato
   movlw    "r" 
   call    dato
   movlw    "a" 
   call    dato
   movlw    ":" 
   call    dato
   
   movlw    SELECT_ROW2             ;scrivi su 2 riga
   call    cmd 
   
   CALL   CONVERS                  ;SCRIVI NUMERO GRADO
   
OPERA1
;SCRIVI PUNTO " . "   
   movlw    '.'                   ;SCRIVI PUNTO
   call    dato 

;SCRIVI DECIMI
   BTFSS    ADRESH,0               ;SE IL BIT O DEL REGISTRO ADRESH (NUMERO BINARIO DELLA CONVERSIONE DI T) VALE:
   goto    SCRIVI_ZERO             ;VALE 1 SCRIVI 0 ALTRIMENTI SKIP
   MOVLW   '5'                     ;SCRIVI 5 DECIMI
   CALL   dato
   GOTO   OPERA2
SCRIVI_ZERO
   MOVLW   '0'                     ;SCRIVI 0 DECIMI
   CALL   dato
   
OPERA2   
;SCRVI SIMBOLO " °C "

   movlw    B'11011111'             ;SIMBOLO DEL GRADO " ° " 
   call    dato 
   movlw    'C'                     ;" C " DI GRADI CELSIUS 
   call    dato 
   goto    OPERA    

;---------------------------------CONVERTITORE DA NUMERO BINARIO A NUMERO DECIMALE---------------------------------
CONVERS                           ;CONVERTE NUMERO DA BINARIO A DECIMALE

   MOVF   ADRESH,W               ;MUOVI CODICE BINARIO(CONVERSIONE) IN W
   MOVWF   POINT                  ;MUOVI W IN POINT
INCRE
   INCF   POINT,F                  ;INCREMENTA POINT FINO AD ARRIVARE ALLA DECINA INTERESSATA PER CAPIRE CHE TEMPERATURA MISURA
                              ;ES. (POINT= 8°C)-CONTINUA AD INCREMENTARE FIN QUANDO NON ARRIVA A 10-PER POI ANDARE ALLA SUBROUTINE DEL 10
;0-9
   MOVLW   20                     ;W=20 (20 PERCHE' CALCOLANDO ANCHE I DECIMALI DI 0.5  (0°C = 0 , 10°C = 20)
   XORWF   POINT,W                  ;compara VALORED con W
   BTFSC   STATUS,Z               ;se diverso skip
   GOTO   ZERO                  ;0-9
;10-19
   MOVLW   40                        ;W=40
   XORWF   POINT,W                  ;compara VALORED con W
   BTFSC   STATUS,Z               ;se diverso skip
   GOTO   TEN                     ;10-19
;20-29
   MOVLW   60                     ;W=60
   XORWF   POINT,W                  ;compara VALORED con W
   BTFSC   STATUS,Z               ;se diverso skip
   GOTO   TWENTY                  ;20-29
;30-39
   MOVLW   80                     ;W=80
   XORWF   POINT,W                  ;compara VALORED con W
   BTFSC   STATUS,Z               ;se diverso skip
   GOTO   THIRTY                  ;30-39
;40-49
   MOVLW   100                     ;W=100
   XORWF   POINT,W                  ;compara VALORED con W
   BTFSC   STATUS,Z               ;se diverso skip
   GOTO   FOURTY                  ;40-49
;50-59
   MOVLW   120                     ;W=120
   XORWF   POINT,W                  ;compara VALORED con W
   BTFSC   STATUS,Z               ;se diverso skip
   GOTO   FIFTY                  ;50-59
;60-69
   MOVLW   140                     ;W=140
   XORWF   POINT,W                  ;compara VALORED con W
   BTFSC   STATUS,Z               ;se diverso skip
   GOTO   SIXTY                  ;60-69
;70-79
   MOVLW   160                     ;W=160
   XORWF   POINT,W                  ;compara VALORED con W
   BTFSC   STATUS,Z               ;se diverso skip
   GOTO   SEVENTY                  ;70-79
;80-89
   MOVLW   180                     ;W=180
   XORWF   POINT,W                  ;compara VALORED con W
   BTFSC   STATUS,Z               ;se diverso skip
   GOTO   EIGHTY                  ;80-89
;90-99   
   MOVLW   200                     ;W=200
   XORWF   POINT,W                  ;compara VALORED con W
   BTFSC   STATUS,Z               ;se diverso skip
   GOTO   NINETY                  ;90-99
;T>100   
   MOVLW   250                     ;W=220
   XORWF   POINT,W                  ;compara VALORED con W
   BTFSC   STATUS,Z               ;se diverso skip
   GOTO   ONE_HUNDRED               ;T>100   

   GOTO   INCRE

;SCRIVI "Tc>100 °C" E LAMPEGGIA   
ONE_HUNDRED
   
   MOVLW   'T'
   CALL   dato
   MOVLW   'c'
   CALL   dato
   MOVLW   '>'
   CALL   dato
   MOVLW   '1'
   CALL   dato
   MOVLW   '0'
   CALL   dato
   MOVLW   '0'
   CALL   dato
   
   movlw    B'11011111'             ;SIMBOLO DEL GRADO " ° " 
   call   dato 
   movlw   'C'                   ;" C " DI GRADI CELSIUS 
   call   dato 

   CALL   DELAY1S
   CALL   CLEAN_ROW
   GOTO   OPERA
;------------------------------------------------------------------   
ZERO 
;DEC
   MOVLW   '0'                     ;SCRIVI DECINA " 0 "
   CALL   dato
;UNITA   
   MOVF   ADRESH,W               ;COPIA CONVERSIONE BINARIA IN W
   SUBLW   20                     ;20-W
   BTFSC   STATUS,Z               ;SE ZERO VAI A OPERA ALTRIMENTI SKIP
   GOTO   OPERA                  ;RICALCOLA
   CALL   TAB                     ;SCRIVI UNITA
   CALL   dato
   GOTO   OPERA1                  ;PROCEDI
   
TEN   
;DEC   
   MOVLW   '1'
   CALL   dato
;UNI
   MOVF   ADRESH,W
   SUBLW   40
   BTFSC   STATUS,Z
   GOTO   OPERA
   CALL   TAB
   CALL   dato
   GOTO   OPERA1   
   
TWENTY
;DEC   
   MOVLW   '2'
   CALL   dato
;UNI
   MOVF   ADRESH,W
   SUBLW   60
   BTFSC   STATUS,Z
   GOTO   OPERA
   CALL   TAB
   CALL   dato
   GOTO   OPERA1
   
THIRTY
;DEC   
   MOVLW   '3'
   CALL   dato
;UNI
   MOVF   ADRESH,W
   SUBLW   80
   BTFSC   STATUS,Z
   GOTO   OPERA
   CALL   TAB
   CALL   dato
   GOTO    OPERA1
   
FOURTY   
;DEC   
   MOVLW   '4'
   CALL   dato
;UNI
   MOVF   ADRESH,W
   SUBLW   100
   BTFSC   STATUS,Z
   GOTO   OPERA
   CALL   TAB
   CALL   dato
   GOTO   OPERA1   
   
FIFTY
;DEC   
   MOVLW   '5'
   CALL   dato
;UNI
   MOVF   ADRESH,W
   SUBLW   120
   BTFSC   STATUS,Z
   GOTO   OPERA
   CALL   TAB
   CALL   dato
   GOTO   OPERA1
   
SIXTY
;DEC   
   MOVLW   '6'
   CALL   dato
;UNI
   MOVF   ADRESH,W
   SUBLW   140
   BTFSC   STATUS,Z
   GOTO   OPERA
   CALL   TAB
   CALL   dato
   GOTO   OPERA1

SEVENTY   
;DEC   
   MOVLW   '7'
   CALL   dato
;UNI
   MOVF   ADRESH,W
   SUBLW   160
   BTFSC   STATUS,Z
   GOTO   OPERA
   CALL   TAB
   CALL   dato
   GOTO   OPERA1   
   
EIGHTY
;DEC   
   MOVLW   '8'
   CALL   dato
;UNI
   MOVF   ADRESH,W
   SUBLW   180
   BTFSC   STATUS,Z
   GOTO   OPERA
   CALL   TAB
   CALL   dato
   GOTO   OPERA1
   
NINETY
;DEC   
   MOVLW   '9'
   CALL   dato
;UNI
   MOVF   ADRESH,W
   SUBLW   200
   BTFSC   STATUS,Z
   GOTO   OPERA
   CALL   TAB
   CALL   dato
   GOTO   OPERA1

   
TAB                            ;TAB UNITA
   addwf    PCL,F
   retlw   '9'                     ;9.5
   retlw    '9'
   retlw    '9'
   retlw    '8'
   retlw    '8'
   retlw    '7'
   retlw    '7'
   retlw    '6'
   retlw    '6'
   retlw    '5'
   retlw    '5'
   retlw    '4'
   retlw    '4'   
   retlw    '3'
   retlw    '3'
   retlw    '2'
   retlw    '2'
   retlw    '1'
   retlw    '1'
   retlw    '0'
   retlw    '0'

;------------------------------------------------------------------
CLEAN_ROW                        ;CLEAN ROW 2
   movlw    SELECT_ROW2 
   call    cmd 
   movlw    " " 
   call    dato 
   movlw    " " 
   call    dato 
   movlw    " " 
   call    dato 
   movlw    " " 
   call    dato 
   movlw    " " 
   call    dato 
   movlw    " " 
   call    dato 
   movlw    " " 
   call    dato 
   movlw    " " 
   call    dato 
   movlw    " " 
   call    dato 
   movlw    " " 
   call    dato 
   movlw    " " 
   call    dato 
   movlw    " " 
   call    dato 
   movlw    " " 
   call    dato 
   movlw    " " 
   call    dato 
   movlw    " " 
   call    dato 
   movlw    " " 
   call    dato
   return 
   
;---------------------------------CONFIGURAZIONE ADC--------------------------------- 
INIT_CONFIG_ADC: 
   bsf    STATUS,RP0 
   bsf    TRISA,0                ;SETTA POTRA,0 IN
   bcf    STATUS,RP0 
   movlw    b'11000001'             ;FRC, AN0, GO/DONE=0, ADON=1
   movwf    ADCON0 
   banksel   ADCON1                  ;SELEZIONA BANCO
   movlw   b'00001000'               ;LEFT JUSTIFIED, FRC, ALL ANALOGIC (PORTA) AND VREF- VREF+ 
   movwf   ADCON1 
   banksel   ADCON0                  ;SELEZIONA BANCO
   return 
   
;---------------------------------ACQUISIZIONE DELL' ADC---------------------------------
ACQUISIZIONE_ADC
   call    SAMPLETIME                ;RITARDO DEI ACQUISIZIONE
   bsf    ADCON0,GO_DONE             ;INIZIA CONVERSIONE
   btfsc    ADCON0,GO_DONE            ;TERMIN CONVERSIONE E CONTROLLA L'ESITO
   goto    $-1                   ;NON ANCORA TERMINATA....QUINDI RICONTROLLA 
   banksel   ADRESH                   ;TERMINATA E CONTINUA 
   movf    ADRESH,W                ;MUOVI I BIT PIU SIGNIFICATIVI IN W 
   movwf    DATOH                   ;DATOH = W
   banksel   ADRESL 
   movf    ADRESL,W                ;MUOVI I BIT MENO SIGNIFICATIVI IN W 
   movwf    DATOL                   ;DATOL = W
   banksel   PORTB                   ;CAMBIO BANCO 
   bcf    STATUS,C                ;SELEZIONA REGISTRO 
   rrf    DATOH,F                ;RUOTA VERSO DESTRA I BIT DI DATOH E DATOL DEL REGISTRO F PASSANDO ...
   rrf    DATOL,F                ; ... PER IL CARRY ED ELIMINANDO IL BIT MENO SIGNIFICATIVO
   return    
   
;---------------------------------SETTAGGIO COMANDI LCD (RS=0)--------------------------------- 
INIT_LCD 
   movlw    b'00110000'              
   call    cmd 
   movlw    b'00110000'              
   call    cmd    
   movlw    b'00110000'              
   call    cmd 
   movlw    b'00111100'              
   call    cmd 
   movlw    b'00001000'               
   call    cmd 
   movlw    b'00000001'               
   call    cmd    
   movlw    b'00000110'              
   call    cmd 
   movlw    b'00001100'                
   call    cmd 
   movlw    b'00000010' 
   call    cmd 
   return 
;---------------------------------INVIA CARATTERI A DISPLAY (E, RS)--------------------------------- 
dato 
   movwf    portlcd 
   bsf    RS 
   nop 
   nop 
   nop 
   bsf    E 
   call    DELAY_5 
   bcf    E 
   return 
   
cmd 
   movwf    portlcd 
   bcf    RS 
   nop 
   nop 
   nop 
   bsf    E 
   call    DELAY_5 
   bcf    E 
   return 

;---------------------------------MESSAGGIO INIZIALE--------------------------------- 
MESS 
   movlw    "T" 
   call    dato 
   movlw    "E" 
   call    dato 
   movlw    "R" 
   call    dato 
   movlw    "M" 
   call    dato 
   movlw    "O" 
   call    dato 
   movlw    "M" 
   call    dato 
   movlw    "E" 
   call    dato 
   movlw    "T" 
   call    dato 
   movlw    "R" 
   call    dato 
   movlw    "O" 
   call    dato 
   
   movlw    SELECT_ROW2 
   call    cmd 
   
   movlw    "I" 
   call    dato 
   movlw    "L" 
   call    dato 
   movlw    "A" 
   call    dato 
   movlw    " " 
   call    dato 
   movlw    " " 
   call    dato 
   movlw    "&" 
   call    dato 
   movlw    " " 
   call    dato 
   movlw    " " 
   call    dato 
   movlw    "I" 
   call    dato 
   movlw    "L" 
   call    dato 
   movlw    "O" 
   call    dato 
   return 
   
;---------------------------------RITARDI---------------------------------
SAMPLETIME 
   movlw    .225    
   movwf    sample 
SAMPLETIME1
   nop 
   nop 
   decfsz    sample,F 
   goto    SAMPLETIME1
   return 
;------------------------------------------------------------------
DELAY_5                         ;DELAY 5ms
   movlw    d'1' 
   movwf    count3 
DEL25A
   movlw    d'100' 
   movwf    count2 
DEL15A 
   movlw    d'166' 
   movwf    count1 
DEL5A 
   decfsz    count1,F    
   goto    DEL5A 
   decfsz    count2,F 
   goto    DEL15A
   decfsz    count3,F 
   goto    DEL25A 
   return 
;------------------------------------------------------------------
DELAY 
   movlw    d'3' 
   movwf    count3 
DEL25B 
   movlw    d'200'
   movwf    count2 
DEL15B 
   movlw    d'166' 
   movwf    count1 
DEL5B 
   decfsz    count1,F 
   goto    DEL5B 
   decfsz    count2,F 
   goto    DEL15B 
   decfsz    count3,F 
   goto    DEL25B 
   return 
;------------------------------------------------------------------
DELAY1S                           ;delay 1 secondo
   movlw   d'7'
   movwf   count1
   movlw   d'47'
   movwf   count2
   movlw   d'3'
   movwf   count3
del_1s
   decfsz   count1,F
   goto    $+2
   decfsz    count2,F
   goto    $+2
   decfsz    count3,F
   goto    del_1s
   goto    $+1
   goto    $+1
   goto    $+1
   return
;------------------------------------------------------------------   
DELAY_5MIN
   movlw   0x54
   movwf   count1
   movlw   0xA1
   movwf   count2
   movlw   0xFD
   movwf   count3
   movlw   0x02
   movwf   count4
Delay_0
   decfsz   count1, f
   goto   $+2
   decfsz   count2, f
   goto   $+2
   decfsz   count3, f
   goto   $+2
   decfsz   count4, f
   goto   Delay_0
   goto   $+1
   goto   $+1
   nop
   return


   END

 

Link al commento
Condividi su altri siti


Il problema è che l'A/D del PIC legge solo tensioni positive 0-5V.

Devi mettere un amplificatore non invertente che offsetti lo 0°C da 0V a +2V, poi amplificando 3 ottieni 5V a 100°C e 0.35V per -55°C.

 

PS Porre la medesima domanda su più forum (Grix) ti aumenta solo la confusione e rende meno disponibili i lettori che scoprono la discussione multipla.;)


Link al commento
Condividi su altri siti

Quote

 

amplificatore non invertente? ora provo a cercare qualcosina su internet su come configurare l'amplificatore

 

 

E' una configurazione di base direi che è un classico.

Invece di mettere la R dell'ingresso "+" a zero V, devi usarla come ingresso di segnale. La resistenza che va al "-" invece che usarla come ingresso di segnale la colleghi alla tensione di offset, in questo caso +2V.

Attenzione che il guadagno non è più Rf / Rs, ma (Rf + Rs) / Rs; in altri termini nella confugurazione non invertente il guadagno è maggiore.

Puoi usare anche un ampli alimentato a soli 5V, purchè sia un ottimo rail to rail.

Link al commento
Condividi su altri siti

Link al commento
Condividi su altri siti

Anche questo nuovo sensore della TI (LMT01LPG) potrebbe fare al caso tuo e credo che sia più semplice il progetto dell'interfaccia software.

In questo caso occorre però adoperare l'interrupt del uP (credo! Ho solo dato un'occhiata veloce al data sheet) mentre con il DS18B20 il controllo è asincrono con il uP come master e permette la lettura di più sensori 1-wire.

http://it.rs-online.com/web/p/sensori-di-temperatura-e-umidita/1330679/

 

Ti ripeto, non li ho mai utilizzati e ho solo dato un'occhiata ai data sheet ma piuttosto che impazzire con tensioni negative e Amp OP ....

 

Di nuovo saluti

 

Andrea 

Link al commento
Condividi su altri siti

  • 1 month later...

Prova a prendere in considerazione il TC1047 della microchip come sensore di temperatura .Ti permette di misurare una temperatura da -40° a 125° senza aggiungere altri componenti esterni . Ogni 10° ha una variazione di 100mV 10 mV a grado.

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...