solucion de guia 2 microcontroladores
DESCRIPTION
Mostramos el programa en ccs compiler y hacemos la respectiva simulacion en proteus(isis)TRANSCRIPT
Comunicación RS 232 utilizando la tecnología de punta xbee y
bluetooth
LECTURA _TECLADO_LCD_VIRTUAL_TERMINAL #include<16f877.h>
//fuses #use delay(clock=4000000)
#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7)
#use standard_io(a)
#define use_portb_lcd true #define use_portb_kbd true
#include<lcd.c>
#include<kbd.c>
void teclado(void);
void prender(void); void apagar(void);
void main(void) //despues de void main son interrupciones locales
{
char k,i,x; //caracter
lcd_init(); //iniciamos la lcd kbd_init(); //iniciamos el teclado
port_b_pullups(true); //habilitamos resistencias internas del microcontrolador
puts("oprima tecla:"); //transmitiendo ordenamos a q escriba para la pc
printf("la tecla de ingreso:% c\r");
lcd_putc("teclado:\n"); while(true)
{
k=kbd_getc();
{
x=k-48; //codigo ascii(lo encontramos en word,simbolos) //interpreteme que tecla yo oprimo o queremos oprimir
switch(x) //switch de varias pocisiones
{
case 1:
printf(lcd_putc,"1"); //para oprimir 1 en lcd puts("1"); //para oprimir 1 en el hiperterminal
break;
case 2:
printf(lcd_putc,"2");
puts("2");
break;
case 3:
printf(lcd_putc,"3"); puts("3");
break;
case 4:
printf(lcd_putc,"4");
puts("4"); break;
case 5:
printf(lcd_putc,"5");
puts("5");
break; case 6:
printf(lcd_putc,"6");
puts("6");
break;
case 7: printf(lcd_putc,"7");
puts("7");
break;
case 8:
printf(lcd_putc,"8"); puts("8");
break;
case 9:
printf(lcd_putc,"9");
puts("9"); break;
case 0:
printf(lcd_putc,"0");
puts("0");
break; }
}
MOTOR MANEJADO CON VIRTUAL TERMINAL
#include<16f877.h> #use delay(clock=4000000) #use RS232(baud=9600,xmit=pin_c6,rcv=pin_c7)
#use fast_io(c) #bit rb1=0x06.1 #bit rb2=0x06.2 void instrucciones(void); void derecha(void); void izquierda(void);
void parar(void); void mensaje(void); int marcha=0; char sentido; void main (void) { char m;
set_tris_b(0b11111001); rb1=0; rb2=0;
instrucciones(); while (true)
{ m=getc(); switch(m) { case'i': izquierda();
sentido='i'; break; case 'd': derecha(); sentido='d'; break; case'p':
parar(); break; default: mensaje(); break; } }
} void instrucciones() { puts("control de motor dc"); puts("pulsa 'i' para giro izquierda dc"); puts("pulsa 'd' para giro derecha");
puts("pulsa 'p' para parar motor"); } void derecha() { if((marcha==1)&&(sentido=='d')) { parar();
delay_ms(3000); rb1=0; rb2=0; marcha=1; } else {
rb1=0; rb2=1; marcha=1; } } void izquierda()
{ if((marcha==1)&&(sentido=='i'))
{ parar(); delay_ms(3000);
rb1=1; rb2=0; marcha=1; } else { rb1=1;
rb2=0; marcha=1; } } void parar() {
rb1=0; rb2=0; marcha=0; } void mensaje() { puts("oprima la tecla correcta");
}
TIMER CERO (0)
#include <16f877.h>
#use delay(clock=4000000)
#use fast_io(B) #INT_RTCC
RTCC_isrc()
{
output_toggle(Pin_B7);
set_timer0(198);
}
void main (void)
{
set_tris_B(0x00);
output_low(Pin_B7);
setup_timer_0(RTCC_DIV_8);
set_timer0(194);
enable_interrupts(INT_RTCC);
enable_interrupts(GLOBAL);
while(true);
VARIADOR PWM
#include<16f876.h>
#use delay (clock=4000000) #use standard_Io(A)
#define use_portb_lcd true
#define use_portb_kbd true
#include <lcd.c> #include <kbd.c>
#byte portb=0x06 void main (void)
{
char k, kant='0';
char PWMH=0, PWML=0;
int x;
kbd_init();
lcd_init();
port_B_pullups(TRUE);
x=0; lcd_putc(" \fIndique Velocidad ");
while (1)
{
k=kbd_getc();
x=k-48;
if (k=='\0')k= kant;
if (( k=='*')||(k=='#')) k=='0';
kant=k;
k=k-48;
PWMH=k*28;
PWML=255-PWMH;
for (PWMH;PWMH>1;PWMH--)
{
OUTPUT_HIGH(pin_A0);
}
for (PWML; PWML>0;PWML--)
{ OUTPUT_LOW(pin_A0);
switch(x)
{
case 0:
printf(lcd_putc," \fmotor parado\n ");
break;
case 1:
lcd_putc(" \f velocidad 1");
break;
case 2:
lcd_putc(" \f velocidad 2"); break;
case 3: lcd_putc(" \f velocidad 3");
break;
case 4:
lcd_putc(" \f velociad 4");
break;
case 5:
lcd_putc(" \f velociad 5");
break;
case 6: lcd_putc(" \f velociad 6");
break;
case 7:
lcd_putc(" \f velociad 7");
break;
case 8:
lcd_putc(" \f velociad 8");
break;
case 9:
lcd_putc(" \f velociad 9");
break;
case '*':
lcd_putc(" \fdisminuyendo");
}
break;
}
PROTOCOLO DE I2C #include<16f877.h>
#use delay(clock=4000000) #use RS232(baud=9600,xmit=pin_c6,rcv=pin_c7)
#include<lcd.c>
#use i2c(master,fast,sda=pin_c4,scl=pin_c3)
#define ds1307_scl pin_c3
#define ds1307_sda pin_c4 #use i2c(master,sda=ds1307_sda,scl=ds1307_scl)
void ds1307_init()
{
output_float(ds1307_scl); output_float(ds1307_sda);
}
void write_ds1307(byte address,byte data)
{
short int status;
i2c_start();
i2c_write(0xd0);
i2c_write(address);
i2c_write(data);
i2c_stop(); i2c_start();
status=i2c_write(0xd0);
while(status==1);
{
i2c_start(); status=i2c_write(0xd0);
}
}
byte read_ds1307(byte address)
{ byte data;
i2c_start();
i2c_write(0xd0);
i2c_write(address);
i2c_start(); i2c_write(0xd0);
data=i2c_read(0);
i2c_stop();
return(data);
} void main(void)
{
int8 sec,min,hora,fecha,dia,mes,anio;
lcd_init();
delay_ms(100); ds1307_init();
sec=read_ds1307(0);
write_ds1307(0,sec&0x7f);
write_ds1307(1,min=0x15); write_ds1307(2,hora=0x08);
write_ds1307(3,dia=06);
write_ds1307(4,fecha=0x17);
write_ds1307(5,mes=0x03);
write_ds1307(6,anio=0x12);
while(true)
{
sec=read_ds1307(0);
min=read_ds1307(1);
hora=read_ds1307(2);
dia=read_ds1307(3);
fecha=read_ds1307(4);
mes=read_ds1307(5);
anio=read_ds1307(6);
delay_ms(100);
lcd_gotoxy(1,1);
printf(lcd_putc,"hora:%2x:%2x:%2x",hora,min,sec);
lcd_gotoxy(1,1); printf(lcd_putc,"fecha es:%2x/%2x/20%2x",fecha,mes,aÑo);
Memoria interna EEPROM del microntrolador #include<16f877A.h>
#fuses xt , noprotect,nolvp,nowdt #use delay(clock=4000000)
#byte port_d=0x08 //identificador del puerto
#int_ext
void ext_isr(void)
{ if((read_eeprom(0)==0x99)||(read_eeprom(0)==0xff))
{
write_eeprom(0,0); //sobre escribi en la eeprom
port_d=read_eeprom(0);// leame la posicion 0 de la eeprom y ubicamelo en el puerto d
} else if((read_eeprom(0)&0x0f)<0x09)
{
write_eeprom((0,read_eeprom(0)),1); //escribame y leame la posicion 0 de la eeprom y sumale 1
port_d=read_eeprom(0); //leame el el puerto d la posicion 0
} else if ((read_eeprom(0)&0x0f)>=0x09)
{
write_eeprom(0,read_eeprom(0)+7); port_d=read_eeprom(0);
}
}
void main(void)
{ set_tris_b(0xff);
set_tris_d(0x00);
enable_interrupts(int_ext);
enable_interrupts(global);
port_d=0xff; while (true)
{
}
}