Vous êtes sur la page 1sur 16

Captulo 4.

Proyectos con el PIC16C71

Captulo 4

Proyectos con
el PIC16C71

Termmetro digital con mdulo LCD


Adquisicin de datos va RS-232

Curso avanzado de Microcontroladores PIC

117

Captulo 4. Proyectos con el PIC16C71

118

Curso avanzado de Microcontroladores PIC

Captulo 4. Proyectos con el PIC16C71

Proyecto N 1: Termmetro digital con mdulo LCD


Como ejemplo de la utilizacin del convertidor A/D del PIC16C71, vamos a
implementar un termmetro que muestra la temperatura medida, en grados centgrados, en la pantalla de un display o mdulo LCD.
Para medir la temperatura emplearemos un LM35. Este sensor tiene tres pines:
Alimentacin, tierra y la salida anloga. Este dispositivo presenta en su salida una
variacin de 10 mV/C, por lo tanto, el valor de la temperatura se puede obtener
directamente, sin necesidad de hacer modificaciones al dato obtenido.
El LM35 puede trabajar en un rango de temperatura entre -55 y 150C, la fuente
de alimentacin positiva puede estar entre 4 y 30 Voltios. Adems, su precisin es de
0.5C. Este elemento viene en un encapsulado plstico TO-92 y tiene la misma apariencia de un transistor.
El mdulo de cristal lquido se conecta al microcontrolador utilizando interface
de 4 bits. En este ejercicio, conectamos la entrada anloga al pin RA2/AN2 del
microcontrolador y el voltaje de referencia del convertidor anlogo a digital, se configura para que sea el voltaje de alimentacin del PIC (VDD). En la figura 4.1 se
muestra el diagrama esquemtico del termmetro digital.
+5V
4
MCLR
RB7
20pF

RB6
16

RB5

OSC1
4 MHz

LM35

15

RB4

13

14

12

13

11

12

10

11

D7
D6
D5
D4

PIC16C71

20pF

OSC2

2
+VCC

+5V
RA2/AN2

RB1
RB0

VSS
5

Mdulo LCD

14
VDD

+5V

+5V

VO

5K

Ajuste de
contraste

RS
R/W GND
1
5

Figura 4.1. Diagrama esquemtico del termmetro digital con PIC


La mxima lectura del convertidor anlogo a digital (0FFH) se obtiene cuando la
entrada anloga sea superior a 5 voltios. De tal manera, que si hacemos la divisin de
5 Voltios entre 255 (FFH), obtenemos una relacin de aproximadamente 20 mV por
unidad. Por ejemplo, si la entrada anloga est en 160 mV (es decir 16C), el valor
Curso avanzado de Microcontroladores PIC

119

Captulo 4. Proyectos con el PIC16C71

digital que entrega el convertidor es 8 (160/20). Dado lo anterior, el valor que entrega
el convertidor se debe duplicar para compensar la diferencia (variacin de 10mV/C y
resolucin de lectura de 20mV). Aunque esto hace que la lectura siempre sea un nmero par, se puede aceptar en vista de que se trata de ejercicios netamente didcticos.
Para solucionar el problema de tener que duplicar el valor leido y garantizar que
el resultado de la conversin corresponda a la temperatura real, se puede utilizar un
amplificador operacional para amplificar la seal entregada por el sensor LM35,
dicho operacional se debe configurar como amplificador no inversor de ganancia 2.
De esta forma, con el valor anlogo adecuado en la entrada del convertidor y con la
fuente de alimentacin como voltaje de referencia, se puede obtener una lectura
precisa y directa. En la figura 4.2 se muestra el diagrama del circuito que utiliza el
amplificador operacional, si se utiliza este montaje se puede obviar la parte del programa que duplica el valor ledo (la parte sombreada en el listado).
LM35
+5V

+5V
5+

8
LM358a 7
64
10F
16V

3 +
LM358b

2 -

+
5.1K

Salida de voltaje
equivalente al doble del
valor entregado por el
sensor LM35

Potencimetro
de 10K para
ajustar la
ganancia

Figura 4.2. Circuito para acople del sensor LM35


En la figura 4.3 se muestra el listado del programa, este incluye todo el programa de la interface a 4 bits con el display de cristal lquido, una seccin que se encarga de leer el convertidor anlogo a digital, y una seccin que convierte el dato hexadecimal obtenido luego de la conversin, a su equivalente en decimal, para ser mostrado en la pantalla.
Pasos a seguir para hacer una conversin A/D
1. Configure los pines del puerto A, los que vayan a trabajar como entradas anlogas deben ser configurados como entradas en el registro TRISA.
2. Configure las entradas anlogas y el voltaje de referencia (interno o externo) en
el registro ADCON1.
3. Seleccione el canal de entrada en el registro ADCON0.
4. Seleccione el reloj de la conversin en ADCON0.
5. Encienda el convertidor (bit ADON del registro ADCON0) para que se tome la
muestra de la seal anloga.
6. Si se va a utilizar la interrupcin se debe borrar el bit ADIF del registro ADCON0
y poner en "1" el bit ADIE y el bit GIE del registro INTCON.
7. Luego de iniciar el convertidor se hace un pequeo retardo (para el muestreo).
8. Se debe iniciar la conversin mediante el bit GO/DONE del registro ADCON0.
120

Curso avanzado de Microcontroladores PIC

Captulo 4. Proyectos con el PIC16C71

9. Esperar a que se termine la conversin probando el estado del bit GO/DONE o


esperar el cambio en la bandera de interrupcin, es decir probando el bit ADIF
del registro ADCON0.
10. El resultado se debe leer en el registro ADRES.
11. Borrar el bit ADIF.
Para el caso del termmetro digital los pasos seguidos fueron los siguientes:
En el primer bloque del programa principal (INICIO), adems de configurar los
puertos, se programa el pin RA2/AN2 como una entrada anloga. El bloque que
inicia con la etiqueta BEGIN se encarga de ubicar en la pantalla el mensaje del
medidor de temperatura, utilizando la interface a 4 bits como se vi en el captulo 2.
La parte del programa que inicia con la etiqueta MIDE se encarga de configurar la
velocidad del convertidor anlogo a digital, de poner el bit ADIF en "0" y de poner
el bit ADON del registro ADCON0 en "1" antes de empezar la conversin, luego se
hace un retardo. El trabajo del convertidor se inicia cuando el bit ADCON0,GO se
pone en 1, nuevamente se hace un pequeo retardo. Para saber si el convertidor ha
terminado se prueba el estado del bit llamado ADCON0,ADIF.
Una vez que se est seguro de tener el dato digital que resulta de la conversin, este
se puede leer del registro ADRES y se debe duplicar antes de enviarlo a la pantalla. Como este nmero se encuentra en hexadecimal, se debe utilizar una rutina
que se encargue de convertirlo a su equivalente en decimal. Esto se hace con la
rutina llamada DECIMAL, la cual devuelve el valor obtenido en los registros CENTENA, DECENA y UNIDAD. A estos datos se les suma el valor 30h para convertirlos en su equivalente ASCII antes de enviarlos a la pantalla.
Esta prctica se puede realizar con cualquier tipo de sensor cuya salida est
entre 0 y 5 voltios, de lo contrario se deber utilizar algn medio para acondicionar su seal a los rangos permitidos por el microcontrolador, por ejemplo un amplificador operacional. En el momento de grabar el microcontrolador se debe tener cuidado de seleccionar el tipo correcto, ya que se ha venido trabajando con el
16F84 y esto nos puede hacer equivocar.
; este programa toma el valor entregado por el sensor de
; temperatura y lo muestra en la pantalla del modulo lcd
;
****** pic16c71
********
;
****** wdt = off *******
;
****** osc = xt
*******
;
******* definiciones ********
indf
equ
0h
;para direccionamiento indirecto
tmro
equ
1h
;contador de tiempo real
pc
equ
2h
;contador de programa
status
equ
3h
;registro de estados y bits de control
fsr
equ
4h
;selecccin de bancos de memoria
ptoa
equ
5h
;puertos
ptob
equ
6h
adcon0
equ
8h
;registros del convertidor a/d
adcon1
equ
88h
adres
equ
9h
trisa
equ
85h
;programacin de los registros

Curso avanzado de Microcontroladores PIC

121

Captulo 4. Proyectos con el PIC16C71


trisb
r0c
r0d
r0e
unidad
decena
centena
r14
r1b
rp0
z
c
w
r
pcfg0
pcfg1
adif
go
e
rs

equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ

retardo
decre

retar2
decr2

decimal

otra

sum
repite

sum1

control
dato
dato2

122

org
goto
org
movlw
movwf
decfsz
goto
retlw
movlw
movwf
call
call
decfsz
goto
retlw

86h
0ch
0dh
0eh
10h
11h
12h
14h
1bh
5h
2h
0h
0h
1h
0
1
1h
2h
1h
0h
***********
00
inicio
05h
0ffh
r1b
r1b,r
decre
0
0ffh
r14
retardo
retardo
r14,r
decr2
0

clrf
clrf
movlw
subwf
btfss
goto
incf
goto
addwf
movlw
subwf
btfss
goto
incf
goto
addwf
retlw

decena
centena
d100'
unidad,r
status,c
sum
centena
otra
unidad
d10'
unidad
status,c
sum1
decena
repite
unidad
0

bcf
goto
bsf

ptob,rs
dato2
ptob,rs

bsf
movwf
movlw
andwf
movf
andlw
iorwf

ptob,e
r0e
0fh
ptob,r
r0e,w
0f0h
ptob,r

;
;
;
;
;
;
;
;
;seleccion de pagina
;bandera de cero
;bandera de carry
;para almacenar en w
;para almacenar en el mismo registro
;bits del registro adcon1
;bits del registro adcon0

programa principal ************


;vector de reset
;va a iniciar programa principal

;rutina que convierte binario en bcd


;borrar registros de trabajo

;restar 100 al valor inicial


;verifica el carry
;si es cero deja de restar 100
;si es 1 incrementa centena
;volver a restar
;sumarle 100
;restar 10 al valor
;verifica el carry
;si es 0 deja de restar
;si es 1 incrementa decena
;sumarle 10 al valor
;el valor de la conversion binario a
;decimal
;se devuelve en los registros centena,
;decena y unidad
;esta rutina genera las seales de control
;para escribir en el modulo lcd y
;entrega el dato a ser mostrado en la
;pantalla
;utiliza la interface a 4 bits

Curso avanzado de Microcontroladores PIC

Captulo 4. Proyectos con el PIC16C71

tabla

inicio

begin

blank
muestra
ciclo

call
bcf
call
bsf
movlw
andwf
swapf
andlw
iorwf
call
bcf
call
retlw
addwf
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
bsf
movlw
movwf
bcf
bcf
movlw
movwf
bcf
movlw
call
movlw
call
movlw
call
movlw
call
movlw
call
movlw
movwf
movf

retardo
ptob,e
retardo
ptob,e
0fh
ptob,r
r0e,w
0f0h
ptob,r
retardo
ptob,e
retardo
0
pc,r
" "
"L"
"A"
" "
"T"
"E"
"M"
"P"
"E"
"R"
"A"
"T"
"U"
"R"
"A"
" "
" "
"A"
"C"
"T"
"U"
"A"
"L"
" "
"E"
"S"
" "
" "
" "
" "
" "
"C"
" "
0
status,rp0
0ffh
trisa
adcon1,pcfg1
adcon1,pcfg0
0ch
trisb
status,rp0
02h
control
28h
control
0ch
control
06h
control
01h
control
0
r0c
r0c,w

Curso avanzado de Microcontroladores PIC

;mensaje que se muestra

;mensaje de la segunda linea

;seleccionar pagina 1
;configura ptoa como entradas
;
;configura ra3 como voltaje de referencia
;y ra0-ra2 como entradas analogas
;configura ptob
;
;vuelve a pagina 0
;inicia display a 4 bits
;display a 4 bits y 2 lineas
;activa display y desactiva cursor
;selecciona el modo de desplazamiento
;borra display y cursor a casa
;inicia contador de caracteres
;hace barrido de la tabla1

123

Captulo 4. Proyectos con el PIC16C71

reta1

linea2
line2

call
call
movlw
movwf
call
decfsz
goto
incf
movlw
subwf
btfss
goto
movlw
xorwf
btfss
goto
movlw
call
movlw
xorwf
btfss
goto

tabla
dato
05fh
r0d
retardo
r0d,r
reta1
r0c,r
10h
r0c,w
status,c
ciclo
10h
r0c,w
status,z
line2
0c0h
control
20h
r0c,w
status,z
ciclo

