бесплано рефераты

Разделы

рефераты   Главная
рефераты   Искусство и культура
рефераты   Кибернетика
рефераты   Метрология
рефераты   Микроэкономика
рефераты   Мировая экономика МЭО
рефераты   РЦБ ценные бумаги
рефераты   САПР
рефераты   ТГП
рефераты   Теория вероятностей
рефераты   ТММ
рефераты   Автомобиль и дорога
рефераты   Компьютерные сети
рефераты   Конституционное право
      зарубежныйх стран
рефераты   Конституционное право
      России
рефераты   Краткое содержание
      произведений
рефераты   Криминалистика и
      криминология
рефераты   Военное дело и
      гражданская оборона
рефераты   География и экономическая
      география
рефераты   Геология гидрология и
      геодезия
рефераты   Спорт и туризм
рефераты   Рефераты Физика
рефераты   Физкультура и спорт
рефераты   Философия
рефераты   Финансы
рефераты   Фотография
рефераты   Музыка
рефераты   Авиация и космонавтика
рефераты   Наука и техника
рефераты   Кулинария
рефераты   Культурология
рефераты   Краеведение и этнография
рефераты   Религия и мифология
рефераты   Медицина
рефераты   Сексология
рефераты   Информатика
      программирование
 
 
 

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


Рисунок 12 - Структура памяти микросхемы DS18B20

Все три описанные выше регистра (байт 2, байт 3, байт 4) имеют механизм автоматического восстановления. При включении питания в них автоматически копируется информация из соответствующих регистров EEPROM. В регистр температуры после включения питания помешается код 0550Н (старший байт 05Н, младший байт 50Н), что соответствует температуре 85°С.

Оставшиеся три регистра блокнотной памяти (байт 5, байт 6 и байт 7) в микросхеме DSI8S20 не используются. Они зарезервированы для будущих ее модификаций. При чтении все три неиспользуемых регистра возвращают код OFFH (единицы во всех разрядах). Последний, восьмой регистр блокнотной памяти — это регистр генератора контрольной суммы.

Формат регистра температуры приведен на рисунке 13.

Рисунок 13 - Структура регистра температуры

После окончания процесса преобразования эти регистры содержат прямое значение величины измеренной температуры в двоичном виде. Регистр температуры — это два регистра блокнотной памяти. На рисунке 13 показан вес каждого разряда регистра. Биты с 11-го по 15-й (обозначенные буквой S) содержат одно и то же значение. Оно равно знаку записанного числи (0 — плюс, 1 — минус). Положительные значения температуры записываются в прямом коде, а отрицательные — в дополнительном (для того, чтобы перевести двоичное число в дополнительный код, нужно инвертировать его, а затем прибавить единицу).

Теперь рассмотрим формат регистров Тн и TL. На рисунке 14 он представлен в графическом виде. Как видно из рисунка, эти регистры имеют всего по восемь разрядов. Причем старший разряд - это знак числа. Поэтому верхний и нижний пределы температуры могут устанавливаться лишь с шагом в 1 градус. Для записи положительных и отрицательных чисел в регистрах Тн и TL также используются прямой и дополнительный коды.

Рисунок 14 - Формат регистров Тн и TL.

Формат регистра конфигурации приведен на рисунке 15. Для изменения конфигурации используются только два разряда этого Регистра — бит 5 и бит 6. Значения остальных битов показаны на рисунке. В таблице 2 представлены все четыре режима, которые можно установить при помощи регистра конфигурации. Номер режима определяется разрядами RO и R1. При отключении лишних разрядов уменьшается точность измерения температуры, но одноименно уменьшается и время, необходимое для преобразования температуры в код. В таблице 2 для каждого из режимов работы приведено максимальное значение времени преобразования.

Бит 7 Бит 6 Бит 5 Бит 4 Бит 3 Бит 2 Бит 1 Бит 0
0 R1 R0 1 1 1 1 1

Рисунок 15 - Формат регистра конфигурации

Таблица 2 - Выбор количества разрядов

На рисунке 16 показана схема включения микросхем DSI8B20 в режиме внешнего питания. Внешнее питание подается через вывод VDD. Если термодатчик находится на значительном удалении от микроконтроллера, то применен такой схемы включения не очень желательно, так как для питания датчика придется прокладывать еще один (третий) провод.

Второй вариант включения микросхем DSI8B20 изображен на рисунке 17. В такой схеме реализованы два режима питания. Для переключения режимов используется управляемый электронный ключ KI. Ключ управляется от микроконтроллера, для чего используется отдельная линия ввода/вывода. Такая схема позволяет переключать режимы питания программным путем. Основной режим работы для схемы, изображенной на рисунке 17 - это режим паразитного питания. В этом режиме ключ KI закрыт и напряжении на шине определяется резистором нагрузки R1, что позволяет передавать информацию по шине, используя 1-Wire протокол.

