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