CAP4MICR

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 5

Microprocesadores 1

Prfr. Carlos Celaya Borges


CAPÍTULO 4. PROGRAMACIÓN EN LENGUAJE C DEL
MICROCONTROLADOR PIC 16F877

4.1 Programación en Lenguaje C

La programción en el lenguaje ANSI-C, se realiza con el compilador PICC de High Tech


Soft.

4.2 Manejo del TIMER0

#include <pic.h>

/*
* Example code for using timer0 on a 16F877
* Just sets up a 1 second interrupt and increments a variable
*/

/*
* Calculate preload value for one second timer
*/

#define PERIOD 1000000 // period in uS - one second here


#define XTAL 4000000 // crystal frequency - 4MHz
#define ICLK (XTAL/4) // crystal is divided by four
#define SCALE 16 // prescale by 16 - check for overflow!

#define PRELOAD PERIOD*ICLK/SCALE/1000000

unsigned long seconds; // second count

/* service routine for timer 0 interrupt */

void interrupt
timer0_isr(void) @ 0x10
{
seconds++;
TMR0 += -PRELOAD; // re-load timer

T0IF=0;
}

main()
{
// initialize timer 0;

1
Microprocesadores 2
Prfr. Carlos Celaya Borges
T0STA = 0b01000; // prescale by 16
T0CS = 1; // select internal clock
TMR0 = -PRELOAD; // preload timer
T0IE = 1; // enable timer interrupt
GLINTD = 0; // enable global interrupts

for(;;)
continue; // let interrupt do its job
}

CAPÍTULO 5. PROPROYECTOS CON EL MICROCONTROLADOR PIC 16F877

Se realiza el proyecto de una cerradura electrónica.

5.1 Cerradura Electrónica

#include <pic.h>
/*
* Usando el PIC 16F84A
*/

#define PORTBIT(adr, bit) ((unsigned)(&adr)*8+(bit))


#define FRACC 128 //debe ser 128
#define NSEGS 4 //debe ser 4
static unsigned long segs,segs128; // segs
static unsigned char rebote,ctap,estado; //cuenta-pulsos y estado
/*La clave de acceso de dos dígitos: 59*/
const static unsigned char PRID=5,SEGD=1; //primer y segundo digito de la clave
const static unsigned char C128VOSEG =-31; //TMR0 interrumpa cada 1/128 seg.
// 1 seg = ( 256 * 31 * 128 ) microseg
static bit pushb @ PORTBIT(PORTB, 0);
static bit LED1 @ PORTBIT(PORTB, 1);
static bit LED2 @ PORTBIT(PORTB, 2);
static bit LED3 @ PORTBIT(PORTB, 3);
static bit LED4 @ PORTBIT(PORTB, 4);
static bit palanca6 @ PORTBIT(PORTB, 6);
static bit palanca7 @ PORTBIT(PORTB, 7);

/* servicio a interrupciones de: TMR0 Y RB0*/


void interrupt
servicio(void) @ 0x10
{
if(INTF)//manejando pushb
{ rebote=1; INTF=0; LED4=!LED4;}//pushb fue accionado, inicia
espera de tiempo de rebote
2
Microprocesadores 3
Prfr. Carlos Celaya Borges
else if(T0IF) //manejando TMR0
{ if(rebote) if(rebote++>1)// espera tiempo de rebote para aceptar tecla
apretada
{ rebote=0; if(pushb) ctap++; LED4=!LED4;
//Máquina de Estados
segs128++;
if(segs128>=FRACC) { segs++; segs128=0; LED3=!LED3;}//cuenta
cada 1/128 seg.
if(segs==NSEGS)//actua cada 5 segundos
{ segs=0; switch(estado)
{ case 0: if( pushb&&(rebote==0) )
{estado=1; ctap=0; LED1=0;
while(pushb){;}}//prende LED1, espera pushb suelto.
break;//a esperar primer dígito
case 1: if( (ctap==PRID) )//si primer digito correcto,
{estado=2; LED1=1; }//apaga LED1,
else {estado =20; LED1=1;}//primer dígito no-
correcto, apaga LED1,
break;//a esperar segundo dígito
case 2: if( (ctap==PRID+SEGD) )//primero y segundo
dígitos correctos
{estado=3;LED1=0; LED2=0; }//clave recibida
correcta y abre
else {estado =3;LED1=0;LED2=1;}//segundo
dígito no-correcto
break;
case 20:estado=3; LED1=0; LED2=1;//clave errónea,
no-abre
break;//regrea al estado inicial
case 3: estado=0; LED1=1; LED2=1;ctap=0;//apaga
LEDS,
break;//regresa al estado inicial
}
}
TMR0 = C128VOSEG; // reinicia timer0
T0IF=0;
}
}

main()
{
// inicialización
estado = 0; //estado inactivo.
segs=0;
3
Microprocesadores 4
Prfr. Carlos Celaya Borges
segs128=0;
ctap=0;
TRISB=0XC1; //BIT 0,6,7: ENTRADA, BITS
1,2,3,4,5:SALIDAS
LED1=1; LED2=1; // apaga LEDS
LED3=0; LED4=1; // apaga LEDS
OPTION = 0x07; // prescala por 256
T0CS = 0; // selecciona reloj interno
TMR0 = C128VOSEG; // precarga de TMR0, para 1/128 seg.
INTEDG=1; //borde positivo de RB0
T0IF=0; // por si está activa
INTF=0; // por si está activa
if(palanca6)T0IE = 1;// habilita interr. del TMR0
if(palanca7)INTE = 1;// habilita interr. de la línea RB0
GIE = 1; // habilitación global de interrupciones
for(;;) continue; // trabajan las interrupciones
}

4
Microprocesadores 5
Prfr. Carlos Celaya Borges

5.2 Consola con display y teclado

Realice la interfaz a un display y teclado como el mostrado en la siguiente figura.

display de 6 dígitos de 7 segmentos de cátodo común matriz de 21 teclas

RB1 0 1 2 RB1

RB2 3 4 5 RB2

RB3 6 7 8 RB3

RB4 9 RB4

RB5 RB5

RB6 RB6

RB7 RB7
PIC
16F877

RD0

RD1

RD2

RD3

RD4

RD5

RD6

RD7

Consola: Teclado y Display para el microcontrolador

También podría gustarte