В нужный момент ключ KI открывается и на шину поступает полноценное питание от источника VPU. Питание поступает только на время выполнения одной из энергоемких команд. Пока ключ К1 открыт, информационный обмен по шине невозможен. Микроконтроллер выдерживает шину в таком состоянии необходимое время, а затем закрывает ключ К1. Шина возвращается в обычный режим работы и снова обретает возможность передачи данных. Для того, чтобы микросхема DSI8B20 правильно работала в режиме паразитного питания, нужно соединить между собой выводы VDD и GND и подключить оба этих вывода к общему проводу, как показано на рисунке.

Рисунок 16 - Схема включения термодатчика в режиме внешнего питания

Рисунок 17 - Схема включения термодатчика в режиме паразитного питания

На рисунке 18показана схема включая вспомогательной цепи и цепи питания. Роль однопроводной шины выполняет линия Р1.1 микроконтроллера. Резистор R2 — это нагрузочный резистор шины. Рекомендованное значение номинала этого резистора 4,7 кОм. Электронный ключ для переключения режима питания собран на элементах VT1, R3, R4 и R5. Микроконтроллер управляет ключом при помощи линии Р1.0. Резистор R5 служит для ограничения тока базы транзистора VT1. Резистор R4 введен для надежного закрывания транзистора. Резистор R3 — страховочный. Он служит для ограничения тока при коротком замыкании в цепи датчика.

Рисунок 18 - Схема включения вспомогательной цепи и цепи питания

2.5 Система команд транспортного уровня микросхемы DSI8B20

Система команд транспортного уровня микросхемы DSI8B20 представлена в таблице 3:

Таблица 3 – Система команд транспортного уровня микросхемы DS18B20

Код команды Описание
4EH Запись блокнотной памяти
0BEH Чтение блокнотной памяти
0B4H Чтение режима питания
0B8H Чтение из EEPROM в блокнотную память
48H Копирование блокнотной памяти в EEPROM
44H Запуск процесса преобразования

В данном проекте используется внешний режим питания микросхемы, поэтому команда «Чтение режима питания» (0B4H) не используется.

Команда «Запись блокнотной памяти» (Write Scratchpad). При выполнении этой команды микроконтроллер выдает на шину следующие сигналы:

-сигнал начального сброса;

-команду сетевого уровня «Пропуск ПЗУ»(0ССН);

-код операции Запись блокнотной памяти» (4EH);

-восемь байт для записи во все восемь регистров этой памяти.

Микросхема DS18B20 принимает все эти данные и записывает в регистры памяти.

Команда «Чтение блокнотной памяти» (Read Scratchpad). При выполнении этой команды микроконтроллер выдает на шину следующие сигналы:

-сигнал начального сброса;

-команду сетевого уровня «Пропуск ПЗУ»(0ССН);

-код операции «Чтение блокнотной памяти» (0ВEH);

Затем он считывает восемь байт данных из блокнотной памяти.

Команда «Чтение из EEPROM в блокнотную память» (Recall E2).

Команда служит для переноса информации из EEPROM в блокнотную память. Для выполнения этой команды микроконтроллер производит следующие действия:

-выдает на шину сигнал начального сброса;

-выдает команду сетевого уровня «Пропуск ПЗУ»(0ССН);

-выдает код операции «из EEPROM в блокнотную память» (0B8H).

Сразу после получения этой команды содержимое EEPROM копируется в блокнотную память. Эта команда выполняется автоматически каждый раз после включения питания.

Команда «Копирование блокнотной памяти в EEPROM» (Copy Scratchpad). При выполнении этой команды микроконтроллер выдает на шину следующие сигналы:

-сигнал начального сброса;

-команду сетевого уровня «Пропуск ПЗУ»(0ССН);

-код операции «Копирование блокнотной памяти в EEPROM» (48H);

-выполняет процедуру ожидания конца операции.

В результате выполнения этой операции содержимое блокнотной памяти копируется в EEPROM.

Команда «Запуск процесса преобразования» (Convert T). При выполнении этой команды микроконтроллер выдает на шину следующие сигналы:

-сигнал начального сброса;

-команду сетевого уровня «Пропуск ПЗУ»(0ССН);

-код операции «Запуск процесса преобразования» (44H);

-выполняет процедуру ожидания конца операции.

В результате выполнения этой команды измеренная температура преобразуется в код. Полученный код помещается в соответствующий регистр микросхемы DS18B20.

