PIC16F877a
El PIC16F877a es un microcontrolador de 8 bits desarrollado por Microchip Technology, lanzado a finales de los años 90 como parte de la familia PIC16. Tiene un bajo consumo de energía y alta capacidad para aplicaciones incrustadas, de acuerdo con su datasheet, cuenta con un procesador RISC de 20MHZ de velocidad de la CPU y 200ns de tiempos de ejecución de instrucción.
Características
-
Cuenta con 3 temporizadores (Timer0, Timer1 y Timer2), que permiten gestionar eventos y medir el paso del tiempo.
-
Módulo Capture: Permite capturar el temporizador ante algún evento con una resolución de 12,5 ns.
-
Módulo Compare: Permite comparar 2 valores de un máximo de 16 bits con una resolución de 200 ns.
-
PWM (Modulación de Ancho de Pulso): Se encarga de enviar una señal de salida de ciclo variable, con una resolución de máximo 10 bits.
-
SSP (Puerto serie síncrono) permite comunicación entre dispositvos con los siguientes protocolos:
-
SSI (Serial Peripheral Interface) permiote la comunicación entre sensores, memorias y pantallas.
-
I2C™ (Inter-Integrated Circuit) permite la comunicación maestro-esclavo, como al querer conectar multiples dispositivos a un bus de datos.
-
-
USART/SCI (Receptor/Transmisor Asíncrono y Síncrono Universal) permite la comunicación serial de forma asincronica con otros dispositivos.
-
PSP (Puerto esclavo paralelo) permite la comunicaicón en paralelo de instrucciones lectura, escritura y selección de chip.
-
BOR (Brown-out reset) protege al dispositivo en caso de caídas de tensión.
-
RISC CPU: procesadores que están diseñados para ejecutar un número reducido de tipos de instrucciones que les permite operar a una velocidad más elevada (Solé, R. 2021).

Fuente: Microchip Technology

Fuente: Microchip Technology
A continuación, se describen las características básicas de acuerdo con Microchip Technology (Microchip, s.f.) del microcontrolador PIC16F877a
Característica | Valor |
---|---|
Tamaño de memoria de programa (KB) |
14 |
RAM (byte) |
368 |
Data EEPROM (bytes) |
256 |
Canitdad pines |
40 o 44 |
Voltage Max. de operación (V) |
5.5 |
Voltage Min. de operación (V) |
2 |
Diferencias entre un Microcontrolador y un Microprocesador
A diferencia de los microprocesadores, el PIC16F877a (el cual es un microcontrolador) no consta de un sistema operativo para su funcionamiento. En lugar de eso, está diseñado para ejecutar directamente código incrustado escrito en lenguajes como C o ensamblador, sin necesidad de capas intermedias de software.
Característica | Microcontrolador (ej: PIC16F877a) | Microprocesador |
---|---|---|
Integración |
Incluye CPU, memoria, I/O y periféricos |
Solo contiene la unidad central de proceso (CPU) |
Propósito |
Aplicaciones incrustadas específicas |
Computadoras generales o sistemas complejos |
Programación |
Fácil de programar con lenguajes simples |
Requiere sistema operativo y software complejo |
Costo |
Bajo |
Alto |
Consumo de energía |
Bajo |
Generalmente más alto |
Los microcontroladores como el PIC16F877a están optimizados para tareas específicas, mientras que los microprocesadores son más potentes pero requieren más componentes externos y recursos.
Usos del PIC16F877a
El PIC16F877a tiene usos en sistemas incrustados donde se requiere bajo consumo energético, una programación simplificada en C++ o assembly. Entre sus usos más comunes se encuentran:
-
Automatización industrial (control de motores, monitoreo de sensores)
-
Domótica (control de luces, cerraduras, temperatura)
-
Equipos médicos portátiles
-
Electrónica de consumo (juguetes inteligentes, electrodomésticos)
-
Sistemas educativos para enseñanza de programación y electrónica básica
-
Prototipos de IoT cuando se combinan con módulos de comunicación externa
Entorno de programación
Para poder programar al PIC16F877a se utiliza el IDE MPLAB ® Xpress IDE ofrecido por Microship Technology (Microchip, s.f.) , siendo una herramienta que aporta flexibilidad, permitiendo programar, depurar y cargar el código al PIC16F877a.

Fuente: Microchip Technology
Ejemplos de Aplicación
Los ejemplos a demostrar son obtenidos del texto de bibliografía (Ruiz, 2021).
Control de un LED por pulsador
Dentro de MCC se crea el nombre del proyecto (menú File → media de microcontroladores) con el nombre LED PULSADOR, luego en la ventasna Project Resources se asigna los terminales RA0 y RA5 como salida y entrada digital respectivamente, tal como muestra la figura 4.

Fuente: MPLAB Xpress

Fuente: MPLAB Xpress