movlw
movwf

b01010000'
adcon0

bsf
movlw
movwf
decfsz
goto
bsf
movlw
movwf
decfsz
goto
nop
btfss
goto
bcf
bcf
movf
movwf
addwf
call
movlw
call
movf
addlw
call
movlw
call
movf
addlw
call
movlw
call
movf
addlw
call
call
clrf
goto
end

adcon0,0
0fh
r1b
r1b,r
dec
adcon0,go
0fh
r1b
r1b,r
de2

mide

dec

de2
consu

adcon0,adif
consu
adcon0,0
adcon0,adif
adres,w
unidad
unidad,r
decimal
0cbh
control
centena,w
30h
dato
0cch
control
decena,w
30h
dato
0cdh
control
unidad,w
30h
dato
retar2
adres
mide

;retardo entre caracteres

;sigue con la tabla


;pregunta si esta mostrando el mensaje dela
;segunda linea
;
;pregunta si es la primera vez que entra
;a la segunda linea para ir a iniciar
;el puntero de la ram del modulo lcd
;
;ubica puntero de la ram del modulo lcd
;en la segunda linea
;pregunta si termino la segunda linea
;para ir a iniciar de nuevo el mensaje o
;para continuar en la segunda lnea

;se hace la conversin anlogo a digital


;configura el conver., selecciona canal,
;velocidad de conver. y lo activa
;adif=0 antes de empezar la conversin

;empezar la conversion

;
;pregunta fin de conversion
;si no ha terminado sigue esperando
;apaga el convertidor
;si termino de convertir debe pasar
;duplicar el valor leido
;convertir el dato binario a decimal
;ubico puntero de ram donde va el numero
;primer digito = centenas

;ubica puntero de ram donde va el numero


;segundo digito = decenas

;ubico puntero de ram donde va el numero


;segundo digito = unidades

;termina

Figura 4.3. Programa completo del termmetro digital


124

Curso avanzado de Microcontroladores PIC

Captulo 4. Proyectos con el PIC16C71

Proyecto N 2: Adquisicin de datos va RS-232


Esta prctica consiste en leer una seal anloga con un microcontrolador PIC16C71
y enviar a una computadora el dato digital equivalente; esta ltima se encargar de
mostrar en la pantalla (de forma grfica) la manera en que la seal vara con el tiempo.
Como fuente de seal se puede usar un potencimetro de 5 kohm, el cual se conecta directamente a un pin del microcontrolador que se ha configurado como entrada
anloga. La forma de enviar los datos serialmente se vi en el captulo 2, utilizando
como interface un integrado MAX232. Tambin se muestra el dato ledo en una pantalla de cristal lquido, con el fin de comprobar que todo funciona correctamente, es
decir que se debe mostrar el mismo dato que en la computadora. Por su parte, la
computadora tiene un programa en lenguaje C que se encarga de leer el dato serial y
de mostrarlo en la pantalla. En la figura 4.4 se muestra el diagrama del circuito.
+5V

+5V
4
MCLR
RB7
RB6

20pF

16

RB5

OSC1
4 MHz

+5V
1

5K
Seal
anloga

RA2

RB4

13

14

12

13

11

12

10

11

RB1

RB2

RB0

VSS

Conector DB9
hembra
Hacer estos
puentes en el
conector

9
8
7
6

D7
D6
D5
D4

PIC16C71

15

20pF

OSC2

2
+VCC

Mdulo LCD

14
VDD

+5V

10F

2
1

Conectar al
computador

10F

+
10F

VO

5K

Ajuste de
contraste

E
RS
R/W GND
1
5

MAX232
+
10F

+5V

1 C1+
2 V+

VCC 16
GND 15

3 C14 C2+

T1OUT 14
T11N 13

5 C26 V-

R1OUT 12
T11N 11

+5V
+

10F

7 T2OUT
T2IN 10
8 R21N
R2OUT 9

Figura 4.4 Diagrama esquemtico del circuito de adquisicin de datos


Curso avanzado de Microcontroladores PIC

125

Captulo 4. Proyectos con el PIC16C71

La comunicacin se har con las mismas especificaciones del ejercicio anterior,


