때때로 사람들은 변동으로 인해 아날로그 온도계에서 온도를 읽는 것이 어렵다는 것을 알게됩니다. 그래서 여기 에서는 온도 측정에 LM35 센서 가 사용 되는 8051 마이크로 컨트롤러 를 사용하여 간단한 디지털 온도계 를 만들 것 입니다. 또한 LM35를 사용하여 Arduino, NodeMCU, PIC, Raspberry Pi 및 기타 마이크로 컨트롤러를 사용하여 디지털 온도계를 구축했습니다.
이 프로젝트는 또한 ADC0804와 8051 및 16 * 2 LCD와 8051 마이크로 컨트롤러의 적절한 인터페이스 역할을 할 것입니다.
필요한 구성 요소:
- 8051 개발 보드
- ADC0804 보드
- 16 * 2 LCD 디스플레이
- LM35 센서
- 전위차계
- 점퍼 와이어
회로도:
LM35를 사용 하는 디지털 온도계 회로의 회로도 는 다음과 같습니다.
8051을 사용하여 LM35로 온도 측정:
8051 마이크로 컨트롤러는 128 바이트 온칩 RAM, 4K 바이트 온칩 ROM, 2 개의 타이머, 1 개의 직렬 포트 및 4 개의 8 비트 포트가있는 8 비트 마이크로 컨트롤러입니다. 8052 마이크로 컨트롤러는 마이크로 컨트롤러의 확장입니다. 아래 표는 8051 가족 구성원의 비교를 보여줍니다.
특색 |
8051 |
8052 |
ROM (바이트) |
4K |
8K |
RAM (바이트) |
128 |
256 |
타이머 |
2 |
삼 |
I / O 핀 |
32 |
32 |
직렬 포트 |
1 |
1 |
인터럽트 소스 |
6 |
8 |
16x2 LCD:
16 * 2 LCD는 임베디드 애플리케이션에 널리 사용되는 디스플레이입니다. 다음은 16 * 2 LCD 디스플레이의 핀 및 작동에 대한 간략한 설명입니다. LCD 내부에는 두 개의 매우 중요한 레지스터가 있습니다. 데이터 레지스터와 명령 레지스터입니다. 명령 레지스터는 클리어 디스플레이, 집의 커서 등과 같은 명령을 보내는 데 사용되며 데이터 레지스터는 16 * 2 LCD에 표시 될 데이터를 보내는 데 사용됩니다. 아래 표는 16 * 2 LCD의 핀 설명입니다.
핀 |
상징 |
I / O |
기술 |
1 |
대 |
- |
바닥 |
2 |
Vdd |
- |
+ 5V 전원 공급 장치 |
삼 |
Vee |
- |
대비를 제어하는 전원 공급 장치 |
4 |
RS |
나는 |
명령 레지스터의 경우 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 명령 코드를 보여줍니다.
코드 (16 진수) |
기술 |
01 |
명확한 디스플레이 화면 |
06 |
커서 증가 (오른쪽 이동) |
0A |
디스플레이 꺼짐, 커서 켜짐 |
0C |
표시 켜기, 커서 끄기 |
0F |
에 표시, 커서 깜박임 |
80 |
커서를 첫 번째 줄의 시작 부분으로 이동 |
C0 |
커서를 두 번째 줄의 시작 부분으로 이동 |
38 |
2 줄 및 5 * 7 매트릭스 |
ADC0804 IC:
ADC0804 IC는 내셔널 세미 컨덕터의 ADC0800 시리즈의 가족의 8 비트 병렬 ADC이다. + 5V로 작동하며 해상도는 8 비트입니다. 단계 크기와 Vin 범위는 Vref / 2 값에 따라 다릅니다. 아래 표는 Vref / 2와 Vin 범위 사이의 관계를 보여줍니다.
Vref / 2 (V) |
빈 (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.28V에 연결되어 있으므로 스텝 크기는 10mV입니다. ADC0804의 경우 단계 크기는 (2 * Vref / 2) / 256으로 계산됩니다.
다음 공식은 출력 전압을 계산하는 데 사용됩니다.
Dout = Vin / 단계 크기
Dout이 10 진수로 디지털 데이터 출력 인 경우 Vin = 아날로그 입력 전압 및 단계 크기 (분해능)가 가장 작은 변화입니다. 여기에서 ADC0804에 대해 자세히 알아보고 8051과 ADC0808의 인터페이스도 확인하십시오.
LM35 온도 센서:
LM35는 출력 전압이 섭씨 온도에 선형 적으로 비례하는 온도 센서입니다. LM35는 이미 보정되어 있으므로 외부 보정이 필요하지 않습니다. 섭씨 온도마다 10mV를 출력합니다.
LM35 센서는 온도에 해당하는 전압을 생성합니다. 이 전압은 ADC0804에 의해 디지털 (0 ~ 256)로 변환되고 8051 마이크로 컨트롤러에 공급됩니다. 8051 마이크로 컨트롤러는이 디지털 값을 섭씨 온도로 변환합니다. 그런 다음이 온도는 표시하기에 적합한 ASCII 형식으로 변환됩니다. 이 ASCII 값은 화면에 온도를 표시하는 16 * 2 LCD에 입력됩니다. 이 프로세스는 지정된 간격 후에 반복됩니다.
다음은 8051을 사용 하는 LM35 디지털 온도계 의 설정 이미지입니다 .
여기에서 모든 LM35 기반 디지털 온도계를 찾을 수 있습니다.
코드 설명:
LM35를 사용 하는이 디지털 온도계에 대한 완전한 C 프로그램 은이 프로젝트의 마지막에 제공됩니다. 코드는 의미있는 작은 청크로 분할되어 아래에 설명되어 있습니다.
8051 마이크로 컨트롤러와 인터페이스하는 16 * 2 LCD의 경우 16 * 2 LCD가 8051 마이크로 컨트롤러에 연결되는 핀을 정의해야합니다. 16 * 2 lcd의 RS 핀은 P2.7에 연결되고 16 * 2 lcd의 RW 핀은 P2.6에 연결되고 16 * 2 lcd의 E 핀은 P2.5에 연결됩니다. 데이터 핀은 8051 마이크로 컨트롤러의 포트 0에 연결됩니다.
sbit rs = P2 ^ 7; // 16 * 2 lcd sbit의 Select (RS) 핀 등록 rw = P2 ^ 6; // 16 * 2 lcd sbit의 읽기 / 쓰기 (RW) 핀 en = P2 ^ 5; // 16 * 2 LCD의 Enable (E) 핀
마찬가지로 8051 마이크로 컨트롤러 와 인터페이싱 하는 ADC0804의 경우 ADC0804가 8051 마이크로 컨트롤러에 연결되는 핀을 정의해야합니다. ADC0804의 RD 핀은 P3.0에 연결되고 ADC0804의 WR 핀은 P3.1에 연결되고 ADC0804의 INTR 핀은 P3.2에 연결됩니다. 데이터 핀은 8051 마이크로 컨트롤러의 포트 1에 연결됩니다.
sbit rd_adc = P3 ^ 0; // ADC0804의 읽기 (RD) 핀 sbit wr_adc = P3 ^ 1; // ADC0804의 쓰기 (WR) 핀 sbit intr_adc = P3 ^ 2; // ADC0804의 인터럽트 (INTR) 핀
다음으로 프로그램에서 사용되는 몇 가지 기능 을 정의 해야합니다. 지연 함수는 지정된 지연 시간을 생성하는데 사용되며, C mdwrt 기능은 16 * 2 LCD 디스플레이에 명령을 전송하는데 사용된다 datawrt 기능은 16 * 2 LCD 디스플레이 및 데이터를 전송하기 위해 사용된다 convert_display의 온도로 ADC 데이터를 변환하는 데 사용되는 함수 16 * 2 LCD 디스플레이에 표시합니다.
무효 지연 (unsigned int); // 지연 생성 기능 void cmdwrt (unsigned char); // 16 * 2 LCD 디스플레이에 명령을 보내는 기능 void datawrt (unsigned char); // 16 * 2 LCD 디스플레이로 데이터를 보내는 기능 void convert_display (unsigned char); // ADC 값을 온도로 변환하여 16 * 2 LCD 디스플레이에 표시하는 기능
코드의 아래 부분에서 우리는 16 * 2 lcd에 명령을 보내고 있습니다. 디스플레이 지우기, 커서 증가, 커서를 첫 번째 줄의 시작으로 강제와 같은 명령 은 지정된 시간 지연 후 하나씩 16 * 2 LCD 디스플레이로 전송됩니다.
for (i = 0; i <5; i ++) // 16 * 2 LCD 디스플레이에 명령을 한 번에 하나씩 전송 {cmdwrt (cmd); // 16 * 2 LCD 디스플레이에 명령을 보내는 함수 호출 delay (1); }
코드의이 부분에서는 16 * 2 lcd로 데이터를 보냅니다. 16 * 2 LCD 디스플레이에 표시 될 데이터는 지정된 시간 지연 후 하나씩 표시되도록 전송됩니다.
for (i = 0; i <12; i ++) // 16 * 2 LCD 디스플레이에 한 번에 한 문자 씩 데이터 전송 {datawrt (data1); // 16 * 2 LCD 디스플레이에 데이터를 보내는 함수 호출 delay (1); } 코드의이 부분에서는 LM35 센서에서 생성 된 아날로그 전압을 디지털 데이터 로 변환 한 다음 온도로 변환하여 16 * 2 LCD 디스플레이에 표시합니다. ADC0804가 변환을 시작하려면 ADC0804의 WR 핀에서 로우에서 하이 펄스를 보내야하며 변환이 끝날 때까지 기다려야합니다. 변환이 끝나면 INTR이 낮아집니다. INTR이 낮아지면 RD가 낮아져 디지털 데이터를 8051 마이크로 컨트롤러의 포트 0에 복사합니다. 지정된 시간 지연 후 다음주기가 시작됩니다. 이 과정은 영원히 반복됩니다.
while (1) // 영원히 반복 {wr_adc = 0; // WR 핀 지연 (1); wr_adc = 1; while (intr_adc == 1); // 변환 종료 대기 rd_adc = 0; // ADC0804에서 데이터를 읽으려면 RD = 0으로 만듭니다. value = P1; // ADC 데이터 복사 convert_display (value); // ADC 데이터를 온도로 변환하여 16 * 2 LCD 디스플레이에 표시하는 함수 호출 delay (1000); // 모든 사이클 사이의 간격 rd_adc = 1; // 다음주기를 위해 RD = 1로 만듭니다.}
코드의 아래 부분에서 우리는 16 * 2 LCD 디스플레이에 명령을 보내고 있습니다. 이 명령은 8051 마이크로 컨트롤러의 포트 0에 복사됩니다. RS는 명령 쓰기를 위해 낮게 설정됩니다. 쓰기 작업을 위해 RW가 낮게 설정됩니다. 명령 쓰기 작업을 시작하기 위해 활성화 (E) 핀에 하이에서 로우 펄스가 적용됩니다.
void cmdwrt (unsigned char x) {P0 = x; // 16 * 2 LCD가 연결된 포트 0으로 명령을 보냅니다. rs = 0; // 명령에 대해 RS = 0으로 rw = 0; // 쓰기 작업을 위해 RW = 0으로 설정 en = 1; // 명령을 시작하기 위해 Enable (E) 핀에서 HIGH에서 LOW 펄스를 보냅니다. 쓰기 작업 지연 (1); en = 0; }
이 코드 부분에서는 16 * 2 LCD 디스플레이로 데이터를 전송합니다. 데이터는 8051 마이크로 컨트롤러의 포트 0에 복사됩니다. RS는 명령 쓰기를 위해 높게 설정됩니다. 쓰기 작업을 위해 RW가 낮게 설정됩니다. Enable (E) 핀에 High에서 Low 펄스가 적용되어 데이터 쓰기 작업을 시작합니다.
void datawrt (unsigned char y) {P0 = y; // 16 * 2 LCD가 연결된 포트 0으로 데이터 전송 rs = 1; // 명령에 대해 RS = 1로 rw = 0; // 쓰기 작업을 위해 RW = 0으로 설정 en = 1; // Enable (E) 핀에 HIGH에서 LOW 펄스를 전송하여 데이터 쓰기 작업을 시작합니다. delay (1); en = 0; }
코드의이 부분에서는 디지털 데이터를 온도로 변환 하여 16 * 2 LCD 디스플레이에 표시합니다.
void convert_display (unsigned char value) {unsigned char x1, x2, x3; cmdwrt (0xc6); // 16 * 2에서 두 번째 줄의 6 번째 위치로 커서를 설정하는 명령 lcd x1 = (value / 10); // 값을 10으로 나누고 몫을 변수 x1에 저장 x1 = x1 + (0x30); // 0x30을 추가하여 변수 x1을 ASCII로 변환 x2 = value % 10; // 값을 10으로 나누고 나머지를 변수 x2에 저장 x2 = x2 + (0x30); // 0x30 x3 = 0xDF를 추가하여 변수 x2를 ASCII로 변환합니다. //도 (°) 기호의 ASCII 값 datawrt (x1); // 16 * 2 LCD 디스플레이에 온도 표시 datawrt (x2); datawrt (x3); datawrt ('C'); }
또한 다른 마이크로 컨트롤러와 함께 LM35를 사용하는 다른 온도계를 확인하십시오.
- Arduino 및 LM35를 사용하는 디지털 온도계
- LM35 및 AVR 마이크로 컨트롤러를 사용한 온도 측정
- Raspberry Pi를 사용한 실내 온도 측정