DS18B20 เป็นเซ็นเซอร์วัดอุณหภูมิแบบดิจิทัลที่ใช้บัสไทม์มิ่งเดียวในการสื่อสารกับโฮสต์. เท่านั้น 1 จำเป็นต้องใช้สายไฟเพื่ออ่านข้อมูลอุณหภูมิให้สมบูรณ์;
DS18B20 มีหมายเลขซีเรียลผลิตภัณฑ์ 64 บิตในตัวเพื่อให้ระบุได้ง่าย. สามารถเชื่อมต่อเซ็นเซอร์ DS18B20 ได้หลายตัว 1 ลวด, และผ่านการตรวจสอบตัวตนแบบ 64 บิต, ข้อมูลอุณหภูมิที่รวบรวมจากเซ็นเซอร์ต่างๆ สามารถอ่านแยกกันได้.
ข้อมูลเบื้องต้นเกี่ยวกับ DS18B20
2.1 คุณสมบัติหลักของ DS18B20
1. การแปลงและเอาต์พุตอุณหภูมิแบบดิจิตอลเต็มรูปแบบ.
2. การสื่อสารข้อมูลบัสเดี่ยวขั้นสูง.
3. ความละเอียดสูงสุด 12 บิต, ด้วยความแม่นยำถึง ±0.5 องศาเซลเซียส.
4. รอบการทำงานสูงสุดที่ความละเอียด 12 บิตคือ 750 มิลลิวินาที.
5. สามารถเลือกโหมดการทำงานของปรสิตได้.
6. ช่วงอุณหภูมิการตรวจจับคือ –55° C ~+125° C (–67° ฟาเรนไฮต์ ~+257° ฟาเรนไฮต์).
7. อีพรอมในตัว, ฟังก์ชั่นปลุกขีดจำกัดอุณหภูมิ.
8. 64-bit photolithography rom, หมายเลขซีเรียลของผลิตภัณฑ์ในตัว, สะดวกสำหรับการเชื่อมต่อหลายเครื่อง.
9. แบบฟอร์มบรรจุภัณฑ์ต่างๆ, ปรับให้เข้ากับระบบฮาร์ดแวร์ต่างๆ.
2.2 ฟังก์ชั่นพิน DS18B20
กราวด์แรงดันไฟฟ้า GND;
DQ บัสข้อมูลเดี่ยว;
แรงดันไฟฟ้าของแหล่งจ่ายไฟ VDD;
NC พินเปล่า;
2.3 หลักการทำงานและการใช้งาน DS18B20
การตรวจจับอุณหภูมิ DS18B20 และเอาต์พุตข้อมูลดิจิทัลได้รับการบูรณาการอย่างสมบูรณ์ในชิปตัวเดียว, ดังนั้นจึงมีความสามารถในการป้องกันการรบกวนได้ดีขึ้น. วงจรการทำงานหนึ่งรอบสามารถแบ่งออกเป็นสองส่วน, ได้แก่การตรวจจับอุณหภูมิและการประมวลผลข้อมูล.
18B20 มีทรัพยากรหน่วยความจำสามรูปแบบ. พวกเขาคือ: หน่วยความจำ ROM แบบอ่านอย่างเดียว, ใช้สำหรับเก็บรหัส DS18B20ID; ครั้งแรก 8 บิตเป็นโค้ดชุดบรรทัดเดียว (รหัส DS18B20 คือ 19H), ต่อไปนี้ 48 บิตคือหมายเลขซีเรียลเฉพาะของชิป; สุดท้าย 8 บิตคือรหัส CRC (การตรวจสอบความซ้ำซ้อน) ของข้างต้น 56 บิต. ข้อมูลถูกตั้งค่าไว้ที่การใช้งานจริงและผู้ใช้ไม่สามารถเปลี่ยนแปลงได้. DS18B20 มีทั้งหมด 64 บิตของ ROM.
การลงทะเบียนข้อมูล RAM, ใช้สำหรับการคำนวณภายในและการเข้าถึงข้อมูล, ข้อมูลสูญหายหลังจากไฟฟ้าดับ, DS18B20 มีทั้งหมด 9 ไบต์ของ RAM, แต่ละไบต์คือ 8 บิต. ไบต์ที่หนึ่งและที่สองคือข้อมูลค่าข้อมูลหลังการแปลงอุณหภูมิ; ไบต์ที่สามและสี่คือภาพสะท้อนของ EEPROM ของผู้ใช้ (ที่ใช้กันทั่วไปสำหรับการจัดเก็บค่าการเตือนอุณหภูมิ). ค่าของมันจะถูกรีเฟรชเมื่อพลังงานถูกรีเซ็ต. ไบต์ที่ห้าคือภาพสะท้อนของ EEPROM ตัวที่สามของผู้ใช้. ที่ 6, 7ไทย, และไบต์ที่ 8 เป็นรีจิสเตอร์นับ, ซึ่งได้รับการออกแบบเพื่อให้ผู้ใช้สามารถรับความละเอียดของอุณหภูมิที่สูงขึ้น. นอกจากนี้ยังเป็นหน่วยจัดเก็บชั่วคราวสำหรับการแปลงและคำนวณอุณหภูมิภายใน. ไบต์ที่ 9 เป็นรหัส CRC ของไบต์แรก 8 ไบต์. EEPROM เป็นหน่วยความจำแบบไม่ลบเลือนซึ่งใช้ในการจัดเก็บข้อมูลที่ต้องบันทึกเป็นเวลานาน, ค่าสัญญาณเตือนอุณหภูมิบนและล่าง, และข้อมูลการตรวจสอบ. DS18B20 มีทั้งหมด 3 บิตของ EEPROM, และมีภาพสะท้อนใน RAM เพื่อความสะดวกในการใช้งานของผู้ใช้.
DS18B20 ทำงานในโหมดความละเอียด 12 บิตตามค่าเริ่มต้น. ข้อมูล 12 บิตที่ได้รับหลังการแปลงจะถูกจัดเก็บไว้ใน RAM 8 บิตสองตัวของ DS18B20 (สองไบต์แรก). ครั้งแรก 5 บิตในไบนารี่เป็นบิตเครื่องหมาย. หากอุณหภูมิที่วัดได้มีค่ามากกว่า 0, เหล่านี้ 5 บิตคือ 0. เพียงคูณค่าที่วัดได้ด้วย 0.0625 เพื่อรับอุณหภูมิที่แท้จริง. หากอุณหภูมิน้อยกว่า 0, เหล่านี้ 5 บิตคือ 1. ค่าที่วัดได้จะต้องกลับด้าน, เพิ่มโดย 1, แล้วคูณด้วย 0.0625 เพื่อรับอุณหภูมิที่แท้จริง. หรือใช้การดำเนินการบิตเพื่อแยกอุณหภูมิ: ตำแหน่งทศนิยมจะอยู่ด้านล่าง 4 บิต, และบิตบนเป็นบิตจำนวนเต็ม (ไม่นับจำนวนลบ).
2.4 ตารางคำแนะนำชิป ROM DS18B20
1. อ่านรอม [33ชม] (คำคำสั่งเลขฐานสิบหกอยู่ในวงเล็บเหลี่ยม).
คำสั่งนี้อนุญาตให้ตัวควบคุมบัสอ่าน ROM 64 บิตของ DS18B20. คำแนะนำนี้สามารถใช้ได้เมื่อมี DS18B20 เพียงตัวเดียวบนบัสเท่านั้น. หากมีการเชื่อมต่อมากกว่าหนึ่งรายการ, ข้อขัดแย้งของข้อมูลจะเกิดขึ้นระหว่างการสื่อสาร.
2. จับ ROM [55ชม]
คำสั่งนี้ตามด้วยหมายเลขซีเรียล 64 บิตที่ออกโดยคอนโทรลเลอร์. เมื่อมี DS18B20 หลายตัวบนบัส, เฉพาะชิปที่มีหมายเลขซีเรียลเดียวกันกับที่ออกโดยคอนโทรลเลอร์เท่านั้นที่สามารถตอบสนองได้, และชิปอื่นๆ จะรอการรีเซ็ตครั้งถัดไป. คำสั่งนี้เหมาะสำหรับการเชื่อมต่อแบบชิปตัวเดียวและหลายชิป.
3. ข้ามรอม [ซีซีเอช]
คำสั่งนี้ทำให้ชิปไม่ตอบสนองต่อรหัส ROM. ในกรณีที่มีรถโดยสารคันเดียว, คำแนะนำนี้สามารถใช้เพื่อประหยัดเวลา. หากใช้คำสั่งนี้เมื่อเชื่อมต่อชิปหลายตัว, ความขัดแย้งของข้อมูลจะเกิดขึ้น, ส่งผลให้เกิดข้อผิดพลาด.
4. ค้นหารอม [F0H]
หลังจากที่ชิปถูกเตรียมใช้งานแล้ว, คำแนะนำในการค้นหาช่วยให้สามารถระบุ ROM 64 บิตของอุปกรณ์ทั้งหมดได้โดยการกำจัดเมื่อชิปหลายตัวเชื่อมต่อกับบัส.
5. ค้นหาสัญญาณเตือน [แต่ละ]
ในกรณีที่มีชิปหลายตัว, คำแนะนำในการค้นหาชิปสัญญาณเตือนจะตอบสนองต่อชิปที่ตรงตามเงื่อนไขการเตือนที่มีอุณหภูมิสูงกว่า TH หรือน้อยกว่า TL เท่านั้น. ตราบใดที่ชิปไม่ได้ถูกปิด, สถานะสัญญาณเตือนจะคงอยู่จนกว่าจะวัดอุณหภูมิอีกครั้งและไม่ถึงเงื่อนไขของสัญญาณเตือน.
6. เขียน Scratchpad [4เอ๊ะ]
นี่คือคำสั่งในการเขียนข้อมูลลง RAM. ข้อมูลสองไบต์ที่เขียนในภายหลังจะถูกเก็บไว้ตามที่อยู่ 2 (TH ของ RAM ปลุก) และที่อยู่ 3 (TL ของ RAM สัญญาณเตือน). กระบวนการเขียนสามารถยุติได้ด้วยสัญญาณรีเซ็ต.
7. อ่านสแครชแพด (อ่านข้อมูลจาก RAM) [บีอีเอช]
คำสั่งนี้จะอ่านข้อมูลจาก RAM, เริ่มต้นจากที่อยู่ 0 และจนถึงที่อยู่ 9, เสร็จสิ้นการอ่านข้อมูล RAM ทั้งหมด. ชิปอนุญาตให้สัญญาณรีเซ็ตยุติกระบวนการอ่าน, นั่นคือ, ไบต์ที่ไม่จำเป็นตามมาสามารถละเว้นได้เพื่อลดเวลาในการอ่าน.
8. คัดลอก Scratchpad (คัดลอกข้อมูล RAM ไปยัง EEPROM) [48ชม]
คำสั่งนี้เก็บข้อมูลใน RAM ลงใน EEPROM เพื่อไม่ให้ข้อมูลสูญหายเมื่อปิดเครื่อง. เนื่องจากชิปยุ่งอยู่กับการประมวลผลการจัดเก็บข้อมูล EEPROM, เมื่อคอนโทรลเลอร์ส่งช่วงเวลาการอ่าน, เอาต์พุตบัส “0”, และเมื่องานจัดเก็บเสร็จสิ้น, บัสจะเอาท์พุต “1”.
ในโหมดการทำงานของปรสิต, ต้องใช้การดึงขึ้นอย่างแรงทันทีหลังจากออกคำสั่งนี้และบำรุงรักษาเป็นเวลาอย่างน้อย 10MS เพื่อรักษาการทำงานของชิป.
9. แปลงที (การแปลงอุณหภูมิ) [44ชม]
หลังจากได้รับคำสั่งนี้แล้ว, ชิปจะทำการแปลงอุณหภูมิและเก็บค่าอุณหภูมิที่แปลงแล้วไว้ในที่อยู่ที่ 1 และ 2 ของ RAM. เนื่องจากชิปยุ่งอยู่กับการประมวลผลการแปลงอุณหภูมิ, เมื่อคอนโทรลเลอร์ส่งช่วงเวลาการอ่าน, เอาต์พุตบัส “0”, และเมื่องานจัดเก็บเสร็จสิ้น, บัสจะเอาท์พุต “1”. ในโหมดการทำงานของปรสิต, ต้องใช้การดึงขึ้นที่แข็งแกร่งทันทีหลังจากออกคำสั่งนี้และบำรุงรักษาอย่างน้อย 500MS เพื่อรักษาการทำงานของชิป.
10. เรียกคืน EEPROM (คัดลอกค่าการเตือนใน EEPROM ไปยัง RAM) [B8H]
คำสั่งนี้จะคัดลอกค่าการเตือนใน EEPROM ไปยังไบต์ที่ 3 และ 4 ใน RAM. เนื่องจากชิปยุ่งอยู่กับการประมวลผลการคัดลอก, เมื่อคอนโทรลเลอร์ส่งช่วงเวลาการอ่าน, เอาต์พุตบัส “0”, และเมื่องานจัดเก็บเสร็จสิ้น, เอาต์พุตบัส “1”. นอกจากนี้, คำสั่งนี้จะดำเนินการโดยอัตโนมัติเมื่อชิปเปิดและรีเซ็ต. ทางนี้, บิตไบต์สัญญาณเตือนสองตัวใน RAM จะเป็นภาพสะท้อนของข้อมูลใน EEPROM เสมอ.
11. อ่านพาวเวอร์ซัพพลาย (สวิตช์โหมดการทำงาน) [B4H]
หลังจากออกคำสั่งนี้แล้ว, มีการออกช่องว่างเวลาในการอ่าน, และชิปจะส่งคืนคำสถานะพลังงาน. “0” คือสภาวะอำนาจปรสิตและ “1” คือสถานะพลังงานภายนอก.
2.5 DS18B20 แผนภาพเวลา
2.5.1 DS18B20 แผนภาพความสัมพันธ์การรีเซ็ตและการตอบสนอง
ต้องทำการรีเซ็ตก่อนการสื่อสารแต่ละครั้ง. เวลารีเซ็ต, รอเวลา, และเวลาตอบสนองควรตั้งโปรแกรมตามเวลาอย่างเคร่งครัด.
DS18B20 ช่องว่างเวลาอ่านและเขียน: การอ่านและการเขียนข้อมูล DS18B20 ได้รับการยืนยันโดยบิตประมวลผลช่องว่างเวลาและคำคำสั่งในการแลกเปลี่ยนข้อมูล.
2.5.2 เขียนข้อมูล 0 และข้อมูล 1 ถึง DS18B20
ในช่วง 15uS แรกของช่องว่างเวลาเขียนข้อมูล, the bus needs to be pulled low by the controller, and then it will be the chip sampling time for the bus data. The sampling time is 15~60uS. If the controller pulls the bus high during the sampling time, it means writing “1”, and if the controller pulls the bus low, it means writing “0”.
Each bit of transmission should have a low-level start bit of at least 15uS, and the subsequent data “0” หรือ “1” should be completed within 45uS.
The transmission time of the entire bit should be kept at 60~120uS, otherwise the normal communication cannot be guaranteed.
บันทึก: DS18B20 reads and writes data from the low bit.
2.5.3 Reading data 0 และข้อมูล 1 from DS18B20
The sampling time of the control during the read time gap should be more accurate. During the read time gap, โฮสต์จะต้องสร้างระดับต่ำอย่างน้อย 1uS เพื่อระบุเวลาเริ่มต้นการอ่าน. แล้ว, ใน 15uS หลังจากที่รถบัสถูกปล่อยออกมา, DS18B20 จะส่งบิตข้อมูลภายใน. ในเวลานี้, หากผู้ควบคุมพบว่าบัสสูง, มันหมายถึงการอ่าน “1”, และถ้ารถบัสต่ำ, มันหมายถึงการอ่านข้อมูล “0”. ก่อนจะอ่านทีละนิด, ตัวควบคุมจะเพิ่มสัญญาณเริ่มต้น.
บันทึก: ต้องอ่านบิตข้อมูลภายใน 15uS ของจุดเริ่มต้นของช่องว่างการอ่านเพื่อให้แน่ใจว่ามีการสื่อสารที่ถูกต้อง.
ในระหว่างการสื่อสาร, 8 บิตของ “0” หรือ “1” ถูกใช้เป็นไบต์, และการอ่านหรือการเขียนไบต์เริ่มต้นจากบิตต่ำ.
2.5.4 ลำดับการอ่านอุณหภูมิหนึ่งครั้ง (มี DS18B20 เพียงตัวเดียวบนรถบัส)
1. ส่งสัญญาณรีเซ็ต
2. ตรวจจับสัญญาณตอบสนอง
3. ส่ง 0xCC
4. ส่ง 0x44
5. ส่งสัญญาณรีเซ็ต
6. ตรวจจับสัญญาณตอบสนอง
7. เขียน 0xcc
8. เขียน 0xbe
9. วง 8 ครั้งเพื่ออ่านไบต์อุณหภูมิต่ำ
10. วง 8 ครั้งเพื่ออ่านไบต์ของอุณหภูมิที่สูง
11. สังเคราะห์ข้อมูลและกระบวนการอุณหภูมิ 16 บิต
3. รหัสไดร์เวอร์
3.1 DS18B20.ซี
#รวม “ds18b20.h”
/*
การทำงาน: การเริ่มต้น DS18B20
การเชื่อมต่อฮาร์ดแวร์: PB15
*/
เป็นโมฆะ DS18B20_Init(เป็นโมฆะ)
{
RCC->APB2ENR|=1<<3; //พีบี
GPIOB->ซีอาร์เอช&=0x0FFFFFFFF;
GPIOB->ซีอาร์เอช|=0x30000000;
GPIOB->โอดีอาร์|=1<<15; //ดึงขึ้น
}
/*
การทำงาน: ตรวจสอบว่ามีอุปกรณ์ DS18B20 อยู่หรือไม่
ส่งคืนค่า: 1 หมายความว่าไม่มีอุปกรณ์อยู่ 0 หมายถึงเครื่องเป็นปกติ
*/
u8 DS18B20_ตรวจสอบอุปกรณ์(เป็นโมฆะ) //ประกอบด้วยพัลส์รีเซ็ต, ชีพจรการตรวจจับ
{
DS18B20_OUTPUT_MODE();//เริ่มต้นเป็นโหมดเอาท์พุต
DS18B20_OUT=0; //สร้างพัลส์รีเซ็ต
ล่าช้าเรา(750); //สร้างระดับต่ำ 750us
DS18B20_OUT=1; //รถบัสปล่อย
ล่าช้าเรา(15); //รอการตอบกลับ DS18B20
ถ้า(DS18B20_CleckAck())//ตรวจจับชีพจรการดำรงอยู่
{
กลับ 1;
}
กลับ 0;
}
/*
การทำงาน: ตรวจจับชีพจรที่มีอยู่ของอุปกรณ์ DS18B20
ส่งคืนค่า: 1 บ่งชี้ถึงข้อผิดพลาด 0 แสดงว่าปกติ
*/
u8 DS18B20_CleckAck(เป็นโมฆะ)
{
u8 cnt=0;
DS18B20_INPUT_MODE();//เริ่มต้นเข้าสู่โหมดอินพุต
ในขณะที่(DS18B20_IN&&ซีเอ็นที<200) //รอพัลส์การมีอยู่ของการตอบสนอง DS18B20
{
ล่าช้าเรา(1);
ซีเอ็นที++;
}
ถ้า(ซีเอ็นที>=200)กลับ 1; //ข้อผิดพลาด
ซีเอ็นที=0;
ในขณะที่((!DS18B20_IN)&&ซีเอ็นที<240) //รอ DS18B20 ปล่อยรถบัส
{
ล่าช้าเรา(1);
ซีเอ็นที++;
}
ถ้า(ซีเอ็นที>=240)กลับ 1; //ข้อผิดพลาด
กลับ 0;
}
/*
การทำงาน: เขียนไบต์
ก่อนอื่นมาเรียนรู้วิธีการเขียนสักหน่อย.
*/
เป็นโมฆะ DS18B20_WriteByte(u8 ซม)
{
คุณ 8 ฉัน;
DS18B20_OUTPUT_MODE(); //เริ่มต้นเป็นโหมดเอาท์พุต
สำหรับ(ผม=0;ฉัน<8;ฉัน++)
{
DS18B20_OUT=0; //สร้างช่องว่างเวลาในการเขียน (เขียนเริ่มต้น)
ล่าช้าเรา(2);
DS18B20_OUT=ซม&0x01; //ส่งข้อมูลบิตจริง
ล่าช้าเรา(60); //รอให้เขียนเสร็จ
DS18B20_OUT=1; //ปล่อยรถบัสและเตรียมพร้อมสำหรับการส่งสัญญาณครั้งต่อไป
คำสั่ง>>=1; //ส่งข้อมูลบิตถัดไปต่อไป
}
}
/*
การทำงาน: อ่านไบต์
ขั้นแรกเรียนรู้วิธีการอ่านสักหน่อย.
*/
u8 DS18B20_ReadByte(เป็นโมฆะ)
{
คุณ 8 ฉัน,ข้อมูล=0;
สำหรับ(ผม=0;ฉัน<8;ฉัน++)
{
DS18B20_OUTPUT_MODE(); //เริ่มต้นเป็นโหมดเอาท์พุต
DS18B20_OUT=0; //สร้างช่องว่างเวลาในการอ่าน (เริ่มอ่าน)
ล่าช้าเรา(2);
DS18B20_OUT=1; //รถบัสปล่อย
DS18B20_INPUT_MODE(); //เริ่มต้นเข้าสู่โหมดอินพุต
ล่าช้าเรา(8); //รอเอาต์พุตข้อมูล DS18B20
ข้อมูล>>=1; //เติมสูงสักหน่อยด้วย 0, ค่าเริ่มต้นคือ 0
ถ้า(DS18B20_IN) ข้อมูล|=0x80;
ล่าช้าเรา(60);
DS18B20_OUT=1; //รถบัสปล่อย, รออ่านข้อมูลบิตถัดไป
}
ส่งคืนข้อมูล;
}
/*
การทำงาน: อ่านข้อมูลอุณหภูมิของ DS18B20 หนึ่งครั้ง
ส่งคืนค่า: อ่านข้อมูลอุณหภูมิแล้ว
พิจารณาสถานการณ์: มี DS18B20 เพียงตัวเดียวที่เชื่อมต่อกับบัส
*/
u16 DS18B20_อ่านอุณหภูมิ(เป็นโมฆะ)
{
U16 อุณหภูมิ=0;
u8 temp_H,อุณหภูมิ_L;
DS18B20_ตรวจสอบอุปกรณ์(); //ส่งพัลส์รีเซ็ต, ตรวจจับชีพจร
DS18B20_เขียนไบต์(0xCC); //ข้ามการตรวจจับลำดับ ROM
DS18B20_เขียนไบต์(0x44); //เริ่มการแปลงอุณหภูมิ
//รอให้การแปลงอุณหภูมิเสร็จสิ้น
ในขณะที่(DS18B20_ReadByte()!=0xFF){}
DS18B20_ตรวจสอบอุปกรณ์(); //ส่งพัลส์รีเซ็ต, ตรวจจับชีพจร
DS18B20_เขียนไบต์(0xCC); //ข้ามการตรวจจับลำดับ ROM
DS18B20_เขียนไบต์(0เอ็กซ์บีอี); //อ่านอุณหภูมิ
temp_L=DS18B20_ReadByte(); //อ่านข้อมูลอุณหภูมิต่ำ
temp_H=DS18B20_ReadByte(); //อ่านข้อมูลอุณหภูมิสูง
อุณหภูมิ=temp_L|(อุณหภูมิ_H<<8); //อุณหภูมิสังเคราะห์
อุณหภูมิขากลับ;
}
3.2 DS18B20.h
#ifndef DS18B20_H
#กำหนด DS18B20_H
#รวม “stm32f10x.h”
#รวม “ซิส.เอช”
#รวม “ความล่าช้า.h”
#รวม “ds18b20.h”
#รวม “usart.h”
/*อินเทอร์เฟซแพ็คเกจ*/
//เริ่มต้น DS18B20 ให้เป็นโหมดอินพุต
#กำหนด DS18B20_INPUT_MODE() {GPIOB->ซีอาร์เอช&=0x0FFFFFFFF;GPIOB->ซีอาร์เอช|=0x80000000;}
//เตรียมใช้งาน DS18B20 ให้เป็นโหมดเอาท์พุต
#กำหนด DS18B20_OUTPUT_MODE(){GPIOB->ซีอาร์เอช&=0x0FFFFFFFF;GPIOB->ซีอาร์เอช|=0x30000000;}
//DS18B20 เอาต์พุตพอร์ต IO
#กำหนด DS18B20_OUT PBout(15)
//อินพุตพอร์ต DS18B20 IO
#กำหนด DS18B20_IN PBin(15)
//ประกาศฟังก์ชั่น
u8 DS18B20_CleckAck(เป็นโมฆะ);
u8 DS18B20_ตรวจสอบอุปกรณ์(เป็นโมฆะ);
เป็นโมฆะ DS18B20_Init(เป็นโมฆะ);
u16 DS18B20_อ่านอุณหภูมิ(เป็นโมฆะ);
u8 DS18B20_ReadByte(เป็นโมฆะ);
เป็นโมฆะ DS18B20_WriteByte(u8 ซม);
#สิ้นสุด
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png
3.3 ฟังก์ชั่นการหน่วงเวลา
/*
การทำงาน: ความล่าช้าในตัวเรา
*/
เป็นโมฆะความล่าช้าเรา(มาหาเรา)
{
#ถ้าdef _SYSTICK_IRQ_
ฉัน,เจ;
สำหรับ(ผม=0;iVAL=0; //ค่าตัวนับ CNT
SysTick->โหลด=9*เรา; //9 หมายถึง 1us
SysTick->CTRL|=1<<0; //เริ่มจับเวลา
ทำ
{
tmp=SysTick->CTRL; //อ่านสถานะ
}ในขณะที่((!(ทีเอ็มพี&1<<16))&&(ทีเอ็มพี&1<<0));
SysTick->วาล=0; //ค่าตัวนับ CNT
SysTick->CTRL&-(1<<0); //ปิดตัวจับเวลา
#สิ้นสุด
};ฉัน++)>
3.4 main.c โทร DS18B20 เพื่ออ่านอุณหภูมิและพิมพ์ไปที่พอร์ตอนุกรม
#รวม “stm32f10x.h”
#รวม “ds18b20.h”
u8 DS18B20_ROM[8]; //เก็บรหัส ROM 64 บิตของ DS18B20
int หลัก(เป็นโมฆะ)
{
U16 อุณหภูมิ;
USARTx_ความร้อน(USART1,72,115200);//การเริ่มต้นพอร์ตอนุกรม 1
DS18B20_ความร้อน(); //การเริ่มต้น DS18B20
/*1. อ่านรหัส ROM 64 บิตของ DS18B20*/
//ส่งพัลส์รีเซ็ต, ตรวจจับชีพจรการดำรงอยู่
ในขณะที่(DS18B20_ตรวจสอบอุปกรณ์())
{
พิมพ์ฉ(“ไม่มีอุปกรณ์ DS18B20!\n”);
ความล่าช้านางสาว(500);
}
//ส่งคำสั่งให้อ่านโค้ด ROM 64 บิต
DS18B20_เขียนไบต์(0x33);
//วนรอบอ่านรหัส ROM 64 บิต
สำหรับ(ผม=0;ฉัน<8;ฉัน++)
{
DS18B20_ROM[ฉัน]= DS18B20_ReadByte();
พิมพ์ฉ(“DS18B20_ROM[%d]=0x%Xn”,ฉัน,DS18B20_ROM[ฉัน]);
}
ในขณะที่(1)
{
/*2. ใช้งาน DS18B20 ทั้งหมดบนบัสพร้อมกันเพื่อเริ่มการแปลงอุณหภูมิ*/
DS18B20_ตรวจสอบอุปกรณ์(); //ส่งพัลส์รีเซ็ต, ตรวจจับชีพจร
DS18B20_เขียนไบต์(0xCC); //ข้ามการตรวจจับลำดับ ROM
DS18B20_เขียนไบต์(0x44); //เริ่มการแปลงอุณหภูมิ (ให้ DS18B20 ทั้งหมดบนบัสแปลงอุณหภูมิ)
ความล่าช้านางสาว(500); //รอให้การแปลงอุณหภูมิ DS18B20 ทั้งหมดในบรรทัดเสร็จสมบูรณ์
/*3. การอ่านค่าอุณหภูมิแบบกำหนดเป้าหมายเดี่ยวของ DS18B20 แต่ละตัว*/
DS18B20_ตรวจสอบอุปกรณ์(); //ส่งพัลส์รีเซ็ต, ตรวจจับชีพจร
DS18B20_เขียนไบต์(0x55); //ส่งคำสั่งให้ตรงกับ ROM
สำหรับ(ผม=0;ฉัน<8;ฉัน++) //ส่งรหัส 64 บิต
{
DS18B20_เขียนไบต์(DS18B20_ROM[ฉัน]);
}
DS18B20_เขียนไบต์(0เอ็กซ์บีอี); //อ่านอุณหภูมิ
อุณหภูมิ=DS18B20_ReadByte(); //อ่านข้อมูลอุณหภูมิต่ำ
อุณหภูมิ|=DS18B20_ReadByte()<<8; //อ่านข้อมูลอุณหภูมิลำดับสูง
พิมพ์ฉ(“temp1=%d.%dn”,อุณหภูมิ>>4,อุณหภูมิ&0เอ็กซ์เอฟ);
พิมพ์ฉ(“temp2=%fn”,อุณหภูมิ*0.0625);
ความล่าช้านางสาว(500);
}
}
English
Afrikaans
العربية
বাংলা
bosanski jezik
Български
Català
粤语
中文(简体)
中文(漢字)
Hrvatski
Čeština
Nederlands
Eesti keel
Suomi
Français
Deutsch
Ελληνικά
हिन्दी; हिंदी
Magyar
Bahasa Indonesia
Italiano
日本語
한국어
Latviešu valoda
Lietuvių kalba
македонски јазик
Bahasa Melayu
Norsk
پارسی
Polski
Português
Română
Русский
Cрпски језик
Slovenčina
Slovenščina
Español
Svenska
ภาษาไทย
Türkçe
Українська
اردو
Tiếng Việt







