Thông báo

Collapse
No announcement yet.

giúp em cái code C này với !

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

  • giúp em cái code C này với !

    Code:
    
    #include <16f874a.h>
    #use delay(clock = 20,000,000)
    #Fuses HS,NOWDT,NOPUT,NOBROWNOUT,NOLVP
    #Fuses LVP,CPD,PROTECT
    #include "lcd_driver.c"
    #include <ctype.h> 
    //==============================
    int1 sensor1=0,sensor2=0,sensor3=0,sensor4=0;
    int timer0=0, duty_left = 0, duty_right = 0 ;
    int status_old = 0, status_new = 0;
    int16 a = 0,time=0;
    //------------------------------
    void int_sys();
    void detected_line(); // phat hien line
    int measure_distance(); // do khoan cach
    void control_motor_left(int duty);
    void control_motor_right(int duty);
    /*
     * 
     */
    #define BUT             PIN_B0 // xac dinh
    #define SENSOR_1        PIN_C0
    #define SENSOR_2        PIN_C1
    #define SENSOR_3        PIN_C2
    #define SENSOR_4        PIN_C3
    
    #define PWM11           PIN_D4
    #define PWM12           PIN_D5
    #define PWM21           PIN_D6
    #define PWM22           PIN_D7
    
    #define TRIG           PIN_B1
    #define ECHO           PIN_B2
    //----------------------------------------------
    #INT_TIMER0
    void timer0_isr()
    {
    
        if(status_old != status_new)
        {
            timer0 = 0;
            status_old = status_new;
        }
        timer0++;time++;
        if(timer0 >= 10) timer0 = 0;
    //  control motor left
        if((status_new == 2))// dao chieu ??ng co left
        {
            output_bit(PWM11,0);
            if(timer0 < duty_left)
            {
                output_bit(PWM12,1);
            }
            else    output_bit(PWM12,0);
        }
        else
        {
            output_bit(PWM12,0);
            if(timer0 < duty_left)
            {
                output_bit(PWM11,1);
            }
            else    output_bit(PWM11,0);
        }
    // control motor right
        if(status_new == 3)// dao chieu ??ng co right
        {
            output_bit(PWM22,0);
            if(timer0 < duty_right)
                output_bit(PWM21,1);
            else    output_bit(PWM21,0);
    
        }
        else
        {
            output_bit(PWM21,0);
            if(timer0 < duty_right)
                    output_bit(PWM22,1);
            else    output_bit(PWM22,0);
        }
        if(status_new == 4)// dao chieu ??ng co right and left
        {
            output_bit(PWM11,0);
            if(timer0 < duty_left)
            {
                output_bit(PWM12,1);
            }
            else    output_bit(PWM12,0);
    
            output_bit(PWM21,0);
            if(timer0 < duty_right)
                    output_bit(PWM22,1);
            else    output_bit(PWM22,0);
    
        }
        // measure distance
        
    
    }
    //==============================================
    void int_sys()
    {
        set_tris_B(0x01);
        set_tris_C(0x0f);
        set_tris_D(0x00);
    
        output_bit(PWM12,0);
        output_bit(PWM21,0);
        output_bit(PWM22,0);
        output_bit(PWM11,0);
        output_bit(PWM22,0);
    
        setup_timer_0 (T0_DIV_32|T0_INTERNAL);
        lcd_init();
    }
    //=============================================
    void detected_line()// detect = 0, non detect = 1
    {
        sensor1 = input(SENSOR_1);
        sensor2 = input(SENSOR_2);
        sensor3 = input(SENSOR_3);
        sensor4 = input(SENSOR_4);
    
        begin:
    
        if((sensor3 == 1)&&(sensor2 == 1))
        {
            status_new = 1;
            duty_left = 3, duty_right = 3;
        }
        if((sensor3 == 0)&&(sensor2 == 1))// sensor3 deteted
        {
            status_new = 2;
            while((input(SENSOR_3)==0)&&(input(SENSOR_2)==1))
            {
                duty_left = 4, duty_right = 4;
            }
            if((sensor3 == 1)&&(sensor2 == 1))
            {
                goto begin;
            }
        }
        if((sensor2 == 0)&&(sensor3 == 1))//rc1 = detect
        {
            status_new = 3;
            while((input(SENSOR_3)==1)&&(input(SENSOR_2)==0))
            {
                duty_left = 4, duty_right = 4;
            }
            if((sensor3 == 1)&&(sensor2 == 1))
            {
                goto begin;
            }
        }
        if((sensor2 == 0)&&(sensor3 == 0)&&(sensor1 == 1)&&(sensor4 == 1))// stop
        {
            status_new = 4;
            while((input(SENSOR_3)==0)&&(input(SENSOR_2)==0))
            {
                duty_left = 5, duty_right = 5;
            }
            if((sensor3 == 1)&&(sensor2 == 1))
            {
                goto begin;
            }
        }
    
        if((sensor2 == 0)&&(sensor3 == 0)&&(sensor1 == 0)&&(sensor4 == 0))// stop
        {
            status_new = 5;
            duty_left = 0, duty_right = 0;
        }
    }
    //============================================
    int measure_distance()
    {
        int16 echo_time=0, distance = 0;
        
        
        SET_TRIS_B(0X01);
        output_bit(TRIG,1);
        delay_us(15);
        output_bit(TRIG,0);
        SET_TRIS_B(0x05);
        while(input(ECHO)==0);
        while(input(ECHO)==1)
        {
            echo_time++;
            delay_us(1);
        }
        distance = echo_time/58;// conver time to cm
        return distance;
    }
    //===========================================
    void main() {
    
    //    unsigned int16  a =0;
    
        int_sys();
    
        lcd_gotoxy(1,1);
        printf(lcd_putc," X ");
        lcd_gotoxy(1,0);
        printf(lcd_putc," Y ");
        delay_ms(3000);
        lcd_gotoxy(1,1);
        printf(lcd_putc,"    BAT DAU     ");
        lcd_gotoxy(1,0);
        printf(lcd_putc,"KHOANG CACH:  ");
    
        enable_interrupts(GLOBAL);
        enable_interrupts(INT_TIMER0);
    
    
        while(1)
        {
            while(input(BUT)==1)
            {delay_ms(10);}
            while(1)
            {
                detected_line();
                if(time >= 1000)
                {
                    disable_interrupts(INT_TIMER0);
                    a = measure_distance();
                    lcd_gotoxy(13,0);
                    printf(lcd_putc,"%03lu",a);
                    time = 0;
                    enable_interrupts(INT_TIMER0);
                }
            }
        }
    }
    chổ void main có điều kiện if(time >= 1000) có nghỉa là sao vậy ? ai pro C giúp em với !

  • #2
    không ai giúp em à :

    Comment


    • #3
      Nguyên văn bởi k2d_nh0k Xem bài viết
      không ai giúp em à :
      1. Mỗi lần timer0_isr() thực hiện (khi timer0 tràn) thì biến time tăng một đơn vị, bằng cách dùng lệnh time++; trong timer0_isr().
      2. Dùng lệnh if(time >= 1000) để kiểm tra xem time vượt quá hoặc bằng 1000 chưa, có thể là 1000, 1001, 1002..., nếu đúng như vậy thì làm những chuyện mà bạn muốn làm, ở đây hình như là ngừng timer0, tính khoảng cách gì đó, xong rồi xuất nó ra LCD.
      a = measure_distance();
      lcd_gotoxy(13,0)
      sau đó cho biến time bằng 0 trở lại và khởi động lại timer0 để đếm lại từ con số 1. (lần tiếp theo là 0+1=1, từ 1 tới =1000 là 1000 lần đúng)
      3. Việc này tương tự như bạn đếm cái gì đó được 1000 lần rồi mới thực hiện.

      Code:
      Ví dụ như bạn tự làm cái chương trình trong bài này, mỗi lần thất bại bạn đếm 1, sau khi bằng hoặc hơn 1000 lần bạn post lên diễn đàn, rồi thử lại tiếp từ con số 0 .
      4. Bước 3 là quan trọng nhất trong việc hiểu một chương trình và làm được các chương trình khác. Không có bước ba bạn không thể làm mọi việc theo ý mình được, chỉ có cop nhặt của người khác một cách mù mờ.

      Comment


      • #4
        Nguyên văn bởi aphu Xem bài viết
        1. Mỗi lần timer0_isr() thực hiện (khi timer0 tràn) thì biến time tăng một đơn vị, bằng cách dùng lệnh time++; trong timer0_isr().
        2. Dùng lệnh if(time >= 1000) để kiểm tra xem time vượt quá hoặc bằng 1000 chưa, có thể là 1000, 1001, 1002..., nếu đúng như vậy thì làm những chuyện mà bạn muốn làm, ở đây hình như là ngừng timer0, tính khoảng cách gì đó, xong rồi xuất nó ra LCD.
        a = measure_distance();
        lcd_gotoxy(13,0)
        sau đó cho biến time bằng 0 trở lại và khởi động lại timer0 để đếm lại từ con số 1. (lần tiếp theo là 0+1=1, từ 1 tới =1000 là 1000 lần đúng)
        3. Việc này tương tự như bạn đếm cái gì đó được 1000 lần rồi mới thực hiện.

        Code:
        Ví dụ như bạn tự làm cái chương trình trong bài này, mỗi lần thất bại bạn đếm 1, sau khi bằng hoặc hơn 1000 lần bạn post lên diễn đàn, rồi thử lại tiếp từ con số 0 .
        4. Bước 3 là quan trọng nhất trong việc hiểu một chương trình và làm được các chương trình khác. Không có bước ba bạn không thể làm mọi việc theo ý mình được, chỉ có cop nhặt của người khác một cách mù mờ.

        Thanks a nhiều ! nhưng mà tại sao phãi là 1000 mà không phãi con số nào khác vậy anh ???? em không hiễu tại sao lại so sánh với 1000

        Comment


        • #5
          Nguyên văn bởi k2d_nh0k Xem bài viết
          Thanks a nhiều ! nhưng mà tại sao phãi là 1000 mà không phãi con số nào khác vậy anh ???? em không hiễu tại sao lại so sánh với 1000
          1000 thì tương đối đủ lâu, con số nào là do yêu cầu hoặc do tác giả chọn, có khi người ta phải tính con số bao nhiêu để được 1s hoặc 0.5s hay 0.8 hay 0.1, tùy yêu cầu và tùy thực tế. Bạn làm thì bạn phải hiểu 1000 tương đương bao nhiêu s, không ai khác trả lời cho bạn được trừ tác giả các code hoặc chính bạn.

          Comment


          • #6
            tại vì e lấy code trên mạng nên ko biết bao nhiêu, anh có thể chĩ em cách tính ra bao nhiêu (s) được không? thanks !
            Last edited by k2d_nh0k; 23-06-2013, 11:11.

            Comment

            Về tác giả

            Collapse

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

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

            Collapse

            • bqviet
              Trả lời cho Đấu tắt điện cho máy tính bảng
              bởi bqviet
              Bqv cáo lỗi vì chưa đủ khả năng diễn giải để người đọc hiểu. Người làm kỹ thuật sâu đôi khi như thế đó. Về việc nạp pin không vào dù cell mới, khả năng cái mạch quản lý đó đã hỏng - cũng chính là nguyên nhân đám cell cũ hỏng từ đầu.
              06-12-2025, 17:17
            • nguyendinhvan
              Trả lời cho Xin hỏi về mạch thu FM/AM trong catsette
              bởi nguyendinhvan
              Theo tôi, nó chỉ là cái Tuy- ê - nơ, hoặc là khối Trung Văn Tần, nó một phần trong cái Da đì ô thôi. Vì có thấy một chỗ có ba chân hàn, giiống như chân Cờ rít sờ tăng 455 ki nô hẹc. Còn khối Tuy ê nơ thì không nhìn thây cái Di ốt Va di cáp...
              05-12-2025, 19:59
            • afrendly
              Trả lời cho Đấu tắt điện cho máy tính bảng
              bởi afrendly
              Có vẻ ngoài hiểu biết của mình rồi. Cuối cùng mình quyết định tìm mua 2 pin trên Shopee, giá 200K thay vào. Tuy nhận pin được 1%, sạc mãi không vào nhưng cũng mở được máy lên. Vậy cũng tạm. Cảm ơn bạn đã hỗ trợ nhé....
              04-12-2025, 01:27
            • nick22
              Trả lời cho Máy điện châm ?
              bởi nick22
              Đúng như bạn nói, máy điện châm hiện nay trên thị trường đã khá đa dạng về mẫu mã, chức năng và giá thành.
              01-12-2025, 13:23
            Đang tải...
            X