đây là đoạn code siêu âm hoạt động ở chế đọ mode2
dùng pic. nhưng khi test thì không hiện gì lên LCD mong mọi người giúp đỡ
xem dùng hộ cái!!!!!!!
#include <16f877a.h>
#include <defs_16f877a.h>
#include <def_877a.h>
#use delay(clock=20000000)
#fuses HS
#BYTE TRISC = 0x87
#BIT TRISC2 = 0x87.2
#BYTE PORTC = 0x07
#BIT RC2 = 0x7.2
#include <lcd_lib_4bit.c>
float getvar = 0, distance = 0;
int1 has_echo = 0, trg = 0;
void trigger(); //t?o trigger
void init();
#INT_CCP1
void ccp1_isr()
{
if(!trg) {
//Khi có xung echo c?nh lên
set_timer1(0); //Reset timer1 v? 0
setup_ccp1(CCP_CAPTURE_FE); //chuy?n sang dò xung c?nh xu?ng
trg = 1;
}
else
{
//Khi có xung echo c?nh xu?ng
getvar = get_timer1(); //??c giá tr? timer1 ngay khi có xung echo c?nh xu?ng
distance = ((getvar /111)*3.2-14.7);//(getvar - 485)/28.3; // S? li?u d?a theo k?t qu? ?o th?c t?
has_echo = 1;
disable_interrupts(GLOBAL);
}
}
void main()
{
init();
//LCD_init();
while (1)
{
trigger();
while(!has_echo);
lcd_putcmd(0xc0);
printf(lcd_putchar,"K/C:%6.2f", distance);
delay_us(200);
}
}
void init()
{
//Timer 1 clock in = Fosc/4 = 5Mhz
//Speed of Speech = 344m/s ,Max time echo =25ms
//=> Max Distance of SRF05 = (344m/s*25ms)/2 = 4.3m
// Min time echo = 100us
//=> Min Distance of SRF05 = (344m/s*100us)/2 = 3.44cm
//=> Timer 1 with Ts = (1/5MHz)*Pre = 0.4uS (Prescaler = 2);
//=> Reg Timer 1 Circle
lcd_init();
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
//Thi?t l?p Capture CCP1 dò xung c?nh lên
setup_ccp1(CCP_CAPTURE_RE);
enable_interrupts(INT_CCP1); // Cho phép ng?t khi CCP1 có tín hi?u
}
void trigger()
{
trg = 0;
has_echo = 0;
TRISC2 = 0; //set chân RC2 làm output
RC2 = 1; //trigger
delay_us(20);
RC2 = 0;
TRISC2 = 1; //set chân RC2 làm input
setup_ccp1(CCP_CAPTURE_RE);
enable_interrupts(GLOBAL);
}
dùng pic. nhưng khi test thì không hiện gì lên LCD mong mọi người giúp đỡ
xem dùng hộ cái!!!!!!!
#include <16f877a.h>
#include <defs_16f877a.h>
#include <def_877a.h>
#use delay(clock=20000000)
#fuses HS
#BYTE TRISC = 0x87
#BIT TRISC2 = 0x87.2
#BYTE PORTC = 0x07
#BIT RC2 = 0x7.2
#include <lcd_lib_4bit.c>
float getvar = 0, distance = 0;
int1 has_echo = 0, trg = 0;
void trigger(); //t?o trigger
void init();
#INT_CCP1
void ccp1_isr()
{
if(!trg) {
//Khi có xung echo c?nh lên
set_timer1(0); //Reset timer1 v? 0
setup_ccp1(CCP_CAPTURE_FE); //chuy?n sang dò xung c?nh xu?ng
trg = 1;
}
else
{
//Khi có xung echo c?nh xu?ng
getvar = get_timer1(); //??c giá tr? timer1 ngay khi có xung echo c?nh xu?ng
distance = ((getvar /111)*3.2-14.7);//(getvar - 485)/28.3; // S? li?u d?a theo k?t qu? ?o th?c t?
has_echo = 1;
disable_interrupts(GLOBAL);
}
}
void main()
{
init();
//LCD_init();
while (1)
{
trigger();
while(!has_echo);
lcd_putcmd(0xc0);
printf(lcd_putchar,"K/C:%6.2f", distance);
delay_us(200);
}
}
void init()
{
//Timer 1 clock in = Fosc/4 = 5Mhz
//Speed of Speech = 344m/s ,Max time echo =25ms
//=> Max Distance of SRF05 = (344m/s*25ms)/2 = 4.3m
// Min time echo = 100us
//=> Min Distance of SRF05 = (344m/s*100us)/2 = 3.44cm
//=> Timer 1 with Ts = (1/5MHz)*Pre = 0.4uS (Prescaler = 2);
//=> Reg Timer 1 Circle
lcd_init();
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
//Thi?t l?p Capture CCP1 dò xung c?nh lên
setup_ccp1(CCP_CAPTURE_RE);
enable_interrupts(INT_CCP1); // Cho phép ng?t khi CCP1 có tín hi?u
}
void trigger()
{
trg = 0;
has_echo = 0;
TRISC2 = 0; //set chân RC2 làm output
RC2 = 1; //trigger
delay_us(20);
RC2 = 0;
TRISC2 = 1; //set chân RC2 làm input
setup_ccp1(CCP_CAPTURE_RE);
enable_interrupts(GLOBAL);
}
Comment