Búsqueda personalizada
Regístrate gratis para participar de los foros, o si ya estás registrado haz login.
| comentario del autor | Mie Sep 24, 2008 1:31 pm | |
|
Este es el Programa /**********************************************************************/ /* */ /* Termometro.c */ /* Termómetro degital usando termistor */ /* para el PIC16F873 */ /* */ /* */ /* Autor: Carlos Narvaez 15/06/2004 */ /* Rutina LCD Original: J. Winpenny */ /* */ /*--------------------------------------------------------------------*/ /* LCD : OPTREX Corporation DMC16249UB */ /* LCD tipo: HD44780 */ /* Compilador: CSC PCM C compiler */ /* termistor: 10K @ 25°C */ /* */ /* Interfaces: */ /* */ /* Termistor = Port A bit 0 */ /* Data_5 = Port B bit 0 */ /* Data_6 = Port B bit 1 */ /* Data_7 = Port B bit 2 */ /* Data_6 = Port B bit 3 */ /* RS = Port B bit 4 */ /* W/R = Port B bit 5 */ /* Enable = Port B bit 6 */ /* Esta version es para el modo de operación 4 bit */ /* */ /* */ /**********************************************************************/ #include <16f873.h> #device ADC=10 #include <math.h> #fuses XT,NOWDT,PUT, NOPROTECT, NOBROWNOUT,NOLVP,WRT,NOCPD #use delay (clock=4000000) /**********************************************************************/ /* Prototipos */ /**********************************************************************/ void LCD_Setup(void); void LCD_FunctionMode(void); void LCD_DataMode(void); void LCD_Write_8_Bit(char); void LCD_Write_4_Bit(char); void LCD_Delay(void); void delay_s(int); void calcule_temp(long int); void write_temp(void); //void WriteLCDString( const char *lcdptr ); /**********************************************************************/ /* Definiciones Generales */ /**********************************************************************/ #byte OPTION_REG = 0x81 long int adc_var; float r_term, T_C, LnRes, LnRes3; /**********************************************************************/ /* Definiciones para la interfaz PIC-LCD */ /**********************************************************************/ #define TER_IN PIN_A0 /* Interfaz Termistor-PIC */ #define LCD_DATA_4 PIN_B0 /* LCD BIT 4 */ #define LCD_DATA_5 PIN_B1 /* LCD BIT 5 */ #define LCD_DATA_6 PIN_B2 /* LCD BIT 6 */ #define LCD_DATA_7 PIN_B3 /* LCD BIT 7 */ #define LCD_RS PIN_B4 /* Register Select */ #define LCD_WR PIN_B5 /* Escribir/Leer */ #define LCD_SEL PIN_B6 /* Habilita LCD */ /* */ /* */ /**********************************************************************/ /* Comandos del LCD ( Segun LCD Data Sheet ) */ /**********************************************************************/ /* */ #define clear_lcd 0x01 /* Clear Display */ #define return_home 0x02 /* Cursor to Home position */ #define entry_mode 0x06 /* Normal entry mode */ #define entry_mode_shift 0x07 /* - with shift */ #define system_set_8_bit 0x38 /* 8 bit data mode 2 line ( 5x7 font ) */ #define system_set_4_bit 0x28 /* 4 bit data mode 2 line ( 5x7 font ) */ #define display_on 0x0c /* Switch ON Display */ #define display_off 0x08 /* Cursor plus blink */ #define set_dd_line1 0x80 /* Line 1 position 1 */ #define set_dd_line2 0xC0 /* Line 2 position 1 */ #define set_dd_ram 0x80 /* Line 1 position 1 */ #define write_data 0x00 /* With RS = 1 */ #define cursor_on 0x0E /* Switch Cursor ON */ #define cursor_off 0x0C /* Switch Cursor OFF */ /* */ /**********************************************************************/ /* Variables configuracion del PIC */ /**********************************************************************/ #define TxMode 0x40 /* Set option reg TMR0 interrupt */ /* source from counter. */ /* Max speed prescaler ( 1:2 ) */ /* ( Not needed for LCD ) */ #define PortAConfig 0x01 /* Configure port A ( 1 = input ) */ /* RA4/RTCC = Input / RA2 = Input */ #define PortBConfig 0x00 /* Configure port B */ /**********************************************************************/ /* Programa Principal */ /**********************************************************************/ void main(void) { /* Configuración puertos PIC e Interrucciones */ OPTION_REG = TxMode; /* Set Option register.*/ set_tris_a( PortAConfig); /* Setup ports */ set_tris_b( PortBConfig ); output_low(LCD_SEL); disable_interrupts(GLOBAL); setup_adc_ports(RA0_ANALOG); setup_adc(ADC_CLOCK_DIV_32); SET_ADC_CHANNEL(0); /* End of Setup */ LCD_Setup(); /* Setup the LCD device */ LCD_Write_4_Bit('T'); /* Display a test message */ LCD_Write_4_Bit('E'); LCD_Write_4_Bit('R'); LCD_Write_4_Bit('M'); LCD_Write_4_Bit('O'); LCD_Write_4_Bit('M'); LCD_Write_4_Bit('E'); LCD_Write_4_Bit('T'); LCD_Write_4_Bit('R'); LCD_Write_4_Bit('O'); delay_s(5); LCD_FunctionMode(); LCD_Write_4_Bit(set_dd_line2); /* Goto line 2 */ LCD_DataMode(); while( 1 ) { adc_var = READ_ADC(); delay_us(10); calcule_temp(adc_var); write_temp(); LCD_FunctionMode(); LCD_Write_4_Bit(set_dd_line2); /* Goto line 2 */ LCD_DataMode(); delay_s(5); } } /* END OF MAIN */ /***********************************/ /* Setup the lcd device */ /***********************************/ void LCD_Setup(void) { /* Reset the LCD */ delay_ms(30); /* Power up delay */ LCD_FunctionMode(); LCD_Write_8_Bit( system_set_4_bit ); /* This sequence resets the LCD */ delay_ms(5); LCD_Write_8_Bit( system_set_4_bit ); delay_ms(5); LCD_Write_8_Bit( system_set_4_bit ); delay_ms(5); LCD_Write_4_Bit( system_set_4_bit ); delay_ms(2); LCD_Write_4_Bit( display_off ); delay_ms(2); LCD_Write_4_Bit( entry_mode ); delay_ms(2); LCD_Write_4_Bit( display_on ); delay_ms(2); LCD_Write_4_Bit( set_dd_ram ); delay_ms(2); LCD_DataMode(); } /***********************************/ /* LCD modo comandos */ /***********************************/ void LCD_FunctionMode(void) { output_low(LCD_RS); LCD_Delay(); } /***********************************/ /* LCD modo Data */ /***********************************/ void LCD_DataMode(void) { output_high(LCD_RS); LCD_Delay(); } /***********************************/ /* Escribe un byte en el LCD */ /* Modo 8 Bit */ /***********************************/ void LCD_Write_8_Bit(char d ) { output_low(LCD_WR); /* modo Write */ LCD_Delay(); /* Setup data */ if ( d & 0x80 ) output_high(LCD_DATA_7); else output_low(LCD_DATA_7); if ( d & 0x40 ) output_high(LCD_DATA_6); else output_low(LCD_DATA_6); if ( d & 0x20 ) output_high(LCD_DATA_5); else output_low(LCD_DATA_5); if ( d & 0x10 ) output_high(LCD_DATA_4); else output_low(LCD_DATA_4); LCD_Delay(); output_high(LCD_SEL); /* Select LCD */ LCD_Delay(); output_low(LCD_SEL); /* De-select LCD */ /***********************************/ /* Escribe un byte en el LCD */ /* Modo 4 Bit */ /***********************************/ void LCD_Write_4_Bit(char d ) { output_low(LCD_WR); /* Write Mode */ LCD_Delay(); /* Output Higher 4 bits */ if ( d & 0x80 ) output_high(LCD_DATA_7); else output_low(LCD_DATA_7); if ( d & 0x40 ) output_high(LCD_DATA_6); else output_low(LCD_DATA_6); if ( d & 0x20 ) output_high(LCD_DATA_5); else output_low(LCD_DATA_5); if ( d & 0x10 ) output_high(LCD_DATA_4); else output_low(LCD_DATA_4); LCD_Delay(); output_high(LCD_SEL); LCD_Delay(); output_low(LCD_SEL); /* Clock in the data */ LCD_Delay(); d <<= 4; /* Output Lower 4 bits */ if ( d & 0x80 ) output_high(LCD_DATA_7); else output_low(LCD_DATA_7); if ( d & 0x40 ) output_high(LCD_DATA_6); else output_low(LCD_DATA_6); if ( d & 0x20 ) output_high(LCD_DATA_5); else output_low(LCD_DATA_5); if ( d & 0x10 ) output_high(LCD_DATA_4); else output_low(LCD_DATA_4); LCD_Delay(); output_high(LCD_SEL); LCD_Delay(); output_low(LCD_SEL); /* Clock in the data */ } /***********************************/ /* Retardo temporal para LCD */ /* Adjuste segun el LCD que use */ /***********************************/ void LCD_Delay(void) { delay_ms(1); } /***********************************/ /* Retardo segundos */ /***********************************/ void delay_s(int n) { for (;n!=0; n--) delay_ms(1000); } /***********************************/ /* Calculo de Temperatura */ /***********************************/ void calcule_temp(long int adc_var) { r_term = ((10.0*adc_var)/(1024-adc_var)); LnRes = log(r_term); LnRes3 = LnRes*LnRes*LnRes; T_C = (1/(0.00269794+0.00028033*LnRes+0.00000086*LnRes3))-273.15; } /***********************************/ /* Escribe Tempertura en LCD */ /***********************************/ void write_temp(void) { printf(LCD_Write_4_Bit, "%5.2f", T_C); } prog1.txt (8.28 kb) - |
||
| sin valorar | Mar Nov 25, 2008 2:38 pm | |
|
no se con q fin busca que te corra este programa,algun proyecto que tienes en mente?,o algun trabajito de la universidad?,postea a ver en que se te puede ayudar,suerte |
||
| sin valorar | Jue Ago 20, 2009 3:15 pm | |
|
/**********************************************************************/ /* */ /* Termometro.c */ /* Termómetro degital usando termistor */ /* para el PIC16F873 */ /* */ /* */ /* Autor: Carlos Narvaez 15/06/2004 */ /* Rutina LCD Original: J. Winpenny */ /* */ /*--------------------------------------------------------------------*/ /* LCD : OPTREX Corporation DMC16249UB */ /* LCD tipo: HD44780 */ /* Compilador: CSC PCM C compiler */ /* termistor: 10K @ 25°C */ /* */ /* Interfaces: */ /* */ /* Termistor = Port A bit 0 */ /* Data_5 = Port B bit 0 */ /* Data_6 = Port B bit 1 */ /* Data_7 = Port B bit 2 */ /* Data_6 = Port B bit 3 */ /* RS = Port B bit 4 */ /* W/R = Port B bit 5 */ /* Enable = Port B bit 6 */ /* Esta version es para el modo de operación 4 bit */ /* */ /* */ /**********************************************************************/ #include <16f873.h> #device ADC=10 #include <math.h> #fuses XT,NOWDT,PUT, NOPROTECT, NOBROWNOUT,NOLVP,WRT,NOCPD #use delay (clock=4000000) /**********************************************************************/ /* Prototipos */ /**********************************************************************/ void LCD_Setup(void); void LCD_FunctionMode(void); void LCD_DataMode(void); void LCD_Write_8_Bit(char); void LCD_Write_4_Bit(char); void LCD_Delay(void); void delay_s(int); void calcule_temp(long int); void write_temp(void); //void WriteLCDString( const char *lcdptr ); /**********************************************************************/ /* Definiciones Generales */ /**********************************************************************/ #byte OPTION_REG = 0x81 long int adc_var; float r_term, T_C, LnRes, LnRes3; /**********************************************************************/ /* Definiciones para la interfaz PIC-LCD */ /**********************************************************************/ #define TER_IN PIN_A0 /* Interfaz Termistor-PIC */ #define LCD_DATA_4 PIN_B0 /* LCD BIT 4 */ #define LCD_DATA_5 PIN_B1 /* LCD BIT 5 */ #define LCD_DATA_6 PIN_B2 /* LCD BIT 6 */ #define LCD_DATA_7 PIN_B3 /* LCD BIT 7 */ #define LCD_RS PIN_B4 /* Register Select */ #define LCD_WR PIN_B5 /* Escribir/Leer */ #define LCD_SEL PIN_B6 /* Habilita LCD */ /* */ /* */ /**********************************************************************/ /* Comandos del LCD ( Segun LCD Data Sheet ) */ /**********************************************************************/ /* */ #define clear_lcd 0x01 /* Clear Display */ #define return_home 0x02 /* Cursor to Home position */ #define entry_mode 0x06 /* Normal entry mode */ #define entry_mode_shift 0x07 /* - with shift */ #define system_set_8_bit 0x38 /* 8 bit data mode 2 line ( 5x7 font ) */ #define system_set_4_bit 0x28 /* 4 bit data mode 2 line ( 5x7 font ) */ #define display_on 0x0c /* Switch ON Display */ #define display_off 0x08 /* Cursor plus blink */ #define set_dd_line1 0x80 /* Line 1 position 1 */ #define set_dd_line2 0xC0 /* Line 2 position 1 */ #define set_dd_ram 0x80 /* Line 1 position 1 */ #define write_data 0x00 /* With RS = 1 */ #define cursor_on 0x0E /* Switch Cursor ON */ #define cursor_off 0x0C /* Switch Cursor OFF */ /* */ /**********************************************************************/ /* Variables configuracion del PIC */ /**********************************************************************/ #define TxMode 0x40 /* Set option reg TMR0 interrupt */ /* source from counter. */ /* Max speed prescaler ( 1:2 ) */ /* ( Not needed for LCD ) */ #define PortAConfig 0x01 /* Configure port A ( 1 = input ) */ /* RA4/RTCC = Input / RA2 = Input */ #define PortBConfig 0x00 /* Configure port B */ /**********************************************************************/ /* Programa Principal */ /**********************************************************************/ void main(void) { /* Configuración puertos PIC e Interrucciones */ OPTION_REG = TxMode; /* Set Option register.*/ set_tris_a( PortAConfig); /* Setup ports */ set_tris_b( PortBConfig ); output_low(LCD_SEL); disable_interrupts(GLOBAL); setup_adc_ports(RA0_ANALOG); setup_adc(ADC_CLOCK_DIV_32); SET_ADC_CHANNEL(0); /* End of Setup */ LCD_Setup(); /* Setup the LCD device */ LCD_Write_4_Bit('T'); /* Display a test message */ LCD_Write_4_Bit('E'); LCD_Write_4_Bit('R'); LCD_Write_4_Bit('M'); LCD_Write_4_Bit('O'); LCD_Write_4_Bit('M'); LCD_Write_4_Bit('E'); LCD_Write_4_Bit('T'); LCD_Write_4_Bit('R'); LCD_Write_4_Bit('O'); delay_s(5); LCD_FunctionMode(); LCD_Write_4_Bit(set_dd_line2); /* Goto line 2 */ LCD_DataMode(); while( 1 ) { adc_var = READ_ADC(); delay_us(10); calcule_temp(adc_var); write_temp(); LCD_FunctionMode(); LCD_Write_4_Bit(set_dd_line2); /* Goto line 2 */ LCD_DataMode(); delay_s(5); } } /* END OF MAIN */ /***********************************/ /* Setup the lcd device */ /***********************************/ void LCD_Setup(void) { /* Reset the LCD */ delay_ms(30); /* Power up delay */ LCD_FunctionMode(); LCD_Write_8_Bit( system_set_4_bit ); /* This sequence resets the LCD */ delay_ms(5); LCD_Write_8_Bit( system_set_4_bit ); delay_ms(5); LCD_Write_8_Bit( system_set_4_bit ); delay_ms(5); LCD_Write_4_Bit( system_set_4_bit ); delay_ms(2); LCD_Write_4_Bit( display_off ); delay_ms(2); LCD_Write_4_Bit( entry_mode ); delay_ms(2); LCD_Write_4_Bit( display_on ); delay_ms(2); LCD_Write_4_Bit( set_dd_ram ); delay_ms(2); LCD_DataMode(); } /***********************************/ /* LCD modo comandos */ /***********************************/ void LCD_FunctionMode(void) { output_low(LCD_RS); LCD_Delay(); } /***********************************/ /* LCD modo Data */ /***********************************/ void LCD_DataMode(void) { output_high(LCD_RS); LCD_Delay(); } /***********************************/ /* Escribe un byte en el LCD */ /* Modo 8 Bit */ /***********************************/ void LCD_Write_8_Bit(char d ) { output_low(LCD_WR); /* modo Write */ LCD_Delay(); /* Setup data */ if ( d & 0x80 ) output_high(LCD_DATA_7); else output_low(LCD_DATA_7); if ( d & 0x40 ) output_high(LCD_DATA_6); else output_low(LCD_DATA_6); if ( d & 0x20 ) output_high(LCD_DATA_5); else output_low(LCD_DATA_5); if ( d & 0x10 ) output_high(LCD_DATA_4); else output_low(LCD_DATA_4); LCD_Delay(); output_high(LCD_SEL); /* Select LCD */ LCD_Delay(); output_low(LCD_SEL); /* De-select LCD */ } /***********************************/ /* Escribe un byte en el LCD */ /* Modo 4 Bit */ /***********************************/ void LCD_Write_4_Bit(char d ) { output_low(LCD_WR); /* Write Mode */ LCD_Delay(); /* Output Higher 4 bits */ if ( d & 0x80 ) output_high(LCD_DATA_7); else output_low(LCD_DATA_7); if ( d & 0x40 ) output_high(LCD_DATA_6); else output_low(LCD_DATA_6); if ( d & 0x20 ) output_high(LCD_DATA_5); else output_low(LCD_DATA_5); if ( d & 0x10 ) output_high(LCD_DATA_4); else output_low(LCD_DATA_4); LCD_Delay(); output_high(LCD_SEL); LCD_Delay(); output_low(LCD_SEL); /* Clock in the data */ LCD_Delay(); d <<= 4; /* Output Lower 4 bits */ if ( d & 0x80 ) output_high(LCD_DATA_7); else output_low(LCD_DATA_7); if ( d & 0x40 ) output_high(LCD_DATA_6); else output_low(LCD_DATA_6); if ( d & 0x20 ) output_high(LCD_DATA_5); else output_low(LCD_DATA_5); if ( d & 0x10 ) output_high(LCD_DATA_4); else output_low(LCD_DATA_4); LCD_Delay(); output_high(LCD_SEL); LCD_Delay(); output_low(LCD_SEL); /* Clock in the data */ } //<----------------------------------------------------------------------------Esta llave era la que faltaba, /***********************************/ /* Retardo temporal para LCD */ /* Adjuste segun el LCD que use */ /***********************************/ void LCD_Delay(void) { delay_ms(1); } /***********************************/ /* Retardo segundos */ /***********************************/ void delay_s(int n) { for (;n!=0; n--) delay_ms(1000); } /***********************************/ /* Calculo de Temperatura */ /***********************************/ void calcule_temp(long int adc_var) { r_term = ((10.0*adc_var)/(1024-adc_var)); LnRes = log(r_term); LnRes3 = LnRes*LnRes*LnRes; T_C = (1/(0.00269794+0.00028033*LnRes+0.00000086*LnRes3))-273.15; } /***********************************/ /* Escribe Tempertura en LCD */ /***********************************/ void write_temp(void) { printf(LCD_Write_4_Bit, "%5.2f", T_C); } |
||