Розробка мікропроцесорного приладу для управління кондиціонером
Предметна область застосування мікропроцесорної системи; проект приладу для управління кондиціонером. Побудова структурної і функціональної схеми роботи системи; вибір елементної бази по діапазону характеристик, розробка алгоритму і резидентної програми.
Рубрика | Коммуникации, связь, цифровые приборы и радиоэлектроника |
Вид | курсовая работа |
Язык | украинский |
Дата добавления | 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) |
|
Исключающее ИЛИ аккумулятора и прямоадресуемого байта |
XRL A, ad |
01100101 |
3 |
2 |
1 |
(A) = (A) |
|
Исключающее ИЛИ аккумулятора и байта из РПД |
XRL A, @Ri |
0110011i |
1 |
1 |
1 |
(A) = (A) |
|
Исключающее ИЛИ аккумулятора и константы |
XRL A, #d |
01100100 |
2 |
2 |
1 |
(A) = (A) |
|
Исключающее ИЛИ прямоадресуемого байта и аккумулятора |
XRL ad, A |
01100010 |
3 |
2 |
1 |
(ad) = (ad) |
|
Исключающее ИЛИ прямоадресуемого байта и константы |
XRL ad, #d |
01100011 |
7 |
3 |
2 |
(ad) = (ad) |
|
Сброс аккумулятора |
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