Розробка мікропроцесорного приладу для управління кондиціонером

Предметна область застосування мікропроцесорної системи; проект приладу для управління кондиціонером. Побудова структурної і функціональної схеми роботи системи; вибір елементної бази по діапазону характеристик, розробка алгоритму і резидентної програми.

Рубрика Коммуникации, связь, цифровые приборы и радиоэлектроника
Вид курсовая работа
Язык украинский
Дата добавления 12.09.2012
Размер файла 799,8 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

В основній програмі спочатку визначаються константи: коди банків пам'яті, лічильник затримки, буфер для прийому даних з термодатчика, буфер для зберігання заданої температури приміщення Туст, лічильник робочих циклів кондиціонера для визначення його режиму роботи. Далі присвоюється початкове значення Туст і викликається підпрограма опитування клавіатури з наступним визначенням натиснутих клавіш. При наступних опитуваннях клавіатури, якщо клавіша натиснута, то відбувається перехід до мітці in1. Потім слід зміна Туст (збільшення або зменшення на 1) і виклик ряду процедур для виводу Туст на РКІ №1. Після виведення Туст запускається перетворення температури приміщення в термодатчика (ТПМ) і читання її (із збереженням у буфері bufLAN). Далі ТПМ виводиться на РК № 2, після чого відбувається обробка ТПМ (а саме запис ТПМ в один байт) і порівняння ТПМ <= Туст. Обнуляється лічильник циклів кондиціонера і відбувається перехід до потрібного режиму роботи кондиціонера. В кінці основної програми відбувається перехід на один з режимів роботи кондиціонера або на мітку in1 (де відбувається аналіз натиснутих клавіш) за результатами виконання підпрограм reoh (режим охолодження) і reob (режим обігріву).

Підпрограма inkl ввдда з клавіатури опитує дві клавіши S1 і S2 і виводить в акумулятор результат (0 біт акумулятора - відповідає за кнопку S2, 1 біт акумулятора - за кнопку S1).

Далі в додатку 1 представлено ряд підпрограм для ініціалізації і виведення символів і рядків на обидва ЖКИ дисплея. Таблиця символів ts необхідна для зручності роботи з кодами символів РКІ дисплеїв (у ній всі коди представлені по порядку). Підпрограма виводу повідомлення про помилку буде використовуватися при роботі з 1-Wire шиною.

Підпрограма виводу Туст на РКІ № 1 записує з bufLAN2 значення Туст в акумулятор і відокремлює одиниці температури від десятків, після чого виводить значення Туст на РКІ № 1 зі знаком «градус Цельсія».

Підпрограма zader викликається підпрограмами reoh і reob. Вона з інтервалом у 100мс опитує клавіатуру і виводить ТПМ на РКІ № 2. При натисканні клавіш підпрограма записує в акумулятор значення 1 і завершує свою роботу. Станом акумулятора в підпрограмі reoh або відбувається вихід з підпрограми з метою аналізу клавіатури в основній програмі (при значенні 1 акумулятора), або триває її виконання (при значенні 0 акумулятора). На виконання підпрограми витрачається приблизно 3хв.

Підпрограма sttmp призначена для передачі по шині команди "Запуск процесу перетворення». Для цього, в якості команди мережевого рівня, використовується команда «Пропустити ПЗУ». Датчик переходить в режим перетворення. Підпрограма використовує банк номер 2. Спочатку відбувається збереження в стеку регістру psw і перемикання банків.

Потім виклик процедури початкового скидання. Знову контролюється код помилки. Потім формується команда мережевого рівня «Пропустити ПЗУ». Команда транспортного рівня («Запуск процесу перетворення») формується за допомогою коду 044Н. Отримавши цю команду, термодатчик переходить в режим перетворення температури, а програма переходить в режим очікування. Управління передається по мітці stm4.

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

Підпрограма містять команди обробки помилок. У разі виникнення помилки управління передається до мітці stm6. Тут викликається підпрограма prErr, яка виводить повідомлення про помилку на екран. Потім управління передається по мітці stmf на початок підпрограми, і процес передачі команди запуску на перетворення повторюється.

Підпрограма читання температури називається rdtmp. Підпрограма виробляє зчитування температури з датчика. Вона повертає значення виміряної температури у вигляді двох байт, записаних у дві старші осередку буфера bufLAN. Молодший байт регістра температури записується за адресою bufLAN, а старший - за адресою bufLAN +1.

Починається підпрограма rdtmp з команди збереження регістру psw. Далі включається банк номер два.

Після цього підпрограма може починати виконання свого головного завдання: читання регістрів блокнотний пам'яті термодатчика. Починається цей процес з виклику процедури початкового скидання, перевіряється ознака помилки. Далі видається команда «Пропустити ПЗУ».

При цьому датчик перейде на транспортний рівень. Далі, програма перейде до формування команди «Читання блокнотний пам'яті». Спочатку в лінію видається код операції (0ВЕН). Потім починається процес читання регістрів термодатчика. Читаються тільки два перші регістру. Саме вони і містять значення температури. Протокол 1-Wire допускає такий режим роботи. Перший байт значення температури поміщається в комірку пам'яті з адресою bufLAN. Другий байт і поміщається в комірку з адресою bufLAN +1. На цьому підпрограма rdtmp завершує свою роботу. Перед виходом з підпрограми відновлюється вміст регістру psw.

Підпрограма resLAN призначена для формування імпульсу початкового скидання. Ця ж підпрограма проводить перевірку наявності сигналу присутності на лінії. Підпрограма здатна виявляти два види помилок: обрив лінії і коротке замикання. У разі виникнення помилки підпрограма повертає код помилки через акумулятор.

Починається підпрограма resLAN з формування імпульсу початкового скидання. Процес формування починається з того, що програма «підсаджує» лінію. Потім формується затримка тривалістю 700 мкс. Після чого лінія «відпускається». Для формування затримки використовується метод порожнього циклу. Спочатку параметру циклу присвоюється початкове значення. У даному випадку це значення дорівнює 100. Саме стільки разів у циклі викликається підпрограма Dely. Після формування імпульсу початкового скидання програма приступає до перевірки сигналу присутності на лінії. Для цього вона формує затримку в 65 мкс, а потім перевіряє значення сигналу на лінії. Якщо немає обриву на лінії і сигнал присутності сформований нормально, то саме в цей момент часу рівень сигналу на лінії повинен бути рівний нулю. Якщо рівень сигналу на лінії р1.1 дорівнює нулю, то це означає, що помилки не виявлено. Управління передається по мітці rst3. Якщо рівень сигналу на лінії дорівнює одиниці, то в акумулятор міститься код помилки «обрив на лінії», а потім підпрограма достроково завершується.

Якщо все ж таки відбувся перехід до мітці rst3 (помилка не виявлена), підпрограма формує затримку в 500 мкс і знову перевіряє рівень сигналу на лінії. Затримка в 500 мкс необхідна для правильного завершення процесу початкового скидання. Після закінчення цього проміжку часу сигнал присутності повинен вже закінчитися і рівень сигналу на лінії повинен бути дорівнює одиниці. Якщо це не так, то це означає, що лінія просто закорочена. У такому разі в акумулятор записується код помилки 2 («коротке замикання») і програма достроково завершується. Якщо короткого замикання не виявлено, то управління передається по мітці rst3 і підпрограма завершується нормальним чином. У цьому випадку, перед завершенням підпрограми в акумулятор поміщається нульовий код. Нуль-це код відсутності помилки.

