Pic16f84

Solo disponible en BuenasTareas
  • Páginas : 30 (7452 palabras )
  • Descarga(s) : 0
  • Publicado : 10 de septiembre de 2012
Leer documento completo
Vista previa del texto
SEMAFORO:
//Semaforo.c
//RB1 -> rojo
//RB2 -> amarillo
//RB3 -> verde
void main(){
OSCCON=0x40; //Oscilador interno a 1MHz.
PORTB=0x00;  //Inicialización.
TRISB=0x00;  //Puerto B como salida.
while (1)
 {
  PORTB=0b0010;  //Encender LED conectado en RB1(pin7).
  Delay_ms(3000);//Esperar 3 segundos.
  PORTB=0b1000;  //Encender LED conectado en RB3(pin9).
 Delay_ms(3000);//Esperar 3 segundos.
  PORTB=0b1100;  //Encender LEDs conectado en RB3:RB2(pines 9,8).
  Delay_ms(3000);//Esperar 3 segundos.
 }
}
Esquema eléctrico del semáforo.-

Reloj con display 7 segmentos - Ejemplo Reloj:
Reloj de 24 horas con display 7 segmentos. La hora se muestra en formato 14:35 (dos de la tarde y 35 minutos). Dispone de botones para ajuste de horas y minutos. Un botónadicional permite activar la presentación (encender el display) por un lapso de 1 segundo. Luego de lo cual el display se apaga pero el conteo del tiempo sigue corriendo. Un pin se activa por un lapso de 1 segundo a dos horas diferentes programables por software. Para que los proyectos funcionen correctamente el PIC16F877A se tiene que polarizar de acuerdo al esquema indicado en la polarizaciónbásica (ver link más abajo).

Código en lenguaje C (mikroC).-
//reloj7seg.c
//Microcontrolador: PIC16F877A
//Oscilador: Externo 4MHz (modo HS)
//******
//El Proteus 7.5 Professional no acepta la simulación del puerto E y presenta un mensaje de error
//al intentar su simulación. Se probó un ejemplo básico para encender un LED el cual
//funcionó perfectamente en la práctica pero el Proteusgeneraba el error "Internal Exception:
//acces violation in module PIC16.DLL".
//******
//Entradas:
//AA: Avance Automático al mantener presionado (también avance paso a paso al pulsar y soltar).
//Ajuste de HORAS (AA) ->RB7(40)
//Ajuste de MINUTOS (AA) ->RC7(26)
//ACTIVAR ->RD7(30)
//Salidas:
//Horas -> Puertos  A y B
//Minutos -> Puertos C y D
//Dos puntos (:)->RE1(9)
//Pulso de 1 segundo -> RE0(8)

//Función para transformar de binario(decimal) a 7 segmentos:
char Bin2_7seg(char digit){
 switch (digit){
   case 0: return 0x3F;  //0x3F es el código 7-segmentos del 0.
   case 1: return 0x06;  //0x06 es el código 7-segmentos del 1.
   case 2: return 0x5B;
   case 3: return 0x4F;
   case 4: return 0x66;
   case 5: return 0x6D;
   case 6:return 0x7D;
   case 7: return 0x07;
   case 8: return 0x7F;
   case 9: return 0x67;
 }
}

char contador=0,segundos=0,minutos=0,horas=0, minutosBCD, unidades, decenas, horasBCD, j=0;
bit activar;

void main(){
PORTA=0x00;
RE0_bit=0;
RE1_bit=0;
ADCON1=0x06; //Pines RA<5:0> como E/S digital.
PORTB=0x00;  //Inicialización.
PORTC=0x00;
PORTD=0x00;
TRISA=0x00;  //Puerto A comosalida.
TRISB=0x80;  //RB7 como entrada. RB<6:0> como salidas.
TRISC=0x80;  //RC7 como entrada. RC<6:0> como salidas.
TRISD=0x80;  //RD7 como entrada. RD<6:0> como salidas.
TRISE0_bit=0;  //RE0 como salida.
TRISE1_bit=0;  //RE1 como salida.
OPTION_REG=0b01010111;      //Pull ups habilitados.Timer0 como temporizador.
                            //Prescaler asignado alTimer0. Prescaler 1:256.

TMR0=61;                    //Valor inicial del TMR0. Interrupción cada 50 ms.
GIE_bit=1;                  //Interrupciones habilitadas.
T0IE_bit=1;                 //Interrupción del Timer0 habilitada.
activar=1;
while (1){
 if (segundos==60){
  minutos++;
  segundos=0;
 }

 if (minutos==60){
  horas++;
  minutos=0;
 }
 
 if (horas==24) horas=0; //Encender los displays por 1 segundo al presionar ACTIVAR:
 if (activar==1){
  //Encender los dos puntos ":" :
  RE1_bit=1;
 
  //Transformar los minutos para su presentación:
  minutosBCD=Dec2Bcd(minutos);          //Transforma de binario a BCD.
  unidades=0b1111&minutosBCD;           //Sacar las unidades.
  decenas=0b11110000&minutosBCD;        //Sacar las decenas.
 ...
tracking img