Captulo 4
Proyectos con
el PIC16C71
117
118
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
119
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
121
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
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
;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
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
;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
;termina
+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
125
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
;para almacenar en w
;para almacenar en el mismo registro
;bits del registro adcon1
;bits del registro adcon0
; pines del puerto a
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
r1c
redo
0
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
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
************
127
dato
pantalla
dato2
bsf
movwf
movlw
andwf
movf
andlw
iorwf
call
bcf
call
ptob,rs
dato2
ptob,rs
ptob,e
r0e
0fh
ptob,r
r0e,w
0f0h
ptob,r
retardo
ptob,e
retardo
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
;seleccionar pagina 1
;configura ptoa como entradas
;
;configura ra3 como voltaje de referencia
;y ra0-ra2 como entradas analogas
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
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
;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
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
;termina
#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
131
132