Мікропроцесорна система управління мікрокліматом теплиці

Тип работы:
Курсовая
Предмет:
Коммуникации, связь, цифровые приборы и радиоэлектроника


Узнать стоимость

Детальная информация о работе

Выдержка из работы

Зміст

Вступ

1. Аналіз технічного завдання курсової

1.1 Призначення системи

1.2 Мета створення системи

1.3 Порядок роботи з пристроєм

1.4 Функціонування системи

2. Розробка і опис структурної схеми

3. Розробка принципової схеми і вибір елементної бази

3.1 Вибір мікропроцесора

3.2 Вибір температурного датчика

3.3 Вибір датчика вологості

3.4 Вибір засобів індикації

3.5 Вибір кнопок управління системою

3.6 Вибір виконавчих пристроїв

4. Розробка алгоритмів роботи програми

5. Написання текстів програми

5.1 Проведення аналізу даних із температурного датчика

5.2 Проведення аналізу даних із датчика вологості

Висновок

Література

Додатки

Вступ

На значній території нашої країни у зв’язку з тривалою, нерідко суворою зимою і коротким, не завжди теплим літом складаються несприятливі умови для вирощування теплолюбних рослин у відкритому ґрунті.

Для розширення можливості вирощування рослин і постачання населення свіжими продуктами харчування, особливо овочами, в несприятливі періоди року застосовують різні споруди захищеного ґрунту, в яких штучно створюються необхідні умови для росту і розвитку рослин. За ступенем задоволення потреб рослин у комплексі чинників життєзабезпечення або по технологічної складності споруди захищеного грунту поділяють на парники, утеплений ґрунт і теплиці.

У спорудах захищеного ґрунту необхідно прагнути до створення оптимальних параметрів середовища вирощування. На жаль, в найпростіших теплицях на присадибних ділянках в основному на сонячному обігріві не завжди цьому приділяється належна увага. У результаті рослини в таких теплицях постійно перебувають у стресових умовах. Вночі, як правило, рослини переохолоджуватися, вдень у сонячну погоду перегріваються. Особливо поглиблюються несприятливі дії в теплицях, розташованих на садово-городніх ділянках, значно віддалених від місць постійного проживання власників. У таких теплицях, відвідуваних, як правило, лише у вихідні дні, немає можливості оперативно втрутитися у формування клімату, в результаті чого він нерідко далекий від оптимального. Правильний тепловий режим в теплицях дозволяє підвищити врожайність в 2−3 рази.

Існують численні системи автоматизованого управління мікрокліматом теплиць. Як правило, такого роду системи, що поставляються численними фірмами (НВО «схемотехніки «, НВФ «Фіто «, система «Агротем «) містять повний комплекс управління мікрокліматом.

Такі системи, звичайно, хороші і ефективні, але мають цілком відчутним недоліком — високою вартістю. Використання такого роду систем у промисловій агротехніці виправдана: територія теплиць величезна, а така система дозволяє економити на персоналі, отримувати великий урожай, що дозволяє збільшити прибуток, а, отже, окупити систему.

Особливістю агротехніки нашої країни є те, що 70% населення самі забезпечують себе овочами в літній та осінній період за рахунок вирощування культур на присадибних ділянках. Природно, що в таких умовах вирощування людина не може постійно контролювати мікроклімат у теплиці, а й купувати дорогу систему теж немає можливості. Багато хто з дачників використовують підручні, не завжди надійні та ефективні властивості - гідроциліндри для автоматичного відкривання кватирок при дуже високій температурі, бочку з невеликим отвором для поливу та інше. Ці пристосування не дороги, але малоефективні і не надійні (гідроциліндри часто виходять ладу, тече масло, ущільнювальне кільця швидко приходять в непридатність, температура, при якій відкривається кватирка, вимірюється емпірично і т.д.). Тому необхідно створити просту систему управління основними параметрами мікроклімату: температура і вологість.

1. Аналіз технічного завдання курсової

Метою даного проекту є створення системи контролю мікрокліматом теплиці на базі мікропроцесора AT89C51.

Рисунок 2.1 — Зовнішній вигляд пристрою і схема зв’язків

1. 1 Призначення системи

1. Контроль температури і вологості в теплиці

2. Забезпечення зручного керування мікрокліматом в теплиці.

3. Можливість виставляти різні типи мікроклімату в теплиці для вирощування різних типів культур.

1. 2 Мета створення системи

1. Точне дотримання умов вирощування культур для підвищення врожайності.

2. Автоматизація операцій поливу і провітрювання, що не вимагають безпосередньої участі у вирощуванні культур.

3. Стеження за зміною мікроклімату для захисту культур від несприятливих факторів (різка зміна температур, посуха).

1. 3 Порядок роботи з пристроєм

1. Для включення пристрою підключаємо його до постійного джерела живлення за допомогою виводів «Живлення». Натискаємо клавішу вкл. і одразу загориться «Індикатор роботи» пристрою і на «Дисплеях температури і вологості» відобразяться відповідно значення температури і вологості, тобто температура і вологість на «датчику температури» і «датчику вологості».

2. Після включення, починають успішно працювати всі, або декілька елементів пристрою. Кількість початково задіяних компонентів визначається відповідно до співвідношення температури чи вологості. Температура і вологість, яку ми хочемо досягнути (відповідно до режимів роботи) і реальної (температура і вологість на відповідних датчиках).