es decir a 1200 bps, 8 bits, sin paridad y con un stop bit (1200, 8, N, 1). En la figura
4.5 se muestra el programa que se graba en el microcontrolador, los bloques ms
importantes son: el que hace la conversin anlogo a digital, que inicia con la etiqueta MIDE y el que hace la transmisin serial que lo compone la subrutina llamada
ENVIAR. Estas rutinas se han explicado en ejercicios anteriores.
La computadora se debe encargar de leer el dato serial y de mostrarlo en la
pantalla, para ello se debe utilizar el llamado modo grfico. En este modo se traza la
ventana donde aparece la curva obtenida, al igual que se van ubicando punto a punto
todos los datos que entrega el microcontrolador. En la figura 4.6 se muestra el programa en lenguaje C que realiza la tarea descrita, llamado ADQUISI1.C. Nuevamente se tienen dos versiones, una para utilizar el COM1 llamada ADQUISI1 y otra
para usar el COM2 llamado ADQUISI2. El programa ejecutable que puede correr el usuario desde el DOS tiene los mismos nombres pero con extensin
.EXE. En la figura 4.7 se tiene un pantallazo del programa ejecutable, mostrando una grfica obtenida.
; este programa toma el valor anlogo leido y lo envia
; a la computadora de forma serial
;
****** pic16c84
********
;
****** wdt = off *******
;
****** osc = xt
*******
;
******
cp = on
******
;
indf
tmro
pc
status
fsr
ptoa
ptob
adcon0
adcon1
adres
trisa
trisb
r0c
r0d
r0e
unidad
decena
centena
r14
r1b
r1c
r1d
trans

equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ

rp0
z
c

equ
equ
equ

w
r
pcfg0
pcfg1
adif
go
tx

equ
equ
equ
equ
equ
equ
equ

126

******* definiciones ********


0h
;para direccionamiento indirecto
1h
;contador de tiempo real
2h
;contador de programa
3h
;registro de estados y bits de control
4h
;selecccin de bancos de memoria
5h
;puertos
6h
8h
;registros del convertidor a/d
88h
9h
85h
;programacin de los registros
86h
0ch
;
0dh
;
0eh
;
10h
;
11h
;
12h
;
14h
;
1bh
;
1ch
1dh
1eh
;bits especiales
;bits del registro status
5h
;seleccion de pagina
2h
;bandera de cero
0h
;bandera de carry
0h
1h
0
1
1h
2h
2

;para almacenar en w
;para almacenar en el mismo registro
;bits del registro adcon1
;bits del registro adcon0
; pines del puerto a

Curso avanzado de Microcontroladores PIC

Captulo 4. Proyectos con el PIC16C71


e
rs
;

delay1
startup
redo

equ
equ

1h
0h

***********

;
;
programa principal

org
goto
org

00
inicio
05h

;vector de reset
;va a iniciar programa principal

movlw
movwf
nop
nop
decfsz
goto
retlw

.166
r1c

;carga para 833 s aproximadamente


;llevar valor de carga al retardo
;limpiar circuito de vigilancia

r1c
redo
0

;decrementar retardo, saltar si cero


;repetir hasta terminar
;retornar

movwf
movlw
movwf
bcf
call
bcf
bcf
rrf
btfsc
bsf
call
decfsz
goto
bsf
call
retlw

trans
8
r1d
ptob,tx
delay1
ptob,tx
status,c
trans
status,c
ptob,tx
delay1
r1d
xnext
ptob,tx
delay1
0

;rutina para enviar dato


;llevar el contenido de w a transmisin
;cargar con nmero de bits
;el contador
;colocar lnea de transmisin en bajo
;para generar bit de arranque
;colocar lnea de transmisin en bajo
;limpiar carry
;rotar registro de transmisin
;preguntar por el carry
;si es uno, colocar l nea en alto
;llamar retardo de 1 bit
;decrementar contador, saltar si cero
;repetir hasta transmitir todo el dato
;colocar l nea de transmisin en alto
;llamar retardo 1 bit -bit de parada;retornar

movlw
movwf
decfsz
goto
retlw

0ffh
r1b
r1b,r
decre
0

movlw
movwf
call
call
decfsz
goto
retlw
clrf
clrf
movlw
subwf
btfss
goto
incf
goto
addwf
movlw
subwf
btfss
goto
incf
goto
addwf
retlw

