Thông báo

Collapse
No announcement yet.

Giao Tiếp SRF 05 Với AVR

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Giao Tiếp SRF 05 Với AVR

    Xin chào các tín đồ của AVR.
    Hôm nay mình xin giới thiệu cho các bạn về cách giao tiếp SRF 05 (Cảm Biến Siêu Âm).
    Bài 1:SRF 05
    Giới Thiệu :SRF
    SRF05 là một bước tiến hóa từ SRF04, và đã được thiết kế để tăng tính linh hoạt,đo khoảng cách xa hơn,Nhưng lại rẻ hơn (?). Do đó, SRF05 hoàn toàn tương thích với SRF04. Phạm vi đo được tăng lên từ 3 mét đến 4 mét. Một chế độ điều khiển mới (đưa chân mode xuống GND) cho phép chỉ sử dụng một pin duy nhất cho cả hai chân trigger và echo, do đó ta sẽ tiết kiệm được 1 chân trên AVR. Khi chế độ bình thường chân mode không được nối, SRF05 hoạt động giống với SRF04, chân echo và trigger được nối với 2 PIN của AVR.
    • Điều Khiển:
    Chế độ 1 - Tương thích với SRF 04–Trigger và Echo riêng biệt
    Chế độ này sử dụng trigger và echo riêng biệt, là chế độ đơn giản nhất!. Nếu các bạn đã xó code cho SRF 04 thì có thể sử dụng cho SRF05 trong chế độ này. Để sử dụng chế độ này, bạn không cần nối chân mode trên SRF05 đi đâu bởi SRF05 đã có trở treo kéo chân này lên mức cao.

    Hình 1: Sơ đồ nối chân mode 1


    Hình 2: Biểu đồ thời gian mode 1.

    Chế độ 2 –sử dụng Trigger và Echo cùng 1 chân AVR.
    Chế độ này sử dụng một pin duy nhất cho cả hai tín hiệu Trigger và Echo, và được thiết kế để tiết kiệm chân trên AVR. Để sử dụng chế độ này, kết nối pin mode với GND.Tín hiệu xuất hiện trên chân Echo sẽ xuất hiện trên chân Trigger ở mode này. SRF05 sẽ không kéo chân echo lên cao trong khi chưa hết 700us sau khi kích hoạt xong tín hiệu trên chân Trigger. Do đó, bạn có đủ thời gian để Set PIN kết nối của AVR thành ngõ vào.

    Hình 3: Sơ đồ nối chân mode 2

    Hình 4: Biểu đồ thời gian mode 2.
    • Tính Toán khoảng cách
    Để bắt đầu 1 phép đo, Bạn chỉ cần cung cấp một xung ngắn 10us vào chân Triggeri. SRF05 sẽ gửi một khối 8 xung siêu âm tại tần số 40kHz và sau đó sẽ kéo chân echo nên mức cao (hoặc chân Trigger trong chế độ 2).Và ngay sau khi phát hiện một vật, chân echo sẽ được lôi xuống mức thấp. Độ rộng xung xuất hiện trên chân echo tỷ lệ thuận với khoảng cách tới đối tượng.khoảng cách đo trong phạm vi theo inches/ cm. Nếu không có gì được phát hiện,SRF05 sẽ tự động lôi chân echo xuống thấp sau 30ms.Nếu chiều rộng của xung được đo bằng uS, sau đó chia cho 58 sẽ cho bạn khoảng cách trong cm, hoặc chia cho 148 sẽ cho khoảng cách trong inches. (uS/58 = cm hoặc uS/148 = inch.)
    • Chú ý:
    SRF05 có thể bắt đầu 1 phép đo nhanh nhất sau mỗi 50ms, hay là 20 lần mỗi giây. Bạn nên chờ 50ms trước khi bắt đầu 1 phép đo mới, ngay cả khi SRF05 phát hiện một đối tượng ở và xung echo ngắn. Điều này là để đảm bảo xung siêu âm đã bị suy hao đi để không gây ảnh hưởng đến 1 xung echo khác.
    Attached Files

  • #2
    Hay quá bạn ở. Bạn đã test con này chưa. Nó có đo chính xác khoảng các không?

    Comment


    • #3
      Mình đã làm con này với AVR rùi, chạy tương đối chính xác.
      buổi sau mình sẽ up code cho các bạn tham khảo. (hum nay đang vội)
      các bạn có thể xem video tại Giao Tiep SRF05 với Atmega8 - YouTube

      Comment


      • #4
        Thanks Bạn
        Hiện mình đang muốn làm đồ án của con này. Mình xem trên web thấy bên Minhha có bán. Để mình mua về có gì mình hỏi bạn thêm sau nha

        Comment


        • #5
          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
          code:
          /************************************************** ***
          This program was produced by the
          CodeWizardAVR V1.25.9 Professional
          Automatic Program Generator
          © Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.
          HP InfoTech, Development Tools for Microcontrollers, C Compilers, In-System Programmers

          Project : SRF05
          Version : 1.0
          Date : 3/6/2012
          Author : Nguyễn Quý Nhật
          Company : Minh Ha Group
          Comments:
          website : MinhHaGroup.Com

          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;
          }
          };
          }

          Comment


          • #6
            Hay quá
            Để mình thử làm xem sao. Có gì mình hỏi sau nha

            Comment


            • #7
              Nguyên văn bởi ICTViet Xem bài viết
              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
              code:
              /************************************************** ***
              This program was produced by the
              CodeWizardAVR V1.25.9 Professional
              Automatic Program Generator
              © Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.
              HP InfoTech, Development Tools for Microcontrollers, C Compilers, In-System Programmers

              Project : SRF05
              Version : 1.0
              Date : 3/6/2012
              Author : Nguyễn Quý Nhật
              Company : Minh Ha Group
              Comments:
              website : MinhHaGroup.Com

              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;
              }
              };
              }
              Cho mình hỏi một chút, nếu không dùng ngắt có đc không?

              Comment


              • #8
                hi atmelavr.
                bạn cũng có thể không dùng đến ngắt để tính toán giá trị thời gian.
                Nhưng như vậy trong khoảng thời gian SRF 05 đợi chân echo được kéo xuống thấp, thì vi xử lý của bạn luôn phải kiểm tra mức logic ở chân echo.
                Như vậy hiệu suất xử lý của vi xử lý sẽ không cao.
                bạn có thể dùng I/O như sau:
                float Start_Range()
                {
                unsigned int range;
                float distance;
                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
                while(Echo); // đợi chân echo được lôi xuống thấp
                range=TCNT1;
                distance=(float)range/58;
                return distance;
                }

                Comment


                • #9
                  Bạn ơi cho mình hỏi, mình học cơ - điện tử, mình đang làm đồ án chế tạo về robot tìm dò đường và tránh vật cản. Thế tớ có thể dùng con này của bạn được ko? con này có khả năng phát hiện những vật cản nhỏ được ko bạn

                  Comment


                  • #10
                    ukm. bạn có thể dùng con SRF 05 để làm robot dò đường rất tốt. vì đối với sinh viên làm đồ án chắc chỉ cần dùng con này là đủ, chẳng cần đến SRF10 đâu.
                    SRF 05 như đã nói ở trên. nó có thể đo trong phạm vi 4m. bạn hỏi vật cản nhỏ là như thế nào? như con kiến chắc là không rùi, nhưng như bao diêm thì OK.

                    Comment


                    • #11
                      Nguyên văn bởi NamATGND
                      mình cũng đang làm 1 con robot dò đường nè^^,nhưng phần code mình yếu quá may mà gặp đc topic này
                      thanks bạn na
                      hihi. không có gì mà bạn. diễn đàn là nơi chia sẻ tài liệu, giúp đỡ mọi người cùng phát triển mà

                      Comment


                      • #12
                        Anh ICTViet oi, a co cai file .max layout cua con AVR ko ? Cho e xin voi!! Roi CODE no' hiển thị ra LCD a co ko? Kết con này nhưng mà ít kiến thức về nó quá . Thank a nhieu ///

                        Comment


                        • #13
                          Nguyên văn bởi ICTViet Xem bài viết
                          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
                          code:
                          /************************************************** ***
                          This program was produced by the
                          CodeWizardAVR V1.25.9 Professional
                          Automatic Program Generator
                          © Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.
                          HP InfoTech, Development Tools for Microcontrollers, C Compilers, In-System Programmers

                          Project : SRF05
                          Version : 1.0
                          Date : 3/6/2012
                          Author : Nguyễn Quý Nhật
                          Company : Minh Ha Group
                          Comments:
                          website : MinhHaGroup.Com

                          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;
                          }
                          };
                          }
                          anh ơi có phải khoảng thời gian mà chân ECHO lên mức 1 là khoảng thời gian mà cảm biến đang đo khoảng cách không anh, nếu khoảng cách ngắn thì thời gian lên 1 là nhanh còn nếu khoảng cách dài thì thời gian lên 1 dài phải không anh nhỉ.nếu khoảng cách là dài nhất thì thời gian đó là bao nhiêu anh?

                          Comment


                          • #14
                            bạn ơi nếu mình dùng chế độ 2 thi sao? mình có nghe nói qua về sử dụng pulsout và pulsin, nhưng mình k hiểu rõ. bạn giúp mình được k?

                            Comment


                            • #15
                              chào bạn
                              bạn có thể cho mình biết thêm về mạch sử dụng srf05 và at89s52.
                              Mình làm mạch dò đường dành cho người mù sử dụng cảm biến để phát hiện vật cản phía trước.mình muốn biết nếu làm mạch đó cần những linh kiện gì được không?
                              Nguyên lý hoạt động của mạch:mạch hoạt động,srf05 phát tín hiệu ra gặp vật cản tín hiệu trả về qua at89s52 xử lý và đưa tín hiệu ra loa hoặc con rung.
                              Mình mới bắt đầu tìm hiểu nên k hiểu mấy về at89s52

                              Comment

                              Về tác giả

                              Collapse

                              ICTViet Tìm hiểu thêm về ICTViet

                              Bài viết mới nhất

                              Collapse

                              Đang tải...
                              X