• Digital Thermometer using LM35 and 8051 Microcontroller

QC

Digital Thermometer using LM35 and 8051 Microcontroller

 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.


              Feature80518052
ROM (in bytes)4K8K
RAM (bytes)128256
Timers23
I/O pins3232
Serial port11
Interrupt sources68



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.

PinSymbolI/ODescription
1Vss-Ground
2Vdd-+5V power supply
3Vee-Power supply to control contrast
4RSIRS=0 for command register , RS=1 for data register
5RWIR/W=0 for write , R/W=1 for read
6EI/OEnable
7D0I/O8-bit data bus(LSB)
8D1I/O8-bit data bus
9D2I/O8-bit data bus
10D3I/O8-bit data bus
11D4I/O8-bit data bus
12D5I/O8-bit data bus
13D6I/O8-bit data bus
14D7I/O8-bit data bus(MSB)
15A-+5V for backlight
16K-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)
open0 to 519.53
2.00 to 415.62
1.50 to 311.71
1.280 to 2.5610

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
  }
}





Nap Code vào PY32F003 dùng Stlink

 Nap Code vào PY32F003 dùng Stlink Bước 1: Cài đặt  KeilC v5.39 theo link sau ( chú ý 5.39 keil c mới nạp ok). https://edge07.111.ir.cdn.ir/...