센서(Sensor)

4채널온도계

arirangled 2009. 12. 10. 07:04

 

온도센서LM35DZ IC를 4개 사용해서 4채널의 아날로그 입력을 받아 캐릭터LCD상에 표시되게한 프로젝트다.

회로도에서 마이컴IC의 발진부와 전원핀처리 부분은 생략되어 있으니 주의가 필요하다.

http://www.x-robotics.com/sensores_ing.htm#Temperatura

 

 

X-Temp_LM35.zip;************************************************* www.x-robotics.com *******
; PROGRAMA : X-Temp_LM35.asm
; Funcion :Medicion de temperatura de 4 canales con 2,56V +Vref externo y
;    sensores LM35, indicacion de temp. en LCD 2x16.
;
;    Medici? de 0 a +150 ?
;
;---------------------------------------------------------------------------
;  Revision : 1.00    Fecha:  22/2/2003       Programa para : PIC16F876
; CPU Clock : 4 MHz                      Tiempo instruccion : 1uS
;       WDT : OFF                       Tipo de reloj : XT
; Code Prot : OFF              cfg USART rs232 ; none
;     Autor : Daniel C. Martin ->  ionitron@x-robotics.com  <-
;************************************************* www.x-robotics.com *******

processor 16F876

LIST P=16F876 ;Se indica el modo de procesador

INCLUDE <P16f876.inc> ;se incluye la definicion de los
;registros internos
__config 3D31



PDel0 EQU 0x21
PDel1 EQU 0x22
PDel2 EQU 0x23
BUFFER EQU 0x24
DATO_A EQU 0x25
DATO_B EQU 0x26
Digito EQU 0x27
INNER EQU 0x28
OUTER EQU 0x29
cnt_bit EQU 0x2A

ASCII_H EQU 0x2B
ASCII_M EQU 0x2C                
ASCII_L EQU 0x2D
HEXADECIMAL EQU 0x2E

Canal EQU 0x2F

;----------------------------------------------------------------------------


org 0x00 ;vector de inicio
goto INICIO


org 0x05 ;despues del vector de interrupcion


;<<<<<<----------------- INICIO PROGRAMA PRINCIPAL ------------------->>>>>>>
;----------------------------------------------------------------------------

INICIO bcf STATUS,RP0 ;banco 0
bcf STATUS,RP1

clrf PORTA
bsf STATUS,RP0 ;banco 1

clrf TRISB ;portb como salida
clrf TRISC

bcf STATUS,RP0 ;banco 0

clrf PORTA
clrf PORTB
clrf PORTC


;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
START           CALL    LCD_INI         ;Inicia LCD (CFG puertos...)                
START_1         MOVLW   b'00000001'     ;Borrar LCD y Home         
                CALL    LCD_REG                                    
                MOVLW   b'00000110'     ;                          
                CALL    LCD_REG                                    
                MOVLW   b'00001100'     ;LCD on, cursor Off,Parpadeo Off        
                CALL    LCD_REG                                    
                MOVLW   0x80            ;Direccion caracter
                CALL    LCD_REG                          
REPETIR       ;MOVF    Digito,w        ;W=Digito
                ;CALL    DATO_1          ;Coge el caracter          
                ;IORLW   0x00            ;Compara
                ;BTFSC   STATUS,2        ;Es el ultimo?            
                ;GOTO    acabar          ;Si              
                ;CALL    LCD_DATOS       ;Visualiza caracter        
                ;INCF    Digito,f        ;Incrementa numero de Digito
                ;GOTO    REPETIR         ;Vuelve a escribir
                                                                   
acabar ;termino inicializacion de lcd y muestra primeros datos


;===========================================================================
; Inicio de conversion de valores analogicos
;===========================================================================


;---------------------Configuracion CONVERTIDOR A/D-------------------------
CFGADC bsf STATUS,RP0 ;Banco 1
bcf STATUS,RP1

movlw b'00000011' ;seleccion tipo puertos A/D
movwf ADCON1
movlw b'11111111'
movwf TRISA ;PORTA como entrada

