Digital Thermometer using LM35 and 8051 Microcontroller - Nhiệt kế kỹ thuật số sử dụng Vi điều khiển LM35 và 8051
Đô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 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.
Components Required:
- 8051 development board
- ADC0804 board
- 16*2 LCD display
- LM35 sensor
- Potentiometer
- Jumper wires
Circuit Diagram:
Đo nhiệt độ với 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.
Feature | 8051 | 8052 |
ROM (in bytes) | 4K | 8K |
RAM (bytes) | 128 | 256 |
Timers | 2 | 3 |
I/O pins | 32 | 32 |
Serial port | 1 | 1 |
Interrupt sources | 6 | 8
|
16x2 LCD:
Màn hình 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 sẽ được hiển thị trên màn hình LCD 16 * 2. Bảng dưới đây cho thấy mô tả chân của màn hình LCD 16 * 2.
Pin | Symbol | I/O | Description |
1 | Vss | - | Ground |
2 | Vdd | - | +5V power supply |
3 | Vee | - | Power supply to control contrast |
4 | RS | I | RS=0 for command register , RS=1 for data register |
5 | RW | I | R/W=0 for write , R/W=1 for read |
6 | E | I/O | Enable |
7 | D0 | I/O | 8-bit data bus(LSB) |
8 | D1 | I/O | 8-bit data bus |
9 | D2 | I/O | 8-bit data bus |
10 | D3 | I/O | 8-bit data bus |
11 | D4 | I/O | 8-bit data bus |
12 | D5 | I/O | 8-bit data bus |
13 | D6 | I/O | 8-bit data bus |
14 | D7 | I/O | 8-bit data bus(MSB) |
15 | A | - | +5V for backlight |
16 | K | - | Ground |
ADC0804 IC:
IC ADC0804 là bộ ADC song song 8 bit trong họ dòng ADC0800 của 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) | Step size (mV) |
open | 0 to 5 | 19.53 |
2.0 | 0 to 4 | 15.62 |
1.5 | 0 to 3 | 11.71 |
1.28 | 0 to 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 / step size
LM35 Temperature Sensor:
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 nên 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 được 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:
CODE:
/*this program is for displaying the temperature on 16*2 lcd display using 8051 microcontroller , LM35 sensor and ADC0804*/
#include<reg51.h>
sbit rs=P2^7; //Register Select(RS) pin of 16*2 lcd
sbit rw=P2^6; //Read/Write(RW) pin of 16*2 lcd
sbit en=P2^5; //Enable(E) pin of 16*2 lcd
sbit rd_adc=P3^0; //Read(RD) pin of ADC0804
sbit wr_adc=P3^1; //Write(WR) pin of ADC0804
sbit intr_adc=P3^2; //Interrupt(INTR) pin of ADC0804
void delay(unsigned int) ; //function for creating delay
void cmdwrt(unsigned char); //function for sending commands to 16*2 lcd display
void datawrt(unsigned char); //function for sending data to 16*2 lcd display
void convert_display(unsigned char); //function for converting ADC value to temperature and display it on 16*2 lcd display
void main(void) //main function
{
unsigned char i;
unsigned char cmd[]={0x38,0x01,0x06,0x0c,0x82};//16*2 lcd initialization commands
unsigned char data1[]="Temperature:";
unsigned char value;
P1=0xFF; //make Port 1 as input port
P0=0x00; //make Port 0 as output port
for(i=0;i<5;i++) //send commands to 16*2 lcd display one command at a time
{
cmdwrt(cmd[i]); //function call to send commands to 16*2 lcd display
delay(1);
}
for(i=0;i<12;i++) //send data to 16*2 lcd display one character at a time
{
datawrt(data1[i]); //function call to send data to 16*2 lcd display
delay(1);
}
intr_adc=1; //make INTR pin as input
rd_adc=1; //set RD pin HIGH
wr_adc=1; //set WR pin LOW
while(1) //repeat forever
{
wr_adc=0; //send LOW to HIGH pulse on WR pin
delay(1);
wr_adc=1;
while(intr_adc==1); //wait for End of Conversion
rd_adc=0; //make RD = 0 to read the data from ADC0804
value=P1; //copy ADC data
convert_display(value); //function call to convert ADC data into temperature and display it on 16*2 lcd display
delay(1000); //interval between every cycles
rd_adc=1; //make RD = 1 for the next cycle
}
}
void cmdwrt (unsigned char x)
{
P0=x; //send the command to Port 0 on which 16*2 lcd is connected
rs=0; //make RS = 0 for command
rw=0; //make RW = 0 for write operation
en=1; //send a HIGH to LOW pulse on Enable(E) pin to start commandwrite operation
delay(1);
en=0;
}
void datawrt (unsigned char y)
{
P0=y; //send the data to Port 0 on which 16*2 lcd is connected
rs=1; //make RS = 1 for command
rw=0; //make RW = 0 for write operation
en=1; //send a HIGH to LOW pulse on Enable(E) pin to start datawrite operation
delay(1);
en=0;
}
void convert_display(unsigned char value)
{
unsigned char x1,x2,x3;
cmdwrt(0xc6); //command to set the cursor to 6th position of 2nd line on 16*2 lcd
x1=(value/10); //divide the value by 10 and store quotient in variable x1
x1=x1+(0x30); //convert variable x1 to ascii by adding 0x30
x2=value%10; //divide the value by 10 and store remainder in variable x2
x2=x2+(0x30); //convert variable x2 to ascii by adding 0x30
x3=0xDF; //ascii value of degree(°) symbol
datawrt(x1); //display temperature on 16*2 lcd display
datawrt(x2);
datawrt(x3);
datawrt('C');
}
void delay(unsigned int z)
{
unsigned int p,q;
for(p=0;p<z;p++) //repeat for 'z' times
{
for(q=0;q<1375;q++); //repeat for 1375 times
}
}