Mình đang cần làm đồ án về báo cháy, sử dụng cảm biến DS18B20 và 8051 hiển thị LCD, trong đó có phần giao tiếp với PC nữa. Mình tìm trên diễn đàng thì thấy có một số mạch dùng con DS18B20 nhưng nối vào chân TX, RX của VĐK, như vậy thì làm sao để giao tiếp với PC nữa., có cách nối nào khác không, mình cần nối 4 con DS18B20 để đo 4 chỗ. Bạn nào có mạch nối 4 con DS18B20 cho mình với, ( mạch đã chạy thực tế) . Nếu có code cho mình xin với , cám ơn nhiều.
Thông báo
Collapse
No announcement yet.
Báo cháy sử dụng cảm biến DS18B20 và 8051 hiển thị LCD
Collapse
X
-
18B20 1 chân bus có thể giao tiếp cho rất nhiều con ko nhất thiết là mỗi con 1 chân. Nếu chú viết ko quen thì mỗi con 1 chân cũng đcNguyên văn bởi Vinhanboy Xem bài viếtMình tham khảo thì vẽ mạch thế này, xin các bạn cho ý kiến.
[ATTACH=CONFIG]41059[/ATTACH]
Comment
-
Cho em hỏi với đoạn code này
Ở hàm main chúng ta viếtCode://--------------------------------------- // DS1820 driver // www.GetMicro.com //--------------------------------------- #include<reg8252.h> #include<stdio.h> sbit DQ = P2^0; // connect with DS1820 Data pin //--------------------------------------- // Delay mS function //--------------------------------------- void DelayMs(unsigned int count) { // mSec Delay 11.0592 Mhz unsigned int i; // Keil v7.5a while(count) { i = 115; while(i>0) i--; count--; } } //---------------------------------------- // DELAY at 11.0592MHz crystal. // Calling the routine takes about 22us, and then // each count takes another 17us. // test with KEIL C51 V7.5 //---------------------------------------- void DelayUs(int us) { int i; for (i=0; i<us; i++); } //---------------------------------------- // Reset DS1820 //---------------------------------------- bit ResetDS1820(void) { bit presence; DQ = 0; //pull DQ line low DelayUs(29); // leave it low for about 490us DQ = 1; // allow line to return high DelayUs(3); // wait for presence 55 uS presence = DQ; // get presence signal DelayUs(25); // wait for end of timeslot 316 uS return(presence); // presence signal returned } // 0=presence, 1 = no part //----------------------------------------- // Read one bit from DS1820 //----------------------------------------- bit ReadBit(void) { unsigned char i=0; DQ = 0; // 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 } //----------------------------------------- // Write one bit to DS1820 //----------------------------------------- void WriteBit(bit Dbit) { unsigned char i=0; DQ=0; DQ = Dbit ? 1:0; DelayUs(5); // delay about 39 uS DQ = 1; } //----------------------------------------- // Read 1 byte from DS1820 //----------------------------------------- unsigned char ReadByte(void) { unsigned char i; unsigned char Din = 0; for (i=0;i<8;i++) { Din|=ReadBit()? 0x01<<i:Din; DelayUs(6); } return(Din); } //----------------------------------------- // Write 1 byte //----------------------------------------- void WriteByte(unsigned char Dout) { unsigned char i; for (i=0; i<8; i++) // writes byte, one bit at a time { WriteBit((bit)(Dout & 0x1)); // write bit in temp into Dout = Dout >> 1; } DelayUs(5); } //----------------------------------------- // Read temperature //----------------------------------------- void ReadTemp(unsigned char * buff) { unsigned char n; EA=0; // disable all interrupt ResetDS1820(); WriteByte(0xcc); // skip ROM WriteByte(0x44); // perform temperature conversion while (ReadByte()==0xff); // wait for conversion complete ResetDS1820(); WriteByte(0xcc); // skip ROM WriteByte(0xbe); // read the result for (n=0; n<9; n++) // read 9 bytes but, use only one byte { buff[n]=ReadByte(); // read DS1820 } EA=1; }
Thì giá trị trong MyTemP[] như thế nào ạ. nó là từng bit hay sao a, nếu muốn dùng dữ liệu này để xuất ra thì như thế nào, mình chả hiêu chỗ nàyCode:ReadTemp(&MyTemp[0]);
Comment
-
vào google search : Application Note 162Nguyên văn bởi Vinhanboy Xem bài viếtAnh có chương trình đọc dữ liệu từ DS18B20 hiển thị trên LCD ko ạ, cho em với, em tìm hoài ko thấy. Nếu viết bằng C thì tốt quá.
Comment
-
Các bác cho em ý kiến với. LCD hiển thị lung tung hêt cả lên.
Nhiệt độ từ 20 đến 23 thì LCD hiển thị đúng. Từ 24 độ thì nó LCD hiển thi X88 cho đến 31 độ là X95, đến 32 độ thì lại hiển thị đúng. Lên 40 độ thì nó hiển thị X88 lại. Các bác giúp em với, em sắp nộp đồ án rồi, em tiêu mất.
Code:void ReadTemp(void) { ResetDS1820(); WriteByte(0xcc); // skip ROM WriteByte(0x44); // perform temperatur conversion while (ReadByte()==0xff); // wait for conversion complete ResetDS1820(); WriteByte(0xcc); // skip ROM WriteByte(0xbe); // read the result readdata[0]=ReadByte(); readdata[1]=ReadByte(); }Code:void HienThi(void) { unsigned int t; t=readdata[1]; t<<=8; t=t|readdata[0]; t>>=4; lcd_data(t/100+48); lcd_data(((t/10)%10)+48); lcd_data(t%10+48); }Code:void lcd_data(unsigned char c) //CT con doc du lieu tu LCD { RS=1; RW=0; lcd_PORT=c; EN=1; EN=0; delay_5ms(); }
Comment
-
chú giải thích thuật toán chuyển đổi giá trị nhiệt xem, lưu ý con 18B20 cho ra trực tiếp độ CNguyên văn bởi Vinhanboy Xem bài viếtCác bác cho em ý kiến với. LCD hiển thị lung tung hêt cả lên.
Nhiệt độ từ 20 đến 23 thì LCD hiển thị đúng. Từ 24 độ thì nó LCD hiển thi X88 cho đến 31 độ là X95, đến 32 độ thì lại hiển thị đúng. Lên 40 độ thì nó hiển thị X88 lại. Các bác giúp em với, em sắp nộp đồ án rồi, em tiêu mất.
Code:void ReadTemp(void) { ResetDS1820(); WriteByte(0xcc); // skip ROM WriteByte(0x44); // perform temperatur conversion while (ReadByte()==0xff); // wait for conversion complete ResetDS1820(); WriteByte(0xcc); // skip ROM WriteByte(0xbe); // read the result readdata[0]=ReadByte(); readdata[1]=ReadByte(); }Code:void HienThi(void) { unsigned int t; t=readdata[1]; t<<=8; t=t|readdata[0]; t>>=4; lcd_data(t/100+48); lcd_data(((t/10)%10)+48); lcd_data(t%10+48); }Code:void lcd_data(unsigned char c) //CT con doc du lieu tu LCD { RS=1; RW=0; lcd_PORT=c; EN=1; EN=0; delay_5ms(); }
Comment
-
Nói thật, em cũng không hiểu chỗ đó nữa ạ, em chép 1 code trên mạng về, chỉnh sửa 1 chút thì nó ra thế.Nguyên văn bởi chung1608 Xem bài viếtchú giải thích thuật toán chuyển đổi giá trị nhiệt xem, lưu ý con 18B20 cho ra trực tiếp độ C
. Anh giúp em với...
Nhưng mà theo em nghĩ thì khi con DS18B20 đọc dữ liệu thì nó lưu giá trị trong 9 byte, nhưng mà 2 byte đầu thì là nhiệt độ thôi.
Comment
-
Em sửa lại đoạn code thế này
Em tìm trên mạng thì có cái nàyCode:void HienThi_ADC(void) { int thap, cao; unsigned int t; thap = readdata[0]; cao = readdata[1]; thap = thap >> 4; cao = cao << 4; t = thap|cao; lcd_data(t/100+48); lcd_data(((t/10)%10)+48); lcd_data(t%10+48); }
Như vậy thì phần nhiệt độ nguyên sẽ được lưu từ bit 4 đến bit 10, do vậy nên ở cái thấp em sẽ dịch qua phải 4 bit, ở phần cao sẽ dịnh qua trái 4 bit, sau đó OR 2 cái này lại để có giá trị nhiệt độ phần nguyên. láy giá trị này đem xử lý để hiển thị ra LCD. Nhưng có cái lỗi này là từ nhiệt độ 40 đến 47 thì hiển thị sai, còn 48 trở lên đến 55 lại hiển thị đúng, đến 56 lại hiển thị sai, em không biết chỉnh chỗ nào, anh em giúp với, gấp lắm rồi ạ
Last edited by Vinhanboy; 09-03-2012, 12:34.
Comment
-
Bài viết mới nhất
Collapse
-
Trả lời cho Yêu thơ mê nhạc, mời các bác vào đây!bởi dinhthuong92GIỚI THIỆU CA KHÚC VỀ CHA MẸ:
Nặng Nghĩa Mẹ Cha
Sáng tác: Hoàng Đình Thường
Giọng hát: AI
Công cha cao tựa như Thái Sơn
Nghĩa mẹ sâu nước biếc xanh trong
Mong con khôn lớn đời hạnh phúc
Mẹ cha...-
Channel: Tâm tình dân kỹ thuật
Hôm qua, 16:22 -
-
bởi afrendlyCảm ơn bạn. Mình hỏi để thợ có thể tham khảo thôi chứ không đủ kiển thức để sửa, mà cũng không có đồ nghề, mua đồ nghề quá tiền máy. Gọi nhiều lần mà thợ hẹn mãi chưa có tới ấy bạn. Mình muốn sửa được chứ bỏ thì uống, nhưng sợ là được mỗi người thợ mà lại không sửa nổi....
-
Channel: Điện tử gia dụng
11-05-2026, 00:34 -
-
bởi mèomướpDạ nó bị tắc ẩm hoặc rò thiếu gas hoặc lốc yếu hoặc van tiết lưu có vấn đề hoặc tất cả những nguyên nhân trên ạ. Chú ko chuyên về mảng này thì bán đi, giành thời gian trồng rau sạch đem ra chợ bán lấy tiền mua tủ mới ạ. Còn...
-
Channel: Điện tử gia dụng
10-05-2026, 17:01 -
-
bởi afrendlyXin chào mọi người. Mình lại có vấn đề về đồ điện cần nhờ mọi người hỗ trợ giúp. Mình có tủ lạnh Sharp dùng cũng lâu rồi. Trước có bị kém lạnh, không đông đá thì có thợ họ mang về, sục đường ga gì đó hết 900k và đã dùng...
-
Channel: Điện tử gia dụng
10-05-2026, 16:53 -
-
bởi dinhthuong92Đấy, cái tôi thắc mắc là chỗ màu hồng ấy bạn, để áp vào cao chứ không bị sụt gần bằng áp pin thì rất cần cuộc cảm để làm điều đó. Tuy nhiên, trong công thức bác thớt dẫn không thấy mặt L, và một vài mạch MPPT tôi đã kiểm...
-
Channel: Nguồn!
09-05-2026, 10:01 -
-
bởi mèomướpDạ mạch sạc là 1 cục nguồn, nó sẽ điều chỉnh công suất đầu ra để có tổng trở bằng nội trở của pin ạ. Và cái cách nó chỉnh công suất đầu ra sẽ là dạng buck, boot. Đều cần đến cuộn cảm ạ. Tất nhiên chú thích thì có thể dùng dạng tuyến tính transistor để bù trừ nhưng mà nó đốt năng lượng vô ích ạ...
-
Channel: Nguồn!
08-05-2026, 16:26 -
-
bởi dinhthuong92Tng trở R của tải (gồm pin và mạch sạc) trong công thức đó rõ ràng khống có L xuất hiện. Nếu tính các dây dẫn thì rất nhỏ, bỏ qua. Vì nội trở pin là rất nhỏ, có thể nói luôn lớn hơn nội trở solar, nên mạch MPPT sẽ hầu như luôn tính...
-
Channel: Nguồn!
08-05-2026, 11:00 -
-
bởi dinhthuong92Chào bác. Đã là công thức phải tổng quát chứ, nó phải thể hiện cả quá trình, rối thì quá độ hay xác lập tính sau vì tùy điều kiện. Cũng như công thức tính diện tích chả hạn, phải là tích phân....
-
Channel: Nguồn!
08-05-2026, 10:49 -


Comment