3. По замовчуванню при запуску системи будуть стояти параметри температури і вологості відповідно до 1 режиму роботи (Таблиця 1).

Для зміни режиму роботи використовуються клавіші «+» та «-» на пульті керування. Відповідно до зміни режиму роботи загорається відповідний світлодіод і відповідно змінюються параметри температури і вологості згідно наступного режиму роботи.

1. 4 Функціонування системи

Після включення системи проводиться вибір вирощуваної культури. Далі зчитується температура, виводиться на індикатор, аналізується. У разі необхідності - її коригування (включення нагрівача або провітрювання), потім зчитується вологість, аналізується і приймається рішення про необхідність поливу.

Кожен режим характеризується своїми параметрами, представленими в таблиці:

Таблиця 2. 1

Режим

Вирощувана культура

Температура повітря

Вологість

1

томат

17

22

30−60

2

огірок

19

23

60−80

3

перець

18

21

35−65

4

троянди

21

24

70−90

5

баклажани

25

30

40−65

2. Розробка і опис структурної схеми

Рисунок 3.2 — Структурна схема мікропроцесорної системи

Структурна схема є першою моделлю електронного пристрою, яка відображає принцип роботи пристрою в загальному вигляді. Перевагою структурної схеми є те, що по ній можна швидко одержати уявлення про склад, структуру і виконувані ним функції, не відвертаючи уваги на схемну реалізацію його функціональних частин.

3. Розробка принципової схеми і вибір елементної бази

3. 1 Вибір мікропроцесора

мікроклімат теплиця алгоритм мікропроцесор

В якості мікропроцесора в системі управління використовується однокристальна 8-ми розрядна мікро-ЕОМ АТ 89С 51.

Мікросхема містить: 8-ми розрядний центральний процесор, логічний процесор з порозрядною і побайтовою обробкою даних, вмонтований тактовий генератор, вмонтований ОЗП даних (128 байт), 20 регістрів спеціального призначення, 8 шин входу/виходу, 2 вмонтованих 16-ти розрядних таймери-лічильники, двохсторонній порт послідовного входу/виходу, система переривань двома рівнями пріоритетності від двох зовнішніх і трьох внутрішніх пристроїв, адресний простір (64 к) для зовнішньої ПЗП, адресний простір (64 к) для зовнішньої програмної пам’яті. Дана мікросхема складається з 20 000 інтегральних елементів.

Два програмованих 16-бітних таймери/лічильника (Т/Л 0 і Т/Л 1) можуть бути використані як таймери або лічильники зовнішніх подій. При роботі як таймер вміст Т/Л інкрементується в кожному машинному циклі, тобто через кожні 12 періодів кварцового резонатора. При роботі в режимі лічильника вміст Т/Л інкрементується після переходу з 1 в 0 зовнішнього вхідного сигналу, який подається на відповідний (Т 0, Т 1). Вміст лічильника буде збільшене на 1, у тому випадку, якщо в попередньому циклі був визначений вхідний сигнал високого рівня (1), а в наступному — сигнал низького рівня (0). На розпізнавання переходу потрібно два машинних цикли, тобто максимальна частота підрахунку вхідних сигналі дорівнює 1/24 частоти резонатора.

Рисунок 4.3 - Умовне графічне позначення мікросхеми AT89C51

Таблиця 4.2 - Призначення виводів AT89C51

Номер вив.

Найменування

Призначення

1…8

Р 1. 0… Р 1. 7

Входи/виходи 8-ми розрядного двохнаправленого порта 1

9

RST

Вхід обнуления

10

RXD

Вхід послідовного каналу в асинхронному режимі

11

TXD

Вихід послідовного каналу в асинхронному режимі

12

INTO

Вхід 0 переривання або управління лічильником 0

Електричні параметри:

Напруга живлення…- 4,75…5,25В

Вхідна напруга високого рівня…- 0,5…+5,75В

Вхідна напруга низького рівня…- 0,5…+0,8В

Вихідна напруга високого рівня…> 2,4В

Вихідна напруга низького рівня при І0ВИХ=1,6 мА…< 0,45В

Струм споживання…< 150 мА

Струм втрат на входах, при 0< ивх<5,75 В …< |±10|мкА

Споживана потужність…0,69Вт

Ємність навантаження…100 пФ

Тактова частота 3,5… 12 МГц

Мінімальний час виконання короткої команди…Імкс

Швидкість обміну даними в послід, порті вводу/виводу…110…375 000біт/с

Кількість базових команд…111

Ємність стеку…0,128 кбайт

Об'єм адресної пам’яті команд, даних…64 кбайт

Напруга живлення…< 7В

Вхідна напруга високого рівня…< 7В

Вхідна напруга низького рівня…< 7В

Ємність навантаження…< 500 пФ

Температура навколишнього середовища — 10…+70°С

3.2 Вибір температурного датчика

Як датчик температури був обраний датчик DS1621 фірми Dallas, представлений на Рисунку 4.3.

Рисунок 4.4 — Температурний датчик DS1621.

Основні його властивості:

* Пряме перетворення температури в цифровий код, без додаткових АЦП

* Можливість передачі даних через одне-, двох-провідний інтерфейс

