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

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. В этой строке находится команда организации цикла. Она передает управление на начало цикла, если это не последний бит, и завершает цикл, если бит последний.

Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9



2012 © Все права защищены
При использовании материалов активная ссылка на источник обязательна.