온도센서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 *******
'센서(Sensor)' 카테고리의 다른 글
휨센서 (0) | 2010.01.05 |
---|---|
습도센서응용 (0) | 2009.12.12 |
거리센서응용 (0) | 2009.12.08 |
금속감지고주파센서 (0) | 2009.11.15 |
PIR(PASSIVE INFRARED)센서 (0) | 2009.06.03 |