Ðăng Nhập

View Full Version : Cần giúp đỡ về giao tiếp giữa DSpic33f với cảm biến DS18B20


phamhang
11-01-2013, 01:02 PM
Chào các bác.
Em đang làm về đo nhiệt độ dùng cảm biến DS18B20 nguồn ngoài với dspic33f nhưng em đang gặp khó khăn là không biết khi nào thì mình cấu hình chân kết nối giữa VDK với cảm biến là chân vaò (TrisBx=1), khi nào là chân ra (TrisBx=0). Em chỉ mới biết khi nào thì chân đó phải có mức 0 (LATBx hoặc PORTBx=0), khi nào thì chân đó có mức 1 thôi (LATBx hoặc PORTBx=1). còn nó là chân vào hay chân ra thì em chưa biết.
Các bác giúp em với. em cảm ơn trước.

phamhang
17-01-2013, 07:33 PM
Các bác giúp em với. Bây giờ thì em đã trả lời dc câu hỏi trên của em rồi. nhưng không hiểu sao chương trình của em vẫn không hiển thị được nhiệt độ lên LCD. LCD chỉ hiển thị là 0000 thôi. em up chương trình đo và đọc nhiệt độ lên các bác kiểm tra giúp em với. Em loay hoay với con này lâu quá rồi .
Chip em dùng là dspic33f.
Em cấu hình Tần số hoạt động của chíp là Fosc = 40MPs.
Chân DQ của cảm biến em kết nối với chân RB2 của DSpic.
DS18B20 em dùng nguồn 3.3v, chân DQ có điện trở kéo 4.7k lên nguồn 3.3v.

Chương trình đo nhiệt độ của em :
//------ham tao tre 1us (khi PR1=40)-------------------------------------------
void Delay_us(unsigned long time)
{ PMD1bits.T1MD = 0; // Enable Timer1 module
T1CONbits.TON = 0; // Disable Timer
T1CONbits.TCS = 0; // Select Internal Clock for Timer1
T1CONbits.TGATE = 0; // Disable Gated Timer Mode
T1CONbits.TCKPS = 0b00; // Set Timer1 Prescaler = 1:1
TMR1 = 0; // Reset timer to 0
PR1 = time; // Timer1 period set
IFS0bits.T1IF = 0; // Clears Timer 1 interupt flag
IEC0bits.T1IE = 0; // Disable timer 1 interupts
T1CONbits.TON = 1; // Starts timer
while(IFS0bits.T1IF==0); // While the interupt flag is not set
IFS0bits.T1IF = 0;
T1CONbits.TON = 0; // Stop timer
// LED2=0;
}

//================================================== ====
char Reset()
{
DQ=0; // DQ is output
LATBbits.LATB2=0; // DQ to low
Delay_us(20000);// delay 500us
DQ=1; // QD is input
Delay_us(2400); //delay 60us
if(PORTBbits.RB2==0) // if there is a presence pule
{
Delay_us(20000); // delay 500us
return 0;
}
else
{
Delay_us(20000); // delay 500us
return 1;
}
}
//================================================== ====

void Write_DS18B20(unsigned char CMD)
{
char i;
DQ=1; // DQ is input
for (i=0; i<8; i++)
{
if ((CMD&(1<<i))!=0)
{ // wirte 1
DQ=0; // DQ is output
LATBbits.LATB2=0;
Delay_us(100);// delay 2us
DQ=1; // DQ is input
Delay_us(2400); // Delay 60us
}
else
{ // wirte 0
DQ=0; // DQ is output
LATBbits.LATB2=0;
Delay_us(2400); // Delay 60us
DQ=1; // DQ is input
}
}
}
//================================================== ====
char Read_DS18B20()
{
char i,result=0;
DQ=1; // QD is input
for(i=0;i<8;i++)
{
DQ=0; // DQ is output
LATBbits.LATB2=0;
Delay_us(80); // delay 2us
DQ=1; // DQ is input
if(LATBbits.LATB2!=0)
result |=1<<i;
Delay_us(2400); // Delay 60us
}
return result;

}
//=====chuong trinh doc nhiet do===================================
void nhiet_do()
{
if(Reset()==0)
{
Write_DS18B20(Skip_Rom);
Write_DS18B20(Convert_T);
Delay_us(40000); // Delay 1ms
Reset();

Write_DS18B20(Skip_Rom );
Write_DS18B20(Read_Scratchpad);
a=Read_DS18B20();

b=Read_DS18B20();
temp = (a >> 4) | (b << 4);
temp=((int)(temp)); // hiển thị nhiệt độ lên LCD dưới dạng số nguyên

}
}



Chương trình đầy đủ ở trong file đính kèm . Các bác cố gắng giúp em với. em cảm ơn rất nhiều.