* Можливість адресації декількох датчиків на одній шині

* Заводське калібрування і вбудована корекція нелінійності, не потрібно додаткової підстроювання

* Широкий діапазон виміру температури (-55 … +125 ° С)

* Висока швидкодія (час перетворення від 0.5 до 2 с)

* захист від агресивного середовища

Технічні характеристики датчика наведені в таблиці 4. 3:

Таблиця 4. 3

Точність

±0.5 °С

Час перетворення

1 с

Кількість біт

9 бит

Інтерфейс

2W (I2C)

Тип корпусу

DIP8, SO8

Температурний датчик необхідно встановити таким чином, щоб на нього не потрапляли прямі сонячні промені, а також вода при поливі, прагнучи при цьому максимально зменшити віддаленість від самого пристрою.

3.3 Вибір датчика вологості

Як датчик вологості був обраний HIH 4000−003. Він забезпечує широкий діапазон вимірювань, високу надійність і низьку вартість при використанні мікроелектронної технології. Це дозволяє проводити ємності планарного типу тонкоплівкових методом. Завдяки цьому ми маємо мініатюрні габарити чутливого елемента, можливість імплементації на кристалі спеціалізованої інтегральної схеми обробки сигналу. Технологічність і високий вихід придатних кристалів забезпечують малу вартість продукції даного типу. Параметри датчика вологості наведені в таблиці 5. Можливо пряме підключення до АЦП мікроконтролера завдяки стандартному розмаху вихідного сигналу (від 1.0 до 4.0 В). Встановити датчик необхідно таким чином, щоб краплі води при поливі не потрапляли не його, а також захистити від дії прямих сонячних променів, щоб уникнути зниження точності вимірювання.

Таблиця 4. 4

Параметр

Значення

Діапазон вимірювань, % RH

0… 100

Повторюваність, ±% RH

0,5

Напруга живлення, В

4,0… 5,8

Струм споживання, мА

0,2

Робоча температура, °С

-40… 85

Температура зберігання, °С

-50… 125

3.4 Вибір засобів індикації

В системі нам необхідно візуально відображати поточну температуру в теплиці і обраний режим роботи. Для цього будемо використовувати семисегментні індикатори і світлодіодну лінійку.

Рисунок 4.5 — Блок індикації(світлодіодна лінійка)

HL1-HL5 — індикатори режимів роботи системи.

HL6 — індикатор включення/виключення системи.

HG1,HG2 — індикатор температури.

HG3,HG4 — індикатор вологості.

Рисунок 4.6 — Блок індикації(семи сегментні індикатори)

3. 5 Вибір кнопок управління системою

Рисунок 4.5 — Дискретні кнопки

S1 — кнопка включення/виключення системи.

S2 — кнопка для вибору режиму роботи (При натисканні цієї клавіші режим роботи переключається на наступний по-порядку)

S3 — кнопка для вибору режиму робот (При натисканні цієї клавіші режим роботи переключається на попередній по-порядку)

3.6 Вибір виконавчих пристроїв

В системі мікропроцесор повинен управляти охолодженням, поливом та обігріванням теплиці. Для охолодження та поливу будем використовувати

Мотори (ENG1,ENG2), а для обігріву нагрівальну лампу (L1).

В якості ключових елементів вибираємо транзистори (VT1,VT2,VT3), які комутують напругу на відповідне електромагнітне реле. Для запобігання самоіндукції електромагнітного реле використовуєм діоди (VD1,VD2,VD3).

Для замикання або розмикання електричного кола використовуєм електромагнітне реле (RL1,RL2,RL3).

Рисунок 4.6 — Схема підключення виконавчих пристроїв.

4. Розробка алгоритмів роботи програми

1. Пристрій вмикається після натиснення клавіші S1. Загорається HL6.

2. Проводиться опитування датчиків температури і вологості.

3. Виводяться дані про навколишню температуру і вологість на індикатори температури (HL1,HL2) і вологості(HL3,HL4).

4. Якщо натиснута клавіша S2 — проводиться вибір наступного режиму роботи (1 режим по замовчуванню).

5. Якщо натиснута клавіша S3 — проводиться вибір попереднього режиму роботи.

6. В залежності від вибраного режиму, в якого є свої конкретні параметри температури чи вологості, починають працювати обігрів, полив чи охолодження, які коректують ці параметри в разі необхідності (якщо завелика температура то вмикається охолодження, якщо навпаки — обігрів, якщо недостатня вологість повітря то включається автоматично полив).

7. В процесі коректування цих параметрів постійно зчитується температура і вологість з датчиків і посилає сигнали (якщо температура чи вологість достатня тоді виключити обігрів, охолодження чи полив)

8. Якщо натиснута клавіша S1 — система виключається.

Рисунок 5.1 — Алгоритм роботи програми

5. Написання текстів програми

$include (mod51)

org 0

wait:

mov p1,#0; очистка p1

mov p3,#0 ; очистка p3

setb p0.2 ; перевірка світлодіодів

setb p0. 3

setb p0. 4

setb p0. 5

setb p0. 6

setb p0. 7

clr p2.0 ; очистити p2. 0

clr p2.1 ; очистити p p2. 1

clr p2.2 ; очистити p2. 2

; початок роботи

start:

jb p2. 3, wait ; включення схеми

clr p0.7 ; подача сигналу на світлодіод

jb p2. 4, nok1 ; якщо натиснута s2 то перейти по мітці

jb bitkl1, nok11

setb bitkl1

cjne r1,#5,no01 ; перевірка значення в акумуляторі і перехід по мітці

jmp nok11

no01:

inc r1 ; інкримент регістра r1

jmp nok11

nok1:

clr bitkl1

nok11:

jb p2. 5, nok2

jb bitkl2, nok22

setb bitkl2

cjne r1,#1,no02 ; перевірка значення в акумуляторі і перехід по мітці

jmp nok22

no02:

dec r1 ; декримент регістра r1

jmp nok22

nok2:

clr bitkl2

nok22:

cjne r1,#1,ex11 ; включення 1-го режиму і відповідного світлодіода

clr p0. 2

setb p0. 3

jmp st

ex11:

cjne r1,#2,ex2 ; включення 2-го режиму і відповідного світлодіода

clr p0. 3

setb p0. 2

setb p0. 4

jmp st

ex2:

cjne r1,#3,ex3 ; включення 3-го режиму і відповідного світлодіода

clr p0. 4

setb p0. 3

setb p0. 5

jmp st

ex3:

cjne r1,#4,ex4 ; включення 4-го режиму і відповідного світлодіода

clr p0. 5

setb p0. 4

setb p0. 6

jmp st

ex4:

clr p0.6 ; включення 5-го режиму і відповідного світлодіода

setb p0. 5

st:

setb T_1WIRE1 ; переіхід до 1 - го датчика

setb T_1WIRE2 ; переіхід до 2 - го датчика

setb type_dat; вибір 1 — го датчика

call GetTemp; отримати температуру

clr type_dat; вибір 2 — го датчика

call GetTemp; отримати температуру

jmp start

Зчитування і передача значення з датчика температури на індикатор виконується

; ======================================================

GetTemp:

jnb type_dat, next11

call Reset_1Wire1

jmp next12

next11: call Reset_1Wire2

next12:

mov a, #0CCh; Посилаємо команду Skip ROM [CCh].

call RW_Byte

mov a, #044h; Посилаемо команду Convert T [44h].

call RW_Byte

; затримка, не менше 750 мс

mov A,#0

call Big_delay

call Big_delay

call Big_delay

call Big_delay

jnb type_dat, next61

call Reset_1Wire1

jmp next62

next61: call Reset_1Wire2

next62:

mov A,#165; (500 — 4) / 3 = 165

call delay

mov a, #0CCh; Посилаємо команду Skip ROM [CCh].

call RW_Byte

mov a, #0BEh; Посилаємо команду Read Scratchpad [BEh].

call RW_Byte

mov a, #1h

call delay

mov CRC,#0

mov A,#0FFh

call RW_Byte; byte 0.

mov fTEMPER_L, A; Молодший байт температури.

call DO_CRC

mov A,#0FFh

call RW_Byte; byte 1.

mov fTEMPER_H, A; Старший байт температури.

call DO_CRC

; Дальше 8 непотрібних байти (зчитуємо тільки для формування CRC).

mov A,#0FFh

call RW_Byte; byte 2.

call DO_CRC

mov A,#0FFh

call RW_Byte; byte 3.

call DO_CRC

mov A,#0FFh

call RW_Byte; byte 4.

call DO_CRC

mov A,#0FFh

call RW_Byte; byte 5.

call DO_CRC

mov A,#0FFh

call RW_Byte; byte 6.

call DO_CRC

mov A,#0FFh

call RW_Byte; byte 7.

call DO_CRC

; Зчитуємо CRC.

mov A,#0FFh

call RW_Byte; byte 8 (CRC).

clr C

subb A, CRC; A = A — CRC

jz GT_CRC_OK

mov A,#10

call Big_Delay

clr CRC_OK

jmp GT_exit

GT_CRC_OK:; Якщо CRC — ok.

setb CRC_OK

; перетворення і вивід температури. 0−99градусів

; якщо температура буде від'ємна — в регістрі fTEMPER_h буде значення FF

; значення після коми зберігаються в молодшій тетраді регістра fTEMPER_l

mov a, fTEMPER_l

anl a, #0f0h; множимо на маску, позбавлючись значень після коми

swap a; значення молодшого байту — в молодших розрядах акумцлятора

mov fTEMPER_l, a; нове значення температури

mov a, fTEMPER_h

mov b, #16; значення старшого байту

mul AB; перемножуємо на множник — 16, — результат в акумуляторі

add a, fTEMPER_l; додаю значення молодшого байту

5. 1 Проведення аналізу даних із температурного датчика

jb type_dat, nnext71

jmp next71

nnext71:

mov r0, a

cjne r1,#1,no11

subb a,#17

jnc e1no1

setb p2. 0

clr p2. 2

jmp GT_ex

e1no1:

subb a,#6

jnc e1no2

clr p2. 2

clr p2. 0

jmp GT_ex

e1no2:

setb p2. 2

clr p2. 0

jmp GT_ex

no11:

cjne r1,#2,no21

subb a,#19

jnc e2no1

setb p2. 0

clr p2. 2

jmp GT_ex

e2no1:

subb a,#5

jnc e2no2

clr p2. 0

