Microcontroller › 8051 › electronic school bell › ELECTRONIC BELL
November 17, 2010 at 9:08 am
#5150
Participant
//DESARROLLADO POR SMIVINKI SMITH
//ESTUDIANTE DE UTESA (RD) EN ING ELECTRONICA.
#include<reg52.h>
#include <string.H> /* Libreria de funciones para cadenas, se incluye para la funcion strub*/
sfr pin_datos_lcd=0XA0;// direccion del P2 en hexa
sbit RS =P3^0; //pin de registro y de seleccion
sbit EN =P3^6; //pin de habilitacion
sbit R_W =P3^1;//pin de lectura y escritura.
sbit seleccion_hora=P1^0; //pin para setear la hora
sbit seleccion_minuto=P1^1;//pin para setear el minuto
sbit start_alarma=P1^4;//pin para iniciar la alarma
sbit D2=P1^6; //Declaracion de pines para seleccionar cada display(sin decodificador BCD)
sbit D3=P1^7; // pin que activa el display D2
sbit bocina =P3^2; //pin para timbre de la alarma.
///////////////////////////// zona delaracion global./////////////////////////////////
int parte_h ,parte_m=0;
int p_horas,p_minutos=0;
int segundo=0;
unsigned char code Codigo_7segmentos[11]={0x40,0xF9,0x24,0x30,0x19,0x12,0x02,0xF8,0x00,0x10}; //numrero 0 a 9 del display
unsigned char tabla_ascii[11]=”0123456789″; //la posicion de cada caracter corresponde a la pocision de su codigo
int fil=0;
int col=0;
///////////////////////// zona de declaracion de los prototipos///////////////////////////////////////////////////
void RETARDO(unsigned int milisegundo); // prototipo de la funcion delay en milisegundo
void COMANDO_LCD(unsigned char COMANDO); // prototipo de la funcion de los comandos del lcd
void DATOS_LCD(unsigned char DATOS); //prototipo de la funcion de datos del lcd
void DATOS_LCD2(unsigned char *DATOS); //
void F_NUM_LCD(int time_val); //prototipo de la funcion de numero del lcd
void WRITE_TO_LCD(unsigned char str1[10]); //prototipo de la funcion para escribir al lcd
void PARTE_HORA(); //prototipo de la funcion de la hora
void PARTE_MINUTO(); // prototipo de la funcion del minuto
void PARTE_SEGUNDO(); // prototipo de la funcion del segundo
void display_me(char cad[2]); //prototipo de la funcion en el array codigo_7segmento
void TIMER(void);
////////////////////////////////////////////////////////////////////////////////////////////
//Declaracion de funciones proptotipos
/////////////////////////Programa principal/////////////////////////////////////
void main()
{
//Zona de declaracion de variables del programa principal
int var_desact_alarma=0;
int var_act_alarma=0;
int var_display=0;
start_alarma=1; // inicializar todo los pines de
seleccion_hora=1; // entrada en
seleccion_minuto=1; // 1.
COMANDO_LCD(0x01); //
COMANDO_LCD(0x82); //comando que escribe en la 1 linea y 2 posicion.
WRITE_TO_LCD(“SETEAR HORA”);//escribir una cadena al lcd
COMANDO_LCD(0xc4);//pasa a la segunda linea del lcd
F_NUM_LCD(p_horas); //llama a la funcion numero del lcd y imprime la hora
DATOS_LCD(‘:’); //manda caracter a la funcion de datos del lcd
F_NUM_LCD(p_minutos); //llama a la funcion numero otra vez y imprime los minutos
DATOS_LCD(‘:’); // manda caracter al lcd
F_NUM_LCD(segundo); //llama a la funcion numero del lcd y imprime los segundos
while(start_alarma==0) // mientras que el reloj no esta activo
{
RETARDO(10); // funcion delay
if(seleccion_hora==0) //si el buton selec_h esta pulsado
PARTE_HORA(); //llama a la funcion parte hora para setear la hora
RETARDO(15);
if(seleccion_minuto==0) //si el buton selec_m esta pulsado
PARTE_MINUTO(); //llama a la funcion parte hora para setear el minuto
RETARDO(15);
}
while(1)// bucle infinito
{
char radio[12][2]={“01″,”02″,”03″,”04″,”05″,”06″,”07″,”08″,”09″,”10″,”11″,”00”};
int var_display=0;
if(start_alarma==1){
parte_h=p_horas; //se iguala la funion que setea el minuto y la funcion que incrementar el minuto para tener los mimos valor al inicializar el reloj
while(parte_h<12) // mientras que la hora es menor que 12
{
parte_h++; // incrementa la hora
parte_m=p_minutos; //se iguala la funion que setea el minuto y la funcion que incrementar el minuto para tener los mimos valor al inicializar el reloj
while(parte_m<60) // mientras que la hora es menor que 60
{
parte_m++; // incrementa el minuto
segundo=0; // se hace cero el segundo
while(segundo<59) // si segundo es menor que 59
{
segundo++; // incrmentar el segundo
COMANDO_LCD(0X81); //comando para escribir en la1 linea en la posicion 1
RETARDO(1); // funcion delay
WRITE_TO_LCD(“ELECTRONIC BELL”); // imprision de cadena al lcd
COMANDO_LCD(0xc4); // se pasa a la segunda linea
RETARDO(1); //funcion delay
F_NUM_LCD(parte_h-1); //se resta 1 a la hora para que se inicializa en 0
DATOS_LCD(‘:’); //manda dos puntos al lcd
F_NUM_LCD(parte_m-1); //se resta 1 a la minuto para que se inicializa en 0
DATOS_LCD(‘:’); //manda dos puntos al lcd
F_NUM_LCD(segundo); //llamada a la funcion segundo
TIMER(); // llamada a la funcion timer
var_desact_alarma++;//incrementa la variable para llegar a los 40 minutos
if((var_act_alarma==2360)&&(bocina=1))//si la variable es 2360 sec = 40 minuto y bocina estaba apagada ?
{
bocina=0; // activar la bocina
var_act_alarma=0;// reinicializo la variable
var_display=var_display+1;
if(var_display==12)
{var_display=0;}
for(fil=0;fil<2;fil++)
{for(col=0;col<var_display;col++)
{
display_me(radio[fil,col]);
RETARDO(10);
}}
}
var_act_alarma++;//incrementa la variable para activar la bocina por 15 segundo
if(( bocina==0)&&(var_desact_alarma==15))//si la bocina esta activado y los se paso los 15 segundos
{bocina=1;} // desactiva la alarma
}
var_desact_alarma=0; //reinicializo lavariable
}
p_minutos=0; // reicializacion de la variable minuto
}
p_horas=0; // reiniciacion de la variable horas
}
}
}
////////////////// funcion delay en milisegundo /////////////////////////////
void RETARDO(unsigned int milisegundo)
{ int j, k;
for (j=0;j<milisegundo;j++) // se pase el valor en la variable milisegundo
for(k=0;k<1275;k++); // por valor
}
///////////////////////////////////////////////////////////////////////////////////
void COMANDO_LCD(unsigned char COMANDO)// configuracion para mandar comando al lcd.
{ pin_datos_lcd= COMANDO;
RS=0;// rs se pone en 0 para conf como registro de intruccion
EN=1;// se pone en 1 para habilitar el lcd
R_W=0;//se pone en 0, solamente para escribir
RETARDO(1);//llama a la fuccion retardo
EN=0; //deshabilita
}
////////////////////////////////////////////////////////////////////////////////////
void DATOS_LCD(unsigned char DATOS)// configuracion para mandar datos al lcd
{
pin_datos_lcd=DATOS;
RS=1;// rs se pone en 1 para conf como dato
EN=1; //habilita el lcd
R_W=0; // conf para escribir
RETARDO(1);// llama a la fucion delay
EN=0; // deshabilita el lcd
}
//////////////////////////// // function para mandar cadena al LCD///////////////////////////////////////////////////////
void DATOS_LCD2(unsigned char *DATOS)
{
int aux;
for(aux=0;DATOS[aux]!=0;aux++)
{
DATOS_LCD(DATOS[aux]); // llamada a la funcion datos_lcd
}
}
////////////////////// Function to send number to LCD/////////////////////////////////
void F_NUM_LCD(int time_val)
{
int int_amt;
int_amt=time_val/10;
DATOS_LCD(int_amt+48);
int_amt=time_val%10;
DATOS_LCD(int_amt+48);
}
///////////////funion para inicializar el LCD/////////////////////////////////
void WRITE_TO_LCD(unsigned char str1[10])
{
COMANDO_LCD(0x38); // configurar para 8 bits
COMANDO_LCD(0x0E); //
COMANDO_LCD(0X0C); // quitar el parpadeo del lcd.
RETARDO(1);//delay ms
DATOS_LCD2(str1);
}
void PARTE_HORA() // funcion para setear la hora
{
p_horas++; // se incrementa la variable p_horas
if(p_horas>12) // si el es menor que 12
p_horas=0; // se hace zero la var p_horas
COMANDO_LCD(0xc4); // se manda el comando 0x04 para escribir en la segunda linea y la posicion 4.
F_NUM_LCD(p_horas); // llama a la funcion LCD responsable de los numeros
}
/////////////////// funcion para setear el minuto//////////////////////
void PARTE_MINUTO()
{
p_minutos++; // se incrementa la variable p_minutos
if(p_minutos>59) // si el es menor que 59
p_minutos=0; // se hace zero la var p_minutos
COMANDO_LCD(0xc7); // se manda el comando 0x07 para escribir en la segunda linea y la posicion 7.
F_NUM_LCD(p_minutos); // llama a la funcion LCD responsable de los numeros
}
//////////////////////////funcion de los segundos//////////////////////
void PARTE_SEGUNDO()
{
segundo=0; //se pone la variable sec en cero
COMANDO_LCD(0XCA); // se manda el comando 0xca para escribir en la segunda linea y la posicion 10.
F_NUM_LCD(segundo); // inprime los segundos en el lcd
}
//////////////////FUNCION PARA MONSTRAR EL PERIODO EN EL DISPLAY///////////////////////////////////////////////
void display_me(char cad[2])
{
unsigned char x,xchar; // declaraciones
char temp; // de las variables
for(x=0;x<2;x++) //va desplasando el caracter a mostrar en los display
{
temp=cad[x];
xchar=strpos(tabla_ascii,temp); //Strpos(), devuelve la posicion
//el valor se guarda en xchar
P1 |= 0x00;
P0=Codigo_7segmentos[xchar]; //Se manda al puerto dos el valor en el array codigo definido por la
//posicion guardada en xchar
switch(x) // variable de control de switch
{
case 0: // en caso la variable x es 0
P1 = 64;// se selecciona el pin p1^6 para el display
RETARDO(10); //delay para el 7 segmento
break;
case 1: // en caso la variable x es 1
P1 = 128;// se selecciona el pin p1^7 para el display
RETARDO(10); //delay para el 7 segmento
break;
}
}
P1 |= 0x00; // reinicializacion del puerto
}
/////////////////agregao//////////////////////////////
void TIMER(void) // FUNCION TIMER 25ms
{ unsigned char x; // declaracion de las variables
for(x=0;x<35;x++){ //multiplico el timer por 40 y se resta 5 de los tiempo perdido.
TMOD=0X10;// timer 1 modo 1
TL1=0XFE; // 25ms/1.085micro se resta de 65536-23041.47=42494.5
TH1=0XA5; //lo convierto en hexa decimal el valor
TR1=1; // arranca el temporizador
while(TF1==0); //espera que se desborda el temporizador
TR1=0; //parrar el temporizador
TF1=0; // pone el flag a cero
} }