Fuente: MPLAB Xpress
#include "mcc_generated_files/system/system.h"
/*
Main application
*/
int main(void)
{
SYSTEM_Initialize();
while(1)
{
if(PULSADOR_GetValue()==0) LED0_Toggle();
}
}
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Copyright (c) 2013 Manolis Agkopian ;
;See the file LICENCE for copying permission. ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PROCESSOR '16F876A'
INCLUDE <P16F876A.INC>
__CONFIG _XT_OSC & _WDT_OFF & _PWRTE_OFF & _CP_OFF & _LVP_OFF & _BODEN_OFF
DL_CNT EQU 0x20 ;DELAY COUNTER: COUNTS THE INTERUPS FROM TMR0
ORG 0x0000
GOTO INIT
ORG 0x0004
GOTO TMR_CNT
INIT:
BSF STATUS, RP0 ;SELECT BANK 01
MOVLW B'11000111' ; PSA = 1/256 (THE TIMER WILL COUNT ONCE EVERY 256 CYCLES)
MOVWF OPTION_REG ;AND USE INTERNAL INSTRUCTION CYCLE CLOCK
BCF TRISB, 0 ;SET PB0 AS OUTPUT
BCF STATUS, RP0 ;SELECT BANK 00
BCF PORTB, 0
MOVLW B'11100000' ;ENABLE TIMER 0 INTERUPT
CLRF TMR0
MOVWF INTCON
MOVLW 0x0F ;256 * 256 * 15 = ABOUT 1S
MOVWF DL_CNT ;SO WE SET THE DELAY COUNTER TO COUNT 15 INTERUPTS
MAIN:
GOTO $ ;DO NOTHING, JUST WAIT FOR AN INTERUPT
TMR_CNT:
BCF INTCON, GIE ;DISABLE ALL INTERUPTS
BCF INTCON, TMR0IF ;CLEAR TMR0 OVERFLOW FLAG
DECFSZ DL_CNT ;WHEN THE DELAY COUNTER BECOMES ZERO
GOTO CONTINUE
BTFSC PORTB, 0 ;THEN IF PB0 IS SET
GOTO CLR_PB0 ;CLEAR IT
BSF PORTB, 0 ;ELSE IF IS CLEARED, THEN SET IT
GOTO CONTINUE_0
CLR_PB0:
BCF PORTB, 0
CONTINUE_0:
MOVLW 0x0F ;RESET THE DELAY COUNTER
MOVWF DL_CNT
CONTINUE:
BSF INTCON, GIE ;RENABLE THE INTERUPTS
RETFIE
END

Fuente: MPLAB Xpress
Comparación entre PIC16F877a y PIC18F4550
También hay opciones más modernas como el PIC18F4550 que tiene mayor capacidad de procesamiento y memoria interna.
Se puede realizar una comparación entre las opciones en el sitio web de Microchip.
Ambos son microcontroladores de 8 bits de Microchip, pero pertenecen a diferentes familias y niveles de capacidad.
Característica | PIC16F877a | PIC18F4550 |
---|---|---|
Arquitectura |
PIC16 (Mid-range) |
PIC18 (High-end 8-bit) |
Velocidad de reloj |
Hasta 20 MHz |
Hasta 48 MHz (con PLL) |
Instrucciones por ciclo |
1 cada 4 ciclos |
1 por ciclo (en la mayoría) |
Número de instrucciones |
35 |
75+ |
Tipo de Memoria | PIC16F877a | PIC18F4550 |
---|---|---|
Flash (programa) |
14 KB |
32 KB |
RAM |
368 bytes |
2 KB |
EEPROM |
256 bytes |
256 bytes |
Funcionalidad | PIC16F877a | PIC18F4550 |
---|---|---|
Puertos I/O |
33 |
35 |
Timers |
3 (8 y 16 bits) |
4 (8 y 16 bits) |
ADC |
10-bit, 8 canales |
10-bit, 13 canales |
PWM |
2 canales |
2 canales |
USART / UART |
1 |
1 |
SPI / I2C |
Sí |
Sí (mejorado) |
USB |
No |
Sí (USB 2.0 Full-Speed) |
Interrupciones |
Básico |
Avanzado (prioridades) |
Comparación | PIC16F877a | PIC18F4550 |
---|---|---|
Facilidad de uso |
Muy fácil para principiantes |
Más complejo, más potente |
Costo |
Más barato |
Un poco más caro |
Capacidad de procesamiento |
Limitada |
Superior |
USB integrado |
❌ No |
✅ Sí |
Tamaño de programa |
14 KB |
32 KB |
Usa el PIC16F877a si:
-
Estás empezando con microcontroladores.
-
Tu proyecto es simple (sensores, control básico).
-
No necesitas USB ni mucha memoria.
Usa el PIC18F4550 si:
-
Necesitas mayor velocidad y complejidad.
-
Requieres comunicación USB integrada.
-
Trabajas con interfaces humanas, data logging, etc.
Conclusión
El microcontrolador PIC16F877a es una excelente opción para desarrolladores en busqueda de soluciones económicas y versátiles para sistemas incrustados. Sus periféricos integrados, bajo consumo de energía y facilidad de programación lo hacen ideal tanto para aplicaciones industriales como educativas.
La principal ventaja frente a otras soluciones es que existe una garantía de que el programa se puede almacenar en la memoria flash o eeprom por 40 años o más.