Ejemplo 1
#include <16f877a.h> // Tipo de microcontrolador
#use delay(clock=4000000) // Delay con xtal de 4MHz
#use fast_io(B) // I/O todas rápidas, de esta forma cuando se
// escribe en los puertos, no se configura el tris
// acelerando el proceso.
#fuses HS // FUSES cristal HS >=4MHz
#FUSES NOPUT // No power up Timer, no espera a estabilizar la tension
#FUSES NOBROWNOUT // No Brown out reset, no se resetea si cae la tension
#define Speaker PIN_B0 // Altavoz conectado a RB0
void main(){
set_tris_b(2); // RB<7:2> Salida RB1 entrada (Pulsador) RB0 Salida (Speaker)
do{ // Bucle infinito
while(input(PIN_B1)){ // Mientras se presione el
// interruptor conectado a RB1.
output_high(Speaker); // Altavoz encendido
delay_us(769); // espera 769 uS
output_low(Speaker); // Altavoz apagado
delay_us(769); // espera 769 uS
}
}while(true);
}
Ejemplo 2
#include <16f877a.h> // Tipo de microcontrolador
#use delay(clock=4000000) // Delay con xtal de 4MHz
#use fast_io(B) // I/O todas rápidas, de esta forma cuando se
// escribe en los puertos, no se configura el tris
// acelerando el proceso.
#FUSES HS // FUSES cristal HS >=4MHz
#FUSES NOPUT // No power up Timer, no espera a estabilizar la tension
#FUSES NOBROWNOUT // No Brown out reset, no se resetea si cae la tension
#define Speaker PIN_B0 // Altavoz conectado a RB0
void Sound(int16 frecuencia, int16 duracion);
void main(){
int t;
set_tris_b(2);
while(true){ //Bucle infinito
if (input(PIN_B1)){ // Si se activa el pulsador
for (t=0;t<30;t++) // Bucle ascendente incrementando la
sound(((int16)t*15)+1600,20); // frecuencia del sonido
for (t=30;t>0;t--) // Bucle decrementando
sound(((int16)t*15)+1600,20); // la frecuencia del sonido
}
}
}
void Sound(int16 frecuencia, int16 duracion){
int16 mS_Transcurridos=0;
int16 CiclosL=0;
int16 uS;
int32 tmp;
if (frecuencia>=20&&frecuencia<=20000){ //si la frecuancia se encuentra entre
// los margenes de 20Hz y 20 KHz se ejecuta
tmp=100000; // de los contrario no.
tmp/=frecuencia; // convierte los Hz a microsegundos para la pausa
tmp*=5;
uS=tmp;
do{
output_high(Speaker); // Genera la frecuancia deseada
delay_us(uS); // con los retardos mientras
CiclosL+=(uS); // aumenta el contador de ciclos transcurridos
output_low(Speaker); // en dos partes para repartir el
delay_us(uS); // trabajo entre estado alto y bajo.
CiclosL+=(uS); //
CiclosL+=25; // Compensador.
while(CiclosL>999){ // Se queda en el bucle mientras CiclosL sea
// menor a 1000 (1 mS)
CiclosL-=1000; // Le resta 1000 a CiclosL
mS_Transcurridos++; // y le suma 1 a mS_Transcurridos.
CiclosL+=25; // Compensador.
}
}while (duracion>mS_Transcurridos);// Repite el bucle hasta que haya pasado el
// tiempo indicado.
}
}
Ejemplo 3
#include <16f877a.h>
#use delay(clock=4000000)
#use fast_io(B)
#fuses HS
#FUSES NOPUT
#FUSES NOBROWNOUT
#define Speaker PIN_B0
#define nDO 0 // DO
#define nDO_ 1 // DO#
#define nRE 2 // RE
#define nRE_ 3 // RE#
#define nMI 4 // MI
#define nFA 5 // FA
#define nFA_ 6 // FA#
#define nSOL 7 // SOL
#define nSOL_ 8 // SOL#
#define nLA 9 // LA
#define nLA_ 10 // LA#
#define nSI 11 // SI
int16 FreqNota[12]={ // retardos entre estado alto
// y bajo para generar las notas
15289, // DO
14430, // DO#
13620, // RE
12856, // RE#
12134, // MI
11453, // FA
10810, // FA#
10204, // SOL
9631, // SOL#
9090, // LA
8580, // LA#
8099 // SI
};
void Play(int nota,int octava,int16 duracion);
void PlayCancion(int cancion);
void main(){
set_tris_b(14); // B<3:1>: Pulsadores B0: Speaker
while (true){
if(input(PIN_B1))PlayCancion(1); //Si pulso switch 1 toca
// Pop Corn
if(input(PIN_B2))PlayCancion(2); //Si pulso switch 2 toca
// Ecuador
if(input(PIN_B3))PlayCancion(3); //Si pulso switch 3 toca
// The lion sleep tonight
}
}
void Play(int nota, int octava, int16 duracion){
int16 fn;
int16 mS_Transcurridos=0;
int16 CiclosL=0;
fn=FreqNota[nota]; // Define los retardos para generar
// la frecuencia de cada nota
fn>>=(octava); // Adapta la frecuencia
// a la octava actual
do{
output_high(Speaker); // Genera la frecuancia
delay_us(fn); // con los retardos mientras
CiclosL+=(fn); // aumenta el contador de
// ciclos transcurridos
output_low(Speaker); // en dos partes para repartir el
delay_us(fn); // trabajo entre estado alto y bajo.
CiclosL+=(fn); //
CiclosL+=25; // Compensador.
while(CiclosL>999){ // Se queda en el bucle mientras
// CiclosL sea menor a 1000 (1 mS)
CiclosL-=1000; // Le resta 1000 a CiclosL
mS_Transcurridos++; // y le suma 1 a mS_Transcurridos.
CiclosL+=25; // Compensador.
}
}while (duracion>mS_Transcurridos); // Repite el bucle hasta
// que haya pasado el
// tiempo indicado.
}
void PlayCancion(int cancion){
switch (cancion){
case 1:
//POP CORN
play (nDO ,5,166);
play (nLA_ ,4,166);
play (nDO ,5,166);
play (nSOL ,4,166);
play (nRE_ ,4,166);
play (nSOL ,4,166);
play (nDO ,4,166);
delay_ms (166);
play (nDO ,5,166);
play (nLA_ ,4,166);
play (nDO ,5,166);
play (nSOL ,4,166);
play (nRE_ ,4,166);
play (nSOL ,4,166);
play (nDO ,4,166);
delay_ms (166);
play (nDO ,5,166);
play (nRE ,5,166);
play (nRE_ ,5,166);
play (nRE ,5,166);
play (nRE_ ,5,166);
play (nDO ,5,166);
play (nRE ,5,166);
play (nDO ,5,166);
play (nRE ,5,166);
play (nLA_ ,4,166);
play (nDO ,5,166);
play (nLA_ ,4,166);
play (nDO ,5,166);
play (nSOL_ ,4,166);
play (nDO ,5,166);
break;
case 2:
//ECUADOR
play (nLA ,3,100);
delay_ms (200);
play (nMI ,3,100);
delay_ms (200);
play (nDO ,4,100);
delay_ms (100);
play (nSI ,3,100);
delay_ms (100);
play (nRE ,4,100);
delay_ms (100);
play (nSI ,3,100);
delay_ms (100);
play (nSOL ,3,100);
delay_ms (100);
play (nLA ,3,100);
delay_ms (200);
play (nMI ,3,100);
delay_ms (200);
play (nDO ,4,100);
delay_ms (100);
play (nSI ,3,100);
delay_ms (100);
play (nRE ,4,100);
delay_ms (100);
play (nSI ,3,100);
delay_ms (100);
play (nSOL ,3,100);
delay_ms (100);
play (nDO ,4,100);
delay_ms (200);
play (nSOL ,3,100);
delay_ms (200);
play (nMI ,4,100);
delay_ms (100);
play (nRE ,4,100);
delay_ms (100);
play (nMI ,4,100);
delay_ms (100);
play (nRE ,4,100);
delay_ms (100);
play (nSOL ,3,100);
delay_ms (100);
play (nDO ,4,100);
delay_ms (200);
play (nLA ,3,100);
delay_ms (200);
play (nDO ,4,100);
delay_ms (100);
play (nSI ,3,100);
delay_ms (100);
play (nDO ,4,100);
delay_ms (100);
play (nSI ,3,100);
delay_ms (100);
play (nSOL ,3,100);
break;
case 3:
//The lion sleep tonight
play (nDO ,3,125);
delay_ms (250);
play (nRE ,3,125);
delay_ms (125);
play (nMI ,3,125);
delay_ms (250);
play (nRE ,3,125);
delay_ms (250);
play (nMI ,3,125);
play (nFA ,3,125);
delay_ms (250);
play (nMI ,3,125);
delay_ms (125);
play (nRE ,3,125);
delay_ms (250);
play (nDO ,3,125);
delay_ms (250);
play (nRE ,3,125);
play (nMI ,3,125);
delay_ms (250);
play (nRE ,3,125);
delay_ms (125);
play (nDO ,3,125);
delay_ms (250);
delay_ms (125);
play (nMI ,3,125);
delay_ms (125);
play (nRE ,3,500);
break;
}
}
No hay comentarios:
Publicar un comentario