ESTE ES UN EJEMPLO MUY COMPLEJO DE MEDIR LA DISTACIO POR REVOTE
umss universit.
//ejemplo:831
// Ultrasonico PIC coddigo
//04/Mar/2006
//medicion de distancia por ultrasonico 1200mm
//modificacion#7
#include <16f877.h>
#fusesXT, NOWDT, NOPROTECT, NOPUT, NOBROWNOUT, NOLVP
#use delay (clock=20000000)
#use RS232 (baud=9600, XMIT=PIN_C6, RCV=PIN_C7)
#define LEDL PIN_D7
#define LEDM PIN_D6
#define LEDR PIN_D5
#define TXRXSEL PIN_E0
#define USSTATE PIN_E1
#byte b_port=0x06
#define usl_driveH 0b00010000
#define usl_driveL 0b00000010
#define usm_driveH 0b00010000
#define usm_driveL 0b00000100
#define usr_driveH 0b00010000
#define usr_driveL 0b00001000
#define usall_short 0b00000000
struct INTCONmap
{
boolean RBIF;
boolean INTF;
boolean T0IF;
boolean RBIE;
boolean INTE;
boolean T0IE;
boolean PEIE;
boolean GIE;
} INTCON;
#byte INTCON=0x0b
byte pulseLeftTX()
{
int i;
byte rx_range,ct;
set_tris_b(0b00000001);
/ output_low(PIN_B0);
for (i=0; i<8; i++)
{
b_port=usl_driveH;
output_high(PIN_B1);
delay_us(12);
b_port=usl_driveL;
output_low(PIN_B1);
delay_us(11);
}
b_port=usall_short;
set_tris_b(0b10000001);
set_rtcc(0);
INTCON.INTF=0;
INTCON.T0IF=0;
rx_range=0xff;
while (INTCON.T0IF==0)
{
if ((rx_range==0xff)&&(INTCON.INTF==1)) rx_range=get_rtcc();
}
for (ct=0;ct<3;ct++) //wait for any echoes to go away...
{
set_rtcc(0);
INTCON.T0IF=0;
while (INTCON.T0IF==0) { }
}
return rx_range;
}
byte pulseMidTX()
{
int i;
byte rx_range,ct;
set_tris_b(0b00000001);
output_low(PIN_B0);
for (i=0; i<8; i++)
{
b_port=usm_driveH;
output_high(PIN_B3);
delay_us(12);
b_port=usm_driveL;
output_low(PIN_B3);
delay_us(11);
}
b_port=usall_short;
set_tris_b(0b00100001);
set_rtcc(0);
INTCON.INTF=0;
INTCON.T0IF=0;
rx_range=0xff;
while (INTCON.T0IF==0)
{
if ((rx_range==0xff)&&(INTCON.INTF==1)) rx_range=get_rtcc();
}
for (ct=0;ct<3;ct++)
{
set_rtcc(0);
INTCON.T0IF=0;
while (INTCON.T0IF==0) { }
}
return rx_range;
}
byte pulseRightTX()
{
int i;
byte rx_range,ct;
set_tris_b(0b00000001);
change time
output_low(PIN_B0);
for (i=0; i<8; i++)
{
b_port=usr_driveH;
output_high(PIN_B3);
delay_us(12);
b_port=usr_driveL;
output_low(PIN_B3);
delay_us(11);
}
b_port=usall_short;
delay_us(400);
set_tris_b(0b01000001);
set_rtcc(0);
INTCON.INTF=0;
INTCON.T0IF=0;
rx_range=0xff;
while (INTCON.T0IF==0)
{
if ((rx_range==0xff)&&(INTCON.INTF==1)) rx_range=get_rtcc();
}
for (ct=0;ct<3;ct++) //wait for any echoes to go away...
{
set_rtcc(0);
INTCON.T0IF=0;
while (INTCON.T0IF==0) { }
}
return rx_range;
}
void serialCheck(byte rangeL, byte rangeM, byte rangeR)
{
char c;
if (kbhit())
{
c = getc();
if (c == "*")
{
output_low(USSTATE);
output_high(TXRXSEL);
delay_ms(5);
delay_us(10);
putc(rangeL);
delay_us(10);
putc(rangeM);
delay_us(10);
putc(rangeR);
delay_us(50);
output_low(TXRXSEL);
}
}
}
void scanSerial()
{
char c;
c = getc();
}
void main(void)
{
byte rangeL, rangeM, rangeR;
#use fast_io(B)
#use fast_io(E)
#use fast_io(D)
#use fast_io(C)
SET_TRIS_B(0x00);
SET_TRIS_D(0x00);
SET_TRIS_E(0x00);
SET_TRIS_C(0b10000000);
output_low(TXRXSEL);
output_high(USSTATE);
output_high(LEDL);
output_high(LEDM);
output_high(LEDR);
setup_counters(RTCC_INTERNAL,RTCC_DIV_64);
rangeL = 0xff;
rangeM = 0xff;
rangeR = 0xff;
while(true)
{
output_high(USSTATE);
serialCheck(66,66,66);
output_low(USSTATE);
serialCheck(66,66,66);
}
while(TRUE)
{
rangeL = pulseLeftTX();
serialCheck(rangeL, rangeM, rangeR);
rangeM = pulseMidTX();
serialCheck(rangeL, rangeM, rangeR);
rangeR = pulseRightTX();
serialCheck(rangeL, rangeM, rangeR);
if (rangeL < 38)
output_high(LEDL);
else
output_low(LEDL);
if (rangeM < 38)
output_high(LEDM);
else
output_low(LEDM);
if (rangeR < 38)
output_high(LEDR);
else
output_low(LEDR);
}
}