Длительность процедуры ожидания определяется сигналом готовности. Сигнал готовности формируется следующим образом. Как только микросхема термодатчика начинает выполнять одну из команд «Копирование блокнотной памяти в EEPROM» или «Запуск процесса преобразования», она «подсаживает» 1-Wire шину. Микроконтроллер проверяет уровень сигнала на шине. Обнаружив нулевой сигнал, он переходит в режим ожидания. Режим ожидания продолжается до тех пор, пока микросхема термодатчика не «отпустит» шину.

2.6 Выбор вентилятора

В кондиционерах применяются вентиляторы с крыльчаткой тангенциального типа [1], поток воздуха в которых поступает в крыльчатку с одной стороны, а выходит с другой, изменив направление своего движения.

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

Рисунок 19 - Вентилятор кондиционера

В ряде моделей кондиционеров Daikin и Toshiba крыльчатка вентилятора имеет переменный шаг лопастей, что исключает возможность возникновения резонансных частот и связанного с ними шума.

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

Таблица 4 - Характеристики вентилятора

Тип Центробежный
Диаметр / длина крыльчатки, мм 70/598
Модель двигателя YDK10-2A
Количество полюсов 2
Максимальная скорость вращения, об/мин 1950
Номинальная выходная мощность, Вт 10

Сопротивление обмоток, Ом (при 20°С).

Цвет изоляции выводов:

«Белый – серый»

«Белый – розовый»

410±10%

301±10%

Устройство безопасности Тип Внутренний термопредохранитель
Температура срабатыания, °С 145±8
Управляющий конденсатор Емкость, мкФ 1,0
Мощность, ВА 450

 

2.7 Выбор компрессора

В бытовых и полупромышленных кондиционерах в настоящее время используются три основных типа компрессоров — ротационный, спиральный и поршневой, причем на долю ротационных компрессоров приходится около 90%. Так из 23 млн. компрессоров, проданных по всему миру в 1995 г. для применения в климатических системах, более 20 млн. были ротационного типа. В климатических системах большой мощности (от 160 до 3500 кВт) применяются винтовые компрессоры. Ротационные компрессоры (рисунок 20) осуществляют всасывание и сжатие газа с помощью вращающегося на валу ротора. За счет вращательного движения рабочих органов в компрессорах этого типа (также как в спиральных и винтовых) существенно снижены пульсации давления и пусковые токи.

Ротационные компрессоры [3] производятся в двух вариантах: со стационарными и вращающимися пластинами. Рабочий цикл компрессора со стационарной пластиной показан на рисунке 21. Ротор эксцентрично закреплен на валу компрессора. При вращении вала эксцентрик обкатывается по внутренней поверхности цилиндра, сжимая перед собой очередную порцию хладагента. Пластина разделяет области высокого и низкого давления.

Рисунок 20 - Устройство ротационного компрессора


Рисунок 21 - Рабочий цикл ротационного компрессора со стационарными пластинами

а — рабочий объем цилиндра заполнен хладагентом,

б — начало сжатия хладагента (слева от ротора) и всасывание новой его порции (справа),

в — продолжение сжатия и всасывания,

г — завершение сжатия и заполнение рабочего объема цилиндра новой порцией хладагента.

1 — пластина,

2 — пружина,

3 — отверстие всасывания,

4 — ротор,

5 — рабочий объем цилиндра,

6 — выпускной клапан.

Ряд фирм-производителей Panasonic, Sanyo и др.) применяют в своих ротационные компрессоры с двумя роторами (рисунок 22) [1]. На валу компрессора эксцентрично вращаются два ротора, каждый из которых осуществляет сжатие хладагента в своем цилиндре. Эксцентрики расположены на валу противофазно (рисунок 23), благодаря чему уменьшается суммарная вибрация при их совместной работе. Цилиндры двухроторного компрессора соединены между собой перепускной трубкой (байпасом) с управляющим клапаном, что позволяет эффективно регулировать производительность при использовании компрессоров данного типа.

Рисунок 22 - Ротационный компрессор с двумя роторами


Рисунок 23 - Противофазное расположение роторов на валу двухроторного компрессора

В компрессорах с вращающимися пластинами эти пластины (две или более), разделяющие области высокого и низкого давления, установлены на роторе.

Рабочий цикл ротационного компрессора с двумя вращающимися пластинами показан на рисунке 24.


Рисунок 24 - Рабочий цикл ротационного компрессора с вращающимися пластинами

а — рабочий объем цилиндра заполнен хладагентом,

б — начало сжатия хладагента и всасывание новой его порции,

в — продолжение сжатия и всасывания,

г — завершение сжатия и заполнение рабочего объема цилиндра новой порцией хладагента.

1 — ротор,

2 — цилиндр,

3 — отверстие всасывания,

4 — выпускное отверстие

