Professional Documents
Culture Documents
LCD1
LM016L
RS RW E 4 5 6
1 2 3
U1
9 10 1 2 3 4 5 6 7 OSC1/CLKIN OSC2/CLKOUT MCLR/Vpp/THV RB0/INT RB1 RB2 RB3/PGM RB4 RB5 RB6/PGC RB7/PGD 21 22 23 24 25 26 27 28 11 12 13 14 15 16 17 18
R2
10k
R1
10k
RA0/AN0 RA1/AN1 RA2/AN2/VREFRA3/AN3/VREF+ RA4/T0CKI RA5/AN4/SS RC0/T1OSO/T1CKI RC1/T1OSI/CCP2 RC2/CCP1 RC3/SCK/SCL RC4/SDI/SDA RC5/SDO RC6/TX/CK RC7/RX/DT PIC16F876
D1
D2
R3
180
R4
180
#include <16F876.h> #fuses XT,NOWDT #use delay(clock= 4000000) #include <lcd.c> #use standard_io(C) #use standard_io(A) enum funciones {med,cal,ini}; //Asigna un valor a cada elemento //med=0, cal=1 e ini=2 void medir(void){ //Funcin de medir //algoritmo correspondiente output_toggle(pin_C0); } void calibrar(void){ //Funcin de calibrar //algoritmo correspondiente output_toggle(pin_C1); } void inicializar(void){ //Funcin de inicializar //algoritmo correspondiente output_toggle(pin_C2); }
void run_func(int numfunc){ //Asignacin de la funcin a realizar //viene dada por la variable "item" switch(numfunc) { case med: medir(); break; case cal:
7 8 9 10 11 12 13 14
D0 D1 D2 D3 D4 D5 D6 D7
SELECCION
MENU
INICIALIZAR
D3
CALIBRAR
MEDIR
R5
180
calibrar(); break; case ini: inicializar(); break; } } void main() { char item; //Variables de funciones char n_menus = 3; //Nmero de funciones // bit_set(TRISA,0); lcd_init(); while (1) { if (input(PIN_A0) == 1) { //Detecta botn de seleccin item++; //Si pulsa aumenta la variable delay_ms(300); //Para evitar rebotes lcd_putc('\f'); } if (item > (n_menus-1)) { //Si la variable supera el nmero de... item = 0; } //funciones la inicializa switch (item) { case 0: lcd_gotoxy(1,1); printf(lcd_putc, "MEDIR"); lcd_gotoxy(1,1); break; case 1: printf(lcd_putc, "CALIBRAR"); lcd_gotoxy(1,1); break; case 2: printf(lcd_putc, "INICIALIZAR"); lcd_gotoxy(1,1); break; } if (input(PIN_A1) == 1) //Si se pulsa el botn de seleccin {delay_ms(200); run_func(item);} //se llama a la funcin correspondiente } }
Ejercicio 2
#include <16F876.h> #use delay(clock=4000000,RESTART_WDT) #byte port_b=6 #org 0x1F00, 0x1FFF {}//para proteger el cdigo //del cargador main() { port_b=1; set_tris_b(0x00); // todo el puerto B como salida while(1) { if(input(PIN_A0)) rotate_left(&port_b,1); else rotate_right(&port_b,1); delay_ms(100); } }
Ejercicio #3
#include <16F876.h> #use delay(clock=4000000,RESTART_WDT) #byte port_b=6 #org 0x1F00, 0x1FFF {}//para proteger el cdigo del cargador main() { unsigned int const display[10]={0x3f,0x6,0x5,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x6f}; int x=0; set_tris_b(0x00); // todo el puerto B como salida port_b=0; for(;;) { x++; If(x>9) x=0; port_b=display[x]; delay_ms(500); } }
Ejercicio 4.
Disene un sistema basico para el control de accesos; a traves de un teclado de 3x4 introducir una clave de 3 digitos que cuando sea correcta abra una puerta(con un pulso a un rele) y lo indique en una pantalla de LCD. Guardar la clave en la memoria EEPROM.
LCD2
LM016L
RS RW E 4 5 6
U1
9 10 1 2 3 4 5 6 7 OSC1/CLKIN OSC2/CLKOUT MCLR/Vpp/THV RB0/INT RB1 RB2 RB3/PGM RB4 RB5 RB6/PGC RB7/PGD 21 22 23 24 25 26 27 28 11 12 13 14 15 16 17 18 C
4 7
5 8 0
6 9 #
RA0/AN0 RA1/AN1 RA2/AN2/VREFRA3/AN3/VREF+ RA4/T0CKI RA5/AN4/SS RC0/T1OSO/T1CKI RC1/T1OSI/CCP2 RC2/CCP1 RC3/SCK/SCL RC4/SDI/SDA RC5/SDO RC6/TX/CK RC7/RX/DT PIC16F876
RL1 R1
1k 12V
BAT1 Q2
BD135 12V
CERRADURA
#include <16F876.h> #fuses XT,NOWDT,NOPROTECT,NOLVP #use delay(clock= 4000000) #use standard_io(a) #include <lcd.c> #include <kbd.c> #include <stdlib.h> #rom 0x2100={'7','2','3'} //Posicin 0,1 y 2 de la Eeprom con los datos //7,2, y 3 respectivamente void main() { char k; int i; char data[3], clave[3]; //Matrices para guardar clave y datos lcd_init(); kbd_init(); port_b_pullups(TRUE); while (TRUE) { i=0; //posicin de la matriz printf(lcd_putc,"\fpulsar tecla 1\n"); //Para primer dato
7 8 9 10 11 12 13 14
1 2 3
D0 D1 D2 D3 D4 D5 D6 D7
while(i<=2){ //Para tres datos k=kbd_getc(); //Lee el teclado if (k!=0) //Si se ha pulsado al guna tecla {data[i]=k; //se guarda en la posicin correspondiente i++; //de la matriz printf(lcd_putc,"\fpulsar tecla %u\n",i+1); //Siguiente dato } } for (i=0;i<=2;i++) { //Pasa datos de eeprom a la matriz clave clave[i]=read_eeprom(i);} if ((data[0]==clave[0])&&(data[1]==clave[1])&&(data[2]==clave[2])) { printf(lcd_putc,"\fPuerta Abierta"); //Compara los datos con la clave output_high(PIN_A0); //Si es igual da pulso al rel delay_ms(500); output_low(PIN_A0);} else printf(lcd_putc,"\fPuerta Cerrada"); //Clave erronea delay_ms(1000); } }