Seguimos con otro ejemplo muy básico usando nuestro compilador XC8 y en este ejemplo aprenderemos a hacer un semáforo básico y de forma sencilla con unas cuantas lineas de código, anteriormente ya había hecho esto usando PBP, pero en esta ocasión lo realice en C como favor a un gran colega (y explicando cada linea para que se entienda mejor).
Circuito:
El circuito usado es el siguiente, usando el ya clásico PIC16F84A:
Circuito:
El circuito usado es el siguiente, usando el ya clásico PIC16F84A:
El código que hace posible esto es el siguiente:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/******************************************************************************* | |
* | |
* Semáforo básico | |
* | |
******************************************************************************* | |
* FileName: main.c | |
* Processor: PIC16F84A | |
* Complier: XC8 v1.42 & MPLAB X IDE v3.61 | |
* Author: Pedro Sánchez (MrChunckuee) | |
* Blog: http://mrchunckuee.blogspot.com/ | |
* Email: mrchunckuee.psr@gmail.com | |
* Description: Simular con LEDs un par de semaforos, utilizando un ya muy | |
* conocido microcontrolador. | |
******************************************************************************* | |
* Rev. Date Comment | |
* v1.00 05/06/2017 Creación del ejemplo | |
******************************************************************************/ | |
#include <xc.h> | |
// PIC16F84A Configuration Bit Settings | |
// CONFIG | |
#pragma config FOSC = XT // Oscillator Selection bits (XT oscillator) | |
#pragma config WDTE = OFF // Watchdog Timer (WDT disabled) | |
#pragma config PWRTE = ON // Power-up Timer Enable bit (Power-up Timer is enabled) | |
#pragma config CP = OFF // Code Protection bit (Code protection disabled) | |
//Definimos la velocidad de 4MHz | |
#define _XTAL_FREQ 4000000 | |
//Etiquetas para las salidas | |
//Renombramos los pines para que sea mas facil acceder a ellos | |
#define LEDA_Verde PORTBbits.RB0 // | |
#define LEDA_Amarillo PORTBbits.RB1 // Semaforo 1 | |
#define LEDA_Rojo PORTBbits.RB2 // | |
#define LEDB_Verde PORTBbits.RB3 // | |
#define LEDB_Amarillo PORTBbits.RB4 // Semaforo 2 | |
#define LEDB_Rojo PORTBbits.RB5 // | |
//Etiquetas globales, para hacer el codigo mas comprensible | |
#define Encender 1 | |
#define Apagar 0 | |
#define AllOutput 0x00 | |
#define AllClear 0x00 | |
//Variables generales | |
unsigned char count; | |
//Declaracion de prototipos | |
void MCU_Delayms(unsigned int t); | |
//Funcion principal | |
void main(void) { | |
//Inicializamos PIC | |
TRISB = AllOutput; //Puerto B como salida | |
PORTB = AllClear; //Limpiamos puerto B | |
while(1){//Inicia la secuancia de semaforo | |
LEDA_Verde = Encender;//Encendemos LED verde del semaforo 1 | |
LEDB_Rojo = Encender;//Encendemos LED rojo de semaforo 2 | |
MCU_Delayms(9000); //Retardo de 9 segundos | |
LEDA_Verde = Apagar;//Apagamos LED verde del semaforo 1 | |
//Hacemos que LED amarillo del semaforo 1 este intermitente | |
for(count=0; count<10; count++){//Esto hace que el LED amarillo del | |
LEDA_Amarillo ^= 1; //primer semaforo este de una forma | |
MCU_Delayms(300); //intermitente cada 0.3 segundos | |
} //por 10 veces | |
LEDB_Rojo = Apagar;//Apagamos LED rojo del semaforo 2 | |
LEDB_Verde = Encender;//Encendemos LED verde del semaforo 1 | |
LEDA_Rojo = Encender;//Encendemos LED rojo de semaforo 1 | |
MCU_Delayms(9000);//Retardo de 9 segundos | |
LEDB_Verde = Apagar;//Apagamos LED verde del semaforo 2 | |
//Hacemos que LED amarillo del semaforo 2 este intermitente | |
for(count=0; count<10; count++){//Esto hace que el LED amarillo del | |
LEDB_Amarillo ^= 1; //segundo semaforo este de una forma | |
MCU_Delayms(300); //intermitente cada 0.3 segundos | |
} //por 10 veces | |
LEDA_Rojo = Apagar;//Apagamos LED rojo del semaforo 1 | |
}//Termina la secuencia del semaforo. | |
//pero se vuleve a repetir indeterminadamente | |
} | |
//Rutina para generar retardos en milisegundos | |
void MCU_Delayms(unsigned int t){ | |
unsigned int acc; | |
//Se repite mientras acc sea menos a t | |
for(acc=0; acc<t; acc++){ | |
__delay_ms(1); //Retardo de 1 milisegundo | |
} | |
} |
Descargas:
Aquí el enlace directo para DESCARGAR los archivos disponibles, también puedes revisar o descargar la información desde mi repositorio en GitHub, si no sabes como descargarlo puedes checar aquí, bueno por el momento es todo si tienes dudas, comentarios, sugerencias, inquietudes, traumas, etc. dejarlas y tratare de responder lo mas pronto posible.
Donaciones:
Si te gusta el contenido o si los recursos te son de utilidad, comparte el enlace en tus redes sociales o sitios donde creas que puede ser de interés y la otra puedes ayudarme con una donación para seguir realizando publicaciones y mejorar el contenido del sitio. También puedes hacer donaciones en especie, ya sea con componentes, tarjetas de desarrollo o herramientas. Ponte en contacto para platicar, o puedes volverte uno de nuestros sponsors.
Pido una retroalimentación avisando cada que un enlace no sirva o tenga errores al momento de abrirlo, así también si una imagen no se ve o no carga, para corregirlo en el menor tiempo posible.
0 Comentarios