Одна из проблем ротационных компрессоров связана с эффектами высоко-температурного разложения смазочных материалов. В результате трения лопасти о вращающийся ротор происходит разогрев ее кромки, где образуется так называемая «горячая точка». Если температура этой точки превышает 200 °С, синтетическое эфирное масло, используемое при работе на хладагенте R407c, разлагается на спирт и жировые кислоты, которые забивают капиллярные трубки и снижают расход хладагента. Лабораторные испытания ротационных компрессоров показывают, что после 2000 ч работы на хладагенте R407c уменьшение расхода хладагента может достигать 30% и сопровождаться значительным снижением холодопроизводительности.

В 1998 г. фирма Daikin предложила новый вид ротационного компрессора — с качающимся ротором (Swing компрессор). В этом компрессоре при повороте вала пластина, жестко связанная с ротором, совершает сложное движение (возвратно-поступательное и колебательное одновременно). Поскольку лопасть и ротор представляют собой единое целое, снижаются потери на трение и отсутствует зона местного нагрева («горячая точка»). Кроме того, отсутствие перетечек хладагента между пластиной и ротором сокращает общие перетечки в компрессоре. Рабочий цикл Swing-компрессора показан на рисунке 25.

Рисунок 25 - Рабочий цикл Swing-компрессора.

фаза 1 — рабочий объем цилиндра заполнен хладагентом

фаза 2 — начало сжатия хладагента и всасывание новой его порции

фаза 3 — сжатие и всасывание продолжается

фаза 4 — завершение сжатия и заполнение рабочего объема цилиндра новой порцией хладагента

В климатических системах малой и средней мощности (от 5 до 40 Вт) используются также спиральные компрессоры [1] (компрессоры Scroll). Компрессор (рисунок 26) состоит из двух стальных спиралей, расширяющихся от центра к периферии цилиндра и вставленных одна в другую. Одна из спиралей закреплена неподвижно, вокруг нее вращается подвижная спираль. Профиль спиралей образован эквивалентной кривой. Подвижная спираль установлена на эксцентрике и при вращении ее внешняя поверхность как бы катится по внутренней поверхности неподвижной спирали. Благодаря этому точка контакта спиралей постепенно перемещается от периферии к центру, сжимая перед собой пары хладагента и вытесняя их в центральное отверстие в верхнее крышке цилиндра. Так как точек контакта несколько (они расположены на каждом витке подвижной спирали), то происходит более плавное сжатие паров, уменьшается нагрузка на электродвигатель, особенно в момент пуска.

Рисунок 26 - Спиральный компрессор (компрессор Scroll).

В технологическом плане компрессор Scroll более сложен, поскольку необходимо обеспечить герметичность по торцам спиралей и очень точное прилегание профилей спиралей. Поэтому компрессоры данного типа пока нашли ограниченное применение.

В поршневом компрессоре (рисунок 27) сжатие газа происходит при возвратно-поступательном движении поршня в цилиндре/


Рисунок 27 - Поршневой компрессор

а — фаза всасывания хладагента,

б — фаза сжатия и выпуска хладагента высокого давления.

1 — выпускной клапан, 2 — линия нагнетания хладагента,

3 — поршень, 4 — цилиндр,

5 — шатун,

6 — коленчатый вал,

7 — головка клапанов,

8 — линия всасывания хладагента,

9 —впускной клапан

В фазе всасывания (а) поршень движется вниз от верхней, так называемой «мертвой точки». При этом над поршнем создается разрежение и через открытый впускной клапан хладагент поступает в цилиндр. В фазе сжатия (б) поршень движется вверх и сжимает хладагент, который выходит из цилиндра через выпускной клапан. При движении в цилиндре поршень никогда не касается головки клапанов, оставляя свободное пространство, которое называют «мертвым объемом».

В зависимости от типа конструкции различают герметичные, полугерметичные и открытые поршневые компрессоры. В герметичном компрессоре электродвигатель и компрессор находятся в едином герметичном корпусе. Такие компрессоры, мощностью 1,7...35 кВт применяются в холодильных машинах малой и средней мощности. В полугерметичных компрессорах, мощность которых варьируется от 30 до 300 Вт, электродвигатель и компрессор закрыты, соединены напрямую и расположены по горизонтали в едином разборном контейнере. В случае повреждения можно извлекать электродвигатель, получая доступ к клапанам, поршню, шатунам и другим элементам конструкции. В открытых компрессорах электродвигатель расположен снаружи (вал с соответствующими сальниками выведен за пределы корпуса).

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

Количество запусков компрессора является наиболее критичным для его срока службы. Именно на режиме запуска происходит наибольшее количество отказов, поэтому приходится ограничивать время между повторными пусками компрессора (как правило, не менее 6 мин), и время между остановом компрессора и его повторным пуском (2...4 мин). Характеристики выбранного компрессора приведены в таблице 5.