0ffh
r14
retardo
retardo
r14,r
decr2
0
decena
centena
d100'
unidad,r
status,c
sum
centena
otra
unidad
d10'
unidad
status,c
sum1
decena
repite
unidad
0

enviar

xnext

retardo
decre

retar2
decr2

decimal

otra

sum
repite

sum1

************

Curso avanzado de Microcontroladores PIC

;rutina que convierte binario en bcd


;borrar registros de trabajo

;restar 100 al valor inicial


;verifica el carry
;si es cero deja de restar 100
;si es 1 incrementa centena
;volver a restar
;sumarle 100
;restar 10 al valor
;verifica el carry
;si es 0 deja de restar
;si es 1 incrementa decena
;sumarle 10 al valor
;el valor de conversion binario a decimal
;se devuelve en los registros centena,
;decena y unidad

127

Captulo 4. Proyectos con el PIC16C71


control

dato
pantalla
dato2
bsf
movwf
movlw
andwf
movf
andlw
iorwf
call
bcf
call

ptob,rs
dato2
ptob,rs

;esta rutina genera las seales de control


;para escribir en el modulo lcd y
;entrega el dato a ser mostrado en la

ptob,e
r0e
0fh
ptob,r
r0e,w
0f0h
ptob,r
retardo
ptob,e
retardo

;utiliza la interface a 4 bits

bsf
movlw
andwf
swapf
andlw
iorwf
call
bcf
call
retlw

ptob,e
0fh
ptob,r
r0e,w
0f0h
ptob,r
retardo
ptob,e
retardo
0

addwf
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw

pc,r
"E"
"L"
" "
"D"
"A"
"T"
"O"
" "
"A"
"N"
"A"
"L"
"O"
"G"
"O"
" "

retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw

" "
"A"
"C"
"T"
"U"
"A"
"L"
" "
"E"
"S"
" "
" "
" "
" "
" "
" "
" "

retlw

bsf
movlw
movwf
bcf
bcf

status,rp0
0ffh
trisa
adcon1,pcfg1
adcon1,pcfg0

tabla

inicio

128

bcf
goto
bsf

;mensaje que se muestra

;mensaje de la segunda linea

;seleccionar pagina 1
;configura ptoa como entradas
;
;configura ra3 como voltaje de referencia
;y ra0-ra2 como entradas analogas

Curso avanzado de Microcontroladores PIC

Captulo 4. Proyectos con el PIC16C71

begin

blank
muestra
ciclo

reta1

linea2
line2

mide

dec

de2
consu

movlw
movwf
bcf

08h
trisb
status,rp0

;configura ptob
;
;vuelve a pagina 0

movlw
call
movlw
call
movlw
call
movlw
call

02h
control
28h
control
0ch
control
06h
control

;inicia display a 4 bits

movlw
call
movlw
movwf
movf
call
call
movlw
movwf
call
decfsz
goto
incf
movlw
subwf
btfss
goto
movlw
xorwf
btfss
goto
movlw
call
movlw
xorwf
btfss
goto

01h
control
0
r0c
r0c,w
tabla
dato
05fh
r0d
retardo
r0d,r
reta1
r0c,r
10h
r0c,w
status,c
ciclo
10h
r0c,w
status,z
line2
0c0h
control
20h
r0c,w
status,z
ciclo

movlw
movwf

b01010000'
adcon0

bsf

adcon0,0

movlw
movwf
decfsz
goto
bsf
movlw
movwf
decfsz
goto
nop
btfss
goto
bcf
bcf
movf
movwf
call

0fh
r1b
r1b,r
dec
adcon0,go
0fh
r1b
r1b,r
de2

call
movlw

decimal
0cbh

call

control

adcon0,adif
consu
adcon0,0
adcon0,adif
adres,w
unidad
enviar

Curso avanzado de Microcontroladores PIC

;display a 4 bits y 2 lineas


;activa display y desactiva cursor
;selecciona el modo de desplazamiento

;borra display y cursor a casa


;inicia contador de caracteres
;hace barrido de la tabla1

;retardo entre caracteres

;sigue con la tabla