Підпрограма mrslot (читання слота) служить для читання одного біта інформації з відомого пристрою. Підпрограма повертає прочитаний біт через CY (ознака перенесення). Спочатку підпрограма формує синхроимпульс. Для цього вона «підсаджує» лінію, формує затримку в 1 мкс, а потім лінію відпускає. Після закінчення синхроімпульса формується затримка в 13 мкс і зчитується рівень сигналу на лінії. Прочитаний біт поміщається в CY. Це і є результат читання слота. Однак на цьому виконання підпрограми не завершується.

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

Програма mwlow записує в слот нульове значення. Дія підпрограми зводиться до формування в межах слота негативного імпульсу тривалістю 80 мкс.

Дія підпрограми починається з формування синхроімпульса тривалістю 5 мкс. Для формування такої тривалості проводиться одноразове звернення до підпрограми Delay. Після завершення синхроімпульса формується затримка 75 мкс. Ця затримка доводить тривалість слота до стандартної величини.

Підпрограма Dely служить для формування тимчасових інтервалів. Як видно з тексту підпрограми, вона являє собою один оператор nор і завершується командою виходу з підпрограми. Така підпрограма забезпечує затримку, приблизно рівну 5 мкс. Підпрограму Delay зручно використовувати при формуванні щодо великих затримок за часом, включаючи виклик цієї підпрограми в тіло порожнього циклу. Команда пір не виконує абсолютно ніяких дій. У той же час, її виконання займає один машинний цикл мікроконтролера. При тактовій частоті, що дорівнює 12 МГц, тривалість машинного циклу буде одна мікросекунд (12/12 = 1 мкс). У мікросхемі АТ89С2051 частота тактового генератора ділиться на 12. Для формування невеликих часових інтервалів достатньо кількох операторів пір, поставлених поспіль один за одним. Для більш тривалих інтервалів застосовується порожній цикл. Цикл просто виконує кілька порожніх операторів певне число разів. У представлених тут підпрограмах широко використовуються обидва способи формування тимчасових інтервалів. В якості лічильника циклу використовується спеціальна комірка пам'яті, позначена в програмі, як LoopCnt.

Підпрограма wr8LAN виводить вміст байта, отриманого через акумулятор, біт за бітом в режимі запису. Саме тому описувана підпрограма представляє собою, по суті, цикл для передачі бітів. Регістр r1 використовується як параметр циклу. Початкове значення r1 дорівнює восьми (за кількістю бітів у байті). Виконання циклу починається з команди вилучення чергового біта. Для цього вміст акумулятора зсувається вправо за допомогою команди rrс. Дія цієї команди приводить до того, що черговий біт виявляється у клітинці ознаки перенесення CY.

Потім програма оцінює значення цього біта. Якщо він дорівнює одиниці, викликається підпрограма запису одиниці в слот mwhi. В іншому випадку викликається підпрограма mwlow для запису в слот нуля. Після виконання однієї з цих програм управління передається по мітці wb3. У цьому рядку перебуває команда організації циклу. Вона передає керування на початок циклу, якщо це не останній біт, і завершує цикл, якщо біт останній.

Підпрограма wr1LAN призначена для передачі по шині одного біта в режимі запису. Ця підпрограма дуже схожа на wr8LAN. Відмінність лише у відсутності циклу. Біт інформації, призначений для передачі по шині 1-Wire, передається в підпрограму через осередок CY. У залежності від значення цього біта виконується або підпрограма mwhi, або mwlow.

Підпрограма rd8LAN призначена для читання одного байта по шині 1-Wire. Програма повертає прочитаний байт в акумулятор. Основна частина підпрограми - це цикл введення бітів. Як параметр циклу використовується регістр r1. Перша команда, яка виконується в тілі циклу - виклик підпрограми читання слота. Вона поміщає прочитаний біт в клітинку CY. Потім біт поміщається в акумулятор методом зсуву. Зрушення проводиться за допомогою команди rrс. Після кожного такого зсуву в акумулятор «вдвигается» черговий прочитаний біт. Після восьми циклів зсуву акумулятор буде містити повноцінний прочитаний байт. Оператор djnz служить для організації всього цього циклу.

Підпрограма rdlLAN призначена для читання одного біта з лінії 1-Wire. Вона викликає підпрограму читання слота mrslot.

У ОЗУ мікроконтролера температура записана в двійковому вигляді. Перед нами стоїть завдання: перевести це значення з двійкової системи в десяткову. І лише потім вивести його на екран.

Для двійково-десяткового перетворення зручно використовувати команду цілочисельного ділення div. Для того, щоб здійснити двійково-десяткове перетворення, потрібно виконати цілочисельне ділення вихідного числа на 10. Після такої операції акумулятор буде містити приватне, а регістр b - залишок від ділення. Приватне буде відповідати кількості десятків, а залишок - кількості одиниць у десятковому представленні числа.

Потім можна просто вивести на екран два цих числа. Спочатку вміст акумулятора, а потім вміст регістра b. У результаті, на екрані ми одержимо зображення цілої частини значення температури в десятковому вигляді. Такий простий метод перетворення буде правильно працювати тільки в тому випадку, якщо ціла частина числа не перевищує значення 99. При більшому значенні температури в старшому розряді отриманого десяткового числа будуть з'являтися літери: частка від ділення буде більше 10. Однак для вимірювання температури приміщення діапазону (0 ... 60) ° С цілком достатньо. Для реалізації описаного алгоритму розроблена підпрограма prtmp. Підпрограма prtmp читає два байти температури з буфера bufLAN і виводить значення цілої частини температури на екран у десятковому вигляді.

Підпрограма reoh забезпечує режим охолодження роботи кондиціонера. Вона дискретно (з інтервалом в 3хв.) Вкличает і вимикає компресор і вентилятор і аналізує різницю Туст і ТПМ. Якщо ТПМ менше Туст на 2 градуси протягом двох циклів роботи кондиціонера в режимі охолоджування, то кондиціонер переходить в режим обігріву (підпрограма reoh за допомогою акумулятора переходить до мітці in4 основної програми). Якщо ні, то кондиціонер залишається в режимі охолодження (переходить до мітці in5). Підпрограма reoh так само викликає підпрограму zader (якщо клавіша натиснута, то перехід за допомогою акумулятора до мітці in1).

Підпрограма reob забезпечує режим обігріву роботи кондиціонера. Вона не преставлена в програмі, але працює аналогічно підпрограмі reoh (включає і вимикає НЕ компресор, а нагрівальний елемент).

0000

Bank0

EQU 00000000b

коды банков памяти

0001

Bank1

EQU 00001000b

0002

Bank2

EQU 00010000b

0003

Bank3

EQU 00110000b

DSEG

ORG

30h

0030

LoopCrt

DS 1

счетчик задержки

0031

BufLAN

DS 8

буфер для приема данных из MicroLAN

0039

bufLAN2

DS 8

буфер для Туст

0041

BufLAN3

DS 1

счетчик рабочих циклов кондиционера

ORG

60h

начало стека

0060

stack

DS 20h

глубина стека

main

0080

MOV

BufLAN,#18h

начальное значение Туст=24 градуса

0083

LCALL

INK1

0086

JZ

IN3