Таблица 5 – характеристики компрессора.

Модель PH180X1C-4DT2
Номинальная выходная мощность компрессора, Вт 800
Объем смазочного масла (SUNISO 4GSD), см3 400

Ток при заторможенном роторе компрессора, А

-220 В

-240 В

23,6

25,5

Сопротивление обмотки компрессора, Ом (при 20°С) C-R: 3,13
C-S: 4,46
Предохранительное устройство компрессора Тип Внутреннее
Модель UPQE0591-T51
Рабочая температура,°С Открыто 150±5
Закрыто 90±10
Ток управления, А (внутренняя температура 25°С) 25 (переключение через 3-10 с)
Управляющий конденсатор 25
450

2.8 Выбор микроконтроллера

В настоящее время среди всех 8-разрядных микроконтроллеров - семейство MCS-51 является несомненным чемпионом по количеству разновидностей и количеству компаний, выпускающих его модификации. Оно получило свое название от первого представителя этого семейства - микроконтроллера 8051, выпущенного в 1980 году на базе технологии HMOS. Удачный набор периферийных устройств, возможность гибкого выбора внешней или внутренней программной памяти и приемлемая цена обеспечили этому микроконтроллеру успех на рынке.

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

В результате на сегодняшний день существует более 200 модификаций микроконтроллеров семейства 8051, выпускаемых почти 20-ю компаниями. Эти модификации включают в себя кристаллы с широчайшим спектром периферии: от простых 20-выводных устройств с одним таймером и 1К программной памяти до сложнейших 100-выводных кристаллов с 10-разрядными АЦП, массивами таймеров-счетчиков, аппаратными 16-разрядными умножителями и 64К программной памяти на кристалле. Каждый год появляются все новые варианты представителей этого семейства. Основными направлениями развития являются: увеличение быстродействия (повышение тактовой частоты и переработка архитектуры), снижение напряжения питания и потребления, увеличение объема ОЗУ и FLASH памяти на кристалле с возможностью внутрисхемного программирования, введение в состав периферии микроконтроллера сложных устройств типа системы управления приводами, CAN и USB интерфейсов и т.п.

Все микроконтроллеры из семейства MCS-51 имеют общую систему команд [4]. Наличие дополнительного оборудования влияет только на количество регистров специального назначения.

Основными производителями клонов 51-го семейства в мире являются фирмы Philips, Siemens, Intel, Atmel, Dallas, Temic, Oki, AMD, MHS, Gold Star, Winbond, Silicon Systems и ряд других.

В рамках СССР производство микроконтроллера 8051 осуществлялось в Киеве, Воронеже (1816ВЕ31/51, 1830ВЕ31/51), Минске (1834ВЕ31) .

Для данной задачи был выбран микроконтроллер AT89C51 фирмы Atmel [5]. Несмотря на то, что фирма Atmel уже давно делает упор на новое поколение микроконтроллеров (серии AVR), микроконтроллер AT89C51 тоже довольно широко применяется. И не случайно, так как эта микросхема имеет еще достаточно большой потенциал. Параметры микросхемы позволяют создавать широкий спектр современных электронных устройств, находящих свое применение в самых различных областях микропроцессорной техники. Главным преимуществом выбора именно этой микросхемы является ее широкая доступность и приемлемая цена.


3 Функциональная схема

Функциональная схема кондиционера изображена на рисунке 28.

Рисунок 28 - Функциональная схема кондиционера


4 Алгоритм работы кондиционера

Алгоритм работы кондиционера представлен на рисунке 29.

Рисунок 29 - Алгоритм работы кондиционера


5 Разработка программы

Программная реализация алгоритма работы кондиционера на языке ассемблер для микроконтроллера AT89C51 представлена в приложении 1.

В основной программе сначала определяются константы: коды банков памяти, счетчик задержки, буфер для приема данных из термодатчика, буфер для хранения заданной температуры помещения Туст, счетчик рабочих циклов кондиционера для определения его режима работы. Дальше присваивается начальное значение Туст и вызывается подпрограмма опроса клавиатуры с последующим определением нажатых клавиш. При последующих опросах клавиатуры, если клавиша нажата, то происходит переход к метке 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 мкс.

Подпрограмма mwhi чуть сложнее. Она выполняет запись в слот единичного значения. Действие подпрограммы начинается с формирования синхроимпульса длительностью 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 обеспечивает режим обогрева работы кондиционера. Она не представлена в приложении 1, но работает аналогично подпрограмме reoh (включает и выключает не компрессор, а нагревательный элемент).


