[Xin giúp] PIC16F877A- DS18B20- R232

josdoaitran

Trứng gà
Hiện mình đang tìm hiểu do nhiệt độ dùng DS18B20 hiển thị lên máy tính dùng C#, nhưng mình vẫn chưa thành công.

Bạn nào từng làm về phần này xin chia sẻ cho mình để tham khảo nha! (Trên vb.net hoặc Matllab).
 

josdoaitran

Trứng gà
Cám ơn bạn rất nhiều! mình đã xây dựng thành công nhưng có cái là lập trình GUI trên matlab có khó hơn trên C# không nhỉ!
Đau đầu về cái này quá!
 

2death

Cố Vấn CLB
Staff member
Cũng không khó, nhưng mà hiện giờ 2death chưa làm TUT phần này được :D Bạn tìm hướng dẫn về GUI Matlab của anh Ngô Hải Bắc xem (google)
 

josdoaitran

Trứng gà
Cám ơn bạn nhiều! nếu mình thành công. mình sẽ post bài chia sẻ xây dựng cho pay it forward!
 

josdoaitran

Trứng gà
Phần cấu kiện cho con DS18B20=> OK! như code dưới.

Mình đã dùng mạch FT232 mua ở Thiên Minh về gắn mạch chung gnd, TX-PIC với Rx của FT 232, Tx-PIC với Tx của FT 232.

Chuỗi Bit gửi lên máy tính: thông qua lệnh gửi print.

PHP:
#include <16f877a.h>
#use delay(clock=20M)
#fuses HS, NOWDT, NOLVP, NOBROWNOUT, NOPROTECT, NOPUT
#use rs232(baud=9600,parity=n,xmit=pin_c6,rcv=pin_c7)
#define DS PIN_A3
int8 led1,led2;
int8 const seg7[10] ={0xC0,0x8F9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
int8 const char9[10] ={'a','b','c','d','e','f','g','h','j','k'};
void reset()
{
   output_low(DS);
   delay_us( 500 ); 
   output_float(DS); 
   delay_us( 500 ); 
   output_float(DS);
}
void write(int data)
{
   int count;
   for (count=0; count<8; ++count)
   {
   output_low(DS);
   delay_us( 2 ); 
   output_bit(DS, shift_right(&data,1,0)); 
   delay_us( 60 ); 
   output_float(DS); 
   delay_us( 2 ); 
   }
}
   unsigned read()
{
   int count, data;
   for (count=0; count<8; ++count)
   {
      output_low(DS);
      delay_us( 2 ); 
      output_float(DS); 
      delay_us( 8 ); 
      shift_right(&data,1,input(DS)); 
      delay_us( 120 ); 
   }
   return( data );
}
   unsigned int CHUYEN(float data)
{ 
   data = data* 0.625;
   return(data);
}


void DS18B20()
{
   int8 byte2,led1,led2,byte1,dec,decimal,led3,i,j,busy=0;
   int16 data;
   unsigned char nhiet_do,so_le;

   reset();
   write(0xCC);
   write(0x44);
   while (busy == 0) 
   busy = read(); 
   reset();
   write(0xCC);
   write(0xBE);
   byte1 = read();
   byte2 = read();
   data=make16(byte2,byte1);
   
   data=data>>4;    
   data=data&0x0ff;  
   led2=data/10;   
   led1=data%10;  
   decimal=byte1&0x0f;
   dec=CHUYEN(decimal);
    
     for(i=0;i<20;i++)
   {
   [COLOR="red"]printf("D=%u U=%u L=%u",led1, led2,dec); [/COLOR]
   }
          
    
  for(i=0;i<20;i++)
    {
      for(J=0;J<50;J++)
      {
         output_low(pin_d0);
         output_b(seg7[led2]);
         delay_ms(1);
         output_high(pin_d0);
    
    
         output_low(pin_d1);
         output_b(seg7[led1]);
         output_low(pin_b7); 
         delay_ms(1);
         output_high(pin_d1);
    
         output_low(pin_d2);
         output_b(seg7[dec]);
         delay_ms(1);
         output_high(pin_d2);
         
         output_low(pin_d3);
         output_b(0b10011100);// hien thi do
         delay_ms(1);
         output_high(pin_d3);
         
         output_low(pin_d4);
         output_b(0b11000110);// hien thi c
         delay_ms(1);
         output_high(pin_d4);
     }
     }
     
}
void main()
{
   SET_TRIS_A(0b00001000);
   SET_TRIS_B(0);   
   OUTPUT_A(0XFF);
   OUTPUT_LOW(PIN_A0);
while (1)
    {
    
   DS18B20();

    }   
}
Sơ đồ nguyên lý:

 

tungbk

Cố Vấn CLB
Staff member
Bạn này vừa thấy spam cũng bài này bên deeforum ; google thì thêm bên picvietnam nữa đúng là ham học hỏi thiệt :). Bạn post trên picvietnam mà không chịu khó search trước trên đó đã có sẵn 1 topic hướng dẫn chi tiết về dùng MATLAB GUI giao tiếp rs232; cũng vì nó quá chi tiết rồi nên cũng không còn gì để nói nữa bạn search thử nhé trong topic MATLAB gì đó. Chúc thành công.
 

2death

Cố Vấn CLB
Staff member
Các bước thực hiện:

1. Em thử viết code truyền nhận cái gì đó đơn giản (gửi 1 kí tự, 1 chuỗi kí tự) giữa PIC và terminal máy tính --> nếu gửi và nhận được => phần cứng đã OK, code đã OK.

2. Vẫn dùng code đó (code đã biết chắc chắn là truyền nhận OK), viết 1 cái GUI bằng Matlab giao tiếp RS232.
+ Google hướng dẫn GUI Matlab giao tiếp RS232 của anh Ngô Hải Bắc
+ Xem bài hướng dẫn đó, làm theo.

Vì GUI Matlab đúng là cần 1 số "thủ thuật" nhỏ, khi đầu em làm có thể không hiển thị được kí tự nhận về. Nhưng tới đó hãy nói tiếp.
Em làm theo các bước trên, tới tạo GUI như trong hướng dẫn, rồi nói xem kết quả ra sao, rồi mình tính tiếp.
 

vanquyen115

Trứng gà
Mấy huynh cho em hỏi !! mình muốn GUIC# nhận 1 luc 2 hoặc 3 byte thì phải khai báo cho hàm nhận như thế nào ? và làm sao để giá trị nhiệt độ đo dc hiển thị ra ô textbox .VD như VDK gửu lên giá trị nhiệt độ đo dc là 34 độ thì phải hiển thị đúng 34 độ. đằng này em làm mà nó chỉ hiểu theo kiểu kí tự là dấu: " ...mong mấy huynh giúp đỡ:-s
 
Top