clr p2. 2

jmp GT_ex

e2no2:

setb p2. 2

clr p2. 0

jmp GT_ex

no21:

cjne r1,#3,no31

subb a,#18

jnc e3no1

setb p2. 0

clr p2. 2

jmp GT_ex

e3no1:

subb a,#4

jnc e3no2

clr p2. 2

clr p2. 0

jmp Gt_ex

e3no2:

setb p2. 2

clr p2. 0

jmp GT_ex

no31:

cjne r1,#4,no41

subb a,#21

jnc e4no1

setb p2. 0

clr p2. 2

jmp GT_ex

e4no1:

subb a,#4

jnc e4no2

clr p2. 0

clr p2. 2

jmp Gt_ex

e4no2:

setb p2. 2

clr p2. 0

jmp GT_ex

no41:

subb a,#25

jnc e5no1

clr p2. 2

setb p2. 0

jmp GT_ex

e5no1:

subb a,#6

jnc e5no2

clr p2. 0

clr p2. 2

jmp GT_ex

e5no2:

clr p2. 0

setb p2. 2

GT_ex:

mov a, r0

mov b, #10; розбиваю значення

div ab; на два числа

swap a; збираю значення

add a, b; докупи в акумуляторі

mov p1, a

; виводжу в порт на індикатор 1

jmp GT_exit

5. 2 Проведення аналізу даних із датчика вологості

next71:

mov r0, a

cjne r1,#1,no1

subb a,#30

jnc e1no

setb p2. 1

jmp GT_exit1

e1no:

clr p2. 1

jmp GT_exit1

no1:

cjne r1,#2,no2

subb a,#60

jnc e2no

setb p2. 1

jmp GT_exit1

e2no:

clr p2. 1

jmp Gt_exit1

no2:

cjne r1,#3,no3

subb a,#35

jnc e3no

setb p2. 1

jmp GT_exit

e3no:

clr p2. 1

jmp Gt_exit1

no3:

cjne r1,#4,no4

subb a,#70

jnc e4no

setb p2. 1

jmp GT_exit

e4no:

clr p2. 1

jmp Gt_exit

no4:

subb a,#40

jnc e5no

setb p2. 1

jmp GT_exit1

e5no:

clr p2. 1

GT_exit1:

mov a, r0

mov b, #10; розбиваю значення

div ab; на два числа

swap a; збираю значення

add a, b; докупи в акумуляторі

mov p3, a; виводжу в порт на індикатор 2

GT_exit:

ret; вихід з GetTemp:

; ======================================================

Reset_1Wire1:; Скидаємо лінію на час, біля 500 мкс. == 1 datchik

clr T_1WIRE1

mov A,#165; (500 — 4) / 3 = 165

call delay

setb T_1WIRE1

; Пропускаємо імпульс присутності

mov A,#165; (500 — 4) / 3 = 165

call delay

ret

; -----------------------------------------------------------------------------

Reset_1Wire2:; Скидаємо лінію на час, біля 500 мкс. == 2 datchik

clr T_1WIRE2

mov A,#165; (500 — 4) / 3 = 165

call delay

setb T_1WIRE2

; Пропускаємо імпульс присутності

mov A,#165; (500 — 4) / 3 = 165

call delay

ret

; ------------------------------------------------------------------------------

delay:

mov fCOUNTER, A

D_Loop36:

nop; 1 us.

DJNZ fCOUNTER, D_Loop36; 2 us.

ret

; -----------------------------------------------------------------------------

Big_delay:; =770*x+1 x=(delay-5)/770 Враховуючи виконання call и return.

mov fCOUNTER2, A

mov fCOUNTER,#0

BD_Loop94:

nop; 1 us.

djnz fCOUNTER, BD_Loop94; 2 us.

djnz fCOUNTER2, BD_Loop94; 2 us.

ret

; ======================================================

; Ф-ція вводу/виводу на лінию 1-Wire. по черзі, зсуваючи вправо значення в, А зчитуємо лінію і формуємо байт

; Виводимо з A и зчитуємо в A.

RW_Byte:

mov fTEMP, A

MOV R2,#8

; --------------------------- цикл

RBLoop:

mov A, fTEMP; повертаємо значення в акумулятор

jnb type_dat, next21

clr T_1WIRE1; Обнуляємо вихід. 1 dat

jmp next22

next21: clr T_1WIRE2; Обнуляємо вихід. 2 dat

next22:

nop

jnb ACC. 0, RB_Skip01

jnb type_dat, next31

setb T_1WIRE1; Встановлюємо вихід. 1 dat

jmp next32

next31: setb T_1WIRE2; Встановлюємо вихід. 2 dat

next32:

RB_Skip01:

rr A

clr ACC. 7; Приймаємо в той самий TEMP, з якого передаємо

nop

nop

nop

nop

jnb type_dat, next41

jnb T_1WIRE1, RB_Skip02

jmp next42

next41: jnb T_1WIRE2, RB_Skip02

next42:

setb ACC. 7

RB_Skip02:

mov fTEMP, A; зберігаємо значення

; дальше даємо час на звільнення лінії веденим девайсом (release = до 45 мкс.)

mov A,#14; (60 — 4) / 3 = 18

call delay

; Відпускаємо лінію.

jnb type_dat, next51

