- ส่วนประกอบที่ต้องการ:
- แผนภูมิวงจรรวม:
- การวัดอุณหภูมิด้วย LM35 โดยใช้ 8051:
- 16x2 LCD:
- ADC0804 IC:
- LM35 เซ็นเซอร์อุณหภูมิ:
- คำอธิบายรหัส:
บางครั้งผู้คนพบว่าการอ่านอุณหภูมิจากเทอร์โมมิเตอร์อนาล็อกเป็นเรื่องยากเนื่องจากมีความผันผวน ดังนั้นที่นี่เราจะสร้างเครื่องวัดอุณหภูมิแบบดิจิตอลอย่างง่ายโดยใช้ไมโครคอนโทรลเลอร์ 8051 ซึ่งใช้เซ็นเซอร์ LM35ในการวัดอุณหภูมิ เรายังใช้ LM35 เพื่อสร้างเทอร์โมมิเตอร์ดิจิตอลโดยใช้ Arduino, NodeMCU, PIC, Raspberry Pi และไมโครคอนโทรลเลอร์อื่น ๆ
โครงการนี้จะทำหน้าที่เชื่อมต่อ ADC0804 กับ 8051 และ 16 * 2 LCD กับไมโครคอนโทรลเลอร์ 8051 อย่างเหมาะสม
ส่วนประกอบที่ต้องการ:
- 8051 คณะกรรมการพัฒนาการ
- ADC0804 บอร์ด
- จอ LCD 16 * 2
- เซ็นเซอร์ LM35
- โพเทนชิออมิเตอร์
- สายจัมเปอร์
แผนภูมิวงจรรวม:
แผนภาพวงจรสำหรับวงจร ดิจิตอลเทอร์โมมิเตอร์โดยใช้ LM35 แสดง ไว้ด้านล่าง:
การวัดอุณหภูมิด้วย LM35 โดยใช้ 8051:
ไมโครคอนโทรลเลอร์ 8051 เป็นไมโครคอนโทรลเลอร์ 8 บิตซึ่งมี 128 ไบต์บนชิป RAM, 4K ไบต์ของชิป ROM, ตัวจับเวลาสองตัว, พอร์ตอนุกรมหนึ่งพอร์ตและพอร์ต 8 บิตสี่พอร์ต ไมโครคอนโทรลเลอร์ 8052 เป็นส่วนขยายของไมโครคอนโทรลเลอร์ ตารางด้านล่างแสดงการเปรียบเทียบสมาชิกในครอบครัว 8051 คน
ลักษณะเฉพาะ |
8051 |
8052 |
ROM (เป็นไบต์) |
4K |
8K |
RAM (ไบต์) |
128 |
256 |
ตัวจับเวลา |
2 |
3 |
หมุด I / O |
32 |
32 |
พอร์ตอนุกรม |
1 |
1 |
ขัดจังหวะแหล่งที่มา |
6 |
8 |
16x2 LCD:
16 * 2 LCD เป็นจอแสดงผลที่ใช้กันอย่างแพร่หลายสำหรับแอพพลิเคชั่นฝังตัว นี่คือคำอธิบายสั้น ๆ เกี่ยวกับพินและการทำงานของจอ LCD 16 * 2 มีการลงทะเบียนที่สำคัญมากสองรายการภายในจอ LCD เป็นทะเบียนข้อมูลและลงทะเบียนคำสั่ง ลงทะเบียนคำสั่งใช้ในการส่งคำสั่งเช่นการแสดงผลที่ชัดเจนเคอร์เซอร์ที่บ้านเป็นต้นการลงทะเบียนข้อมูลใช้ในการส่งข้อมูลซึ่งจะแสดงบนจอ LCD 16 * 2 ตารางด้านล่างแสดงคำอธิบายพินของจอ LCD 16 * 2
พิน |
สัญลักษณ์ |
I / O |
คำอธิบาย |
1 |
Vss |
- |
พื้น |
2 |
Vdd |
- |
+ แหล่งจ่ายไฟ 5V |
3 |
วี |
- |
แหล่งจ่ายไฟเพื่อควบคุมความคมชัด |
4 |
อาร์เอส |
ผม |
RS = 0 สำหรับการลงทะเบียนคำสั่ง RS = 1 สำหรับการลงทะเบียนข้อมูล |
5 |
RW |
ผม |
R / W = 0 สำหรับเขียน R / W = 1 สำหรับการอ่าน |
6 |
จ |
I / O |
เปิดใช้งาน |
7 |
D0 |
I / O |
บัสข้อมูล 8 บิต (LSB) |
8 |
D1 |
I / O |
บัสข้อมูล 8 บิต |
9 |
D2 |
I / O |
บัสข้อมูล 8 บิต |
10 |
D3 |
I / O |
บัสข้อมูล 8 บิต |
11 |
D4 |
I / O |
บัสข้อมูล 8 บิต |
12 |
D5 |
I / O |
บัสข้อมูล 8 บิต |
13 |
D6 |
I / O |
บัสข้อมูล 8 บิต |
14 |
D7 |
I / O |
บัสข้อมูล 8 บิต (MSB) |
15 |
ก |
- |
+ 5V สำหรับแบ็คไลท์ |
16 |
เค |
- |
พื้น |
ตารางด้านล่างแสดงรหัสคำสั่ง LCD ที่ใช้บ่อย
รหัส (ฐานสิบหก) |
คำอธิบาย |
01 |
หน้าจอแสดงผลชัดเจน |
06 |
เคอร์เซอร์ที่เพิ่มขึ้น (เลื่อนไปทางขวา) |
0A |
ปิดการแสดงเคอร์เซอร์เปิด |
0C |
แสดงเปิดเคอร์เซอร์ปิด |
0F |
แสดงเคอร์เซอร์กะพริบ |
80 |
บังคับเคอร์เซอร์ไปยังจุดเริ่มต้นของ 1 เซนต์บรรทัด |
C0 |
บังคับเคอร์เซอร์ไปยังจุดเริ่มต้นที่ 2 ครั้งที่บรรทัด |
38 |
2 บรรทัดและ 5 * 7 เมทริกซ์ |
ADC0804 IC:
ADC0804 ICเป็น ADC ขนาน 8 บิตในครอบครัวของชุด ADC0800 จากชาติเซมิคอนดักเตอร์ ใช้งานได้กับ +5 โวลต์และมีความละเอียด 8 บิต ขนาดขั้นตอนและช่วง Vin แตกต่างกันไปสำหรับค่า Vref / 2 ที่แตกต่างกัน ตารางด้านล่างแสดงความสัมพันธ์ระหว่างช่วง Vref / 2 และ Vin
Vref / 2 (วี) |
วิน (V) |
ขนาดขั้นตอน (mV) |
เปิด |
0 ถึง 5 |
19.53 |
2.0 |
0 ถึง 4 |
15.62 |
1.5 |
0 ถึง 3 |
11.71 |
1.28 |
0 ถึง 2.56 |
10 |
ในกรณีของเรา Vref / 2 เชื่อมต่อกับ 1.28 โวลต์ดังนั้นขนาดขั้นตอนคือ 10mV สำหรับขนาดขั้นบันได ADC0804 คำนวณเป็น (2 * Vref / 2) / 256
สูตรต่อไปนี้ใช้ในการคำนวณแรงดันขาออก:
Dout = Vin / ขนาดขั้นตอน
โดยที่ Dout เป็นเอาต์พุตข้อมูลดิจิทัลในรูปทศนิยม Vin = แรงดันไฟฟ้าอินพุตแบบอะนาล็อกและขนาดขั้นตอน (ความละเอียด) เป็นการเปลี่ยนแปลงที่น้อยที่สุด เรียนรู้เพิ่มเติมเกี่ยวกับ ADC0804 ที่นี่และตรวจสอบการเชื่อมต่อของ ADC0808 กับ 8051
LM35 เซ็นเซอร์อุณหภูมิ:
LM35 เป็นเซ็นเซอร์อุณหภูมิที่มีแรงดันขาออกเป็นสัดส่วนเชิงเส้นกับอุณหภูมิเซลเซียส LM35 ได้รับการปรับเทียบแล้วจึงไม่จำเป็นต้องมีการสอบเทียบภายนอก เอาต์พุต 10mV สำหรับแต่ละองศาเซลเซียสอุณหภูมิ
เซ็นเซอร์ LM35 สร้างแรงดันไฟฟ้าที่สอดคล้องกับอุณหภูมิ แรงดันไฟฟ้านี้ถูกแปลงเป็นดิจิตอล (0 ถึง 256) โดย ADC0804 และป้อนให้กับไมโครคอนโทรลเลอร์ 8051 ไมโครคอนโทรลเลอร์ 8051 แปลงค่าดิจิตอลนี้เป็นอุณหภูมิในองศาเซลเซียส จากนั้นอุณหภูมินี้จะถูกแปลงเป็นรูปแบบ ascii ซึ่งเหมาะสำหรับการแสดงผล ค่า ascii นี้ป้อนให้กับจอ LCD 16 * 2 ซึ่งจะแสดงอุณหภูมิบนหน้าจอ กระบวนการนี้จะทำซ้ำหลังจากช่วงเวลาที่กำหนด
ด้านล่างนี้คือภาพการตั้งค่าสำหรับ เครื่องวัดอุณหภูมิดิจิตอล LM35 โดยใช้ 8051:
คุณสามารถค้นหาเทอร์โมมิเตอร์ดิจิตอลที่ใช้ LM35 ทั้งหมดได้ที่นี่
คำอธิบายรหัส:
โปรแกรม C ที่สมบูรณ์สำหรับเครื่องวัดอุณหภูมิดิจิตอลนี้โดยใช้ LM35มีให้ในตอนท้ายของโครงการนี้ รหัสจะแบ่งออกเป็นส่วนเล็ก ๆ ที่มีความหมายและอธิบายไว้ด้านล่าง
สำหรับการเชื่อมต่อ LCD 16 * 2 กับไมโครคอนโทรลเลอร์ 8051 เราต้องกำหนดพินที่จอ LCD 16 * 2 เชื่อมต่อกับไมโครคอนโทรลเลอร์ 8051 ขา RS ของจอ LCD 16 * 2 เชื่อมต่อกับ P2.7, ขา RW ของจอ LCD 16 * 2 เชื่อมต่อกับ P2.6 และขา E ของ 16 * 2 lcd เชื่อมต่อกับ P2 พินข้อมูลเชื่อมต่อกับพอร์ต 0 ของไมโครคอนโทรลเลอร์ 8051
sbit rs = P2 ^ 7; // ลงทะเบียนพิน Select (RS) ของ 16 * 2 lcd sbit rw = P2 ^ 6; // อ่าน / เขียน (RW) พินของ 16 * 2 lcd sbit en = P2 ^ 5; // เปิดใช้งานพิน (E) ของจอ LCD 16 * 2
ในทำนองเดียวกันสำหรับADC0804 ที่เชื่อมต่อกับไมโครคอนโทรลเลอร์8051เราต้องกำหนดพินที่ ADC0804 เชื่อมต่อกับไมโครคอนโทรลเลอร์ 8051 ขา RD ของ ADC0804 เชื่อมต่อกับ P3.0 พิน WR ของ ADC0804 เชื่อมต่อกับ P3.1 และขา INTR ของ ADC0804 เชื่อมต่อกับ P3.2 พินข้อมูลเชื่อมต่อกับพอร์ต 1 ของไมโครคอนโทรลเลอร์ 8051
sbit rd_adc = P3 ^ 0; // อ่าน (RD) พินของ ADC0804 sbit wr_adc = P3 ^ 1; // เขียน (WR) พินของ ADC0804 sbit intr_adc = P3 ^ 2; // พินอินเทอร์รัปต์ (INTR) ของ ADC0804
ต่อไปเราจะต้องกำหนดฟังก์ชั่นบางอย่างที่ใช้ในโปรแกรม ฟังก์ชัน หน่วงเวลา ใช้เพื่อสร้างการหน่วงเวลาที่ระบุฟังก์ชันc mdwrt ใช้เพื่อส่งคำสั่งไปยังจอแสดงผล LCD 16 * 2 ฟังก์ชัน datawrt ใช้เพื่อส่งข้อมูลไปยังจอแสดงผล LCD 16 * 2 และฟังก์ชัน convert_display ใช้เพื่อแปลงข้อมูล ADC เป็นอุณหภูมิ และเพื่อแสดงบนจอ LCD ขนาด 16 * 2
ความล่าช้าเป็นโมฆะ (int ไม่ได้ลงนาม); // ฟังก์ชันสำหรับสร้างความล่าช้าเป็นโมฆะ cmdwrt (ถ่านที่ไม่ได้ลงชื่อ); // ฟังก์ชั่นสำหรับส่งคำสั่งไปยังจอ LCD 16 * 2 void datawrt (ถ่านที่ไม่ได้ลงชื่อ) // ฟังก์ชั่นสำหรับส่งข้อมูลไปยังจอ LCD 16 * 2 โมฆะ convert_display (ถ่านที่ไม่ได้ลงชื่อ) // ฟังก์ชั่นสำหรับการแปลงค่า ADC เป็นอุณหภูมิและแสดงบนจอ LCD 16 * 2
ในส่วนด้านล่างของรหัสที่เราจะส่งคำสั่งไปยัง 16 * 2 จอแอลซีดี คำสั่งดังกล่าวเป็นจอแสดงผลที่ชัดเจนเคอร์เซอร์เพิ่มขึ้นบังคับเคอร์เซอร์ไปยังจุดเริ่มต้นของ 1 เซนต์สายจะถูกส่งไป 16 * 2 จอแสดงผล LCD หนึ่งโดยหนึ่งหลังจากที่ล่าช้าบางเวลาที่ระบุไว้
สำหรับ (i = 0; i <5; i ++) // ส่งคำสั่งไปยังจอ LCD 16 * 2 แสดงทีละคำสั่ง {cmdwrt (cmd); // เรียกใช้ฟังก์ชันเพื่อส่งคำสั่งไปยังจอแสดงผล LCD 16 * 2 ล่าช้า (1); }
ในส่วนของรหัสนี้เราจะส่งข้อมูลไปยัง 16 * 2 จอแอลซีดีข้อมูลที่จะแสดงบนจอ LCD 16 * 2 จะถูกส่งไปแสดงทีละรายการหลังจากการหน่วงเวลาที่กำหนด
สำหรับ (i = 0; i <12; i ++) // ส่งข้อมูลไปยังจอ LCD 16 * 2 แสดงทีละอักขระ {datawrt (data1); // เรียกใช้ฟังก์ชันเพื่อส่งข้อมูลไปยังจอแสดงผล LCD 16 * 2 ล่าช้า (1); } ในส่วนนี้ของรหัสเรากำลังแปลงแรงดันไฟฟ้าอะนาล็อกที่ผลิตโดยเซ็นเซอร์ LM35 เป็นข้อมูลดิจิทัลจากนั้นจะถูกแปลงเป็นอุณหภูมิและแสดงบนจอ LCD ขนาด 16 * 2 เพื่อให้ ADC0804 เริ่มต้นการแปลงเราต้องส่งพัลส์ต่ำไปสูงบน WR พินของ ADC0804 จากนั้นเราต้องรอให้สิ้นสุดการแปลง INTR จะต่ำเมื่อสิ้นสุดการแปลง เมื่อ INTR ต่ำ RD จะถูกทำให้ต่ำเพื่อคัดลอกข้อมูลดิจิทัลไปยังพอร์ต 0 ของไมโครคอนโทรลเลอร์ 8051 หลังจากการหน่วงเวลาที่กำหนดรอบถัดไปจะเริ่มขึ้น กระบวนการนี้จะทำซ้ำตลอดไป
ในขณะที่ (1) // ทำซ้ำตลอดไป {wr_adc = 0; // ส่งพัลส์ LOW ถึง HIGH เมื่อ WR พินดีเลย์ (1); wr_adc = 1; ในขณะที่ (intr_adc == 1); // รอให้สิ้นสุดการแปลง rd_adc = 0; // ทำให้ RD = 0 เพื่ออ่านข้อมูลจากค่า ADC0804 = P1; // คัดลอกข้อมูล ADC convert_display (ค่า); // เรียกใช้ฟังก์ชันเพื่อแปลงข้อมูล ADC เป็นอุณหภูมิและแสดงบนจอ LCD 16 * 2 ล่าช้า (1,000); // ช่วงเวลาระหว่างทุกรอบ rd_adc = 1; // สร้าง RD = 1 สำหรับรอบถัดไป}
ในส่วนล่างของโค้ดเรากำลังส่งคำสั่งไปยังจอแสดงผล LCD 16 * 2 คำสั่งถูกคัดลอกไปยังพอร์ต 0 ของไมโครคอนโทรลเลอร์ 8051 RS ถูกทำให้ต่ำสำหรับการเขียนคำสั่ง RW ถูกทำให้ต่ำสำหรับการเขียน ใช้พัลส์สูงถึงต่ำบนพินเปิดใช้งาน (E) เพื่อเริ่มดำเนินการเขียนคำสั่ง
เป็นโมฆะ cmdwrt (ถ่าน x ที่ไม่ได้ลงชื่อ) {P0 = x; // ส่งคำสั่งไปที่พอร์ต 0 ซึ่งเชื่อมต่อจอ LCD 16 * 2 rs = 0; // สร้าง RS = 0 สำหรับคำสั่ง rw = 0; // สร้าง RW = 0 สำหรับการเขียน en = 1; // ส่งพัลส์ HIGH ถึง LOW บนพิน Enable (E) เพื่อเริ่ม commandwrite operation delay (1); th = 0; }
ในส่วนนี้ของรหัสเรากำลังส่งข้อมูลไปยังจอแสดงผล LCD 16 * 2 ข้อมูลจะถูกคัดลอกไปยังพอร์ต 0 ของไมโครคอนโทรลเลอร์ 8051 RS ถูกสร้างให้สูงสำหรับการเขียนคำสั่ง RW ถูกทำให้ต่ำสำหรับการเขียน ใช้พัลส์สูงถึงต่ำบนพินเปิดใช้งาน (E) เพื่อเริ่มการดำเนินการเขียนข้อมูล
เป็นโมฆะ datawrt (ถ่าน y ที่ไม่ได้ลงชื่อ) {P0 = y; // ส่งข้อมูลไปยังพอร์ต 0 ซึ่งเชื่อมต่อจอ LCD 16 * 2 rs = 1; // สร้าง RS = 1 สำหรับคำสั่ง rw = 0; // สร้าง RW = 0 สำหรับการเขียน en = 1; // ส่งพัลส์ HIGH ถึง LOW บนพิน Enable (E) เพื่อเริ่มการหน่วงเวลาการดำเนินการ datawrite (1); th = 0; }
ในส่วนนี้ของรหัสเรากำลังแปลงข้อมูลดิจิทัลเป็นอุณหภูมิและแสดงบนจอ LCD ขนาด 16 * 2
โมฆะ convert_display (ค่าถ่านที่ไม่ได้ลงชื่อ) {ถ่านที่ไม่ได้ลงชื่อ x1, x2, x3; cmdwrt (0xc6); // คำสั่งกำหนดเคอร์เซอร์ไปที่ตำแหน่งที่ 6 ของบรรทัดที่ 2 บน 16 * 2 lcd x1 = (ค่า / 10); // หารค่าด้วย 10 และเก็บผลหารในตัวแปร x1 x1 = x1 + (0x30); // แปลงตัวแปร x1 เป็น ascii โดยเพิ่ม 0x30 x2 = ค่า% 10; // หารค่าด้วย 10 และเก็บส่วนที่เหลือในตัวแปร x2 x2 = x2 + (0x30); // แปลงตัวแปร x2 เป็น ascii โดยเพิ่ม 0x30 x3 = 0xDF; // ค่า ascii ของสัญลักษณ์ degree (°) datawrt (x1); // แสดงอุณหภูมิบนจอแสดงผล LCD 16 * 2 datawrt (x2); datawrt (x3); datawrt ('C'); }
ตรวจสอบเทอร์มอมิเตอร์อื่น ๆ โดยใช้ LM35 กับไมโครคอนโทรลเลอร์ที่แตกต่างกัน:
- เครื่องวัดอุณหภูมิดิจิตอลโดยใช้ Arduino และ LM35
- การวัดอุณหภูมิโดยใช้ไมโครคอนโทรลเลอร์ LM35 และ AVR
- การวัดอุณหภูมิห้องด้วย Raspberry Pi