Phiên bản đồng hồ sáng tạo nhất, tích hợp rất nhiều tính năng vào trong một chiếc đồng hồ. Hiển thị ngày theo dương lịch, hiển thị giờ, hiển thị nhiệt độ, 8 hiệu ứng viền nháy theo giây, hẹn giờ đa chức năng, báo giờ,...
Bài 14: Đo nhiệt độ dùng cảm biến DS18B20 với 8051 Đăng bởi: Vũ Văn Thái - Thời gian: 19-10-2014, 10:11 Chuyên mục: Học lập trình 8051 - Lượt xem: 26.480
Đo nhiệt độ dùng cảm biến DS18B20 với 8051
1. Giới thiệu cảm biến nhiệt độ DS18B20
DS18B20 là cảm biến nhiệt độ kỹ thuật số giao tiếp 1-Wire (1 dây duy nhất), bên trong IC được tích hợp sẵn cảm biến nhiệt và bộ chuyển đổi, khối xử lý, giao tiếp 1 wire, bộ nhớ ROM, EEPROM, báo thức nhiệt độ khi đạt ngưỡng...
Thông số của cảm biến:
- Giải đo: -55 đến +125 độ C (sai số 0.5 độ C trong điều kiện -10 to +85 độ C)
- Nguồn cung cấp: 3 - 5.5V
- Độ phân giải: 9bit, 12bit
- Môi trường làm việc: Mọi môi trường nếu có vỏ bảo vệ tốt.
Cảm biến DS18B20 cho phép bạn kết nối nhiều cảm biến trên một đường dây DATA (DQ) và nó cho phép kết nối ít nhất là 2 dây DQ và GND không cần cấp VCC, lúc này chân VCC nối tắt sang GND, như vậy thì làm sao cấp nguồn được cho cảm biến hoạt động ??? Để cấp nguồn thì cảm biến được thiết kế có thể lấy trực tiếp áp từ dây tín hiệu DQ để duy trì hoạt động (xem mạch trong datasheet).
Trong bài này ta chỉ xét xem làm thế nào để giao tiếp được với cảm biến, còn các bạn muốn tìm hiểu kỹ hơn thì vui lòng đọc datasheet gửi kèm trong đính kèm.
2. Sơ đồ chân và các kiểu đóng vỏ:
3. Lập trình giao tiếp:
/****************Chương trình giao tiếp IC DS18B20***************************/ void delay_18B20(unsigned int ti){ //delay us while(ti--); } void Init_18B20(void){ //Khởi tạo cảm biến DQ = 1; delay_18B20(8); DQ = 0; delay_18B20(65); DQ = 1; delay_18B20(20); } unsigned char ReadOneChar(void){ //Đọc 1 byte từ IC unsigned char i=0; unsigned char dat = 0; for (i=8;i>0;i--){ DQ = 0; dat>>=1; DQ = 1; if(DQ) dat |= 0x80; delay_18B20(4); } return(dat); } void WriteOneChar(unsigned char dat){ //Ghi một byte vào IC unsigned char i=0; for (i=8; i>0; i--){ DQ = 0; DQ = dat&0x01; delay_18B20(5); DQ = 1; dat>>=1; } } void ReadTemperature(void){ //Hàm đọc nhiệt độ lưu vào biến temp unsigned char a=0; unsigned char b=0; //EA=0; //Nếu có ngắt thì cấm ngắt để tránh ảnh hưởng quá trình giao tiếp Init_18B20(); WriteOneChar(0xCC); // Bỏ qua ROM WriteOneChar(0x44); delay_18B20(10); Init_18B20(); WriteOneChar(0xCC); WriteOneChar(0xBE); //Đọc nhiệt độ delay_18B20(10); a=ReadOneChar(); //Read temp low value b=ReadOneChar(); //Read temp high value temp=((b*256+a)>>4); //Giá trị nhiệt độ lưu vào biến temp //EA=1; //Đọc xong thì cho phép ngắt }//End code DS18B20
4. Mô phỏng giao tiếp với cảm biến
* Các bạn tải code đầy đủ và mô phỏng về trong File đính kèm....
Bạn chưa đăng nhập, không thể viết bình luận! Bấm vào đây để Đăng nhập hoặc Đăng ký!
Vũ Văn Thái lúc 17-05-2021, 16:48 @hieu27_02_00: Vòng lặp nhận bit về thôi, mỗi lần lặp là một lần dịch bit sang phải, sau đó đưa chân DQ=1 (8051 input pull up), kiểm tra chân DQ nếu DQ=1 thì dat |= 0x80 (lệnh OR bit), cuối cùng delay để qua vòng lặp bit tiếp theo, đủ 8bit là thoát vòng lặp.
hieu27_02_00 lúc 11-05-2021, 16:37 unsigned char ReadOneChar(void){ //Đọc 1 byte từ IC unsigned char i=0; unsigned char dat = 0; for (i=8;i>0;i--){ DQ = 0; dat>>=1; DQ = 1; if(DQ) dat |= 0x80; delay_18B20(4); } return(dat); Ở PHẦN NÀY EM CHƯA HIỂU LẮM A CÓ THỂ GIẢI THÍCH GIUPSEM VỚI Ạ
huy195 lúc 02-10-2017, 15:21 unsigned char ReadOneChar(void){ //Đọc 1 byte từ IC unsigned char i=0; unsigned char dat = 0; for (i=8;i>0;i--){ DQ = 0; dat>>=1; DQ = 1; if(DQ) dat |= 0x80; delay_18B20(4); } return(dat); ở phần này e chưa hiểu lắm,mong a giải thích dùm em em cảm ơn!!
trantrunghieuvt1995 lúc 03-05-2017, 22:40 Cho mình hỏi là sao file mô phỏng của bạn mình mở k được vậy?
bthanhkha lúc 22-04-2017, 00:08 Anh Thái cho e nhờ chút ak! giờ em muốn thêm nhiệt đột vào mạch này thì làm thế nào ak? kính mong anh trợ giúp CODE đây ak!
tuanan lúc 04-03-2016, 11:34 Khong thay file tai o dau!
Vũ Văn Thái lúc 04-03-2016, 13:02 Ngay trên chỗ bạn viết bình luận
notail lúc 14-08-2015, 21:56 bạn có thể giải thích hộ mình đoạn này được ko? for (i=8;i>0;i--){ DQ = 0; dat>>=1; DQ = 1; if(DQ) dat |= 0x80; delay_18B20(4); }
Vũ Văn Thái lúc 13-07-2015, 19:13 uk nhưng phải xử lý nó thì mới hiển thị được vì nó là số sau dấu phẩy
hoangtruonghl lúc 13-07-2015, 13:10 Vậy giờ muốn lấy cả phần thập phân thì bỏ đoạn >>4 đi phải ko bạn?
Vũ Văn Thái lúc 25-03-2015, 06:26 Do cảm biến của ta có độ phân giải 12bit mà ta lại chỉ cần 8bit lưu vào biến temp tức ta bỏ giá trị thập phân đi chỉ lấy phần nguyên, b*256 a là tính gộp 2 thanh ghi 8bit lại thành kiểu 16bit, tiếp đó dịch phải 4bit để lấy 8bit cao, bỏ 4bit thấp của 12bit dữ liệu, thì ta sẽ được giá trị nhiệt độ nguyên.