setb T_1WIRE1

jmp next52

next51: setb T_1WIRE2

next52:

; трішки відпочиваємо (на всякий пожарний).

mov A,#1

call delay

; Якщо 8 біт, то виходимо з циклу.

DJNZ R2, RBLoop; послідовно зчитуємо 8 біт (лічильник рег. R2)

; ------------------ цикл

; прийнятий байт.

mov A, fTEMP; записуємо значення сформованого байту в акумулятор

ret;

; ======================================================

; Процедура обновлення CRC. Параметр в A.

DO_CRC: PUSH ACC; save accumulator

PUSH B; save the B register

PUSH ACC; save bits to be shifted

MOV B,#8; set shift = 8 bits;

CRC_LOOP: XRL A, CRC; calculate CRC

RRC A; move it to the carry

MOV A, CRC; get the last CRC value

JNC ZERO; skip if data = 0

XRL A,#18H; update the CRC value

;

ZERO: RRC A; position the new CRC

MOV CRC, A; store the new CRC

POP ACC; get the remaining bits

RR A; position the next bit

PUSH ACC; save the remaining bits

DJNZ B, CRC_LOOP; repeat for eight bits

POP ACC; clean up the stack

POP B; restore the B register

POP ACC; restore the accumulator

RET

; -------------------------------------------------------------------------------

end

Висновок

В процесі виконання курсового проекту було розроблено систему управління мікрокліматом теплиці. Під час виконання даної роботи, я навчився створювати та описувати структурні і принципові схеми, складати алгоритми та програми на мові асемблера для мікропроцесора AT89С 51. Модель мікропроцесорної системи було спроектовано в програмному комплексі Proteus Professional 7.7.

Література

1. В. В. Сташин А.В. УРУСОВ О. Ф. Мологонцева Проектирование цифровых устройств на однокристальных микроконтроллерах Москва Энергоатомиздат 1990 г.

2. А. С. Басманов «МП и ОЭВМ», Москва, «Мир», 1988.

3. «Микропроцессоры», Учебное пособие в 5-ти книгах, под редакцией В. А. Шахнова, Москва «Высшая школа», 1988.

4. Фрунзе «Микроконтроллеры? Это же просто!»

5. Магда Ю. С. «Микроконтроллеры серии 8051: практический подход»

6. https: //sites. google. com/site/laboratoria101/mps

7. http: //www. teplitsa-urojay. ru/rasta/ogurtsy/

8. http: //www. zooclub. ru/flora/rouse/14. shtml

9. http: //www. greeninfo. ru/vegetables/capsicum_annuum. html/Article/_/aID/335

10. http: //www. sadovod. spb. ru/TextShablon. php? LinkPage=222

11. http: //www. gaw. ru/

Додаток 1. Текст програми

$include (mod51)

org 0

; *************************************************************

; Порт 0.

T_1WIRE1 bit P0. 0

T_1WIRE2 bit P0. 1

type_dat bit 01h

bitkl1 bit 7fh

bitkl2 bit 7eh

; *************************************************************

fCOUNTER EQU 19h

fCOUNTER2 EQU 1Ah

CRC EQU 1Bh

fTEMP EQU 1Ch

; Температура.

fTEMPER_L EQU 36h

fTEMPER_H EQU 37h

CRC_OK BIT 00h.

; -------------------------------------------------------------

mov r1,#1

wait:

mov p1,#0

mov p3,#0

setb p0. 2

setb p0. 3

setb p0. 4

setb p0. 5

setb p0. 6

setb p0. 7

clr p2. 0

clr p2. 1

clr p2. 2

start:

jb p2. 3, wait

clr p0. 7

jb p2. 4, nok1

jb bitkl1, nok11

setb bitkl1

cjne r1,#5,no01

jmp nok11

no01:

inc r1

jmp nok11

nok1:

clr bitkl1

nok11:

jb p2. 5, nok2

jb bitkl2, nok22

setb bitkl2

cjne r1,#1,no02

jmp nok22

no02:

dec r1

jmp nok22

nok2:

clr bitkl2

nok22:

cjne r1,#1,ex11

clr p0. 2

setb p0. 3

jmp st

ex11:

cjne r1,#2,ex2

clr p0. 3

setb p0. 2

setb p0. 4

jmp st

ex2:

cjne r1,#3,ex3

clr p0. 4

setb p0. 3

setb p0. 5

jmp st

ex3:

cjne r1,#4,ex4

clr p0. 5

setb p0. 4

setb p0. 6

jmp st

ex4:

clr p0. 6

setb p0. 5

st:

setb T_1WIRE1

setb T_1WIRE2

setb type_dat

call GetTemp

clr type_dat

call GetTemp

jmp start

; ======================================================

GetTemp:

jnb type_dat, next11

call Reset_1Wire1

jmp next12

next11: call Reset_1Wire2

next12:

mov a, #0CCh;

call RW_Byte

mov a, #044h;

call RW_Byte

; затримка, не менше 750 мс

mov A,#0

call Big_delay

call Big_delay

call Big_delay

call Big_delay

jnb type_dat, next61

call Reset_1Wire1

jmp next62

next61: call Reset_1Wire2

next62:

mov A,#165; (500 — 4) / 3 = 165

call delay

mov a, #0CCh;

call RW_Byte

