- Необходимые компоненты:
- Принципиальная электрическая схема:
- Измерение температуры с помощью LM35 с использованием 8051:
- ЖК-дисплей 16x2:
- ADC0804 IC:
- Датчик температуры LM35:
- Объяснение кода:
Иногда людям трудно считывать температуру с аналогового термометра из-за колебаний. Итак, здесь мы собираемся построить простой цифровой термометр с использованием микроконтроллера 8051, в котором датчик LM35 используется для измерения температуры. Мы также использовали LM35 для создания цифрового термометра с использованием Arduino, NodeMCU, PIC, Raspberry Pi и других микроконтроллеров.
Этот проект также будет служить надлежащим интерфейсом ADC0804 с 8051 и 16 * 2 LCD с микроконтроллером 8051.
Необходимые компоненты:
- 8051 совет по развитию
- Плата ADC0804
- ЖК-дисплей 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 |
Контакты ввода / вывода |
32 |
32 |
Серийный порт |
1 |
1 |
Источники прерывания |
6 |
8 |
ЖК-дисплей 16x2:
ЖК-дисплей 16 * 2 широко используется для встраиваемых приложений. Вот краткое объяснение контактов и работы ЖК-дисплея 16 * 2. Внутри ЖК-дисплея есть два очень важных регистра. Это регистр данных и регистр команд. Регистр команд используется для отправки команд, таких как четкое отображение, курсор в исходном положении и т. Д., Регистр данных используется для отправки данных, которые должны отображаться на ЖК-дисплее 16 * 2. В таблице ниже показано описание контактов ЖК-дисплея 16 * 2.
Штырь |
Условное обозначение |
Ввод / вывод |
Описание |
1 |
Vss |
- |
Земля |
2 |
Vdd |
- |
+ 5В питание |
3 |
Ви |
- |
Блок питания для контроля контрастности |
4 |
RS |
я |
RS = 0 для регистра команд, RS = 1 для регистра данных |
5 |
RW |
я |
R / W = 0 для записи, R / W = 1 для чтения |
6 |
E |
Ввод / вывод |
включить |
7 |
D0 |
Ввод / вывод |
8-битная шина данных (LSB) |
8 |
D1 |
Ввод / вывод |
8-битная шина данных |
9 |
D2 |
Ввод / вывод |
8-битная шина данных |
10 |
D3 |
Ввод / вывод |
8-битная шина данных |
11 |
D4 |
Ввод / вывод |
8-битная шина данных |
12 |
D5 |
Ввод / вывод |
8-битная шина данных |
13 |
D6 |
Ввод / вывод |
8-битная шина данных |
14 |
D7 |
Ввод / вывод |
8-битная шина данных (MSB) |
15 |
А |
- |
+ 5В для подсветки |
16 |
K |
- |
Земля |
В таблице ниже показаны часто используемые коды команд ЖК-дисплея.
Код (шестнадцатеричный) |
Описание |
01 |
Очистить экран дисплея |
06 |
Курсор увеличения (сдвиг вправо) |
0A |
Дисплей выключен, курсор включен |
0C |
Дисплей включен, курсор выключен |
0F |
Дисплей включен, курсор мигает |
80 |
Переместить курсор в начало 1- й строки |
C0 |
Переместить курсор в начало 2- й строки |
38 |
2 строки и матрица 5 * 7 |
ADC0804 IC:
ADC0804 IC представляет собой 8-разрядный параллельный АЦП в семействе серии ADC0800 от National Semiconductor. Он работает с напряжением +5 В и имеет разрешение 8 бит. Размер шага и диапазон Vin варьируются для разных значений Vref / 2. В таблице ниже показано соотношение между диапазоном Vref / 2 и Vin.
Vref / 2 (В) |
Вин (V) |
Размер шага (мВ) |
открытый |
От 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 В, поэтому размер шага составляет 10 мВ. Для ADC0804 размер шага рассчитывается как (2 * Vref / 2) / 256.
Для расчета выходного напряжения используется следующая формула:
Dout = Vin / размер шага
Где Dout - вывод цифровых данных в десятичном формате, Vin = напряжение аналогового входа, а размер шага (разрешение) - наименьшее изменение. Узнайте больше об ADC0804 здесь, также проверьте взаимодействие ADC0808 с 8051.
Датчик температуры LM35:
LM35 - это датчик температуры, выходное напряжение которого линейно пропорционально температуре по Цельсию. LM35 поставляется уже откалиброванным, поэтому не требует внешней калибровки. Он выдает 10 мВ для каждого градуса Цельсия.
Датчик LM35 выдает напряжение, соответствующее температуре. Это напряжение преобразуется в цифровое (от 0 до 256) с помощью ADC0804 и подается на микроконтроллер 8051. Микроконтроллер 8051 преобразует это цифровое значение в температуру в градусах Цельсия. Затем эта температура преобразуется в формат ascii, который подходит для отображения. Эти значения ascii подаются на ЖК-дисплей 16 * 2, который отображает температуру на своем экране. Этот процесс повторяется через указанный интервал.
Ниже приведено изображение настройки цифрового термометра LM35 с использованием 8051:
Здесь вы можете найти все цифровые термометры на базе LM35.
Объяснение кода:
Полная программа на языке C для этого цифрового термометра с использованием LM35 приведена в конце этого проекта. Код разбит на небольшие значимые фрагменты и объяснен ниже.
Для сопряжения ЖК-дисплея 16 * 2 с микроконтроллером 8051 необходимо определить контакты, на которых ЖК-дисплей 16 * 2 подключен к микроконтроллеру 8051. Вывод RS 16 * 2 ЖК-дисплея подключен к P2.7, контакт RW 16 * 2 ЖК-дисплея подключен к P2.6, а вывод E 16 * 2 ЖК-дисплея подключен к P2.5. Контакты данных подключены к порту 0 микроконтроллера 8051.
сбит rs = P2 ^ 7; // Выбор регистра (RS) вывода 16 * 2 ЖК-бит rw = P2 ^ 6; // Чтение / запись (RW) вывода 16 * 2 lcd sbit en = P2 ^ 5; // Включаем вывод (E) 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 используется для отправки команд на ЖК-дисплей 16 * 2, функция datawrt используется для отправки данных на ЖК-дисплей 16 * 2, а функция convert_display используется для преобразования данных АЦП в температуру и отобразить его на ЖК-дисплее 16 * 2.
недействительная задержка (беззнаковое целое); // функция для создания задержки void cmdwrt (unsigned char); // функция отправки команд на жк-дисплей 16 * 2 void datawrt (unsigned char); // функция отправки данных на жк-дисплей 16 * 2 void convert_display (unsigned char); // функция для преобразования значения АЦП в температуру и отображения ее на ЖК-дисплее 16 * 2
В приведенной ниже части кода мы отправляем команды на ЖК-дисплей 16 * 2. Такие команды, как очистка дисплея, увеличение курсора, перевод курсора в начало 1- й строки, отправляются на ЖК-дисплей 16 * 2 по одной после некоторой заданной задержки.
for (i = 0; i <5; i ++) // отправляем команды на 16 * 2 ЖК-дисплей отображает по одной команде за раз {cmdwrt (cmd); // вызов функции для отправки команд на жк-дисплей 16 * 2 delay (1); }
В этой части кода мы отправляем данные на ЖК-дисплей 16 * 2. Данные, которые должны отображаться на ЖК-дисплее 16 * 2, отправляются на отображение одно за другим после некоторой заданной задержки.
for (i = 0; i <12; i ++) // отправляем данные на ЖК-дисплей 16 * 2 отображать по одному символу за раз {datawrt (data1); // вызов функции для отправки данных на жк-дисплей 16 * 2 delay (1); } В этой части кода мы преобразуем аналоговое напряжение, создаваемое датчиком LM35, в цифровые данные, а затем оно преобразуется в температуру и отображается на ЖК-дисплее 16 * 2. Чтобы ADC0804 начал преобразование, мы должны послать импульс низкого уровня в высокий на вывод WR ADC0804, а затем дождаться окончания преобразования. В конце преобразования INTR становится низким. Как только INTR становится низким, RD становится низким, чтобы скопировать цифровые данные в порт 0 микроконтроллера 8051. По истечении указанного времени начинается следующий цикл. Этот процесс повторяется вечно.
while (1) // повторять бесконечно {wr_adc = 0; // отправляем импульс от LOW к HIGH на выводе WR delay (1); wr_adc = 1; а (intr_adc == 1); // ждем окончания преобразования rd_adc = 0; // сделаем RD = 0 для чтения данных из ADC0804 value = P1; // копирование данных АЦП convert_display (value); // вызов функции для преобразования данных АЦП в температуру и отображения ее на ЖК-дисплее 16 * 2 delay (1000); // интервал между циклами rd_adc = 1; // делаем RD = 1 для следующего цикла}
В приведенной ниже части кода мы отправляем команды на ЖК-дисплей 16 * 2. Команда копируется в порт 0 микроконтроллера 8051. RS устанавливается на низкий уровень для записи команды. RW становится низким для операции записи. На вывод включения (E) подается импульс от высокого к низкому, чтобы начать операцию записи команды.
void cmdwrt (unsigned char x) {P0 = x; // отправляем команду на порт 0, к которому подключен ЖК-дисплей 16 * 2 rs = 0; // делаем RS = 0 для команды rw = 0; // делаем RW = 0 для операции записи en = 1; // посылаем импульс от высокого к низкому на вывод Enable (E), чтобы запустить операцию записи команды delay (1); en = 0; }
В этой части кода мы отправляем данные на ЖК-дисплей 16 * 2. Данные копируются в порт 0 микроконтроллера 8051. RS устанавливается в высокий уровень для записи команды. RW становится низким для операции записи. На вывод включения (E) подается импульс от высокого к низкому, чтобы начать операцию записи данных.
void datawrt (unsigned char y) {P0 = y; // отправляем данные в порт 0, к которому подключен ЖК-дисплей 16 * 2 rs = 1; // делаем RS = 1 для команды rw = 0; // делаем RW = 0 для операции записи en = 1; // посылаем импульс от высокого до низкого на вывод Enable (E), чтобы начать операцию записи данных delay (1); en = 0; }
В этой части кода мы преобразуем цифровые данные в температуру и отображаем ее на ЖК-дисплее 16 * 2.
void convert_display (значение символа без знака) {символ без знака x1, x2, x3; cmdwrt (0xc6); // команда для установки курсора в 6-ю позицию 2-й строки на ЖК-дисплее 16 * 2 x1 = (value / 10); // делим значение на 10 и сохраняем частное в переменной x1 x1 = x1 + (0x30); // конвертируем переменную x1 в ascii, добавляя 0x30 x2 = value% 10; // делим значение на 10 и сохраняем остаток в переменной x2 x2 = x2 + (0x30); // конвертируем переменную x2 в ascii, добавляя 0x30 x3 = 0xDF; // значение ascii градуса (°) символа datawrt (x1); // отображение температуры на жк-дисплее 16 * 2 datawrt (x2); datawrt (x3); datawrt ('C'); }
Также проверьте другие термометры с использованием LM35 с разными микроконтроллерами:
- Цифровой термометр с использованием Arduino и LM35
- Измерение температуры с помощью микроконтроллера LM35 и AVR
- Измерение комнатной температуры с помощью Raspberry Pi