bcf STATUS,RP0 ;Banco 0
movlw b'01000001' ;seleccion Tad, canales para
movwf ADCON0 ;conversion y A/D=ON
bcf PIR1,ADIF ;limpia flag de conversion completa

; FIN de configuracion de registros
;---------------------------------------------------------------------------


lecturas movlw d'0' ;selecciona canal ADC
movwf Canal
call RUN_ADC

movlw 0x80 ;pone cursor en 80------------------
call LCD_REG
movlw 'T'
call    LCD_DATOS       ;Visualiza caracter   
movlw '1'
call    LCD_DATOS       ;Visualiza caracter   
movlw '='
call    LCD_DATOS       ;Visualiza caracter   

call inLCD ;visualiza dato---------------------
movlw 0xDF ;? call    LCD_DATOS       ;Visualiza caracter
movlw 0x20 ;" "
call    LCD_DATOS       ;Visualiza caracter
;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
movlw d'5'
call delay  
;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
movlw d'1' ;selecciona canal ADC
movwf Canal
call RUN_ADC

movlw 0x88 ;pone cursor en 80------------------
call LCD_REG
movlw 'T'
call    LCD_DATOS       ;Visualiza caracter   
movlw '2'
call    LCD_DATOS       ;Visualiza caracter   
movlw '='
call    LCD_DATOS       ;Visualiza caracter   

call inLCD ;visualiza dato---------------------
movlw 0xDF ;? call    LCD_DATOS       ;Visualiza caracter  
movlw 0x20 ;" "
call    LCD_DATOS       ;Visualiza caracter  
;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
movlw d'5'
call delay  
;;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
movlw d'2' ;selecciona canal ADC
movwf Canal
call RUN_ADC

movlw 0xC0 ;pone cursor en 80------------------
call LCD_REG
movlw 'T'
call    LCD_DATOS       ;Visualiza caracter   
movlw '3'
call    LCD_DATOS       ;Visualiza caracter   
movlw '='
call    LCD_DATOS       ;Visualiza caracter   

call inLCD ;visualiza dato---------------------
movlw 0xDF ;? call    LCD_DATOS       ;Visualiza caracter   
movlw 0x20 ;" "
call    LCD_DATOS       ;Visualiza caracter  
;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
movlw d'5'
call delay  
;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
movlw d'4' ;selecciona canal ADC
movwf Canal
call RUN_ADC

movlw 0xC8 ;pone cursor en 80------------------
call LCD_REG
movlw 'T'
call    LCD_DATOS       ;Visualiza caracter   
movlw '4'
call    LCD_DATOS       ;Visualiza caracter   
movlw '='
call    LCD_DATOS       ;Visualiza caracter   

call inLCD ;visualiza dato---------------------
movlw 0xDF ;? call    LCD_DATOS       ;Visualiza caracter
movlw 0x20 ;" "
call    LCD_DATOS       ;Visualiza caracter  
;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
movlw d'5'
call delay  
;;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''


goto lecturas

;///////////////////////////////////////////////////////////////////////////
;///////////////////////////////////////////////////////////////////////////
;///////////////////////////////////////////////////////////////////////////



;---------------------------------------------------------------------------

RUN_ADC bcf STATUS,RP0 ;Banco 0
bcf STATUS,RP1 ;Banco 0

movlw b'01000001' ;repone a cero para que iorlw pueda
movwf ADCON0
;bcf ADCON0,ADON ;apaga el convertidor
rlf Canal,F ;posiciona los bits
rlf Canal,F
rlf Canal,W
iorwf ADCON0,F
;bsf ADCON0,ADON ;enciende el convertidor
rrf Canal,F
rrf Canal,F ;retorna a la anterior
bcf PIR1,ADIF ;limpia flag de conversion completa

nop
nop

GO_ADC bsf ADCON0,GO_DONE ;Inicio conversion

wait_ADC btfsc ADCON0,GO_DONE ;espera a que finalice la conversion
goto wait_ADC ;bucle

READ_OK ;La conversion esta en ADRESH:ADRESL
return


