tengo otro nuevo programita es un termostato variable con lm35, tiene una temperatura minima y otra maxima programadas y si la temp actual es mas baja que la baja se enciende el relecalefactor y con la temperatura alta al reves con un16f877
'****************************************************************
'* Name : UNTITLED.BAS *
'* Author : Alberto Pumar *
'* Notice : Copyright (c) 2012 [select VIEW...EDITOR OPTIONS] *
'* : All Rights Reserved *
'* Date : 02/01/2012 *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************
define LCD_DREG PORTD ;define pines del lcd de b4 a b7
define LCD_DBIT 0 ;empezando desde el puerto b4 a b7
define LCD_RSREG PORTD ;define el puerto b para acceder al bit RS
define LCD_RSBIT 4 ;este es el puerto b3
define LCD_EREG PORTD ;define el puerto b para conectar el ennable
define LCD_EBIT 5 ;este es el puerto b2
define adc_bit 8 ;fijar nº bits resultado (5,8,10)
define adc_clock 3 ;fijar el clock (rc=3)
define adc_sampleus 50 ;nº seg fijar canal y comenzar conversion a/d
trisa=%1 ;el puerto a0 es de entrada
adcon1=%00001110 ;el puerto a0 es el a/d los demas digitales
dato var word ;dato vale hasta 6500
temp1 var word
tempbaja var byte ;temperatura baja bale hasta 255
tempalta var byte ;temperatura alta bale hasta 255
eeprom 0, [20,24] ;guardar valores de temperatura de 20 y 24
x var byte ;x vale hasta 255
g con 223 ;este es el ascii de grados
relef var portb.0 ;rele calefactor en d2
relec var portb.1 ;rele enfriador en d3
led var portb.2 ;led en d4
botenter var portb.3 ;enter en d5
botbaja var portb.4 ;boton bajar temperatura en d6
botsube var portb.5 ;boton subir temperatura en d7
inicio: ;subrutina para indicar procesador funciona
for x=1 to 3 ;repetir 3 veces
high led ;encender led
pause 200 ;esperar 200 ms
low led ;apagar el led
pause 200 ;esperar 200 ms
next
read 0,tempbaja ;leer en lugar 0 de eepron y dato guarda en tempbaja
read 1,tempalta ;leer el lugar 1 de eepron y dato guardar en tempalta
lcdout $FE,1 ;limpiar pantalla lcd
lcdout $FE,2,"T.mi T.act T.max" ;sacar ese texto por la primera linea lcd
sensar: ;subrutina
adcin 0,dato ;leer a0 y guardar en dato
temp1=150*dato/77 ;el resultado es este
lcdout $FE,$c6,dec3 temp1,g,"C" ;sacar por la segunda linea el valor de temperatura ambiente
lcdout $FE,$c0,dec3 tempbaja,g,"C" ;sacar por la segunda linea el valor de temperatura minima
lcdout $FE,$cc,dec3 tempalta,g,"C" ;sacar por la segunda linea el valor de temperatura maxima
for x=1 to 50 ;repetir 50 veces
if botenter=0 then grabar1a ;si el boton grabar esta pulsado ir a grabar tempertura
pause 10
next
if temp1<tempbaja then calentar ;si el dato temp1 es < que la temperatura minina ir a sub calentar
if temp1>tempalta then enfriar ;si el dato temp1 es> qaue la temperatura maxima ir a sub enfriar
low relec:low relef ;apagar los dos reles
goto sensar ;continuar sensando
calentar:
high relec:low relef ;encender relecalentar y apagar rele enfriar
goto sensar
enfriar:
high relef:low relec ;encender releenfriar y apagar relecalentar
goto sensar
grabar1a:
gosub soltar ;va a tecla antirebote
grabar1:
LCDout $FE,1,"Programar Temperatura..." ;poner en la 1 linea programar temperatura
lcdout $FE,$C0,"Tminima=",dec3 tempbaja,g,"C" ;en la 2 linea sale la temperatura minima en º
pause 100
if botbaja=0 then restar1 ;si se pulsa boton restar va a subrutina restar1
if botsube=0 then sumar1 ;si se pulsa boton subir va a subrutina sumar1
if botenter=0 then grabarA ;si se pulsa boton enter va a subrutina grabara
goto grabar1a ;sigue en la subrutina mientras no se pulse un boton
restar1: ;subrutina restar a la temperatura minina
gosub soltar ;programa rebote tecla
if tempbaja<1 then grabar1 ;si la temperatura minima es <1º va a subrutina anterior
tempbaja=tempbaja-1 ;restar 1 a la temperatura minima
goto grabar1 ;vuelve a subrutina grabar
sumar1: ;subrutina aumentar temperatura minima
gosub soltar ;tecla antirebote teclas
if tempbaja>40 then grabar1 ;si la temp baja minima es>40 ir a subrutina graba1
tempbaja=tempbaja+1 ;sumar 1 a la temperatura minima
goto grabar1 ;vuelve a subrutina grabar1
grabarA:
gosub soltar ;programa antirebote teclas
write 0,tempbaja ;grabar la nuevga temperatura minima en eeprom
grabar2:
lcdout $FE,1,"Programar Temperatura..." ;primera linea sale ese mensaje
lcdout $FE,$C0,"Tmaxima=",dec3 tempalta,g,"C" ;en la 2 linea sale la temperatura maxima en º
pause 100
if botbaja=0 then restar2 ;si pulsamos boton bajar va a subrutina restar2
if botsube=0 then sumar2 ;si pulsamos boton subir va a subrutina subir2
if botenter=0 then grabarB ;si pulsamos boton enter va a subrutina gragarb
goto grabar2 ;sigue en subrutina mientras no se pulse un boton
restar2: ;subrutina restar grados a la temperatura maxima
gosub soltar ;progrma antirebote de tecla
if tempalta<5 then grabarB ;si la temperatura es <5º vs a subrutina grabarb
tempalta=tempalta-1 ;restar 1 a la temperatura maxima
goto grabar2 ;va a subrutina grabar2
sumar2: ;subrutina sumar a la temperatura maxima
gosub soltar ;va a programa antirebote tecla
if tempalta>60 then grabarB ;si la temperatura maxima es>60 ir a grabarb
tempalta=tempalta+1 ;sumar 1 a la temkperatura maxima
goto grabar2 ;va a subrutina grabar
grabarb: ;subrutina grabar temperatura maxinma
gosub soltar ;programa antirebote de teclas
write 1,tempalta ;grabar la nueva temperatura maxima
lcdout $FE,1,"nueva temperatura"
lcdout $FE,$C0,"programada"
goto inicio ;vuelve al inicio del prgrama
soltar: ;subrutian antirebote teclas
high led
pause 150
low led
soltar2: ;continuacion subrutina antirebote teclas
if botbaja=0 then soltar2 ;si boton sigue pulsado seguir en esta subrutina
if botsube=0 then soltar2 ;si boton sigue pulsado seguir en esta subrutina
if botenter=0 then soltar2 ;si boton sigue pulsado seguir en esta subrutina
pause 100
return ;vuelve a subrutina grabar1a
end
