domingo, 2 de octubre de 2011

Sistema de riego

A continuación les demostrare como hacer un sistema de riego con el microcontrolador 16f873a  controlando la hora de riego y el tiempo de riego por medio de un reloj digital y además tendrá un termómetro digital. Demostrando las variables en una lcd .
Bueno a continuación demostrare el programa en ccs le recomendaría que simularan este circuito en proteus 7 profesional. Para que se den una idea del funcionamiento del programa.
Programa en ccs   y además les dejare el archivo .hex  para cargarlo al microcontrolador  solo que no tengo un espacio donde subir mis archivos para descargar pero les dejo el código maquina solo tienen que copiarlo en el bloc de notas y guardarlo con la extensión .hex y listo tienen su programa para cargarlo al microcontrolador suerte.


#include <16F873a.h>
#device adc=8
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz
#FUSES PUT                      //Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading


#use delay(clock=4000000)
#define use_portb_lcd TRUE
#include <lcd.c>
int segundos,minutos,horas,temperatura;
int seg=0;
int n_horas=24;
int n_minutos =60;


int prende= 0;
int ehoras,eminutos;
int ahoras,aminutos;

     //INTERRUPCION//
#int_rtcc //Habilita interrupción timer0
void interrupt_timer(void){
   seg++;
   if(seg==59){                //Condición de cambio
      segundos++;              // cuenta 1 segundo
      seg=0;
       delay_ms(300);
   }}
void main(void){
   setup_adc_ports(RA0_ANALOG);// configura RA0 como entrada analogica
   set_tris_a(0xff);
   setup_adc(ADC_CLOCK_INTERNAL);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_64);  //Configura timer0 y prescaler
   set_timer0(131);                          //Inicializa timer0
   enable_interrupts(INT_RTCC);             //Habilita interrupción timer0
   enable_interrupts(GLOBAL);              //Habilita Interrupciones
   lcd_init();                            // inicializa el LCD
   set_adc_channel(0);
   delay_us(1000);
   while(true){
 
      temperatura=read_adc(); //lee valor analogico
    if (input (PIN_A1) == 0){
     horas++;
     delay_ms(100);}
    
     if (input (PIN_A2) == 0){
     minutos ++;
     delay_ms(100);}
    
     if (horas > (n_horas-1)){
      horas = 0;}
     
      if (minutos > (n_minutos-1)){
      minutos = 0;}
     if (input (PIN_A3) == 0){
     ehoras++;
     delay_ms(100);}
    
     if (input (PIN_A4) == 0){
     eminutos ++;
     delay_ms(100);}
     
     if (ehoras > (n_horas-1)){
      ehoras = 0;}
     
      if (eminutos > (n_minutos-1)){
      eminutos = 0;}
    
    if (input (PIN_A5) == 0){
     ahoras++;
     delay_ms(100);}
    
     if (input (PIN_C0) == 0){
     aminutos ++;
     delay_ms(100);}
    
     if (ahoras > (n_horas-1)){
      ahoras = 0;}
     
      if (aminutos > (n_minutos-1)){
      aminutos = 0;}
   
    if(segundos>59){
    segundos=0;
    minutos++;
    if(minutos>59)
         {
    minutos=0;
    horas++;
    if(horas>24)
    horas=0;
    }  } {
    if ((horas == ehoras)&& (minutos == eminutos))
   
    ((output_high(PIN_C2))&& (output_high(PIN_C3)));
   
     if ((horas == ahoras)&& (minutos == aminutos))
     ((output_low(PIN_C2))&& (output_low(PIN_C3)));
    }
      printf (lcd_putc,"\fH:%02u:%02u Temp:%d%cC" ,horas,minutos,temperatura*2,0xdf);
      printf (lcd_putc,"\nE:%02u:%02u A:%02u:%02u" ,ehoras,eminutos,ahoras,aminutos);
     delay_ms(500);
     
   }}}
//fin del programa ccs


Aquí tienen todos los archivos de la simulación en proteus y ademas el programa en ccs .


No hay comentarios: