Thông báo

Collapse
No announcement yet.

đọc nhiều kênh ADC pic16f887

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

  • đọc nhiều kênh ADC pic16f887

    Chào các bạn! Mình viết code đọc 4 kênh ADC hiển thị lên LCD, Trong chương trình con adc_convert() tham số truyền vào là kênh ADC đươc lựa chọn, nhưng mình chỉ đọc được kênh 0 thôi, không đọc được các kênh khác. Các bạn xem giúp mình với

    #include <htc.h>
    __CONFIG(INTIO & WDTDIS & PWRTEN & MCLREN & UNPROTECT & SWBOREN & IESODIS & FCMDIS & LVPDIS & DEBUGDIS); //1st config. Word

    #define rs 0
    #define e 1
    #define lcd_data PORTB
    #define rs_1 (PORTC|=(1<<rs))
    #define rs_0 (PORTC&=(~(1<<rs))
    #define pule_e (PORTC|=(1<<e); PORTC&=(~(1<<e))
    //ham chuyen doi adc
    unsigned int adc_convert (unsigned char channel)
    {
    int adc=0;
    ADCON0|= (channel<<3);
    ADCON0|= (1<<1);// bat dau chuyen doi
    while (ADCON0&0x04);// cho chuyen doi xong
    adc=ADRESH;
    adc<<=8;
    adc|=ADRESL;
    return adc;
    }
    //ham xuat lenh ra lcd
    void lcd_command(unsigned char command)
    {
    lcd_data=command;
    rs_0;
    pule_e;
    _delay(10000);
    }
    //ham xuat ki tu ra lcd
    void lcd_char (unsigned char chr)
    {
    lcd_data=chr;
    rs_1;
    pule_e;
    _delay(10000);
    }
    //ham hien thi 1 chuoi tren lcd
    void lcd_display(char row, char col, char*s)
    {
    switch (row)
    {
    case 0: lcd_command(0x80+col);
    break;
    case 1: lcd_command(0xC0+col);
    break;
    }
    while (*s!=0) lcd_char(*s++);
    }
    //ham khoi tao lcd
    void init_lcd()
    {
    lcd_command(0x38);
    lcd_command(0x0C);
    lcd_command(0x38);
    lcd_command(0x01);
    _delay(10000);
    }
    void main(void)
    {
    int temp;
    ANSEL=0xFF;
    ANSELH=0x00;
    TRISB=0x00;
    TRISC=0x00;
    TRISA=0xFF;
    ADCON0=0x01;
    ADCON1=0xB1;// Vref+ = AN3
    init_lcd();


    while(1)
    {
    temp=adc_convert(0);
    lcd_display(0,0,"nhietdo:");
    lcd_char((temp/100)+ 0x30);
    lcd_char(((temp%100)/10) + 0x30);
    lcd_char((temp%10) + 0x30);
    _delay(100000);
    };




    }

  • #2
    Nguyên văn bởi kingsun1991 Xem bài viết
    Chào các bạn! Mình viết code đọc 4 kênh ADC hiển thị lên LCD, Trong chương trình con adc_convert() tham số truyền vào là kênh ADC đươc lựa chọn, nhưng mình chỉ đọc được kênh 0 thôi, không đọc được các kênh khác. Các bạn xem giúp mình với

    #include <htc.h>
    __CONFIG(INTIO & WDTDIS & PWRTEN & MCLREN & UNPROTECT & SWBOREN & IESODIS & FCMDIS & LVPDIS & DEBUGDIS); //1st config. Word

    #define rs 0
    #define e 1
    #define lcd_data PORTB
    #define rs_1 (PORTC|=(1<<rs))
    #define rs_0 (PORTC&=(~(1<<rs))
    #define pule_e (PORTC|=(1<<e); PORTC&=(~(1<<e))
    //ham chuyen doi adc
    unsigned int adc_convert (unsigned char channel)
    {
    int adc=0;
    ADCON0|= (channel<<3);
    ADCON0|= (1<<1);// bat dau chuyen doi
    while (ADCON0&0x04);// cho chuyen doi xong
    adc=ADRESH;
    adc<<=8;
    adc|=ADRESL;
    return adc;
    }
    //ham xuat lenh ra lcd
    void lcd_command(unsigned char command)
    {
    lcd_data=command;
    rs_0;
    pule_e;
    _delay(10000);
    }
    //ham xuat ki tu ra lcd
    void lcd_char (unsigned char chr)
    {
    lcd_data=chr;
    rs_1;
    pule_e;
    _delay(10000);
    }
    //ham hien thi 1 chuoi tren lcd
    void lcd_display(char row, char col, char*s)
    {
    switch (row)
    {
    case 0: lcd_command(0x80+col);
    break;
    case 1: lcd_command(0xC0+col);
    break;
    }
    while (*s!=0) lcd_char(*s++);
    }
    //ham khoi tao lcd
    void init_lcd()
    {
    lcd_command(0x38);
    lcd_command(0x0C);
    lcd_command(0x38);
    lcd_command(0x01);
    _delay(10000);
    }
    void main(void)
    {
    int temp;
    ANSEL=0xFF;
    ANSELH=0x00;
    TRISB=0x00;
    TRISC=0x00;
    TRISA=0xFF;
    ADCON0=0x01;
    ADCON1=0xB1;// Vref+ = AN3
    init_lcd();


    while(1)
    {
    temp=adc_convert(0);
    lcd_display(0,0,"nhietdo:");
    lcd_char((temp/100)+ 0x30);
    lcd_char(((temp0)/10) + 0x30);
    lcd_char((temp) + 0x30);
    _delay(100000);
    };




    }
    tôi không hiểu cách viết này. tuy nhiên bạn tham khảo cái này viết cho bằng CCS không biết có thể áp dụng cho bạn được không.
    Code:
       set_ADC_channel(0); // chọn đọc giá trị ADC kênh 0
       delay_us(10); // trì hoãn 10us
       adc1=read_adc(); // gán giá trị ADC vào biến adc1
       set_ADC_channel(1);
       delay_us(10);
       adc2=read_adc();
       set_ADC_channel(2);
       delay_us(10);
       adc3=read_adc();
       set_ADC_channel(3);
       delay_us(10);
       adc4=read_adc();

    Comment


    • #3
      Nguyên văn bởi caovanhuong Xem bài viết
      tôi không hiểu cách viết này. tuy nhiên bạn tham khảo cái này viết cho bằng CCS không biết có thể áp dụng cho bạn được không.
      Code:
         set_ADC_channel(0); // chọn đọc giá trị ADC kênh 0
         delay_us(10); // trì hoãn 10us
         adc1=read_adc(); // gán giá trị ADC vào biến adc1
         set_ADC_channel(1);
         delay_us(10);
         adc2=read_adc();
         set_ADC_channel(2);
         delay_us(10);
         adc3=read_adc();
         set_ADC_channel(3);
         delay_us(10);
         adc4=read_adc();
      Đây là môn học của mình, vài bữa nữa thi rồi, thi người ta không cho sữ dụng bất cứ hàm nào trừ hàm delay(). Vì thế nên dùng trình biên dịch nào cũng vậy hà bạn

      Comment


      • #4
        Nguyên văn bởi kingsun1991 Xem bài viết
        Đây là môn học của mình, vài bữa nữa thi rồi, thi người ta không cho sữ dụng bất cứ hàm nào trừ hàm delay(). Vì thế nên dùng trình biên dịch nào cũng vậy hà bạn
        - ý là tôi muốn nói đến cái thuật toán cho bạn. bạn chọn kệnh để đọc sau đó lưu vào 1 biến, sau đó chọn kênh 2 và lưu vào biến 2 và cuối cùng là chọn kênh thứ 4 và lưu vào biến 4.
        - cái của bạn viết hình như là mới đầu đọc kênh 0 sau đó hiển thị ra LCD, chờ 10s sau lại đọc kênh 1 rồi hiển thị ra LCD và lần lượt là 4 kênh phải không.

        Comment


        • #5
          um đúng, đọc rồi hiển thị luôn, sau đó mới tiếp tục kênh khác

          Comment

          Về tác giả

          Collapse

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

          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
          Đang tải...
          X