ЗАКЛЮЧЕНИЕ

В проекте были разработаны структурная и функциональная схемы кондиционера с микропроцессорным управлением, в которых были учтены все необходимые элементы. Также был разработан алгоритм и большая часть программы.

Разработанная система управления позволяет поддерживать заданную температуру в помещении, удовлетворяет основным требованиям: обеспечивает экономичность, низкую стоимость, простоту в использовании и минимальные затраты на эксплуатацию.

В процессе выполнения работы был выбран термодатчик с 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 ;основная программа

bank0                   EQU  00000000B ;коды банков памяти

bank1                   EQU  00001000B

bank1                   EQU  00010000B

bank2                   EQU  00110000B

                   DSEG

                   ORG 30H

LoopCnt:    DS     1                 ;счетчик задержки

bufLAN:     DS     8                 ;буфер для приема данных из MicroLAN

bufLAN2:   DS     8                 ;буфер для Туст

bufLAN3:   DS     1                 ;счетчик рабочих циклов кондиционера

                   ORG 60H            ;начало стека

stack:          DS     20H            ;глубина стека

main: mov bufLAN2, #18H              ;начальное значение Туст=24 градуса Цельсия

          call inkl

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

in1:    cjne a, #11B, in2            ;если обе клавиши нажаты переход

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

          jmp in3

in2:    dec bufLAN2

in3:    call eclr1                        ;вывод Туст

          mov a, #2

          call ecur1

          call prtmu                      ;Туст на ЖКИ №1

          call eclr2

          mov a, #2

          call ecur2

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

          call rdtmp                      ;чтение Тпм

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

          mov a, bufLAN+1                   ;записьТпм в аккумулятор

          swap a

          anl a, #0F0H

          mov R5, a

          mov a, bufLAN

          swap a

          anl a, #0FH

          add a, R5                       ;в аккумуляторе байт Тпм

          mov a, #LE(a, bufLAN2)                  ;сравнение Тпм<=Туст

          mov bufLAN3, #0                   ;обнуление счетчика циклов работы кондиционера

          cjne a, #0FFFFH, in5              ;обработкаусловия Тпм<=Туст

in4:    call reob

          jmp in6

in5:    call reoh

