Thông báo

Collapse
No announcement yet.

DS18b20

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

  • DS18b20

    bác nào giúp em kiểm tr xem code nào chỗ nào chưa đc với. em nghi là nó ko search đc con ds nào hay sao ý.em cảm ơn nhiều nhiều!


    Code:
    /*  CHUONG TRINH QUET 6 LED 7 THANH
        PORTD CHON LED
        PORTB XUAT DU LIEU  */
    
       
    #include <1wire.h>    
    #include <delay.h>    
    #include <stdio.h>
    #include <mega16.h>
    #include <ds18b20.h>
    #include <io.h>
    #asm
        .equ __w1_port=0x1b
        .equ __w1_bit=6      
    #endasm 
    #asm
        .equ __led_port=0x18
    #endasm
    
    
    
    // HAM THIET LAP PORTD,B LAM CONG RA 
    
    void congra(){
        DDRD = 0XFF;
        DDRB = 0XFF;
    }
        
    //  HAM XUAT DU LIEU    
    
    void xuatdl(unsigned char x){
        switch (x){
            case 0:
                PORTB = 0xC0;
                break;
            case 1:
                PORTB = 0xF9;
                break;
            case 2:
                PORTB = 0xA4;
                break;
            case 3:
                PORTB = 0xB0;
                break;
            case 4:
                PORTB = 0x99;
                break;
            case 5:
                PORTB = 0x92;
                break;
            case 6:
                PORTB = 0x82;
                break;
            case 7:
                PORTB = 0xF8;
                break;
            case 8:
                PORTB = 0x80;
                break;
            case 9:
                PORTB = 0x90;
                break;
            };
    }
    
    //  HAM HIEN THI 1 SO 4 CHU SO CHO TRUOC  
    void hienthitemp(unsigned short n){
        int i,soled;
        unsigned char sothu[6];    
        if (n<1000) soled = 3; else soled = 4;
        for (i=1; i<=6; i++){      //LUU 4 CHU SO VAO MANG SOTHU
            sothu[i] = n%10;       //BAT DAU LA SOTHU[1] LA SO HANG DON VI
            n = n/10;
        };
        
        // QUET LED HIEN THI     
        for (i=1; i<=soled; i++){ 
        PORTD = 0x01;
        PORTB = 0x46;
        delay_ms(4);      
        PORTD = PORTD<<i;     
        xuatdl(sothu[i]);     
        delay_ms(4);    
        PORTB = 0xFF;
        };     
    }
    //  HAM HIEN THI NHIET DO
    
    
    
    void temperature(){     
        unsigned char i,devices;
        unsigned char rom_code[8][9];
        float temp;
        
        devices = w1_search(0xf0,rom_code);
        if (!devices) while (1); 
        
        for (i=0; i<devices;){  
        if (!ds18b20_init(&rom_code[i++][0],10,40,DS18B20_12BIT_RES))
            while (1);
        }      
       
        for (i=0;i<devices;i++){
        temp=ds18b20_temperature(&rom_code[i][0]);
        }       
        
        hienthitemp(temp);
    }
          
    //  CHUONG TRINH CHINH    
    void main(){       
        
        while(1){
            congra();          
            temperature();    
            };
    
    }
    Last edited by VNarmy; 03-11-2008, 12:02.

  • #2
    Bạn đang sai ở "if (n<1000")" bạn phải chuyển thành ì ( n <= 1000 ) thì chương trình mới chạy dc ! không dịch ra không có lỗi nhưng chương trình sẽ chạy sai ...
    Mạch nạp Little Programmer
    MSC-51,AVR,EEPROM ... etc

    Site Fukusei shop :

    Comment


    • #3
      Nguyên văn bởi phucthinhel Xem bài viết
      Bạn đang sai ở "if (n<1000")" bạn phải chuyển thành ì ( n <= 1000 ) thì chương trình mới chạy dc ! không dịch ra không có lỗi nhưng chương trình sẽ chạy sai ...
      tớ thử rùi nhưng ko đc!help meeeee!

      Comment


      • #4
        cái này mình xuất ra màn hình lcd 16x2 dc mà . code vision nó cũng có ví dụ khá chi tiết về con ds18b20 .
        Mạch nạp Little Programmer
        MSC-51,AVR,EEPROM ... etc

        Site Fukusei shop :

        Comment


        • #5
          chào các bạn!
          Mình đang làm cảm biến nhiệt độ dùng DS18B20 và atmega8 hiện ra lcd. mình lấy code ví dụ ds18B20 trong codevisionAVR sảu lại cho atmega8 mà không chạy. các bạn giúp mình xem lại code sai ở đâu với
          thân

          Nguyên văn bởi #include <mega8.h>
          #include <delay.h>
          #asm
          .equ __w1_port=0x15
          .equ __w1_bit=3
          #endasm
          #asm
          .equ __lcd_port=0x18
          #endasm

          #include <lcd.h> // LCD driver routines
          #include <ds1820.h>
          #include <1wire.h>
          #include <stdio.h>

          char lcd_buffer[33
          ;

          /* maximum number of DS1820/DS18S20 connected to the 1 Wire bus */
          #define MAX_DEVICES 8

          /* DS1820/DS18S20 devices ROM code storage area */
          unsigned char rom_code[MAX_DEVICES][9];
          //PORTC=0x00;
          //DDRC=0x00;

          main()
          {
          unsigned char i,j,devices;
          int temp;
          PORTC=0x0F;
          DDRC=0x0F;
          lcd_init(16);
          lcd_putsf("CodeVisionAVR\n1 Wire Bus Demo");
          delay_ms(100);
          lcd_clear();

          /* detect how many DS1820/DS18S20 devices
          are connected to the 1 Wire bus */
          devices=w1_search(0xf0,rom_code);
          sprintf(lcd_buffer,"%u DS1820\nDevice detected",devices);
          lcd_puts(lcd_buffer);
          delay_ms(100);

          /* display the ROM codes for each device */
          if (devices)
          {
          for (i=0;i<devices;i++)
          {
          sprintf(lcd_buffer,"Device #%u ROM\nCode is:",i+1);
          lcd_clear();
          lcd_puts(lcd_buffer);
          delay_ms(100);
          lcd_clear();
          for (j=0;j<8;j++)
          {
          sprintf(lcd_buffer,"%02X ",rom_code[i][j]);
          lcd_puts(lcd_buffer);
          if (j==3) lcd_gotoxy(0,1);
          };
          delay_ms(100);
          };
          }
          else
          while (1); /* stop here if no devices were found */

          /* measure and display the temperature(s) */
          while (1)
          {
          for (i=0;i<devices
          {
          temp=ds1820_temperature_10(&rom_code[i][0]);
          j='+';
          if (temp<0)
          {
          j='-';
          temp=-temp;
          };
          sprintf(lcd_buffer,"t%u=%c%i.%u\xdfC",++i,j,temp/10,temp%10);
          lcd_clear();
          lcd_puts(lcd_buffer);
          delay_ms(100);
          };
          };
          }
          .
          |

          Comment


          • #6
            Em cũng đang làm về con DS18B20 này.
            Bác hoangviet fải lưu ý con DS18B20 khác với DS1820 đấy.
            Tôi làm thì nó chạy rồi,nhưng tôi có cảm giác nó chưa được đúng lắm. Tiện đây hỏi các bác luôn thể :
            [I]temp=ds18b20_temperature(&rom_code[0]);
            cái biến temp này sẽ mang giá trị của nhiệt độ đo được. Tôi muốn hỏi cách sắp xếp giá trị trong biến này : 1 byte là fần nguyên có fải ko?
            1 byte là fần thập fân có fải ko, và tổ chức trong byte này thế nào?
            Vì tôi đọc trong datasheet thì thấy như thế này : 4bits sign + 4bits upper data + 4bits lower data + 4 bits decimal. Như vậy chúng ta có fải thực hiện việc nhân chia ko (thực chất là dịch bit) để có được giá trị đúng của fần nguyên và fần thập fân ko ?
            Mong mọi người cho ý kiến.
            Toi viết theo ví dụ của help Codevíion thì ko hiển thị đúng.
            |

            Comment


            • #7
              Nguyên văn bởi hoangviet Xem bài viết
              chào các bạn!
              Mình đang làm cảm biến nhiệt độ dùng DS18B20 và atmega8 hiện ra lcd. mình lấy code ví dụ ds18B20 trong codevisionAVR sảu lại cho atmega8 mà không chạy. các bạn giúp mình xem lại code sai ở đâu với
              thân
              Thứ nhất là mã nguồn của bác là sử dụng cho con 1820 chứ không phải 18B20, trong CodeVisionAVR có 2 Example cho 2 con, không dùng lẫn lộn được.

              Thứ 2 là để hiển thị đúng nhiệt độ bằng hàm sprintf, bạn cần vào Project->Config..., và cho phép sprintf số float vì mặc định hàm sprintf chỉ hoạt động với số nguyên int hoặc byte.
              PNLab
              Mạch nạp/debug ULink2, Jlink ARM USB
              Mạch nạp AVR, PIC, 8051, MSP430 USB
              Mạch phát triển STM32, ARM9, ARM11
              more...www.pnlabvn.com

              Comment


              • #8
                Thanks pác sphinx nhé, e nó chạy ok rùi. Mất 2 ngày với nó, mệt thật.
                |

                Comment


                • #9
                  CHo hỏi là con DS18B20 khác với con DS1820 như thế nào vậy?Con nào tốt hơn?Dễ mua hơn.Con DS1820 kiếm ngoài nhật tảo không có

                  Comment


                  • #10
                    Cả 2 loại đều là các cảm biến nhiệt độ của Maxim, sử dụng chuẩn giao tiếp 1-Wire, tuy nhiên DS1820 là đời cũ và không còn được sản xuất, DS18B20 có nhiều điểm cải tiến hơn so với DS1820 và hiện nay rất phổ biến, có thể mua dễ dàng ở các cửa hàng bán linh kiện điện tử.
                    PNLab
                    Mạch nạp/debug ULink2, Jlink ARM USB
                    Mạch nạp AVR, PIC, 8051, MSP430 USB
                    Mạch phát triển STM32, ARM9, ARM11
                    more...www.pnlabvn.com

                    Comment


                    • #11
                      bạn ngựa gỗ có thể send phần code lên cho mình tham khảo với được không ạ,chứ mình đang bị dính ở chỗ con ds18b20 nó không đo mà hiện lên LCD con số 85 là con số ban đầu trong bộ nhớ của nó,hĩ kh6ng bít giải quyết vấn đề này ai bít chỉ dùm em nha,seach mấy trang nước ngoài thì cũng thấy tụi n1 bị bí ở chỗ này mà kh6ng ai giải quyết với lại nó xài không phải codevision

                      Comment


                      • #12
                        mọi người cho mình hỏi mình không biết làm sao con ds18b20 của mình không hiển thị đúng mà nó hiển thị giá trị là 241 trong khi mình mô phỏng trên Proteus la ok roi và khi mình thay tần số trong phần mô phỏng la lấy tần số trong chip thì no cung bao loi và cho gia trị 241. mong mọi người trả lời giúp sớm một chút vì mình sắp phải nộp bài rồi

                        Comment


                        • #13
                          Nguyên văn bởi vania Xem bài viết
                          mọi người cho mình hỏi mình không biết làm sao con ds18b20 của mình không hiển thị đúng mà nó hiển thị giá trị là 241 trong khi mình mô phỏng trên Proteus la ok roi và khi mình thay tần số trong phần mô phỏng la lấy tần số trong chip thì no cung bao loi và cho gia trị 241. mong mọi người trả lời giúp sớm một chút vì mình sắp phải nộp bài rồi
                          Proteus chỉ là điều kiện cần để cho mạch chạy thôi, nhiều khi proteus nó chạy đúng nhưng mạch thật thì chưa chắc đã chạy vì điều kiện trong proteus khác với thực tế rất nhiều!

                          Comment


                          • #14
                            bạn ơi liệu con ds18b20 no chet no có báo như vậy không vậy vì mình co rút ra cắm lại mình e lam cháy nó rồi vì mình mô phỏng khi không có con ds18b20 nó cũng báo như vậy. mình chỉ biết test trên mô phỏng thôi. nếu ngày mai(17/12) bạn hoặc ai đó vào thì nếu rảnh hôm sau nếu mình không giải quyết được mình có thể gửi code nhờ bạn xem giúp được chứ. thanks bạn nhiều

                            Comment

                            Về tác giả

                            Collapse

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

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

                            Collapse

                            Đang tải...
                            X