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

Giao tiếp one-wire ds18b20 đo nhiệt độ nhờ mọi người giúp mình

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • nakatatran
    Nhập môn đệ tử
    • Sep 2010
    • 3

    #1

    Giao tiếp one-wire ds18b20 đo nhiệt độ nhờ mọi người giúp mình

    Mình viết chương trình sử dụng pic16f887 + ds18b20 xuất nhiệt độ ra lcd. (có gửi file đính kèm..)
    link : http://www.mediafire.com/?z421gvz8h7k4b01
    http://www.mediafire.com/?h85o48ee0yw5b2d
    còn đây là có mình viết trên hitech C.
    Do mình mới làm quen với pic nên gặp khó khăn nhờ các bạn xem giúp .Cám ơn!!
    //
    #include <htc.h>
    #include<stdio.h>
    #include "lcd.h"
    __CONFIG(INTIO&WDTDIS&PWRTEN&MCLREN&UNPROTECT&DUNP ROTECT&BORDIS&IESODIS&FCMDIS&LVPDIS);
    __CONFIG(BORV21);
    #define _XTAL_FREQ 4000000
    #define DQ RC0
    //PORTC 0X07

    unsigned char ow_reset(void)
    // bit ow_reset(void)
    {
    unsigned char presence;
    presence=1;
    while(presence)
    {
    TRISC=0;
    DQ = 0; //pull DQ line low
    __delay_us(500); // leave it low for about 490us
    DQ = 1; // allow line to return high
    __delay_us(40); // wait for presence 55 uS
    TRISC=1;
    presence = DQ; // get presence signal
    __delay_us(25); // wait for end of timeslot 316 uS
    }
    return(presence); // presence signal returned
    } // 0=presence, 1 = no part
    unsigned char read_bit(void)
    {
    //unsigned char i=0;
    TRISC=0;
    DQ = 0;
    __delay_us(1);
    TRISC=1;
    __delay_us(15); // pull DQ low to start timeslot
    // DQ=1;
    // for (i=0; i<3; i++); // delay 17 us from start of timeslot
    return(DQ); // return value of DQ line
    }

    void write_bit(char bitval)
    {
    TRISC=0;
    DQ=0;
    //DQ = Dbit;
    __delay_us(15); // delay about 39 uS
    if(bitval==1) TRISC=1;
    __delay_us(50);
    // DQ = 1;
    }

    // READ_BYTE - reads a byte from the one-wire bus.
    //
    unsigned char read_byte(void)
    {
    unsigned char i;
    unsigned char value = 0;
    for (i=0;i<8;i++)
    {
    if(read_bit()) value|=0x01<<i; // reads byte in, one byte at a time and then
    // shifts it left
    __delay_us(150); // wait for rest of timeslot
    }
    return(value);
    }

    void write_byte(char val)
    {
    unsigned char i;
    unsigned char temp;
    for (i=0; i<8; i++) // writes byte, one bit at a time
    {
    temp = val>>i; // shifts val right 'i' spaces
    temp &= 0x01; // copy that bit to temp
    write_bit(temp); // write bit in temp into
    }
    __delay_us(100);
    }
    void main (void)
    {
    unsigned char x;
    TRISC=0;
    RC0=0;
    ANSEL=ANSELH=0;
    ow_reset();
    write_byte(0xCC); // skip ROM
    write_byte(0x44); // Start conversion

    __delay_us(100);
    ow_reset();
    write_byte(0xCC);
    x = read_byte();
    lcd_init();
    lcd_gotoxy(2,1);
    printf("temp = %u",x);


    __delay_us(100000);

    }

    void putch(char c)
    {
    lcd_putc(c);
    }
Working...