mov a, #0BEh;

call RW_Byte

mov a, #1h

call delay

mov CRC,#0

mov A,#0FFh

call RW_Byte; byte 0.

mov fTEMPER_L, A

call DO_CRC

mov A,#0FFh

call RW_Byte; byte 1.

mov fTEMPER_H, A

call DO_CRC

mov A,#0FFh

call RW_Byte; byte 2.

call DO_CRC

mov A,#0FFh

call RW_Byte; byte 3.

call DO_CRC

mov A,#0FFh

call RW_Byte; byte 4.

call DO_CRC

mov A,#0FFh

call RW_Byte; byte 5.

call DO_CRC

mov A,#0FFh

call RW_Byte; byte 6.

call DO_CRC

mov A,#0FFh

call RW_Byte; byte 7.

call DO_CRC

mov A,#0FFh

call RW_Byte; byte 8 (CRC).

clr C

subb A, CRC; A = A — CRC

jz GT_CRC_OK

mov A,#10

call Big_Delay

clr CRC_OK

jmp GT_exit

GT_CRC_OK:

mov a, fTEMPER_l

anl a, #0f0h

swap a

mov fTEMPER_l, a

mov a, fTEMPER_h

mov b, #16

mul AB

add a, fTEMPER_l

jb type_dat, nnext71

jmp next71

nnext71:

mov r0, a

cjne r1,#1,no11

subb a,#17

jnc e1no1

setb p2. 0

clr p2. 2

jmp GT_ex

e1no1:

subb a,#6

jnc e1no2

clr p2. 2

clr p2. 0

jmp GT_ex

e1no2:

setb p2. 2

clr p2. 0

jmp GT_ex

no11:

cjne r1,#2,no21

subb a,#19

jnc e2no1

setb p2. 0

clr p2. 2

jmp GT_ex

e2no1:

subb a,#5

jnc e2no2

clr p2. 0

clr p2. 2

jmp GT_ex

e2no2:

setb p2. 2

clr p2. 0

jmp GT_ex

no21:

cjne r1,#3,no31

subb a,#18

jnc e3no1

setb p2. 0

clr p2. 2

jmp GT_ex

e3no1:

subb a,#4

jnc e3no2

clr p2. 2

clr p2. 0

jmp Gt_ex

e3no2:

setb p2. 2

clr p2. 0

jmp GT_ex

no31:

cjne r1,#4,no41

subb a,#21

jnc e4no1

setb p2. 0

clr p2. 2

jmp GT_ex

e4no1:

subb a,#4

jnc e4no2

clr p2. 0

clr p2. 2

jmp Gt_ex

e4no2:

setb p2. 2

clr p2. 0

jmp GT_ex

no41:

subb a,#25

jnc e5no1

clr p2. 2

setb p2. 0

jmp GT_ex

e5no1:

subb a,#6

jnc e5no2

clr p2. 0

clr p2. 2

jmp GT_ex

e5no2:

clr p2. 0

setb p2. 2

GT_ex:

mov a, r0

mov b, #10

div ab

swap a

mov p1, a

jmp GT_exit

next71:

mov r0, a

cjne r1,#1,no1

subb a,#30

jnc e1no

setb p2. 1

jmp GT_exit1

e1no:

clr p2. 1

jmp GT_exit1

no1:

cjne r1,#2,no2

subb a,#60

jnc e2no

setb p2. 1

jmp GT_exit1

e2no:

clr p2. 1

jmp Gt_exit1

no2:

cjne r1,#3,no3

subb a,#35

jnc e3no

setb p2. 1

jmp GT_exit

e3no:

clr p2. 1

jmp Gt_exit1

no3:

cjne r1,#4,no4

subb a,#70

jnc e4no

setb p2. 1

jmp GT_exit

e4no:

clr p2. 1

jmp Gt_exit

no4:

subb a,#40

jnc e5no

setb p2. 1

jmp GT_exit1

e5no:

clr p2. 1

GT_exit1:

mov a, r0

mov b, #10

div ab

swap a

add a, b

mov p3, a

GT_exit:

ret

; ======================================================

Reset_1Wire1:

clr T_1WIRE1

mov A,#165; (500 — 4) / 3 = 165

call delay

setb T_1WIRE1

mov A,#165; (500 — 4) / 3 = 165

call delay

ret

; -----------------------------------------------------------------------------

Reset_1Wire2: clr T_1WIRE2

mov A,#165; (500 — 4) / 3 = 165

call delay

setb T_1WIRE2

mov A,#165; (500 — 4) / 3 = 165

call delay

ret

; ------------------------------------------------------------------------------

delay:

mov fCOUNTER, A

D_Loop36:

nop; 1 us.

DJNZ fCOUNTER, D_Loop36; 2 us.

ret

; -----------------------------------------------------------------------------

Big_delay:; =770*x+1 x=(delay-5)/770 Враховуючи виконання call и return.

mov fCOUNTER2, A

mov fCOUNTER,#0

BD_Loop94:

nop; 1 us.

djnz fCOUNTER, BD_Loop94; 2 us.

djnz fCOUNTER2, BD_Loop94; 2 us.

ret

; ======================================================

RW_Byte:

mov fTEMP, A

MOV R2,#8

; --------------------------- цикл

RBLoop:

mov A, fTEMP