;pregunta si esta mostrando el mensaje de
;la segunda linea
;
;pregunta si es la primera vez que entra
;a la segunda linea para ir a iniciar
;el puntero de la ram del modulo lcd
;
;ubica puntero de la ram del modulo lcd
;en la segunda linea
;pregunta si termino la segunda linea
;para ir a iniciar de nuevo el mensaje o
;para continuar en la segunda lnea
;aqu hace la
;configura el
;velocidad de
;adif=0 antes

conversin anlogo a digital


conver., selecciona canal,
conver. y lo activa
de empezar conversin

;empezar la conversin

;
;pregunta fin de conversin
;si no ha terminado sigue esperando
;apaga el convertidor
;si termino de convertir debe pasar
;transmite el dato serialmente
;convertir el dato binario a decimal
;ubico puntero de ram donde va el numero
;leido

129

Captulo 4. Proyectos con el PIC16C71


movf
addlw
call
movlw

centena,w
30h
dato
0cch

call
movf
addlw
call
movlw

control
decena,w
30h
dato
0cdh

call
movf
addlw
call
call
clrf
goto
end

control
unidad,w
30h
dato
retar2
adres
mide

;primer digito = centenas

;ubico puntero de ram donde va el numero


;leido
;segundo digito = decenas

;ubico puntero de ram donde va el numero


;leido
;segundo digito = unidades

;termina

Figura 4.5. Programa que convierte el dato anlogo a digital y lo enva a la


computadora

#include
#include
#include
#include
#include

<bios.h>
<graphics.h>
<stdlib.h>
<stdio.h>
<conio.h>

int puerto,COM1,COM2;
int k,j,dato;
int config;
int COM1,COM2;
int maxx,maxy;
float x;
char pattern[8] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
void leer (void);
void leer(void)
{
do{
dato=bioscom(2,0x83,puerto);
/*leer dato recibido*/
} while (((dato<0)|(dato>255))&(!kbhit()));
}
void main(void)
{
/* autodeteccin */
int gdriver = DETECT, gmode, errorcode; /* inicializa modo grfico */
initgraph(&gdriver, &gmode, "c:\\borlandc\\bgi\\");
errorcode = graphresult(); /* lee resultado de inicializacin */
if (errorcode != grOk) /* un error ocurri */
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1);
}
maxx=getmaxx();
maxy=getmaxy();
COM1=0;
COM2=1;
puerto=COM1
/* definir cual puerto se utiliza */

130

Curso avanzado de Microcontroladores PIC

Captulo 4. Proyectos con el PIC16C71


clrscr();
/*limpiar pantalla*/
config=0x83; /*configurar puerto: 1200 bps,8 bits, sin paridad,1 stop bit*/
bioscom(0,config,puerto);
/*configuracin de los puertos*/
cleardevice();
gotoxy(10,2);
printf("Curso de Microcontroladores PIC - CEKIT");
gotoxy(10,4);
printf("La computadora recibe los datos y los grafica - ADQUISI1.C");
gotoxy(60,25);
printf("Escape = Salir");
x=0;
moveto(66,maxy/2-155);
outtext("255");
moveto(82,maxy/2+100);
outtext("0");
setfillpattern(pattern,0);
bar(100,maxy/2-155,maxx-100,maxy/2+100);
rectangle(100,maxy/2-156,maxx-100,maxy/2+101);
moveto(100,maxy/2+100);
do{
leer();
if(!kbhit())
{
lineto(x+100,maxy/2+100-dato);
gotoxy(10,24);
printf("
");
gotoxy(10,24);
printf("El dato ledo es: %d",dato);
moveto(x+100,maxy/2+100-dato);
x+=1;
if (x>maxx-200)
{
setfillpattern(pattern,0);
bar(100,maxy/2-155,maxx-100,maxy/2+100);
rectangle(100,maxy/2-155,maxx-100,maxy/2+100);
x=0;
moveto(100,maxy/2+100);
}
}
}while(!kbhit());
closegraph();
clrscr();
}

Figura 4.6. Programa en lenguaje C que lee el dato serial y lo grafica en


la pantalla (adquisi1.C)

Figura 4.7. Pantallazo del programa ADQUISI1


Curso avanzado de Microcontroladores PIC

131

Captulo 4. Proyectos con el PIC16C71

132

Curso avanzado de Microcontroladores PIC