Indice
1.
Objetivo del circuito
2. Conversor Análogo/Digital
ADC0804
3. Sensor de temperatura
LM35
4. Circuito Integrado
MAX232
5. Microcontrolador
PIC16F84A
6. Diagrama de flujo del programa para
programar el PIC16F84A
7. Código fuente del programa
para el PIC16F84A
8. Programa TermoPIC
9. Código fuente del programa
TermoPIC
El circuito que se ha construido, consiste en un sensor
de temperatura
LM35, el cual otorga al PIC16F84A el valor de la
temperatura en el ambiente, para
tal propósito, el PIC16F84A y el LM35 se encuentran
conectados por medio de un conversor análogo/digital, el
ADC0804. Una vez el PIC16F84A obtiene el dato binario del
conversor correspondiente a la temperatura, lo envía al PC
vía serial, para ello se utiliza el circuito integrado
MAX232.
2.
Conversor Análogo/Digital ADC0804
Un convertidor análogo/digital es un circuito
integrado que convierte señales análogas en
datos
binarios: 0s y 1s.
El convertidor analogo/digital ADC0804 es un circuito integrado
capaz de convertir una muestra
analógica entre 0v y 5v, en un valor binario de 8
dígitos binarios. Para saber la resolución del
convertidor tenemos que saber el valor máximo que la
entrada de información utiliza y la cantidad
máxima de la salida en dígitos binarios. Como
ejemplo vamos a hacer los cálculos para el
ADC0804.
Distribución de pines
Conversor ADC0804
Vcc: voltaje positivo de alimentación
AGND: tierra del
sistema
análogo
DGND: tierra del sistema digital
Vin(+): terminal positiva del voltaje de entrada
Vin(-): terminal negativa del voltaje de entrada
DB7-DB0: salidas de la conversión digital, con DB7 el MSB
y DB0 el LSB
CLKin: entrada de reloj
CLKr: salida del reloj cuya frecuencia depende de una resistencia y un
condensador externos
CS: chip select, para que el ACD0804 funciones debe
estar en low
RD: cuando este pin esta en low, las salidas tristate
están activas y se puede leer el dato
WR: cuando va a low, el proceso de
conversión se inicia
INTR: genera una interrupción de nivel low cuando finaliza
el proceso de conversión
Vref/2: este pin debe ser alimentado con la mitad del rango de
voltaje analógico máximo que va a recibir el
ADC0804 por el pin Vin(+). Ejemplo: para un rango de entrada
entre 0,5v y 3,5v el valor de Vref/2 será igual a: (3,5
– 0,5 )/2 o sea 1,5v
El sensor de temperatura utilizado, es el circuito
integrado LM35D de National
Semiconductors
Características principales
El circuito integrado LM35D es un sensor de temperatura cuya
tensión de salida es linealmente proporcional con la
temperatura en la escala Celsius
(centígrada) . Posee una precisión aceptable para
la aplicación requerida, no necesita calibración
externa, posee sólo tres terminales, permite el sensado
remoto y es de bajo costo
- Factor de escala : 10mV/ºC ( garantizado entre
9,8 y 10,2mV/ºC) - Rango de utilización : -55ºC < T <
150ºC - Precisión de : ~1,5ºC (peor
caso) - No linealidad : ~0,5ºC (peor caso)
Este circuito integrado soluciona los problemas de
niveles de voltaje cuando se requiere enviar señales
digitales sobre una línea RS-232. el MAX232 se usa en
aquellas aplicaciones donde no se dispones de fuentes dobles
de +12V; por ejemplo, en aplicaciones alimentados con
baterías de una polaridad. El MAX232 necesita solamente
una fuente de +5V para su operación; un elevador de
voltaje interno convierte el voltaje de +5V al doble de polaridad
de +-12V. A continuación se muestra la estructura
interna del MAX232 y algunas de sus
características.
Circuito Integrado MAX232
Este PIC está fabricado con tecnología CMOS de
altas prestaciones y
encapsulado en plástico
con 18 pines.
A continuación se comenta brevemente la misión de
cada uno de los pines.
Vdd: Pin por el que se aplica la tensión positiva de la
alimentación.
Vss: Pin conectado a tierra o negativo de la
alimentación.
OSC1 / CLKIN: Pin por el que se aplica la entrada del circuito
oscilador externo que proporciona la frecuencia de trabajo del
microcontrolador.
OSC2 / CLKOUT: Pin auxiliar del circuito oscilador.
MCLR#: Este pin es activado con un nivel lógico bajo, lo
que se representa con el símbolo 3. su activación
origina reinicialización o Reset del PIC.
También se usa este pin durante la grabación de
la memoria de
programa para
introducir por ella la tensión, Vpp, que está
comprendida entre 12 y 14 V DC.
Diagrama de conexión de pines del PIC16F84A
RA0 – RA4: Son 5 líneas de E/S digitales
correspondientes a la Puerta A.
La línea RA4 multiplexa otra función
expresado por TOCKI. En este segundo caso sirve para recibir una
frecuencia externa para alimentar al temporizador interno
TMR0.
RB0 – RB7: Estos 8 pines corresponden a las 8 líneas
de E/S digitales de la Puerta B.
La línea RB0 multiplexa otra función, que es la de
servir como entrada a una petición externa de una
interrupción, por eso se la denomina RB0 / INT.
6. Diagrama de flujo
del programa para programar el PIC16F84A
Diagrama de flujo de la subrutina
reloj
Diagrama de flujo de la subrutina
enviar
Diagrama de flujo de la subrutina
delay
7. Código
fuente del programa para el PIC16F84A
;Proyecto final de
Microcontroladores
;Medición digital de la temperatura
;mediante un LM35 y ADC0804 y envío
;de la temperatura al PC mediante un PIC16F84A
;y un MAX232 vía RS-232
LIST P=16F84
;*****************************
;Declaración de registros
status equ 0x03
PORTA equ 0x05
PORTB equ 0x06
carry equ 0
TX equ 1
WR equ 2
CLK equ 3
INTR equ 4
loops equ 0x0c
r0d equ 0x0d
r0e equ 0x0e
trans equ 0x0f
org 0
goto inicio
org 5
;****************************
;Subrutina reloj, que se encarga de dar pulsos al ADC0804
reloj bsf PORTA,CLK ;sube la linea del reloj
movlw 0x1F
movwf loops ;retardo
reloj2 decfsz loops
goto reloj2
bcf PORTA,CLK ;baja la linea de reloj
movlw 0x1F
movwf loops ;retardo
reloj3 decfsz loops
goto reloj3
return
;Fin de la subrutina reloj
;****************************
;Subrutina delay para transmitir un bit
delay movlw .166 ;cargar para 833 microseg aproximadamente
startup movwf r0e ;llevar a cabo el retardo
redo nop ;limpiar circuito de vigilancia
nop
decfsz r0e
goto redo
retlw 0
;Fin de la subrutina delay
;****************************
;Subrutina enviar, envia el valor de la temperatura
;al PC de manera serial
enviar movwf trans ;llevar el contenido de w a transmision
xmrt movlw 8 ;cargar con el numero de bits
movwf r0d ;el contador
bcf PORTA,TX ;colocar la linea de transmision en bajo
call delay ;para generar bit de arranque
xnext bcf PORTA,TX ;colocar la linea de transmision en bajo
bcf status,carry ;limpiar el carry
rrf trans ;rotar registro de
transmision
btfsc status,carry ;preguntar por el carry
bsf PORTA,TX ;si es uno, colocar linea en alto
call delay
decfsz r0d ;decrementar el contador, saltar si cero
goto xnext ;repetir hasta transmitir el dato
bsf PORTA,TX ;colocar la linea de transmision en alto
call delay ;llamar retardo 1 bit -bit de parada-
retlw 0
;Fina de la subrutina enviar
;****************************
;Inicio del programa
inicio bsf status,5
movlw 0x11
movwf PORTA
movlw 0xFF
movwf PORTB
bcf status,5
bsf PORTA,TX ;colocar la linea de transmision en alto
bcf PORTA,WR ;colocar en bajo WR para resetear el ADC
movlw 0x1F
movwf loops ;retardo
salto1 decfsz loops
goto salto1
bsf PORTA,WR ;colocar en alto WR para iniciar la conversion
movlw 0x1F
movwf loops ;retardo
salto2 decfsz loops
goto salto2
pulsos call reloj ;llamar a la subrutina reloj
btfsc PORTA,INTR ;preguntar se INTR es cero, si lo es saltar
goto pulsos
movf PORTB,w ;cargar el dato binario en w
call enviar ;llamar a la subrutina enviar
goto inicio
;Fin del programa principal
;*****************************
end
El programa que se utiliza para visualizar la
temperatura en el PC se llama TermoPIC, el cual se ha
desarrollado en lenguaje
Delphi.
Nota importante: para que el programa funcione, debe bajarse de
Internet el
componente para delphi conocido como TComport
9.
Código fuente del programa TermoPIC
unit TermoPIC;
interface
uses
Windows,
Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs,
Comport, StdCtrls, ExtCtrls, Buttons, Gauges;
type
TForm1 = class( TForm )
GroupBox1: TGroupBox;
shPortOpen: TShape;
StaticText6: TStaticText;
shError: TShape;
StaticText11: TStaticText;
cbPorts: TComboBox;
StaticText1: TStaticText;
ComPort1: TComPort;
SpeedButton1: TSpeedButton;
SpeedButton2: TSpeedButton;
Image1: TImage;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
GroupBox2: TGroupBox;
Gauge1: TGauge;
Label4: TLabel;
Label5: TLabel;
procedure btnOpenClick( Sender: TObject );
procedure btnCloseClick( Sender: TObject );
//procedure btnSendClick( Sender: TObject );
procedure Button6Click( Sender: TObject );
procedure Button7Click( Sender: TObject );
procedure Button8Click( Sender: TObject );
procedure Button9Click( Sender: TObject );
procedure FormCreate( Sender: TObject );
procedure FormDestroy( Sender: TObject );
procedure ComPort1PortOpen( Sender: TObject );
procedure ComPort1ReceiveCallBack( Data: string );
procedure ComPort1PortClose(Sender: TObject);
//procedure Edit2KeyPress( Sender: TObject; var Key: Char );
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1 : TForm1;
Implementation
{$R *.DFM}
//==========================================
procedure TForm1.FormCreate( Sender: TObject );
begin
EnumPorts( cbPorts.Items );
if cbPorts.Items.Count > 0 then
cbPorts.ItemIndex := 0; // show first available port
end;
//===========================================
procedure TForm1.FormDestroy( Sender: TObject );
begin
ComPort1.Free;
end;
//============================================
procedure TForm1.btnOpenClick( Sender: TObject );
begin
cbPorts.Enabled := false;
ComPort1.Port := cbPorts.Items[cbPorts.ItemIndex];
ComPort1.Open;
end;
//=============================================
procedure TForm1.btnCloseClick( Sender: TObject );
begin
ComPort1.Close;
cbPorts.Enabled := true;
label1.Caption:='0';
Gauge1.Progress:=0;
end;
//===================================================
procedure TForm1.ComPort1ReceiveCallBack( Data: string );
var
i,temperatura: longint;
begin
Temperatura:=Ord(Data[1]);
Temperatura:= (Temperatura*100) div 256;
Image1.Visible := not Image1.Visible;
label1.Caption:=IntToStr(Temperatura);
gauge1.Progress:=Temperatura;
for i:=0 to 100000000 do
begin
end;
end;
//===============================================
procedure TForm1.ComPort1PortOpen( Sender: TObject );
begin
shPortOpen.Brush.Color :=
clYELLOW;
end;
//===========================================================
(*procedure TForm1.Edit2KeyPress( Sender: TObject; var Key: Char
);
begin
if Key = #13 then
begin
BtnSendClick( Sender );
Key := #0;
end;
end; *)
//===========================================
(*procedure TForm1.btnSendClick( Sender: TObject );
begin
ComPort1.send( edit2.Text + #13#10 );
end; *)
//===========================================
procedure TForm1.Button6Click( Sender: TObject );
begin
ComPort1.SetRTS( true );
end;
//===========================================
procedure TForm1.Button7Click( Sender: TObject );
begin
ComPort1.SetRTS( false );
end;
//===========================================
procedure TForm1.Button8Click( Sender: TObject );
begin
ComPort1.SetDTR( true );
end;
//============================================
procedure TForm1.Button9Click( Sender: TObject );
begin
ComPort1.SetDTR( false );
end;
procedure TForm1.ComPort1PortClose(Sender: TObject);
begin
shPortOpen.Brush.Color:=clGray;
end;
end.
Autor:
Mauricio Alberto Orozco Salguero
Ocupación: estudiante de ingeniería
de sistemas y computación (décimo semestre).
Fecha: noviembre de 2002.
Titulo y categoría: Sensor digital de temperatura con PIC.
Categoría: Hardware.