in6:    mov b, a

          mov a, EQ(b, #1)

          cjne a, #0FFFFH, in7

          jmp in1

in7:    mov a, EQ(b, #4)

          cjne a, #0FFFFH, in5

          jmp in4

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

inkl:   setb P0.0                        ;установка 1 на линиях клавиатуры

          setb P0.1

mov a, P0                      ;считывание порта p0

anl a, #00000011B                  ;обнуление лишних разрядов

xrl a, #00000011B                  ;инвертирование

ret

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

eres1: mov P2, #0FH                         ;засылаем адрес регистра блокировки

setb P2.4

clr P2.4

mov P2, #01000001B             ;записываем код снятия блокировки

setb P2.4

clr P2.4

mov P2, #0                    ;устанавливаем адрес на первый разряд

setb P2.4

clr P2.4

ret

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

eres2: mov P3, #0FH

setb P3.4

clr P3.4

mov p3, #01000001B

setb P3.4

clr P3.4

mov P3, #0

setb P3.4

clr P3.4

ret

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

eclr1: call eres1                        ;сброс экрана

mov P2, #01000000B             ;установка управляющего кода

mov R0, #20                           ;инициализация счетчика разрядов

c11:   set P2.4                          ;импульс записи

clr P2.4

          djnz R0, c11                            ;оператор цикла

          ret

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

eclr2: call eres2

mov P3, #01000000B

mov R0, #20

c21:   set P3.4

clr P3.4

          djnz R0, c21

          ret

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

ecur1:          anl a, #0FH                    ;отделяем биты адреса

mov P2, a                      ;устанавливаем адрес на первый разряд

setb P2.4

clr P2.4

ret

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

ecur2:          anl a, #0FH

mov P3,a

setb P3.4

clr P3.4

ret

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

          ORG 0600H

ts:      DB    0EEH                             ;0

          DB    060H                    ;1

          DB    02FH                    ;2

DB    06DH                             ;3

DB    0E1H                    ;4

DB    0CDH                            ;5

DB    0CFH                             ;6

DB    068H                    ;7

DB    0EFH                             ;8

DB    0EDH                            ;9

DB    0EBH                             ;A

DB    0C7H                           ;b       

DB    08EH                    ;C

DB    067H                    ;d

DB    08FH                    ;E

DB    08BH                             ;F

DB    000H                    ;

DB    0A9H                             ;°

DB    001H                    ;-

DB    003H                    ;r

DB    047H                    ;o

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

prch1:         push DPL                      ;сохранение регистров в стеке

push DPH

push b

mov DPTR, #ts              ;начало таблицы символов

mov c, acc.7                            ;сохраняем значение точки

clr acc.7                         ;сбрасываем значение бита

movc a, @a+DPTR                 ;получаем выводимый код

mov acc.4, c                            ;восстанавливаем значение точки

mov b, a                         ;сохраняем его в b

anl a, #0FH                    ;отделяем младший полубайт

mov P2, a                      ;выводим его на индикатор

setb P2.6                        ;вкл. Режим вывода данных

setb P2.4                        ;импульс записи

clr P2.4

mov a, b                         ;восстанавливаем выводимый код

swap a

anl a, #0FH                    ;отделяем старший полубайт

mov p2, a                       ;выводим его на индикатор

setb p2.6                        ;вкл. Режим вывода данных

setb P2.4                        ;импульс записи

clr P2.4

pop b

pop DPH                       ;восстановление регистров

pop DPL

ret

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

prch2:         push DPL                      ;сохранение регистров в стеке

push DPH

push b

mov DPTR, #ts              ;начало таблицы символов

mov c, acc.7                            ;сохраняем значение точки

clr acc.7                         ;сбрасываем значение бита

movc a, @a+DPTR                 ;получаем выводимый код

mov acc.4, c                            ;восстанавливаем значение точки

mov b, a                         ;сохраняем его в b

anl a, #0FH                    ;отделяем младший полубайт

mov P3, a                      ;выводим его на индикатор

setb P3.6                        ;вкл. Режим вывода данных

setb P3.4                        ;импульс записи

clr P3.4

mov a, b                         ;восстанавливаем выводимый код

swap a

anl a, #0FH                    ;отделяем старший полубайт

mov P3, a                      ;выводим его на индикатор

setb P3.6                        ;вкл. Режим вывода данных

setb P3.4                        ;импульс записи

clr P3.4

pop b

pop DPH                       ;восстановление регистров

pop DPL

ret

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

prstr2:        push psw                       ;сохранение регистра psw

          mov psw, #bank3          ;включаем банк 3

ps1:   mov a, #0

          movc a, @a+DPTR                 ;получение очередного символа

          cjne a, #0, ps2                         ;если это не последний выводим

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

ret

ps2:   call prch2                       ;вывод символа на экран

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

jmp ps1

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

prErr:         push acc

          call eclr2                        ;очистка экрана

          mov a, #2                       ;курсор в позицию 2

          call ecur2

          mov DPTR, #serr          ;вывести надпись «Error»

          call prst2

          pop acc

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

          ret

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

          ORG 0680H

Serr:  DB    14, 19, 19, 20, 19, 0      ;сообщение «Error», 0 в конце – признак окончания слова

;подпрограмма вывода Туст на ЖКИ №1

prtmu:        mov a, #16

          call prch1

          mov a, bufLAN2

          mov b, #10

          div ab

          call prch1

          mov a, b

          call prch1

          mov a, #17

          call prch

mov a, #0CH

call prch1

ret

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

zader:          mov R2, #7

za1:   mov R1, #255

za2:   mov R0, #56;

za3:   mov LoopCnt, #255

za4:   call Delay

          djnz LoopCnt, za4

djnz R0, za3

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

jnz za5                                     ;переход при нажатии

call eclr2                        ;вывод Тпм

mov a, #2

call ecur2

call sttmp

call rdtmp

call prtmp

djnz R1, za2

djnz R2, za1

mov a, #0

ret

za5:   mov a, #1

          ret

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

sttmp:         push psw

          mov psw, #bank2          ;выбор банка 2 памяти

stm1: call resLAN                    ;сброс

          cjne a, #0, stm6              ;если ошибка переход

          mov a, #0CCH                         ;пропуск ПЗУ

          call wr8LAN

          mov a, #44H                           ;запуск преобразования

call wr8LAN

stm4: call rd1LAN                            ;запрос об окончании преобразования

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

stm5: pop psw                        ;выход из подпрограммы

          ret

stm6: call prErr                       ;если ошибка, печать

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

;подпрограмма чтения температуры

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

rdtmp:        push psw

          mov psw, #bank2          ;выбор банка 2 памяти

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

          cjne a, #0, rtm2              ;если ошибка

          mov a, #0CCH                         ;пропуск ПЗУ

          call wr8LAN

          mov a, #0BEH                        ;выдать команду

          call wr8LAN

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

          mov bufLAN, a              ;запись в буфер

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

          mov bufLAN+1, a                   ;запись в буфер

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

          ret

rtm2: call prErr                       ;если ошибка, вывести на экран

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

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

resLAN:clr P1.1                      ;закорачиваем линию

          mov LoopCnt, #100                ;задержка 700 мкс

rst1:  call Delay

          djnz LoopCnt, rst1

          setb P1.1                        ;отпускаем линию

          mov LoopCnt, #9          ;задержка 65 мкс

rst2:  call Delay

          djnz LoopCnt, rst2

          jnb P1.1, rst3                           ;проверка сигнала присутствия

          mov a, #1                       ;код ошибки «нет датчика»

          ret

rst3:  mov LoopCnt, #71                  ;задержка 500 мкс

rst4:  call Delay

          djnz LoopCnt, rst4

          jb P1.1, rst5                             ;если на линии 1 переход

          mov a, #2                       ;код ошибки «КЗ в линии»

          ret

rst5:  mov a, #0                       ;код нормального завершения

          ret

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

mrslot:        clr P1.1                          ;закоротить линию

          nop

          setb P1.1                        ;отпустить линию

          call Delay                       ;задержка 13 мкс

          call Delay

          nop

          nop

          nop

          mov C, P1.1                            ;прочитать и сохранить бит

          mov LoopCnt, #8          ;задержка 60 мкс

msl1: call Delay

          djnz LoopCnt, msl1

          ret

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

mwlow:       clr P1.1                 ;закоротить линию

          mov LoopCnt, #11                  ;задержка 80 мкс

mwl1:         call Delay

          djnz LoopCnt, mwl1

          setb P1.1                        ;отпустить линию

          ret

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

mwhi:         clr P1.1                          ;закоротить линию

          call Delay                       ;задержка 5 мкс

          setb P1.1                        ;отпустить линию

          mov LoopCnt, #11                  ;задержка 75 мкс

mwh1:        call Delay

          djnz LoopCnt, mwh1

          ret

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

Delay:         nop

          ret

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

wr8LAN:

mov R1, #8                    ;инициализация счетчика разрядов

wb1:  rrc A                              ;младший бит в C

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

          call mwlow                    ;запись 0 в слот

          jmp wb3

wb2:  call mwhi                       ;запись 1 в слот

wb3:  djnz R1, wb1                           ;продолжать, если не последний

          ret

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

wr1LAN:

jc wb4                                      ;если бит = 0

          call mwlow                    ;запись 0 в слот

          jmp wb5

wb4:  call mwhi                       ;запись 1 в слот

wb5: 

          ret

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

rd8LAN:

mov R1, #8                    ;счетчик количества битов

rb1:   call mrslot                      ;чтение очередного бита

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

          djnz R1, rb1                            ;продолжать, если не последний

          ret

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

rd1LAN:

call mrslot

          ret

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

prtmp:        mov a, #16                     ;вывод пробела

          call prch2

          mov a, bufLAN+1                   ;считываем старший байт

          swap a                                     ;обмен тетрад

          anl a, #0F0H                           ;получили старший полубайт

          mov R5, a                      ;временно записываем в R5

          mov a, bufLAN              ;считываем младший байт

          swap a                                     ;обмен тетрад

          anl a, #0FH                    ;получили младший полубайт

          add a, R5                       ;складываем полубайты

          mov b, #10                    ;деление на 10

          div ab

          call prch2                       ;вывод десятков

          mov a, b                         ;берем остаток от деления

call prch2                       ;вывод единиц

mov a, #17                     ;вывод символа «градус»

call prch2

mov a, #0CH                           ;вывод буквы «С»(Цельсия)

call prch2

ret

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

reoh:  clr P0.2                          ;выкл. Нагревательный элемент

          setb P0.4                        ;вкл. компрессор

          setb P0.3                        ;вкл. вентелятор

          call zader

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

          ret

re4:    clr P0.4                          ;выкл. компрессор

          clr P0.3                          ;выкл. вентелятор

          call zader

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

          ret

re3:    mov a, bufLAN+1

          swap a

          anl a, #0F0H

          mov R5, a

          mov a, bufLAN

          swap a

          anl a, #0FH

          add a, R5                       ;в аккумуляторе байт Тпм

          mov b, bufLAN2

          mov b, #b-2

          mov a, #LE(a, b)            ;сравнение Тпм<=Туст-2

          cjne a, #0FFFFH, re1              ;переход, если не истина

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

          mov a, #GT(bufLAN3, 2)

          cjne a, #0FFFFH, re2              ;сравнение «счетчик циклов>=2»

          mov bufLAN3, #0                   ;обнуление счетчика

          mov a, #4                       ;в режим обогрева

          ret

re1:    mov bufLAN3, #0                   ;обнуление счетчика

re2:    mov a, #5                       ;режим охлаждения

          ret

;конец программы

          end


Страницы: 1, 2


© 2010 САЙТ РЕФЕРАТОВ