RP Store Tìm linh kiện theo mã, gửi BOM nhận báo giá Gửi BOM

nhờ giúp đỡ code đo nhiệt độ hiển thi ra led dung DS18B20

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • lyxa_bk
    Đệ tử 1 túi
    • Oct 2013
    • 20

    #1

    nhờ giúp đỡ code đo nhiệt độ hiển thi ra led dung DS18B20

    đây là đoạn code của mình, ai hiểu sâu vấn đề nào vào tư vấn giúp mình với

    #include <main.h>
    #define DQ pin_c1 // chân C1 nối DQ
    const char m[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x9 0};
    int nghin,tram,chuc,donvi;
    // hiển thị ra led 7 đoạn, hàm này chạy tốt vì mình đã đo ADC qua hiển thị led.
    void hienthiso(int16 c)
    {
    nghin=c/1000;
    tram=(c%1000)/100;
    chuc=((c%1000)%100)/10;
    donvi= (((c%1000)%100)%10)/1;
    while(true)
    {
    if(nghin>0)
    {
    output_d(m[nghin]);
    output_a(12);
    delay_ms(1);
    output_d(255);
    delay_ms(1);
    }
    if(tram>0||nghin>0)
    {
    output_d(m[tram]);
    output_a(16);
    delay_ms(1);
    output_d(255);
    delay_ms(1);
    }
    if(chuc>0||tram>0||nghin>0)
    {
    output_d(m[chuc]);
    output_a(20);
    delay_ms(1);
    output_d(255);
    delay_ms(1);
    }
    if(donvi>=0||chuc>0||tram>0||nghin>0)
    {
    output_d(m[donvi]);
    output_a(24);
    delay_ms(1);
    output_d(255);
    delay_ms(1);
    }
    }
    }
    // reset va start DS18B20
    char reset_start()
    {
    int a;
    output_low(DQ);
    delay_us(480);
    output_float(DQ);
    delay_us(65);
    a=!input(DQ);
    delay_us(240);
    if(a)
    return(1);
    else
    return(0);
    }
    //doc 1 byte tu DS18B20
    byte read_byte()
    {
    byte i;
    byte Din;
    for(i=0;i<8;i++)
    {
    output_low(DQ);
    delay_us(4);
    output_float(DQ);
    delay_us(5);
    shift_right(&Din,1,input(DQ));
    delay_us(100);
    }
    return (Din);
    }
    //ghi 1 byte len DS18B29
    byte write_byte(byte Dout)
    {
    byte i;
    for(i=0;i<8;i++)
    {
    output_low(DQ);
    delay_us(10);
    if(shift_right(&Dout,1,0))
    output_high(DQ);
    else
    output_low(DQ);
    delay_us(5);
    output_high(DQ);
    delay_us(5);
    }
    return(1);
    }
    void config(unsigned char A_th,A_tl,mode)
    {
    reset_start();
    write_byte(0x4e);
    write_byte(A_th);
    write_byte(A_tl);
    write_byte(mode);
    }
    // doc nhiet do
    float read_tem()
    {
    int8 busy=0, tem1, tem2;
    int16 tem3;
    float result;
    reset_start();
    write_byte(0xCC);
    write_byte(0x44);
    while(busy==0)
    busy=read_byte();
    reset_start();
    write_byte(0xCC);
    write_byte(0xBE);
    tem1=read_byte();
    tem2=read_byte();
    tem3= make16(tem2,tem1);
    result=(float)tem3/16.0;
    delay_ms(200);
    return(result);
    }
    void main()
    {
    float tem;
    while(true)
    {
    tem = read_tem();
    hienthiso(tem);
    }
    }


    mình không rõ là sai ở đâu khi nạp code thì thấy hiện lên số 4095 trên led 7 đoan??
  • 1041002
    Đệ tử 3 túi
    • Apr 2007
    • 46

    #2
    Nguyên văn bởi lyxa_bk View Post
    đây là đoạn code của mình, ai hiểu sâu vấn đề nào vào tư vấn giúp mình với

    #include <main.h>
    #define DQ pin_c1 // chân C1 nối DQ
    const char m[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x9 0};
    int nghin,tram,chuc,donvi;
    // hiển thị ra led 7 đoạn, hàm này chạy tốt vì mình đã đo ADC qua hiển thị led.
    void hienthiso(int16 c)
    {
    nghin=c/1000;
    tram=(c%1000)/100;
    chuc=((c%1000)%100)/10;
    donvi= (((c%1000)%100)%10)/1;
    while(true)
    {
    if(nghin>0)
    {
    output_d(m[nghin]);
    output_a(12);
    delay_ms(1);
    output_d(255);
    delay_ms(1);
    }
    if(tram>0||nghin>0)
    {
    output_d(m[tram]);
    output_a(16);
    delay_ms(1);
    output_d(255);
    delay_ms(1);
    }
    if(chuc>0||tram>0||nghin>0)
    {
    output_d(m[chuc]);
    output_a(20);
    delay_ms(1);
    output_d(255);
    delay_ms(1);
    }
    if(donvi>=0||chuc>0||tram>0||nghin>0)
    {
    output_d(m[donvi]);
    output_a(24);
    delay_ms(1);
    output_d(255);
    delay_ms(1);
    }
    }
    }
    // reset va start DS18B20
    char reset_start()
    {
    int a;
    output_low(DQ);
    delay_us(480);
    output_float(DQ);
    delay_us(65);
    a=!input(DQ);
    delay_us(240);
    if(a)
    return(1);
    else
    return(0);
    }
    //doc 1 byte tu DS18B20
    byte read_byte()
    {
    byte i;
    byte Din;
    for(i=0;i<8;i++)
    {
    output_low(DQ);
    delay_us(4);
    output_float(DQ);
    delay_us(5);
    shift_right(&Din,1,input(DQ));
    delay_us(100);
    }
    return (Din);
    }
    //ghi 1 byte len DS18B29
    byte write_byte(byte Dout)
    {
    byte i;
    for(i=0;i<8;i++)
    {
    output_low(DQ);
    delay_us(10);
    if(shift_right(&Dout,1,0))
    output_high(DQ);
    else
    output_low(DQ);
    delay_us(5);
    output_high(DQ);
    delay_us(5);
    }
    return(1);
    }
    void config(unsigned char A_th,A_tl,mode)
    {
    reset_start();
    write_byte(0x4e);
    write_byte(A_th);
    write_byte(A_tl);
    write_byte(mode);
    }
    // doc nhiet do
    float read_tem()
    {
    int8 busy=0, tem1, tem2;
    int16 tem3;
    float result;
    reset_start();
    write_byte(0xCC);
    write_byte(0x44);
    while(busy==0)
    busy=read_byte();
    reset_start();
    write_byte(0xCC);
    write_byte(0xBE);
    tem1=read_byte();
    tem2=read_byte();
    tem3= make16(tem2,tem1);
    result=(float)tem3/16.0;
    delay_ms(200);
    return(result);
    }
    void main()
    {
    float tem;
    while(true)
    {
    tem = read_tem();
    hienthiso(tem);
    }
    }


    mình không rõ là sai ở đâu khi nạp code thì thấy hiện lên số 4095 trên led 7 đoan??
    Bạn có thể xem project tại đây (có code và mô phỏng)


    Projects for PIC, AVR in MikroC and C | Điện tử cơ bản | Mạch điện tử ứng dụng | Tài liệu điện tử | Tài liệu truyền hình | Ebook | Softwaves | tool online |


    Visit my site address: http://dientudieukhien.net/

    Comment

    • dung07d6
      Nhập môn đệ tử
      • Sep 2010
      • 1

      #3
      Giao tiếp ds18b20 với pic16f877a hiển thị ra led 7 đoạn

      Nhờ các cao thủ chỉ giáo cho, không biết code sai ở đoạn nào. Khi mô phỏng thì led không có hiện tượng gì.
      //=========================================

      #include <16f877a.h>
      #include <def_877a.h>
      #device *=16 ADC=10
      #FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP,NOCPD, NOWRT
      #use delay(clock=8m)
      #use rs232(baud=9600,parity=N,xmit=PIN_B5,rcv=PIN_B2,bi ts=9)
      #use i2c(Master,Fast,sda=PIN_B1,scl=PIN_B4)
      #define DS18B20_PIN RA4
      #define DS18B20_SKIP_ROM 0xCC
      #define DS18B20_CONVERT_T 0x44
      #define DS18B20_READ_SCRATCH_PAD 0xBE
      #define led1 RB1
      #define led2 RB2
      #define led3 RB3

      //------------------------------------------------------------------------------------
      void DS18B20_RESET()
      {
      output_low(DS18B20_PIN);
      delay_us(500);

      output_float(DS18B20_PIN);
      delay_us(500);

      output_float(DS18B20_PIN);
      }

      //------------------------------------------------------------------------------------

      void DS18B20_write_byte(unsigned char data)
      {
      unsigned char i = 8;
      while(i--)
      {
      output_low(DS18B20_PIN);
      delay_us(2);

      output_bit(DS18B20_PIN, shift_right(&data, 1, 0));
      delay_us( 60 );

      output_float(DS18B20_PIN);
      delay_us( 2 );
      }
      }

      //------------------------------------------------------------------------------------

      FLOAT DS18B20_READ_BYTE()
      {
      unsigned char data, i=8;
      while(i--)
      {
      output_low(DS18B20_PIN);
      delay_us(2);

      output_float(DS18B20_PIN);
      delay_us(8);

      shift_right(&data, 1, input(DS18B20_PIN));
      delay_us(120);
      }
      return data;
      }

      //------------------------------------------------------------------------------------
      float ds18b20_read()
      {
      int8 busy, temp1, temp2;
      int16 temp3;
      float result;

      while(1)
      {
      DS18B20_RESET();
      DS18B20_write_byte(0xCC) ;
      DS18B20_write_byte(0x44);

      while(busy==0)
      busy=DS18B20_READ_BYTE();

      DS18B20_RESET();
      DS18B20_write_byte(0xCC) ;
      DS18B20_write_byte(0xBE);

      temp1=DS18B20_READ_BYTE();
      temp2=DS18B20_READ_BYTE();
      temp3=make16(temp2,temp1);

      delay_ms(200);
      }
      return temp3;
      }
      //------------------------------------------------------------------------------------

      void main()
      {
      int16 nhiet_do;
      unsigned char int_part, decimal_part, HC, HDV;
      unsigned char ma7doan[10]={0xc0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x9 0};

      while(1)
      {
      nhiet_do=ds18b20_read();
      int_part=nhiet_do>>4;
      HC=int_part/10;
      HDV=nhiet_do%10;

      decimal_part=(nhiet_do&0x000f);
      decimal_part=decimal_part*10/16;

      output_high(RB1);
      output_C(ma7doan[HC]);
      delay_ms(2);
      output_low(RB1);


      output_high(RB2);
      output_C(ma7doan[HDV]);
      delay_ms(2);
      output_low(RB2);

      output_high(RB3);
      output_C(ma7doan[decimal_part]);
      delay_ms(2);
      output_low(RB3);

      }
      }

      Comment

      Working...