если клавиши не нажаты переход

IN1

0089

CJNE

A,#11b,008Fh

если обе клавиши нажаты переход

008C

INC

BufLAN

Туст увеличить на 1

008E

SJMP

IN3

IN2

0090

DEC

BufLAN2

IN3 0092

LCALL

ECLR1

вывод Туст

0095

MOV

A,#2

0097

LCALL

ECUR1

009A

LCALL

PRTMU

Туст на ЖКИ №1

009D

LCALL

ECLR2

00A0

MOV

A,#2

00A2

LCALL

ECUR2

00A5

LCALL

STTMP

запуск преобразования Тпм

00A8

LCALL

RDTMP

чтение Тпм

00AB

LCALL

PRTMP

вывод Тпм на ЖКИ №2

00AE

MOV

A,bufLAN+1

записьТпм в аккумулятор

00B0

SWAP

A

00B1

ANL

A,#0F0h

00B3

MOV

R5,A

00B4

MOV

A,bufLAN

00B6

SWAP

A

00B7

ANL

A,#0Fh

00B9

ADD

A,R5

в аккумуляторе байт Тпм

00BA

MOV

A,#LE(A,bufLAN)

сравнение Тпм<=Туст

00BC

MOV

BufLAN3,#0

Обнул. счетчик циклов работы

00BF

CJNE

A,#0FFFFh,IN5

обработкаусловия Тпм<=Туст

IN4 00C2

LCALL

REOB

00C5

SJMP

IN6

IN5 00C7

LCALL

REOH

IN6 00CA

MOV

B,A

00CB

MOV

