Разработка системы управления кондиционером
Рисунок 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 - Схема включения
вспомогательной цепи и цепи питания
Система команд транспортного уровня микросхемы 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 шину. Микроконтроллер проверяет уровень сигнала на шине. Обнаружив
нулевой сигнал, он переходит в режим ожидания. Режим ожидания продолжается до
тех пор, пока микросхема термодатчика не «отпустит» шину.
В кондиционерах применяются вентиляторы
с крыльчаткой тангенциального типа [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 |
В
настоящее время среди всех 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
тоже довольно широко применяется. И не случайно, так как эта микросхема имеет
еще достаточно большой потенциал. Параметры микросхемы позволяют создавать
широкий спектр современных электронных устройств, находящих свое применение в
самых различных областях микропроцессорной техники. Главным преимуществом
выбора именно этой микросхемы является ее широкая доступность и приемлемая
цена.
Функциональная
схема кондиционера изображена на рисунке 28.
Рисунок
28 - Функциональная схема кондиционера
Алгоритм
работы кондиционера представлен на рисунке 29.
Рисунок
29 - Алгоритм
работы кондиционера
Программная реализация алгоритма работы кондиционера
на языке ассемблер для микроконтроллера 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.
ПРИЛОЖЕНИЕ
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
|