- Các thành phần bắt buộc:
- Sơ đồ mạch:
- Đo nhiệt độ bằng LM35 sử dụng 8051:
- LCD 16x2:
- IC ADC0804:
- Cảm biến nhiệt độ LM35:
- Giải thích mã:
Đôi khi mọi người cảm thấy khó khăn khi đọc nhiệt độ từ nhiệt kế tương tự vì sự dao động. Vì vậy, ở đây chúng ta sẽ xây dựng một nhiệt kế kỹ thuật số đơn giản sử dụng vi điều khiển 8051 trong đó cảm biến LM35 được sử dụng để đo nhiệt độ. Chúng tôi cũng đã sử dụng LM35 để xây dựng nhiệt kế kỹ thuật số sử dụng Arduino, NodeMCU, PIC, Raspberry Pi và các bộ vi điều khiển khác.
Dự án này cũng sẽ đóng vai trò là giao tiếp thích hợp của ADC0804 với 8051 và LCD 16 * 2 với vi điều khiển 8051.
Các thành phần bắt buộc:
- Ban phát triển 8051
- Bảng ADC0804
- Màn hình LCD 16 * 2
- Cảm biến LM35
- Chiết áp
- Dây nhảy
Sơ đồ mạch:
Sơ đồ mạch cho Mạch nhiệt kế kỹ thuật số sử dụng LM35 được đưa ra dưới đây:
Đo nhiệt độ bằng LM35 sử dụng 8051:
Vi điều khiển 8051 là vi điều khiển 8 bit có 128 byte RAM trên chip, 4K byte ROM trên chip, hai bộ định thời, một cổng nối tiếp và bốn cổng 8 bit. Vi điều khiển 8052 là một phần mở rộng của vi điều khiển. Bảng dưới đây cho thấy sự so sánh của các thành viên gia đình 8051.
Đặc tính |
8051 |
8052 |
ROM (tính bằng byte) |
4K |
8 nghìn |
RAM (byte) |
128 |
256 |
Hẹn giờ |
2 |
3 |
Chân I / O |
32 |
32 |
Cổng nối tiếp |
1 |
1 |
Nguồn gián đoạn |
6 |
số 8 |
LCD 16x2:
LCD 16 * 2 là màn hình được sử dụng rộng rãi cho các ứng dụng nhúng. Dưới đây là giải thích ngắn gọn về các chân và hoạt động của màn hình LCD 16 * 2. Có hai thanh ghi rất quan trọng bên trong màn hình LCD. Chúng là thanh ghi dữ liệu và thanh ghi lệnh. Thanh ghi lệnh được sử dụng để gửi các lệnh như hiển thị rõ ràng, con trỏ ở nhà, v.v., thanh ghi dữ liệu được sử dụng để gửi dữ liệu được hiển thị trên màn hình LCD 16 * 2. Bảng bên dưới hiển thị mô tả chân của màn hình LCD 16 * 2.
Ghim |
Biểu tượng |
I / O |
Sự miêu tả |
1 |
Vss |
- |
Đất |
2 |
Vdd |
- |
Nguồn điện + 5V |
3 |
Vee |
- |
Nguồn cung cấp để kiểm soát độ tương phản |
4 |
RS |
Tôi |
RS = 0 cho thanh ghi lệnh, RS = 1 cho thanh ghi dữ liệu |
5 |
RW |
Tôi |
R / W = 0 để ghi, R / W = 1 để đọc |
6 |
E |
I / O |
Kích hoạt |
7 |
D0 |
I / O |
Bus dữ liệu 8-bit (LSB) |
số 8 |
D1 |
I / O |
Xe buýt dữ liệu 8 bit |
9 |
D2 |
I / O |
Xe buýt dữ liệu 8 bit |
10 |
D3 |
I / O |
Xe buýt dữ liệu 8 bit |
11 |
D4 |
I / O |
Xe buýt dữ liệu 8 bit |
12 |
D5 |
I / O |
Xe buýt dữ liệu 8 bit |
13 |
D6 |
I / O |
Xe buýt dữ liệu 8 bit |
14 |
D7 |
I / O |
Bus dữ liệu 8 bit (MSB) |
15 |
A |
- |
+ 5V cho đèn nền |
16 |
K |
- |
Đất |
Bảng dưới đây hiển thị các mã lệnh LCD thường được sử dụng.
Mã (hex) |
Sự miêu tả |
01 |
Màn hình hiển thị rõ ràng |
06 |
Con trỏ tăng dần (dịch phải) |
0A |
Tắt hiển thị, bật con trỏ |
0C |
Bật hiển thị, tắt con trỏ |
0F |
Bật hiển thị, con trỏ nhấp nháy |
80 |
Buộc con trỏ đến đầu dòng thứ nhất |
C0 |
Buộc con trỏ đến đầu dòng thứ 2 |
38 |
2 dòng và ma trận 5 * 7 |
IC ADC0804:
Các ADC0804 IC là một 8-bit song song ADC trong gia đình của loạt ADC0800 từ National Semiconductor. Nó hoạt động với +5 volt và có độ phân giải 8bits. Kích thước bước và phạm vi Vin thay đổi đối với các giá trị khác nhau của Vref / 2. Bảng dưới đây cho thấy mối quan hệ giữa Vref / 2 và phạm vi Vin.
Vref / 2 (V) |
Vin (V) |
Kích thước bước (mV) |
mở |
0 đến 5 |
19,53 |
2.0 |
0 đến 4 |
15,62 |
1,5 |
0 đến 3 |
11,71 |
1,28 |
0 đến 2,56 |
10 |
Trong trường hợp của chúng tôi, Vref / 2 được kết nối với 1,28 volt, vì vậy kích thước bước là 10mV. Đối với kích thước bước ADC0804 được tính là (2 * Vref / 2) / 256.
Công thức sau được sử dụng để tính toán điện áp đầu ra:
Dout = Vin / kích thước bước
Trong đó Dout là đầu ra dữ liệu số ở dạng thập phân, Vin = điện áp đầu vào tương tự và kích thước bước (độ phân giải) là thay đổi nhỏ nhất. Tìm hiểu thêm về ADC0804 tại đây, cũng kiểm tra giao tiếp của ADC0808 với 8051.
Cảm biến nhiệt độ LM35:
LM35 là một cảm biến nhiệt độ có điện áp đầu ra tỷ lệ tuyến tính với nhiệt độ độ C. LM35 đã được hiệu chuẩn vì vậy không cần hiệu chuẩn bên ngoài. Nó tạo ra 10mV cho mỗi độ C.
Cảm biến LM35 tạo ra điện áp tương ứng với nhiệt độ. Điện áp này được chuyển đổi thành kỹ thuật số (0 đến 256) bởi ADC0804 và nó được cấp cho vi điều khiển 8051. Bộ vi điều khiển 8051 chuyển đổi giá trị kỹ thuật số này thành nhiệt độ theo độ C. Sau đó nhiệt độ này chuyển thành dạng ascii thích hợp để hiển thị. Giá trị ascii này được đưa vào màn hình LCD 16 * 2 hiển thị nhiệt độ trên màn hình của nó. Quá trình này được lặp lại sau khoảng thời gian xác định.
Dưới đây là hình ảnh thiết lập cho Nhiệt kế kỹ thuật số LM35 sử dụng 8051:
Bạn có thể tìm thấy tất cả các nhiệt kế kỹ thuật số dựa trên LM35 tại đây.
Giải thích mã:
Chương trình C hoàn chỉnh cho Nhiệt kế kỹ thuật số sử dụng LM35 này được đưa ra ở phần cuối của dự án này. Mã được chia thành các đoạn nhỏ có ý nghĩa và được giải thích bên dưới.
Đối với giao tiếp LCD 16 * 2 với vi điều khiển 8051, chúng ta phải xác định các chân mà trên đó LCD 16 * 2 được kết nối với vi điều khiển 8051. Chân RS của LCD 16 * 2 được kết nối với P2.7, chân RW của LCD 16 * 2 được kết nối với P2.6 và chân E của LCD 16 * 2 được kết nối với P2.5. Các chân dữ liệu được kết nối với cổng 0 của vi điều khiển 8051.
sbit rs = P2 ^ 7; // Đăng ký Chân chọn (RS) của 16 * 2 lcd sbit rw = P2 ^ 6; // Chân Đọc / Ghi (RW) của 16 * 2 lcd sbit en = P2 ^ 5; // Bật chân (E) của màn hình LCD 16 * 2
Tương tự, đối với giao tiếp ADC0804 với vi điều khiển 8051, chúng ta phải xác định các chân mà ADC0804 được kết nối với vi điều khiển 8051. Chân RD của ADC0804 được kết nối với P3.0, chân WR của ADC0804 được kết nối với P3.1 và chân INTR của ADC0804 được kết nối với P3.2. Các chân dữ liệu được kết nối với cổng 1 của vi điều khiển 8051.
sbit rd_adc = P3 ^ 0; // Đọc chân (RD) của ADC0804 sbit wr_adc = P3 ^ 1; // Ghi (WR) pin ADC0804 sbit intr_adc = P3 ^ 2; // Chân ngắt (INTR) của ADC0804
Tiếp theo chúng ta phải xác định một số hàm được sử dụng trong chương trình. Hàm Delay được sử dụng để tạo độ trễ thời gian cụ thể, hàm c mdwrt được sử dụng để gửi lệnh đến màn hình LCD 16 * 2, hàm datawrt được sử dụng để gửi dữ liệu đến màn hình LCD 16 * 2 và hàm convert_display được sử dụng để chuyển đổi dữ liệu ADC thành nhiệt độ và hiển thị nó trên màn hình LCD 16 * 2.
void delay (unsigned int); // hàm tạo delay void cmdwrt (unsigned char); // hàm gửi lệnh đến màn hình LCD 16 * 2 void datawrt (unsigned char); // hàm gửi dữ liệu ra màn hình LCD 16 * 2 void convert_display (unsigned char); // chức năng chuyển đổi giá trị ADC thành nhiệt độ và hiển thị trên màn hình LCD 16 * 2
Trong phần bên dưới của mã, chúng tôi đang gửi lệnh đến màn hình LCD 16 * 2. Các lệnh như hiển thị rõ ràng, con trỏ tăng dần, buộc con trỏ đến đầu dòng thứ nhất sẽ lần lượt được gửi đến màn hình LCD 16 * 2 sau một số thời gian trễ được chỉ định.
for (i = 0; i <5; i ++) // gửi lệnh đến màn hình LCD 16 * 2 hiển thị từng lệnh một {cmdwrt (cmd); // lệnh gọi hàm để gửi lệnh đến độ trễ hiển thị lcd 16 * 2 (1); }
Trong phần này của mã, chúng tôi đang gửi dữ liệu đến màn hình LCD 16 * 2. Dữ liệu được hiển thị trên màn hình LCD 16 * 2 được gửi đến hiển thị từng cái một sau một thời gian trễ nhất định.
for (i = 0; i <12; i ++) // gửi dữ liệu đến màn hình LCD 16 * 2 hiển thị một ký tự tại một thời điểm {datawrt (data1); // lệnh gọi hàm gửi dữ liệu đến độ trễ hiển thị lcd 16 * 2 (1); } Trong phần này của mã, chúng tôi đang chuyển đổi điện áp tương tự do cảm biến LM35 tạo ra thành dữ liệu kỹ thuật số và sau đó nó được chuyển đổi thành nhiệt độ và hiển thị trên màn hình LCD 16 * 2. Để ADC0804 bắt đầu chuyển đổi, chúng ta phải gửi xung từ thấp đến cao trên chân WR của ADC0804, sau đó chúng ta phải đợi kết thúc chuyển đổi. INTR trở nên thấp khi kết thúc chuyển đổi. Khi INTR trở nên thấp, RD được đặt ở mức thấp để sao chép dữ liệu số vào cổng 0 của vi điều khiển 8051. Sau một khoảng thời gian trễ nhất định, chu kỳ tiếp theo sẽ bắt đầu. Quá trình này được lặp lại mãi mãi.
while (1) // lặp lại mãi mãi {wr_adc = 0; // gửi xung LOW đến HIGH trên chân WR delay (1); wr_adc = 1; while (intr_adc == 1); // đợi Kết thúc chuyển đổi rd_adc = 0; // làm cho RD = 0 để đọc dữ liệu từ ADC0804 value = P1; // sao chép dữ liệu ADC convert_display (value); // lệnh gọi hàm để chuyển đổi dữ liệu ADC thành nhiệt độ và hiển thị trên màn hình LCD 16 * 2 delay (1000); // khoảng thời gian giữa mọi chu kỳ rd_adc = 1; // tạo RD = 1 cho chu kỳ tiếp theo}
Trong phần bên dưới của mã, chúng tôi đang gửi các lệnh đến màn hình LCD 16 * 2. Lệnh được sao chép vào cổng 0 của vi điều khiển 8051. RS được đặt ở mức thấp để ghi lệnh. RW được đặt ở mức thấp cho hoạt động ghi. Xung từ cao xuống thấp được áp dụng trên chân bật (E) để bắt đầu thao tác ghi lệnh.
void cmdwrt (unsigned char x) {P0 = x; // gửi lệnh đến Cổng 0 trên đó 16 * 2 lcd được kết nối rs = 0; // tạo RS = 0 cho lệnh rw = 0; // tạo RW = 0 cho hoạt động ghi en = 1; // gửi xung HIGH đến LOW trên chân Enable (E) để bắt đầu trì hoãn thao tác ghi lệnh (1); vi = 0; }
Trong phần này của mã, chúng tôi đang gửi dữ liệu đến màn hình LCD 16 * 2. Dữ liệu được sao chép vào cổng 0 của vi điều khiển 8051. RS được tạo ra ở mức cao để ghi lệnh. RW được đặt ở mức thấp cho hoạt động ghi. Xung từ cao xuống thấp được áp dụng trên chân bật (E) để bắt đầu thao tác ghi dữ liệu.
void datawrt (unsigned char y) {P0 = y; // gửi dữ liệu đến Cổng 0 trên đó 16 * 2 lcd được kết nối rs = 1; // tạo RS = 1 cho lệnh rw = 0; // tạo RW = 0 cho hoạt động ghi en = 1; // gửi xung HIGH đến LOW trên chân Enable (E) để bắt đầu trì hoãn thao tác ghi dữ liệu (1); vi = 0; }
Trong phần này của mã, chúng tôi đang chuyển đổi dữ liệu kỹ thuật số thành nhiệt độ và hiển thị nó trên màn hình LCD 16 * 2.
void convert_display (unsigned char value) {unsigned char x1, x2, x3; cmdwrt (0xc6); // lệnh đặt con trỏ đến vị trí thứ 6 của dòng thứ 2 trên 16 * 2 lcd x1 = (value / 10); // chia giá trị cho 10 và lưu thương vào biến x1 x1 = x1 + (0x30); // chuyển biến x1 thành ascii bằng cách thêm 0x30 x2 = value% 10; // chia giá trị cho 10 và lưu phần dư vào biến x2 x2 = x2 + (0x30); // chuyển biến x2 thành ascii bằng cách thêm 0x30 x3 = 0xDF; // giá trị ascii của biểu tượng độ (°) datawrt (x1); // hiển thị nhiệt độ trên màn hình LCD 16 * 2 datawrt (x2); datawrt (x3); datawrt ('C'); }
Ngoài ra, hãy kiểm tra các nhiệt kế khác sử dụng LM35 với các bộ vi điều khiển khác nhau:
- Nhiệt kế kỹ thuật số sử dụng Arduino và LM35
- Đo nhiệt độ sử dụng LM35 và Vi điều khiển AVR
- Đo nhiệt độ phòng với Raspberry Pi