;mostrar en lcd!************************************************************
inLCD movf ADRESH,W
call Hex_Ascii

bcf STATUS,RP0 ;banco 0
bcf STATUS,RP1

bcf STATUS,Z
movf ASCII_H,W ;sobreescribe el dato distancia
                xorlw   0x30         ;Comprueba si es cero a la izquierda
                btfsc   STATUS,Z
                goto cero_izquierda
movf ASCII_H,W
                CALL    LCD_DATOS       ;Visualiza caracter


cero_izquierda  movf ASCII_M,W
                ;iorlw   0x00            ;Comprueba si es cero a la izquierda
                ;btfss   STATUS,Z
CALL    LCD_DATOS       ;Visualiza caracter        

                movf ASCII_L,W
CALL    LCD_DATOS       ;Visualiza caracter        

call DELAY_5MS
call DELAY_5MS

return



;///////////////////////////////////////////////////////////////////////////
;///////////////////////////////////////////////////////////////////////////
;///////////////////////////////////////////////////////////////////////////



;#########################################################RUTINAS DE LCD####
LCD_E           BSF     PORTC,2         ;Activa se?l E
                NOP
                NOP
                NOP                     ;Espera 1uS
                BCF     PORTC,2         ;Desactiva se?l E
                RETURN       
                             
LCD_BUSY        BSF     PORTC,1         ;Pone el LCD en modo lectura
                BSF     STATUS,RP0      ;Selecciona el Banco 1
                MOVLW   0xFF 
                MOVWF   TRISB           ;Puerta B act? de entrada
                BCF     STATUS,RP0      ;Selecciona el Banco 0
                BSF     PORTC,2         ;Activa el LCD (Se?l E)
                NOP          
L_BUSY          BTFSC   PORTB,7         ;Chequea el bit BUSY
                GOTO    L_BUSY          ;Est  a "1" (Ocupado)
                BCF     PORTC,2         ;Desactiva el LCD (Se?l E)
                BSF     STATUS,RP0      ;Selecciona el Banco 1
                CLRF    TRISB           ;Puerta B actua como salida
                BCF     STATUS,RP0      ;Selecciona el Banco 0
                BCF     PORTC,1         ;Pone el LCD en modo escritura
                RETURN       
                             
LCD_REG         BCF     PORTC,0         ;Desactiva RS (Modo instruccion)
                MOVWF   PORTB           ;Saca el codigo de instruccion
                CALL    LCD_BUSY        ;Espera a que se libere el LCD
                GOTO    LCD_E           ;Genera pulso en se?l E
                             
LCD_DATOS       BCF     PORTC,0         ;Desactiva RS (Modo instrucci?)
                MOVWF   PORTB           ;Valor ASCII a sacar por PORTB
                CALL    LCD_BUSY        ;Espera a que se libere el LCD
                BSF     PORTC,0         ;Activa RS (Modo dato) 
                GOTO    LCD_E           ;Genera pulso en se?l E
                             
LCD_INI         MOVLW   b'00111000'
                CALL    LCD_REG         ;Codigo de instruccion
                CALL    DELAY_5MS       ;Temporiza 5 mS.
                MOVLW   b'00111000'
                CALL    LCD_REG         ;Codigo de instruccion
                CALL    DELAY_5MS       ;Temporiza 5 mS.
                MOVLW   b'00111000'
                CALL    LCD_REG         ;Codigo de instruccion
                CALL    DELAY_5MS       ;Temporiza 5 mS.
                RETURN           
                             
;****************************************************************************                                                              
;DELAY_5MS genera una temporizacion de 5mS necesario para la secuencia de
;inicio del LCD                        
                                       
DELAY_5MS  movlw   .6        ; 1 set number of repetitions (B)
        movwf   PDel0     ; 1 |
PLoop1  movlw   .207      ; 1 set number of repetitions (A)
       movwf   PDel1     ; 1 |
