- Необходими компоненти:
- Електрическа схема:
- Измерване на температурата с LM35 с помощта на 8051:
- 16x2 LCD:
- ADC0804 IC:
- LM35 Температурен сензор:
- Обяснение на кода:
Понякога хората се затрудняват да разчитат температурата от аналоговия термометър поради колебания. И така, тук ще изградим обикновен цифров термометър, използващ 8051 микроконтролер, в който LM35 сензор се използва за измерване на температурата. Също така използвахме LM35 за изграждане на цифров термометър, използвайки Arduino, NodeMCU, PIC, Raspberry Pi и други микроконтролери.
Този проект ще служи и за правилно свързване на ADC0804 с 8051 и 16 * 2 LCD с 8051 микроконтролер.
Необходими компоненти:
- 8051 съвет за разработка
- ADC0804 дъска
- 16 * 2 LCD дисплей
- LM35 сензор
- Потенциометър
- Джъмперни проводници
Електрическа схема:
Схема на верига за цифров термометър, използваща LM35, е дадена по-долу:
Измерване на температурата с LM35 с помощта на 8051:
8051 микроконтролер е 8-битов микроконтролер, който има 128 байта чип RAM, 4K байта чип ROM, два таймера, един сериен порт и четири 8 битови порта. Микроконтролерът 8052 е продължение на микроконтролера. Таблицата по-долу показва сравнението на 8051 членове на семейството.
Особеност |
8051 |
8052 |
ROM (в байтове) |
4K |
8K |
RAM (байтове) |
128 |
256 |
Таймери |
2 |
3 |
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 |
Vss |
- |
Земя |
2 |
Vdd |
- |
+ 5V захранване |
3 |
Вее |
- |
Захранване за контрол на контраста |
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 |
A |
- |
+ 5V за подсветка |
16. |
К |
- |
Земя |
Таблицата по-долу показва често използвани LCD кодове за команди.
Код (шестнадесетичен) |
Описание |
01 |
Ясен дисплей |
06 |
Курс за увеличаване (смяна вдясно) |
0А |
Дисплеят е изключен, курсорът е включен |
0С |
Дисплеят включен, курсорът изключен |
0F |
Дисплеят е включен, курсорът мига |
80 |
Принудете курсора до началото на 1- ви ред |
С0 |
Принудете курсора до началото на 2- ри ред |
38 |
2 реда и матрица 5 * 7 |
ADC0804 IC:
В ADC0804 IC е на 8-битов паралелен ADC в семейството на серията ADC0800 от National Semiconductor. Работи с +5 волта и има разделителна способност 8 бита. Размерът на стъпката и диапазонът на Vin варират за различните стойности на Vref / 2. Таблицата по-долу показва връзката между Vref / 2 и Vin диапазон.
Vref / 2 (V) |
Vin (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,28 волта, така че размерът на стъпката е 10mV. За ADC0804 размерът на стъпката се изчислява като (2 * Vref / 2) / 256.
За изчисляване на изходното напрежение се използва следната формула:
Dout = Vin / размер на стъпка
Когато Dout е цифрово извеждане на данни в десетичен знак, Vin = аналогово входно напрежение и размерът на стъпка (резолюция) е най-малката промяна. Научете повече за ADC0804 тук, също така проверете взаимодействието на ADC0808 с 8051.
LM35 Температурен сензор:
LM35 е температурен сензор, чието изходно напрежение е линейно пропорционално на температурата на Целзий. LM35 е вече калибриран, поради което не се изисква външно калибриране. Извежда 10mV за всеки градус от температурата на Целзий.
LM35 сензорът произвежда напрежение, съответстващо на температурата. Това напрежение се преобразува в цифрово (0 до 256) от ADC0804 и се подава към 8051 микроконтролер. Микроконтролерът 8051 преобразува тази цифрова стойност в температура в градуси по Целзий. След това тази температура се преобразува в ascii форма, която е подходяща за показване. Тези ascii стойности се подават на 16 * 2 lcd, което показва температурата на своя екран. Този процес се повтаря след определен интервал.
По-долу е изображението за настройка на цифровия термометър LM35, използващ 8051:
Можете да намерите всички цифрови термометри на базата на LM35 тук.
Обяснение на кода:
Пълната програма C за този цифров термометър, използващ LM35, е дадена в края на този проект. Кодът е разделен на малки смислени парчета и е обяснен по-долу.
За 16 * 2 LCD взаимодействие с 8051 микроконтролер, ние трябва да дефинираме щифтове, на които 16 * 2 lcd е свързан към 8051 микроконтролер. RS щифт от 16 * 2 lcd е свързан към P2.7, RW щифт от 16 * 2 lcd е свързан към P2.6 и E щифт от 16 * 2 lcd е свързан към P2.5. Пиновете за данни са свързани към порт 0 на микроконтролера 8051.
sbit rs = P2 ^ 7; // ПИН за регистрация за избор (RS) от 16 * 2 lcd sbit rw = P2 ^ 6; // Четене / запис (RW) щифт от 16 * 2 lcd sbit en = P2 ^ 5; // Активиране (E) щифт от 16 * 2 lcd
По същия начин, за 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 lcd дисплей, функцията datawrt се използва за изпращане на данни до 16 * 2 lcd дисплей и функцията convert_display се използва за преобразуване на ADC данните в температура и да го покажете на 16 * 2 lcd дисплей.
забавяне на празнотата (неподписан int); // функция за създаване на забавяне void cmdwrt (неподписан знак); // функция за изпращане на команди до 16 * 2 lcd display void datawrt (неподписан знак); // функция за изпращане на данни на 16 * 2 lcd дисплей void convert_display (неподписан знак); // функция за преобразуване на стойността на ADC в температура и я показва на 16 * 2 lcd дисплей
В долната част на кода изпращаме команди на 16 * 2 lcd. Команди като изчистване на дисплея, увеличаване на курсора, принуждаване на курсора до началото на 1- ви ред се изпращат на дисплей 16 * 2 lcd един по един след известно зададено време.
за (i = 0; i <5; i ++) // изпращане на команди до 16 * 2 lcd показва по една команда по едно {cmdwrt (cmd); // извикване на функция за изпращане на команди до закъснение на дисплея 16 * 2 lcd (1); }
В тази част от кода ние изпращаме данни на 16 * 2 lcd. Данните, които трябва да бъдат показани на 16 * 2 lcd дисплей, се изпращат, за да се покажат един по един след известно определено закъснение.
за (i = 0; i <12; i ++) // изпращане на данни на 16 * 2 lcd показва по един символ {datawrt (data1); // извикване на функция за изпращане на данни до 16 * 2 lcd display delay (1); } В тази част от кода преобразуваме аналоговото напрежение, произведено от сензора LM35, в цифрови данни и след това то се преобразува в температура и се показва на 16 * 2 lcd дисплей. За да започне преобразуването ADC0804, трябва да изпратим нисък до висок импулс на WR щифт на ADC0804, след което трябва да изчакаме края на преобразуването. INTR става нисък в края на преобразуването. След като INTR стане ниско, RD се намалява, за да копира цифровите данни към порт 0 на микроконтролера 8051. След определено закъснение започва следващият цикъл. Този процес се повтаря завинаги.
while (1) // повтаряме завинаги {wr_adc = 0; // изпращаме LOW до HIGH импулс при WR pin delay (1); wr_adc = 1; докато (intr_adc == 1); // изчакваме края на преобразуването rd_adc = 0; // направете RD = 0, за да прочетете данните от ADC0804 value = P1; // копиране на ADC данни convert_display (стойност); // извикване на функция за преобразуване на ADC данни в температура и показване при 16 * 2 lcd display delay (1000); // интервал между всеки цикъл rd_adc = 1; // направете RD = 1 за следващия цикъл}
В долната част на кода изпращаме команди на 16 * 2 lcd дисплей. Командата се копира на порт 0 на микроконтролера 8051. RS е намален за запис на команди. RW е намален за операция на запис. Силен до нисък импулс се прилага на щифта за активиране (E), за да стартира операцията за запис на команда.
void cmdwrt (неподписан знак x) {P0 = x; // изпращаме командата към порт 0, на който е свързан 16 * 2 lcd rs = 0; // направете RS = 0 за команда rw = 0; // правим RW = 0 за операция по запис en = 1; // изпращаме импулс HIGH to LOW на щифт Enable (E), за да стартираме забавяне на операцията за писане на команди (1); en = 0; }
В тази част от кода изпращаме данни на 16 * 2 lcd дисплей. Данните се копират в порт 0 на микроконтролера 8051. RS е направен високо за писане на команди. RW е намален за операция на запис. Силен до нисък импулс се прилага на щифта за активиране (E), за да стартира операцията по запис на данни.
void datawrt (неподписан знак y) {P0 = y; // изпращаме данните към порт 0, към който е свързан 16 * 2 lcd rs = 1; // направете RS = 1 за команда rw = 0; // правим RW = 0 за операция по запис en = 1; // изпращаме HIGH to LOW импулс на щифт Enable (E) за стартиране на забавяне на операцията за запис на данни (1); en = 0; }
В тази част на кода преобразуваме цифровите данни в температура и ги показваме на 16 * 2 lcd дисплей.
void convert_display (неподписана стойност на символа) {неподписан знак x1, x2, x3; cmdwrt (0xc6); // команда за задаване на курсора на 6-та позиция на 2-ри ред на 16 * 2 lcd x1 = (стойност / 10); // разделяме стойността на 10 и съхраняваме коефициент в променлива x1 x1 = x1 + (0x30); // конвертираме променлива x1 в ascii чрез добавяне на 0x30 x2 = стойност% 10; // разделяме стойността на 10 и съхраняваме остатъка в променлива x2 x2 = x2 + (0x30); // конвертираме променлива x2 в ascii чрез добавяне на 0x30 x3 = 0xDF; // ascii стойност на степен (°) символ datawrt (x1); // температура на дисплея на 16 * 2 lcd дисплей datawrt (x2); datawrt (x3); datawrt ('C'); }
Също така проверете други термометри с помощта на LM35 с различни микроконтролери:
- Цифров термометър, използващ Arduino и LM35
- Измерване на температурата с помощта на LM35 и AVR микроконтролер
- Измерване на стайна температура с Raspberry Pi