A,EQ(B,#1)

00CD

CJNE

A,#0FFFFh,IN7

00D0

SJMP

IN1

IN7 00D2

MOV

A,EQ(B,#4)

00D4

CJNE

A,#0FFFh,00C7h

00D7

SJMP

00C2h

INK1

Подпрограмма ввода с клавиатуры (0 бит - S2, 1 бит - S1)

00D9

SETB

P0.0

установка 1 на линиях клавиатуры

00DB

MOV

A,P0

считывание порта p0

00DC

ANL

A,#00000011b

обнуление лишних разрядов

00DF

XRL

A,#00000011b

инвертирование

00E1

RET

ERES1

подпрограмма сброса ЖКИ №1

00E2

MOV

P2,#0Fh

отпр.адрес регистра блокировки

00E4

SETB

P2.4

00E6

CLR

P2.4

00E8

MOV

P2,#01000001b

Запис. код снятия блокировки

00EA

SETB

P2.4

00EC

CLR

P2.4

00EE

MOV

P2,#0

Устан. адрес на первый разряд

00F0

SETB

P2.4

00F2

CLR

P2.4

00F4

RET

ERES2

подпрограмма сброса ЖКИ №2

00F5

MOV

P3,#0Fh

00F7

SETB

P3.4

00F9

CLR

P3.4

00FB

MOV

P3,#01000001b

00FD

SETB

P3.4

00FF

CLR

P3.4

0102

MOV

P3,#0

0104

SETB

P3.4

0106

CLR

P3.4

0108

RET

ECLR1

подпрограмма очистки ЖКИ №1

0109

LCALL

ERES1

сброс экрана

010C

MOV

P2,#01000000b

установка управляющего кода

010E

MOV

R0,#20

инициализация счетчика разрядов

0110

SETB

P2.4

импульс записи

0112

CLR

P2.4

0114

DJNZ

R0,0110h

оператор цикла

0116

RET

ECLR2

подпрограмма очистки ЖКИ №2

0117

LCALL

ERES2

011A

MOV

P3,#01000000b

011C

MOV

R0,#20

011E

SETB

P3.4

0120

CLR

P3.4

0122

DJNZ

R0,011Eh

0124

RET

ECUR1

подпрограмма установки курсора для ЖКИ №1 по аккумулятору

0125

ANL

A,#0Fh

отделяем биты адреса

0127

MOV

P2,A

Устан. адрес на первый разряд

0128

SETB

P2.4

012A

CLR

P2.4

012C

RET

ECUR2

подпрограмма установки курсора для ЖКИ №2 по аккумулятору

012D

ANL

A,#0Fh

012F

MOV

P3,A

0130

SETB

P3.4

0132

CLR

P3.4

0134

RET

ORG

0600h

TS

таблица символов

0600

DB

0EEh

0

0601

DB

060h

1

0602

DB

02Fh

2

0603

DB

06Dh

3

0604

DB

0E1h

4

0605

DB

0CDh

5

0606

DB

0CFh

6

0607

DB

068h

7

0608

DB

0EFh

8

0609

DB

0EDh

9

060A

DB

0EBh

A

060B

DB

0C7h

b

060C

DB

08Eh

C

060D

DB

067h

d

060E

DB

08Fh

E

060F

DB

08Bh

F

0610

DB

000h

0611

DB

0A9h

0612

DB

001h

-

0613

DB

003h

r

0614

DB

047h

o

PRCH1

подпрограмма вывода символа на ЖКИ №1 через аккумулятор

0615

PUSH

DPL

сохранение регистров в стеке

0616

PUSH

DPH

0617

PUSH

B

0618

MOV

DPTR,#TS

начало таблицы символов

061B

MOV

C,ACC.7

сохраняем значение точки

061C

CLR

ACC.7

сбрасываем значение бита

061E

MOVC

A,@A+DPTR

получаем выводимый код

061F

MOV

ACC.4,C

восстанавливаем значение точки

0620

MOV

B,A

сохраняем его в b

0621

ANL

A,#0Fh

отделяем младший полубайт

0623

MOV

P2,A

выводим его на индикатор

0624

SETB

P2.6

вкл. Режим вывода данных

0626

SETB

P2.4

импульс записи

0628

CLR

P2.4

062A

MOV

A,B

восстанавливаем выводимый код

062B

SWAP

A

062C

ANL

A,#0Fh

отделяем старший полубайт

062E

MOV

P2,A

выводим его на индикатор

062F

SETB

P2.6

вкл. Режим вывода данных

0631

SETB

P2.4

импульс записи

0633

CLR

P2.4

0635

POP

B

0636

POP

DPH

восстановление регистров

0637

POP

DPL

0638

RET

PRCH2

подпрограмма вывода символа на ЖКИ №2 через аккумулятор

0639

PUSH

DPL

сохранение регистров в стеке

063A

PUSH

DPH

063B

PUSH

B

063C

MOV

DPTR,#TS

начало таблицы символов

063F

MOV

C,ACC.7

сохраняем значение точки

0640

CLR

ACC.7

сбрасываем значение бита

0642

MOVC

A,@A+DPTR

получаем выводимый код

0643

MOV

ACC.4,C

восстанавливаем значение точки

0644

MOV

B,A

сохраняем его в b

0645

ANL

A,0Fh

отделяем младший полубайт

0647

MOV

P3,A

выводим его на индикатор

0648

SETB

P3.6

вкл. Режим вывода данных

064A

SETB

P3.4

импульс записи

064C

CLR

P3.4

064E

MOV

A,B

восстанавливаем выводимый код

064F

SWAP

A

0650

ANL

A,#0Fh

отделяем старший полубайт

0651

MOV

P3,A

выводим его на индикатор

0652

SETB

P3.6

вкл. Режим вывода данных

0654

SETB

P3.4

импульс записи

0656

CLR

P3.4

0658

POP

B

0659

POP

DPH

восстановление регистров

065A

POP

DPL

065B

RET

PRSTR2

подпрограмма вывода сообщения на ЖКИ №2

065C

PUSH

PSW

сохранение регистра psw

065D

MOV

PSW,#BANK3

включаем банк 3

0660

MOV

A,#0

0662

MOVC

A,@A+DPTR

получение очередного символа

0663

CJNE

A,#0,0668

если это не последний выводим

0666

POP

PSW

завершение подпрограммы

0667

RET

0668

CALL

PRCH2

вывод символа на экран

066B

INC

DPTR

увеличиваем значение указателя

066C

JMP

0660

PRERR

подпрограмма вывода сообщения об ошибке

066F

PUSH

ACC

0670

CALL

ECLR2

очистка экрана

0673

MOV

A,#2

курсор в позицию 2

0675

CALL

ECUR2

0678

MOV

DPTR,#SERR

вывести надпись «Error»

067A

CALL

PRST2

067D

POP

ACC

067E

CALL

PRCH2

вывод номера ошибки

0681

RET

сообщение «Error»

ORG

0690h

0690

SERR

DB

14,19,19,20,19,0

сообщение «Error», 0 в конце - признак окончания слова

PRTMU

вывод Туст на ЖКИ №1

0696

MOV

A,#16

0698

MOV

A,BUFLAN2

069B

MOV

B,#10

069D

DIV

AB

069E

CALL

PRCH1

06A1

MOV

A,B

06A2

CALL

PRCH1

06A5

MOV

A,#0Ch

06A7

CALL

PRCH1

06AA

RET

ZADER

подпрограмма с длительностью выполнения примерно 3 мин. опроса клавиатуры и вывода Тпм

06AB

MOV

R2,#7

06AD

MOV

R1,#255

06AF

MOV

R0,#56

06B1

MOV

LOOPCNT,#255

06B4

CALL

DELAY

06B7

DJNZ

LOOPCNT,06B4h

06BA

DJNZ

R0,06B1h

06BC

CALL

INK1

опрос клавиатуры

06BF

JNZ

06DBh

переход при нажатии

06C2

CALL

ECLR2

вывод Тпм

06C5

MOV

A,#2

06C6

CALL

ECUR2

06C9

CALL

STTMP

06CC

CALL

RDTMP

06CF

CALL

PRTMP

06D2

DJNZ

R1,06AFh

06D5

DJNZ

R2,06ADh

06D8

MOV

A,#0

06DA

RET

06DB

MOV

A,#1

06DD

RET

STTMP

подпрограмма запуска процесса измерения температуры

06DE

PUSH

PSW

06DF

MOV

PSW,#BANK2

выбор банка 2 памяти

06E1

CALL

RESLAN

сброс

06E4

CJNE

A,#0,06F9h

если ошибка переход

06E7

MOV

A,#0CCh

пропуск ПЗУ

06E9

CALL

WR8LAN

06EC

MOV

A,#44h

запуск преобразования

06EE

CALL

WR8LAN

06F1

CALL

RD1LAN

запрос об окончании преобр.

06F4

JNE

06F1h

если не готово / повторить

06F7

POP

PSW

выход из подпрограммы

06F8

RET

06F9

CALL

PRERR

если ошибка, печать

06FC

JMP

06E1h

перейти в начало

RDTMP

подпрограмма чтения темп.

выходные параметры - температура в bufLAN - младший байт, в bufLAN+1 - старший байт

06FF

PUSH

PSW

0700

MOV

PSW,#BANK2

выбор банка 2 памяти

0702

CALL

RESLAN

вызов процедуры сброса

0705

CJNE

A,#0,071Eh

если ошибка

0708

MOV

A,#0CCh

пропуск ПЗУ

070A

CALL

WR8LAN

070D

MOV

A,0BEh

выдать команду

070F

CALL

WR8LAN

0712

CALL

RD8LAN

чтение младшего байта

0715

MOV

BUFLAN,A

запись в буфер

0717

CALL

RD8LAN

чтение старшего байта

071A

MOV

BUFLAN+1,A

запись в буфер

071C

POP

PSW

завершение программы

071D

RET

071E

CALL

PRERR

если ошибка, вывести на экран

0721

JMP

06FFh

перейти в начало

resLAN

подпрограмма формирования сигнала начального сброса

0724

CLR

P1.1

закорачиваем линию

0726

MOV

LOOPCNT,#100

задержка 700 мкс

0729

CALL

DELAY

072C

DJNZ

LOOPCNT,0729h

072F

SETB

P1.1

отпускаем линию

0731

MOV

LOOPCNT,#9

задержка 65 мкс

0734

CALL

DELAY

0737

DJNZ

LOOPCNT,0734h

073A

JNB

P1.1,0740h

проверка сигнала присутствия

073D

MOV

A,#1

код ошибки «нет датчика»

073F

RET

0740

MOV

LOOPCNT,#71

задержка 500 мкс

0743

CALL

DELAY

0746

DJNZ

LOOPCNT,0743h

0749

JB

P1.1,0750h

если на линии 1 переход

074C

MOV

A,#2

код ошибки «КЗ в линии»

074F

RET

0750

MOV

A,#0

код нормального завершения

0752

RET

MRslot

подпрограмма чтения слота (через признак переноса)

0753

CLR

P1.1

закоротить линию

0755

NOP

0756

SETB

P1.1

отпустить линию

0758

CALL

DELAY

задержка 13 мкс

075B

CALL

DELAY

075F

NOP

0760

NOP

0761

NOP

0762

MOV

C,P1.1

прочитать и сохранить бит

0763

MOV

LOOPCNT,#8

задержка 60 мкс

0766

CALL

DELAY

0769

DJNZ

LOOPCNT,0766h

076C

RET

MWlow

;подпрограмма записи 0 в слот

076D

CLR

P1.1

закоротить линию

076F

MOV

LOOPCNT,#11

задержка 80 мкс

0772

CALL

DELAY

0775

DJNZ

LOOPCNT,MWL1

0778

SETB

P1.1

отпустить линию

077A

RET

MWhi

подпрограмма записи 1 в слот

077B

CLR

P1.1

закоротить линию

077D

CALL

DELAY

задержка 5 мкс

0780

SETB

P1.1

отпустить линию

0782

MOV

LOOPCNT,#11

задержка 75 мкс

0785

CALL

DELAY

0788

DJNZ

LOOPCNT,0785h

078B

RET

DELAY

процедура задержки 5 мкс (при тактовой частоте 12МГц)

078C

NOP

078D

RET

wr8LAN

программа записи байта через аккумулятор

078E

MOV

R1,#8

инициализация счетчика разрядов

0790

RRC

A

младший бит в C

0791

JC

079Ah

если текущий бит = 0

0794

CALL

MWLOW

запись 0 в слот

0797

JMP

079Dh

079A

CALL

MWHI

запись 1 в слот

079D

DJNZ

R1,0790h

продолжать, если не последний

07A0

RET

wr1LAN

подпрограмма записи бита, который передается через С

07A1

JC

07AAh

если бит = 0

07A4

CALL

MWLOW

запись 0 в слот

07A7

JMP

WB5

07AA

CALL

MWHI

запись 1 в слот

07AD

RET

rd8LAN

подпрограмма чтения байта

07AE

MOV

R1,#8

счетчик количества битов

07B0

CALL

MRSLOT

чтение очередного бита

07B3

RRC

A

сдвиг битов младшим разрядом вперед

07B4

DJNZ

R1,07B0h

продолжать, если не последний

07B7

RET

rd1LAN

подпрограмма чтения бита

07B8

CALL

MRSLOT

07BB

RET

PRTMP

вывод Тпм на ЖКИ №2

07BC

MOV

A,#16

вывод пробела

07BE

CALL

PRCH2

07C1

MOV

A,BUFLAN+1

считываем старший байт

07C3

SWAP

A

обмен тетрад

07C4

ANL

A,#0F0h

получили старший полубайт

07C6

MOV

R5,A

временно записываем в R5

07C7

MOV

A,BUFLAN

считываем младший байт

07C9

SWAP

A

обмен тетрад

07CA

ANL

A,#0Fh

получили младший полубайт

07CC

ADD

A,R5

складываем полубайты

07CD

MOV

B,#10

деление на 10

07CF

DIV

AB

07D0

CALL

PRCH2

вывод десятков

07D3

MOV

A,B

берем остаток от деления

07D4

CALL

PRCH2

вывод единиц

07D7

MOV

A,#17

вывод символа «градус»

07D9

CALL

PRCH2

07DC

MOV

A,#0Ch

вывод буквы «С»(Цельсия)

07DE

CALL

PRCH2

07E1

RET

REOH

подпрограмма режима охлаждения

07E2

CLR

P0.2

выкл. Нагревательный элемент

07E4

SETB

P0.4

вкл. компрессор

07E6

SETB

P0.3

вкл. вентелятор

07E8

CALL

ZADER

07EB

JZ

0FEFh

переход при нажатой клавише

07EE

RET

0FEF

CLR

P0.4

выкл. компрессор

0FF1

CLR

P0.3

выкл. вентелятор

0FF3

CALL

ZADER

0FF6

JZ

0FF9h

переход при нажатой клавише

0FF8

RET

0FF9

MOV

A,BUFLAN+1

0FFC

SWAP

A

0FFD

ANL

A,#0F0h

0FFF

MOV

R5,A

1000

MOV

A,BUFLAN

1002

SWAP

A

1003

ANL

A,#0Fh

1005

ADD

A,R5

в аккумуляторе байт Тпм

1006

MOV

B,BUFLAN2

1008

MOV

B,#B-2

100A

MOV

A,#LE(A,B)

сравнение Тпм<=Туст-2

100D

CJNE

A,0FFFFh,RE1

переход, если не истина

1010

INC

BUFLAN3

счетчик циклов режима увеличить на 1

1012

MOV

A,#GT(bufLan3,2)

1014

CJNE

A,#0FFFFh,RE2

сравнение «счетчик циклов>=2»

1017

MOV

BUFLAN3,#0

обнуление счетчика

1019

MOV

A,#4

в режим обогрева

101B

RET

RE1

MOV

BUFLAN3,#0

обнуление счетчика

RE2

MOV

A,#5

режим охлаждения

RET

8. Інструкції з експлуатації та обслуговування мікропроцесорної системи

Методи налагодження пристрою

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

Методи пошуку та усунення несправностей

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

мікропроцесорний кондиціонер алгоритм програма

Висновки

У проекті були розроблені структурна і функціональна схеми кондиціонера з мікропроцесорним управлінням, в яких були враховані всі необхідні елементи. Також був розроблений алгоритм і велика частина програми.Розроблена система управління дозволяє підтримувати задану температуру в приміщенні, задовольняє основним вимогам: забезпечує економічність, низьку вартість, простоту у використанні і мінімальні витрати на експлуатацію.У процесі виконання роботи був обраний термодатчик з 1-Wire інтерфейсом, який оптимально підходить для вирішення завдань курсового проекту. Була розібрана робота 1-Wire інтерфейсу на різних рівнях програмної реалізації. Вибрані типові виконавчі пристрої кондиціонера, такі, як компресор, вентилятор, нагрівальний елемент за такими критеріями, як низька вартість, простоту у використанні і мінімальні витрати на експлуатацію. Був обраний мікроконтроллер сімейства МК51 за тими ж критеріями.

Список використаної літератури

1. В.В. Коляда. Кондиціонери - М.: СОЛОН-Прес, 2002 - с. 233.

2. А.В. Бєлов. Конструювання пристроїв на мікроконтролерах - СПб.: Наука і техніка, 2005 - с. 255.

3. www.inrost.ru - науково-технічна бібліотека сайту фірми ІНРОСТ.

4. А.В. Логінов. Програмування мікро-ЕОМ сімейства МК51: Учеб. Посібник - СПб.: Балт. держ. тех. ун-т, 1996 - 72с.

5. www.atmel.ru - офіційний сайт корпорації Atmel.

Додаток 1

Система команд мікропроцесора

Таблица 1

Группа команд передачі даних

Название команды

Мнемокод

КОП

Т

Б

Ц

Операція

Пересылка в аккумулятор из регистра (n = 0 - 7)

MOV A, Rn

11101rrr

1

1

1

(A) = (Rn)

Пересылка в аккумулятор прямоадресуемого байта

MOV A, ad

11100101

3

2

1

(A) = (ad)

Пересылка в аккумулятор байта из РДП (i = 0, 1)

MOV A, @Ri

1110011i

1

1

1

(A) = ((Ri))

Загрузка в аккумулятор константы

MOV A, #d

01110100

2

2

1

(A) = #d

Пересылка в регистр из аккумулятора

MOV Rn, A

11111rrr

1

1

1

(Rn) = (A)

Пересылка в регистр прямоадресуемого байта

MOV Rn, ad

10101rrr

3

2

2

(Rn) = (ad)

Загрузка в регистр константы

MOV Rn, #d

01111rrr

2

2

1

(Rn) = #d

Пересылка по прямому адресу аккумулятора

MOV ad, A

11110101

3

2

1

(ad) = (A)

Пересылка по прямому адресу регистра

MOV ad, Rn

10001rrr

3

2

2

(ad) = (Rn)

Пересылка прямоадресуемого байта по прямому адресу

MOV add, ads

10000101

9

3

2

(add) = (ads)

Пересылка байта из РДП по прямому адресу

MOV ad, @Ri

1000011i

3

2

2

(ad) = ((Ri))

Пересылка по прямому адресу константы

MOV ad, #d

01110101

7

3

2

(ad) = #d

Пересылка в РДП из аккумулятора

MOV @Ri, A

1111011i

1

1

1

((Ri)) = (A)

Пересылка в РДП прямоадресуемого байта

MOV @Ri, ad

0110011i

3

2

2

((Ri)) = (ad)

Пересылка в РДП константы

MOV @Ri, #d

0111011i

2

2

1

((Ri)) = #d

Загрузка указателя данных

MOV DPTR, #d16

10010000

13

3

2

(DPTR) = #d16

Пересылка в аккумулятор байта из ПП

MOVC A, @A + DPTR

10010011

1

1

2

(A) = ((A) + (DPTR))

Пересылка в аккумулятор байта из ПП

MOVC A, @A + PC

10000011

1

1

2

(PC) = (PC) + 1

(A) = ((A) + (PC))

Пересылка в аккумулятор байта из ВПД

MOVX A, @Ri

1110001i

1

1

2

(A) = ((Ri))

Пересылка в аккумулятор байта из расширенной ВПД

MOVX A, @DPTR

11100000

1

1

2

(A) = ((DPTR))

Пересылка в ВПД из аккумулятора

MOVX @Ri, A

1111001i

1

1

2

((Ri)) = (A)

Пересылка в расширенную ВПД из аккумулятора

MOVX @DPTR, A

11110000

1

1

2

((DPTR)) = (A)

Загрузка в стек

PUSH ad

11000000

3

2

2

(SP) = (SP) + 1

((SP)) = (ad)

Извлечение из стека

POP ad

11010000

3

2

2

(ad) = (SP)

(SP) = (SP) - 1

Обмен аккумулятора с регистром

XCH A, Rn

11001rrr

1

1

1

(A) <-> (Rn)

Обмен аккумулятора с прямоадресуемым байтом

XCH A, ad

11000101

3

2

1

(A) <-> (ad)

Обмен аккумулятора с байтом из РДП

XCH A, @Ri

1100011i

1

1

1

(A) <-> ((Ri))

Обмен младшей тетрады аккумулятора с младшей тетрадой байта РДП

XCHD A, @Ri

1101011i

1

1

1

(A0-3) <-> ((Ri) 0-3)

Группа команд арифметичних операцій

Таблица 2

Группа команд арифметичних операцій

Название команды

Мнемокод

КОП

Т

Б

Ц

Операция

Сложение аккумулятора с регистром (n = 0 - 7)

ADD A, Rn

00101rrr

1

1

1

(A) = (A) + (Rn)

Сложение аккумулятора с прямоадресуемым байтом

ADD A, ad

00100101

3

2

1

(A) = (A) + (ad)

Сложение аккумулятора с байтом из РПД (i = 0, 1)

ADD A, @Ri

0010011i

1

1

1

(A) = (A) + ((Ri))

Сложение аккумулятора с константой

ADD A, #d

00100100

2

2

1

(A) = (A) + #d

Сложение аккумулятора с регистром и переносом

ADDC A, Rn

00111rrr

1

1

1

(A) = (A) + (Rn) + (C)

Сложение аккумулятора с прямоадресуемым байтом и переносом

ADDC A, ad

00110101

3

2

1

(A) = (A) + (ad) + (C)

Сложение аккумулятора с байтом из РПД и переносом

ADDC A, @Ri

0011011i

1

1

1

(A) = (A) + ((Ri)) + (C)

Сложение аккумулятора с константой и переносом

ADDC A, #d

00110100

2

2

1

(A) = (A) + #d + (C)

Десятичная коррекция аккумулятора

DA A

11010100

1

1

1

Если

(A0-3) > 9 \/ ((AC) = 1),

то (A0-3) = (A0-3) + 6, затем если

(A4-7) > 9 \/ ((C) = 1),

то (A4-7) = (A4-7) + 6

Вычитание из аккумулятора регистра и заема

SUBB A, Rn

10011rrr

1

1

1

(A) = (A) - (C) - (Rn)

Вычитание из аккумулятора прямоадресуемого байта и заема

SUBB A, ad

10010101

3

2

1

(A) = (A) - (C) - ((ad))

Вычитание из аккумулятора байта РПД и заема

SUBB A, @Ri

1001011i

1

1

1

(A) = (A) - (C) - ((Ri))

Вычитание из аккумулятора константы и заема

SUBB A, #d

10010100

2

2

1

(A) = (A) - (C) - #d

Инкремент аккумулятора

INC A

00000100

1

1

1

(A) = (A) + 1

Инкремент регистра

INC Rn

00001rrr

1

1

1

(Rn) = (Rn) + 1

Инкремент прямоадресуемого байта

INC ad

00000101

3

2

1

(ad) = (ad) + 1

Инкремент байта в РПД

INC @Ri

0000011i

1

1

1

((Ri)) = ((Ri)) +1

Инкремент указателя данных

INC DPTR

10100011

1

1

2

(DPTR) = (DPTR) + 1

Декремент аккумулятора

DEC A

00010100

1

1

1

(A) = (A) - 1

Декремент регистра

DEC Rn

00011rrr

1

1

1

(Rn) = (Rn) - 1

Декремент прямоадресуемого байта

DEC ad

00010101

3

2

1

(ad) = (ad) - 1

Декремент байта в РПД

DEC @Ri

0001011i

1

1

1

((Ri)) = ((Ri)) -1

Умножение аккумуллятора на регистр B

MUL AB

10100100

1

1

4

(B)(A) = (A)*(B)

Деление аккумулятора на регистр B

DIV AB

10000100

1

1

4

(A).(B) = (A)/(B)

Команды ADD и ADDC аналогичны командам сложения МК48, но допускают сложение аккумулятора с большим числом операндов. Аналогично командам ADDC существуют четыре команды SUBB, что позволяет более просто, чем в МК48, производить вычитание байтов и многобайтных двоичных чисел. В МК51 реализуется расширенный (по сравнению с МК48) список команд инкремента/декремента байтов, введена команда инкремента 16-битного регистра-указателя данных.

Группа команд логических операций

Данную группу образуют 25 команд (табл.3.4), реализующих те же логические операции над байтами, что и в МК48. Однако в МК51 значительно расширено число типов операндов, участвующих в операциях.

Таблица 3

Группа команд логических операций

Название команды

Мнемокод

КОП

Т

Б

Ц

Операция

Логическое И аккумулятора и регистра

ANL A, Rn

01011rrr

1

1

1

(A) = (A) /\ (Rn)

Логическое И аккумулятора и прямоадресуемого байта

ANL A, ad

01010101

3

2

1

(A) = (A) /\ (ad)

Логическое И аккумулятора и байта из РПД

ANL A, @Ri

0101011i

1

1

1

(A) = (A) /\ ((Ri))

Логическое И аккумулятора и константы

ANL A, #d

01010100

2

2

1

(A) = (A) /\ #d

Логическое И прямоадресуемого байта и аккумулятора

ANL ad, A

01010010

3

2

1

(ad) = (ad) /\ (A)

Логическое И прямоадресуемого байта и константы

ANL ad, #d

01010011

7

3

2

(ad) = (ad) /\ #d

Логическое ИЛИ аккумулятора и регистра

ORL A, Rn

01001rrr

1

1

1

(A) = (A) \/ (Rn)

Логическое ИЛИ аккумулятора и прямоадресуемого байта

ORL A, ad

01000101

3

2

1

(A) = (A) \/ (ad)

Логическое ИЛИ аккумулятора и байта из РПД

ORL A, @Ri

0100011i

1

1

1

(A) = (A) \/ ((Ri))

Логическое ИЛИ аккумулятора и константы

ORL A, #d

01000100

2

2

1

(A) = (A) \/ #d

Логическое ИЛИ прямоадресуемого байта и аккумулятора

ORL ad, A

01000010

3

2

1

(ad) = (ad) \/ (A)

Логическое ИЛИ прямоадресуемого байта и константы

ORL ad, #d

01000011

7

3

2

(ad) = (ad) \/ #d

Исключающее ИЛИ аккумулятора и регистра

XRL A, Rn

01101rrr

1

1

1

(A) = (A) \/ (Rn)

Исключающее ИЛИ аккумулятора и прямоадресуемого байта

XRL A, ad

01100101

3

2

1

(A) = (A) \/ (ad)

Исключающее ИЛИ аккумулятора и байта из РПД

XRL A, @Ri

0110011i

1

1

1

(A) = (A) \/ ((Ri))

Исключающее ИЛИ аккумулятора и константы

XRL A, #d

01100100

2

2

1

(A) = (A) \/ #d

Исключающее ИЛИ прямоадресуемого байта и аккумулятора

XRL ad, A

01100010

3

2

1

(ad) = (ad) \/ (A)

Исключающее ИЛИ прямоадресуемого байта и константы

XRL ad, #d

01100011

7

3

2

(ad) = (ad) \/ #d

Сброс аккумулятора

CLR A

11100100

1

1

1

(A) = 0

Инверсия аккумулятора

CPL A

11110100

1

1

1

(A) = ( ¬A)

Сдвиг аккумулятора влево циклически

RL A

00100011

1

1

1

(An+1) = (An),

n = 0 ? 6, (A0) = (A7)

Сдвиг аккумулятора влево через перенос

RLC A

00110011

1

1

1

(An+1) = (An),

n = 0 ? 6, (A0) = (C),

(C) = (A7)

Сдвиг аккумулятора вправо циклически

RR A

00000011

1

1

1

(A n) = (A n+1),

n = 0 ? 6, (A7) = (A0)

Сдвиг аккумулятора вправо через перенос

RRC A

00010011

1

1

1

(A n) = (A n+1),

n = 0 ? 6, (A7) = (C),

(C) = (A0)

Обмен местами тетрад в аккумуляторе

SWAP A

11000100

1

1

1

(A0-3) <-> (A4-7)

В отличие от МК48 имеется возможность производить операцию "исключающее ИЛИ" с содержимым портов. Команда XRL может быть эффективно использована для инверсии отдельных бит портов.

Группа команд операций с битами

Отличительной особенностью данной группы команд (табл.3.5) является то, что они оперируют с однобитными операндами. В качестве таких операндов могут выступать отдельные биты некоторых регистров специальных функций (РСФ) и портов, а также 128 программных флагов пользователя.

Таблица 4

Группа команд операции с битами

Название команды

Мнемокод

КОП

Т

Б

Ц

Операция

Сброс переноса

CLR C

11000011

1

1

1

(C) = 0

Сброс бита

CLR bit

11000010

4

2

1

(b) = 0

Установка переноса

SETB C

11010011

1

1

1

(C) = 1

Установка бита

SETB bit

11010010

4

2

1

(b) = 1

Инверсия переноса

CPL C

10110011

1

1

1

(C) = ( ¬C)

Инверсия бита

CPL bit

10110010

4

2

1

(b) = ( ¬b)

Логическое И бита и переноса

ANL C, bit

10000010

4

2

2

(C) = (C) /\ (b)

Логическое И инверсии бита и переноса

ANL C, /bit

10110000

4

2

2

(C) = (C) /\ ( ¬b)

Логическое ИЛИ бита и переноса

ORL C, bit

01110010

4

2

2

(C) = (C) \/ (b)

Логическое ИЛИ инверсии бита и переноса

ORL C, /bit

10100000

4

2

2

(C) = (C) \/ (¬b)

Пересылка бита в перенос

MOV C, bit

10100010

4

2

1

(C) = (b)

Пересылка переноса в бит

MOV bit, C

10010010

4

2

2

(b) = (C)

Существуют команды сброса (CLR), установки (SETB) и инверсии (CPL) бит, а также конъюнкции и дизъюнкции бита и флага переноса. Для адресации бит используется прямой восьмиразрядный адрес (bit). Косвенная адресация бит невозможна.

Группа команд передачи управления

К данной группе команд (табл.3.6.) относятся команды, обеспечивающие условное и безусловное ветвление, вызов подпрограмм и возврат из них, а также команда пустой операции NOP. В большинстве команд используется прямая адресация, т.е. адрес перехода целиком (или его часть) содержится в самой команде передачи управления. Можно выделить три разновидности команд ветвления по разрядности указываемого адреса перехода.

Таблица 5

Группа команд передачи управления

Название команды

Мнемокод

КОП

Т

Б

Ц

Операция

Длинный переход в полном объеме памяти в программ

LJMP ad16

00000010

12

3

2

(PC) = ad16

Абсолютный переход внутри страницы в 2 Кбайта

AJMP ad11

a10a9a800001

6

2

2

(PC) = (PC) + 2

(PC0-10) = ad11

Короткий относительный переход внутри страницы в 256 байт

SJMP rel

10000000

5

2

2

(PC) = (PC) + 2

(PC) = (PC) + rel

Косвенный относительный переход

JMP @A+DPTR

01110011

1

1

2

(PC) = (A) + (DPTR)

Переход, если аккумулятор равен нулю

JZ rel

01100000

5

2

2

(PC) = (PC) + 2,

если (A) = 0,

то (PC) = (PC) + rel

Переход, если аккумулятор не равен нулю

JNZ rel

01110000

5

2

2

(PC) = (PC) + 2,

если (A) ? 0,

то (PC) = (PC) + rel

Переход, если перенос равен единице

JC rel

01000000

5

2

2

(PC) = (PC) + 2,

если (C) = 1,

то (PC) = (PC) + rel

Переход, если перенос равен нулю

JNC rel

01010000

5

2

2

(PC) = (PC) + 2,

если (C) = 0,

то (PC) = (PC) + rel

Переход, если бит равен единице

JB bit, rel

00100000

11

3

2

(PC) = (PC) + 3,

если (b) = 1,

то (PC) = (PC) + rel

Переход, если бит равен нулю

JNB bit, rel

00110000

11

3

2

(PC) = (PC) + 3,

если (b) = 0,

то (PC) = (PC) + rel

Переход, если бит установлен, с последующим сбросом бита

JBC bit, rel

00010000

11

3

2

(PC) = (PC) + 3,

если (b) = 1,

то (b) = 0

и (PC) = (PC) + rel

Декремент регистра и переход, если не нуль

DJNZ Rn, rel

11011rrr

5

2

2

(PC) = (PC) + 2,

(Rn) = (Rn) -1,

если (Rn) ? 0,

то (PC) = (PC) + rel

Декремент прямоадресуемого байта и переход, если не нуль

DJNZ ad, rel

11010101

8

3

2

(PC) = (PC) + 2,

(ad) = (ad) -1,

если (ad) ? 0,

то (PC) = (PC) + rel

Сравнение аккумулятора с прямоадресуемым байтом и переход, если не равно

CJNE A, ad, rel

10110101

8

3

2

(PC) = (PC) + 3,

если (A) ? (ad),

то (PC) = (PC) + rel,

если (A) < (ad),

то (C) = 1,

иначе (C) = 0

Сравнение аккумулятора с константой и переход, если не равно

CJNE A, #d, rel

10110100

10

3

2

(PC) = (PC) + 3,

если (A) ? #d,

то (PC) = (PC) + rel,

если (A) < #d,

то (C) = 1,

иначе (C) = 0

Сравнение регистра с константой и переход, если не равно

CJNE Rn, #d, rel

10111rrr

10

3

2

(PC) = (PC) + 3,

если (Rn) ? #d,

то (PC) = (PC) + rel,

если (Rn) < #d,

то (C) = 1,

иначе (C) = 0

Сравнение байта в РПД с константой и переход, если не равно

CJNE @Ri, #d, rel

1011011i

10

3

2

(PC) = (PC) + 3,

если ((Ri)) ? #d,

то (PC) = (PC) + rel, если ((Ri)) < #d,

то (C) = 1,

иначе (C) = 0

Длинный вызов подпрограммы

LCALL ad16

00010010

12

3

2

(PC) = (PC) + 3,

(SP) = (SP) + 1,

((SP)) = (PC0-7),

(SP) = (SP) + 1,

((SP)) = (PC8-15),

(PC) = ad16

Абсолютный вызов подпрограммы в пределах страницы в 2 Кбайта

ACALL ad11

a10a9a810001

6

2

2

(PC) = (PC) + 2,

(SP) = (SP) + 1,

((SP)) = (PC0-7),

(SP) = (SP) + 1,

((SP)) = (PC8-15),

(PC0-10) = ad11

Возврат из подпрограммы

RET

00100010

1

1

2

(PC8-15) = ((SP)),

(SP) = (SP) - 1,

(PC0-7) = ((SP)),

(SP) = (SP) - 1

Возврат из подпрограммы обработки прерывания

RETI

00110010

1

1

2

(PC8-15) = ((SP)),

(SP) = (SP) - 1,

(PC0-7) = ((SP)),

(SP) = (SP) - 1

Холостая команда

NOP

00000000

1

1

1

(PC) = (PC) + 1

Примечание. Ассемблер допускает использование обобщенного имени команд JMP и CALL, которые в процессе трансляции заменяются оптимальными по формату командами вызова (ACALL, LCALL) или перехода (AJMP, SJMP, LJMP).

Длинный переход

Переход по всему адресному пространству ПП. В команде содержится полный 16-битный адрес перехода (ad 16). Трех байтные команды длинного перехода содержат в мнемокоде букву L (Long). Всего существует две такие команды: LJMP - длинный переход и LCALL - длинный вызов подпрограммы. На практике редко возникает необходимость перехода в пределах всего адресного пространства и чаще используются укороченные команды перехода, занимающее меньше места в памяти.

Абсолютный переход. Переход в пределах одной страницы памяти программ размером 2048 байт. Такие команды содержат только 11 младших бит адреса перехода (ad 11). Команды абсолютного перехода имеют формат 2 байта. Начальная буква мнемокода - A (Absolute). При выполнении команды в вычисленном адресе следующей по порядку команды ((РС)= (PC) + 2) 11 младших бит заменяются на ad11 из тела команды абсолютного перехода.

Относительный переход. Короткий относительный переход позволяет передать управление в пределах -128 - +127 байт относительно адреса следующей команды (команды, следующей по порядку за командой относительного перехода). Существует одна команда безусловного короткого перехода SJMP (Short). Все команды условного перехода используют данный метод адресации. Относительный адрес перехода (rel) содержится во втором байте команды.

Косвенный переход. Команда JMP @A + DPTR позволяет передавать управление по косвенному адресу. Эта команда удобна тем, что предоставляет возможность организации перехода по адресу, вычисляемому самой программой и неизвестному при написании исходного текста программы.

Условные переходы. Развитая система условных переходов предоставляет возможность осуществлять ветвление по следующим условиям: аккумулятор содержит нуль (JZ); содержимое аккумулятора не равно нулю (JNZ); перенос равен единице (JC); перенос равен нулю (JNC); адресуемый бит равен единице (JB); адресуемый бит равен нулю (JNB).

Для организации программных циклов удобно пользоваться командой DJNZ, которая работает аналогично соответствующей команде МК48. Однако в качестве счетчика циклов в МК51 может использоваться не только регистр, но и прямоадресуемый байт (например, ячейка РПД).

Команда CJNE эффективно используется в процедурах ожидания какого-либо события. Например, команда

WAIT: CJNE A,P0,WAIT

будет выполняться до тех пор, пока на линиях порта 0 не установится информация, совпадающая с содержимым аккумулятора.

Все команды данной группы, за исключением CJNE и JBC, не оказывают воздействия на флаги. Команда CJNE устанавливает флаг C, если первый операнд оказывается меньше второго. Команда JBC сбрасывает флаг C в случае перехода.

Подпрограммы. Для обращения к подпрограммам необходимо использовать команды вызова подпрограмм (LCALL, ACALL). Эти команды в отличие от команд перехода (LJMP, AJMP) сохраняют в стеке адрес возврата в основную программу. Для возврата из подпрограммы необходимо выполнить команду RET. Команда RETI отличается от команды RET тем, что разрешает прерывания обслуженного уровня.

Размещено на Allbest.ru


Подобные документы

  • Розробка мікропроцесорної системи управління роботом з контролем переміщення на базі мікроконтролера AT89C51. Розробка і опис структурної схеми мікропроцесорної системи. Відстань між світлодіодом і фототранзистором. Розробка алгоритмів програми.

    курсовая работа [2,3 M], добавлен 13.04.2013

  • Розробка передавального напівкомплекту кодоімпульсної системи телевимірювань. Застосування системи для відправлення в лінію зв’язку сигналів телевимірювання. Розробка функціональної схеми багатоканального напівкомплекту. Вибір елементної бази системи.

    курсовая работа [188,3 K], добавлен 31.05.2013

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

    курсовая работа [1,0 M], добавлен 28.09.2011

  • Система реєстрації даних як високопродуктивний обчислювач з процесором або контролером, накопичувачем інформації й інтерфейсом зв'язку. Розробка функціональної схеми й вибір елементної бази. Аналіз принципової електричної схеми. Економічні розрахунки.

    дипломная работа [694,4 K], добавлен 20.02.2011

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

    дипломная работа [1,4 M], добавлен 13.06.2017

  • Мнемосхема процесу завантаження вагонеток. Технічні характеристики та конструктивне оформлення системи управління. Розробка принципової схеми: вибір елементної бази, датчиків та основних елементів силової частини. Розрахунок енергоспоживання пристрою.

    курсовая работа [228,3 K], добавлен 14.11.2011

  • Розробка та формалізація алгоритму управління вузлом виготовлення глиняного брусу на базі RS-тригерної моделі. Структурна та принципова схеми системи управління, її конструктивне оформлення. Реалізація системи на дискретних логічних елементах серії К555.

    курсовая работа [711,2 K], добавлен 30.09.2011

  • Блок керування та синхронізації. Вибір АЦП, комутатора-мультиплексора, інтерфейсних схем. Таблиця розподілу оперативної пам'яті. Розробка структурної та принципової схеми і алгоритму функціонування контролера. Архітектура мікроконтролерів MCS-51.

    курсовая работа [801,8 K], добавлен 17.05.2013

  • Розробка функціональної схеми цифрової слідкуючої системи. Складання передаточних функцій її елементів. Вибір виконавчого двигуна і підсилювача потужності. Розрахунок, побудова та моделювання послідовної безперервної корегуючої ланки методом ЛАЧХ.

    курсовая работа [169,8 K], добавлен 21.04.2011

  • Характеристика устаткування підприємств м’ясної промисловості. Функціональна схема електроприводу куттера. Розробка структурної, математичної схеми мікропроцесорної САУ, її алгоритму функціонування. Дослідження якості перехідних процесів й точності МПСАУ.

    курсовая работа [1,2 M], добавлен 12.05.2014

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.