PLoop2 nop              ; 1 clear watchdog
        decfsz  PDel1, 1  ; 1 + (1) is the time over? (A)
        goto    PLoop2    ; 2 no, loop
        decfsz  PDel0,  1 ; 1 + (1) is the time over? (B)
        goto    PLoop1    ; 2 no, loop
PDelL1  goto PDelL2      ; 2 cycles delay
PDelL2  nop              ; 1 cycle delay
        return              ; 2+2 Done
;###########################################################################



del_1ms movlw d'199' ;delay 1mS
movwf INNER
in_lp nop
nop
decfsz INNER,F
goto in_lp
return

delay movwf OUTER ;vueltas de 1mS
out_lp call del_1ms
decfsz OUTER,F
goto out_lp
return


;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()
;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()
;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()

Hex_Ascii ;cargar en W el dato hex.
;
;MOVLW .254
MOVWF HEXADECIMAL
      clrf    ASCII_H       ;Para BCD D'0'
      clrf    ASCII_M    ;Para BCD D'0'
      clrf    ASCII_L         ;Para BCD D'0'
;
Centenas
;
      movlw  D'100'          ;D'100' --> W
      subwf   HEXADECIMAL,W   ;HEXADECIMAL - D'100' --> W
      btfss STATUS,C        ;?HEXADECIMAL es menor que D'100' ?
      goto    Decenas         ;Si
      movwf   HEXADECIMAL     ;Salva el resto
      incf    ASCII_H,F       ;Incrementa el contador de centenas BCD
      goto    Centenas        ;Vuelve por otros D'100'
;
Decenas
;
      movlw   D'10'          ;D'10' --> W
      subwf   HEXADECIMAL,W   ;HEXADECIMAL - D'10' --> W
      btfss STATUS,C        ;?HEXADECIMAL es menor que D'10' ?
      goto    Unidades        ;Si
      movwf   HEXADECIMAL     ;Salva el resto
      incf    ASCII_M,F       ;Incrementa el contador de decenas BCD
      goto    Decenas         ;Vuelve por otros D'10'
;
Unidades
;
      movf    HEXADECIMAL,W   ;El resto pertenece
      movwf   ASCII_L         ;a las unidades BCD
      clrf    HEXADECIMAL     ;Pone a cero el registro HEXADECIMAL
;
Bcd_A_Ascii
;
      movlw H'30'           ;H'30' --> W
      iorwf   ASCII_L,F       ;Convierte de BCD a ASCII
      iorwf   ASCII_M,F       ;Convierte de BCD a ASCII
;
      movf    ASCII_H,F       ;ASCII_H --> F
      btfsc   STATUS,Z                ;? ASCII_H es D'00' ?
      goto    Espacio         ;Si
      movlw   H'30'           ;H'30' --> W
      iorwf   ASCII_H,F       ;Convierte de BCD a ASCII
      return                  ;Retorna
;
Espacio
;
      movlw   '0'            ;A' ' --> W
      movwf   ASCII_H  ;A' ' --> ASCII_H
      ;movwf   ASCII_M  ;A' ' --> ASCII_H
      ;movwf   ASCII_L  ;A' ' --> ASCII_H
      return                  ;Retorna
;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()
;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()
;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()

; Description: Waits 100 cycles
;-------------------------------------------------------------
Delayp1  movlw   .23       ; 1 set number of repetitions
        movwf   PDel0     ; 1 |
PLoop02 nop              ; 1 clear watchdog
        decfsz  PDel0, 1  ; 1 + (1) is the time over?
        goto    PLoop02    ; 2 no, loop
PDelL12  goto PDelL22         ; 2 cycles delay
PDelL22  nop              ; 1 cycle delay
        return              ; 2+2 Done
       
              
END
;************************************************* www.x-robotics.com *******

X-Temp_LM35.zip
0.0MB
반응형

'센서(Sensor)' 카테고리의 다른 글

휨센서  (0) 2010.01.05
습도센서응용  (0) 2009.12.12
거리센서응용  (0) 2009.12.08
금속감지고주파센서  (0) 2009.11.15
PIR(PASSIVE INFRARED)센서  (0) 2009.06.03