jnb type_dat, next21

clr T_1WIRE1; Обнуляємо вихід. 1 dat

jmp next22

next21: clr T_1WIRE2; Обнуляємо вихід. 2 dat

next22:

nop

jnb ACC. 0, RB_Skip01

jnb type_dat, next31

setb T_1WIRE1; Встановлюємо вихід. 1 dat

jmp next32

next31: setb T_1WIRE2; Встановлюємо вихід. 2 dat

next32:

RB_Skip01:

rr A

clr ACC. 7

nop

nop

nop

nop

jnb type_dat, next41

jnb T_1WIRE1, RB_Skip02

jmp next42

next41: jnb T_1WIRE2, RB_Skip02

next42:

setb ACC. 7

RB_Skip02:

mov fTEMP, A

)

mov A,#14; (60 — 4) / 3 = 18

call delay

jnb type_dat, next51

setb T_1WIRE1

jmp next52

next51: setb T_1WIRE2

next52:

mov A,#1

call delay

.

DJNZ R2, RBLoop

mov A, fTEMP

ret;

; ======================================================

; Процедура обновлення CRC. Параметр в A.

DO_CRC: PUSH ACC; save accumulator

PUSH B; save the B register

PUSH ACC; save bits to be shifted

MOV B,#8; set shift = 8 bits;

CRC_LOOP: XRL A, CRC; calculate CRC

RRC A; move it to the carry

MOV A, CRC; get the last CRC value

JNC ZERO; skip if data = 0

XRL A,#18H; update the CRC value

;

ZERO: RRC A; position the new CRC

MOV CRC, A; store the new CRC

POP ACC; get the remaining bits

RR A; position the next bit

PUSH ACC; save the remaining bits

DJNZ B, CRC_LOOP; repeat for eight bits

POP ACC; clean up the stack

POP B; restore the B register

POP ACC; restore the accumulator

RET

; -------------------------------------------------------------------------------

Додаток 2. Hex-файл програми

: 1 000 000 079 017 590 0165B000D282D283D284D285F6

: 1 000 1000D286D287C2A0C2A1C2A220A3E5C28720F5

: 1 000 2000A40F207F0ED27FB905030200330902001E

: 100 030 0033C27F20A50F207E0ED27EB901030200BD

: 10 004 000 471 902 0047C27EB90107C282D28302006B

: 100 050 0079B90209C283D282D284020079B9030934

: 1 000 6000C284D283D285020079B90409C285D284C0

: 1 000 7000D286020079C286D285D280D281D2011284

: 10 008 000 0089C201120089809130010612024202E9

: 1 000 900 000 951 202 5604CC120274744412027474EA

: 1000A000001202671202671202671202673001062D

: 1000B0001202420200B912025174A512026074CCFD

: 1000C00012027474BE1202747401120260751B0075

: 1000D00074FF120274F5361202C074FF120274F536

: 1000E000371202C074FF1202741202C074FF1202AF

: 1000F000741202C074FF1202741202C074FF120262

: 1 001 000 074 1202C074FF1202741202C074FF120251

: 1 001 100 074 1202C074FF120274C3951B600A740A41

: 1 001 200 012 0267C200020241D200E53654F0C4F563

: 100 130 0036E53775F010A425362001030201E7F8F3

: 1 001 4000B9011D94115007D2A0C2A20201DA94068F

: 10 015 000 5007C2A2C2A00201DAD2A2C2A00201DAF2

: 1 001 6000B9021D94135007D2A0C2A20201DA94056D

: 10 017 000 5007C2A0C2A20201DAD2A2C2A00201DAD2

: 1 001 8000B9031D94125007D2A0C2A20201DA94044E

: 10 019 000 5007C2A2C2A00201DAD2A2C2A00201DAB2

: 1001A000B9041D94155007D2A0C2A20201DA94042A

: 1001B0005007C2A0C2A20201DAD2A2C2A00201DA92

: 1001C00094195007C2A2D2A00201DA94065007C2C5

: 1001D000A0C2A20201DAC2A0D2A2E875F00A84C4C9

: 1001E00025F0F590020241F8B9010E941E5005D297

: 1001F000A1020237C2A1020237B9020E943C500597

: 1 002 0000D2A1020237C2A1020237B9030E942350D1

: 100 210 0005D2A1020241C2A1020237B9040E9446DE

: 10 022 000 5005D2A1020241C2A10202419428500508

: 1 002 3000D2A1020237C2A1E875F00A84C425F0F504

: 1 002 4000B022C28074A5120260D28074A51202602E

: 100 250 0022C28174A5120260D28174A512026022AA

: 1 002 6000F51900D519FC22F51A75190000D519FCED

: 1 002 7000D51AF922F51C7A08E51C300105C2800266

: 10 028 000 0284C2810030E00A300105D2800202926D

: 1 002 9000D28103C2E700000000300106308008026E

: 1002A00002A5308102D2E7F51C740E5160300105C1

: 1002B000D2800202B7D28174015160DABBE51C2200

: 1002C000C0E0C0F0C0E075F008651B13E51B5002EC

: 1002D000641813F51BD0E003C0E0D5F0ECD0E0D0FB

: 0402E000F0D0E02258

: 01FF

ПоказатьСвернуть
Заполнить форму текущей работой