LIÊN THÔNG CƠ ĐIỆN TỬ K5- ĐH CÔNG NGHIỆP HÀ NỘI
CHÀO MỪNG BẠN
Đến Với Forum Của Lớp Cơ Điện Tử.
Mời Bạn ĐăngNhập Để Đóng Góp Ý Kiến Cho Forum
Chúc Bạn Luôn Vui Và Thành Công

Thành công đến từ những việc nhỏ nhất khi bạn nghiêm túc làm...


You are not connected. Please login or register

Đo khoảng cách với SRF05 + 89S52 + AVR

Xem chủ đề cũ hơn Xem chủ đề mới hơn Go down  Thông điệp [Trang 1 trong tổng số 1 trang]

1 Đo khoảng cách với SRF05 + 89S52 + AVR on Tue Jun 19, 2012 11:10 am



Hi các bạn.
Hum nay tôi sẽ giới thiệu tiếp bài số 2.
Làm thế nào để giao tiếp AVR với SRF 05.
Trong bài viết này tôi sử dụng Atmega8, giao tiếp với SRF05 ở chế độ 1.(2 chân trigger và echo riêng biệt)
tôi kết nối chân Trigger với 1 chân I/O bình thường, chân echo tôi kết nối với chân vào của chân interrup 0 (chân T0). đấu chân echo như vậy để tôi có thể đếm thời gian chính xác nhất, các bạn cũng có thể kết nối nó với chân I/O bình thường, Tuy vậy bạn sẽ luôn phải kiểm tra trạng thái của chân đó. tôi sẽ dùng timer 1 để đếm thời gian (độ rộng xung trên chân echo). Để bắt đầu 1 phép đo tôi cấp 1 xung có độ rộng 12ms lên chân trigger, sau đó tôi chờ cho chân echo được kéo lên mức cao, ngay sau khi chân echo được kéo lên mức cao, tôi sẽ kích hoạt timer 1, tôi đặt T0 ở chế độ cạnh xuống, khi xong phép đo, SRF05 kéo chân echo xuống mức thấp, 1 ngắt T0 xảy ra, và tôi đọc giá trị Timer 1 sẽ tính được độ rộng xung chân echo --> ta có khoảng cách.
dễ quá phải không các bạn? Nếu các bạn vẫn chưa hiểu có thể liên hệ qua số điện thoại 0986773956


Chip type : ATmega8
Program type : Application
Clock frequency : 1.000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
************************************************** ***/

#include <main.h>
unsigned int distance; // Biến lưu giá trị thời gian
unsigned char range_ok; // Biến lưu thông tin phép đo hoàn thành
float range; // Biến lưu giá trị khoảng cách
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
distance=TCNT1; // Đọc giá trị Timer 1
range=(float)(distance)/58;
TCNT1 = 0x00; // Xóa dữ liệu trong Timer 1
TCCR1B = Disable_Timer; // Ngừng Timer1, Timer 1 chỉ hoạt động khi MCU yêu cầu đo khoảng cách
range_ok=1; // hoàn thành phép đo
}
void StartRange()
{
Trigger=1;
delay_ms(12); // Tạo 1 xung ít nhất 10ms
Trigger=0; // Bắt đầu gửi lệnh đo
while(!(Echo)); // Đợi cho chân Echo kéo lên mức cao
TCCR1B=0x01; // Cho Phép Timer 1 hoạt động
}
void main(void)
{
// Declare your local variables here
char str[16];
// Input/Output Ports initialization
// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=Out Func4=Out Func3=Out Func2=In Func1=In Func0=In
// State7=T State6=T State5=0 State4=0 State3=0 State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x38;

// Port C initialization
// Func6=In Func5=In Func4=Out Func3=In Func2=Out Func1=Out Func0=In
// State6=T State5=T State4=0 State3=T State2=0 State1=0 State0=T
PORTC=0x00;
DDRC=0x16;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=Out
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=0
PORTD=0x00;
DDRD=0x01;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Falling Edge
// INT1: Off
GICR|=0x40;
MCUCR=0x02;
GIFR=0x40;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// Global enable interrupts
#asm("sei")
LCD_init();
LCD_clear();
LCD_write_String_flash(1,1,"Nguyen Quy Nhat");
LCD_write_String_flash(1,2,"MinhHaGroup.Com");
delay_ms(1000);
LCD_clear();
range_ok=0;
while (1)
{
// Place your code here
if(!range_ok)
{
StartRange();
}
if(range_ok)
{
sprintf(str,"%4.2f",range);
LCD_write_String(2,2,str);
delay_ms(200); // đợi 200ms để tiến hành phép đo tiếp theo
range_ok=0;
}
};
}



#include<reg52.h>
//================
sbit Led1 = P0^3;
sbit Led2 = P0^2;
sbit Led3 = P0^1;
sbit Led4 = P0^0;
sbit Led_bao_1 = P3^6;
sbit Led_bao_2 = P3^7;
sbit trig = P3^1;
sbit echo = P3^2;
//=================
unsigned char M[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char M1[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
int a,b,c,d,e,f,g,h;
unsigned char timel,timeh,i;
float time;
bit ok;

void delay(unsigned int t)
{
unsigned int i;
for(i=0;i<=t;i++);
}

void hienthi(float cm)
{
e=cm*100;
e= (int)(e);
g=e/100;
h=e%100;

a=g/100;
b=(g%100)/10;
c=((g%1000)%10);
d=h/10;
for(f=0;f<100;f++)
{
Led1=1; //led dau tien sang
P2=M[a];
delay(20);
Led1=0;
P2=0xff;//xoa du lieu
Led2=1; //led 2 sang
P2=M[b];
delay(20);
Led2=0;
P2=0xff;//xoa du lieu
Led3=1; //led 3 sang
P2=M1[c];
delay(20);
Led3=0;
P2=0xff;//xoa du lieu
Led4=1; //led 4 sang
P2=M[d];
delay(20);
Led4=0;
P2=0xff;//xoa du lieu
}
}
void ngatINT0 () interrupt 0{
timel=TL0;
timeh=TH0;
TL0=TH0=0;
ok=0;
}
}
void main(){
trig=0;
TMOD=0x09; //timer 0 che do 1 (16bit) cuc GATE mo
TR0=1;
IT0=1; //ngat ngoai 0 che do falling
IT1=1;
EX0=1; //cho phep ngat ngoai 0
EX1=1;
EA=1; // cho phep ngat toan cuc
ok=0;
while(1){
if(ok==0){
trig=1;
delay(20);
trig=0;
ok=1;
}
time=timel+timeh*256;
hienthi(time/58);
}
}



Sưu Tập!


_________________
Xem lý lịch thành viên http://sinvietelevator.com

Xem chủ đề cũ hơn Xem chủ đề mới hơn Về Đầu Trang  Thông điệp [Trang 1 trong tổng số 1 trang]

Permissions in this forum:
Bạn không có quyền trả lời bài viết