Вы находитесь на странице: 1из 90

Д.В.

Андреев

ПРОГРАММИРОВАНИЕ
МИКРОКОНТРОЛЛЕРОВ MCS-51

Допущено Министерством образования Российской


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

Ульяновск 2000
УДК 681.32(075)
ББК 32.973.2я7
А65

Рецензенты: кафедра вычислительной техники и защиты информации


Уфимского государственного авиационного технического университета
(зав. кафедрой д-р техн. наук, профессор В.И.Васильев); кафедра
радиотехники Ульяновского государственного технического университета
(зав. кафедрой канд. техн. наук, профессор Н.А.Трефилов); канд. техн.
наук, с.н.с. Г.П.Токмаков

Андреев Д.В.
А65 Программирование микроконтроллеров MCS-51: Учебное пособие.
- Ульяновск: УлГТУ, 2000. - 88 с.
ISBN 5-89146-133-1
Приведены технические характеристики и функциональные
возможности популярных микроконтроллеров семейства MCS-51,
выпускаемых ведущими компаниями мира. Рассмотрены особенности
программной модели микроконтроллера 8051, являющегося ядром MCS-
51, и соответствующего машинно-ориентированного языка АСМ51.
Описаны содержание основных этапов разработки прикладного
программного обеспечения микроконтроллера 8051, а также технология
применения специальных программных кросс-средств (кросс-ассемблера
X8051 и кросс-редактора связей Link). Даны варианты типовых
микроконтроллерных программ. Изложение сопровождается большим
числом практических примеров.
УДК 681.32(075)
ББК 32.973.2я7

Учебное издание
АНДРЕЕВ Дмитрий Васильевич
ПРОГРАММИРОВАНИЕ МИКРОКОНТРОЛЛЕРОВ MCS-51
Учебное пособие
Редактор Н.А.Евдокимова
Изд. лиц. 020640 от 22.10.97. Подписано в печать 22.02.00. Формат 60х84/16.
Бумага писчая. Усл. печ. л. 5,12. Уч.-изд. л. 5,00. Тираж 200 экз. Заказ
Ульяновский государственный технический университет,
432027, Ульяновск, Сев. Венец, 32.
Типография УлГТУ, 432027, Ульяновск, Сев. Венец, 32.

ISBN 5-89146-133-1 © Д.В.Андреев, 2000


© Оформление. УлГТУ, 2000

ПРЕДИСЛОВИЕ

Эффективная автоматизация машин, приборов и технологического


оборудования, которая является обязательным условием ускорения
научно-технического прогресса, основана на широком применении
средств микропроцессорной техники (МТ). Автоматизация с
использованием микропроцессоров (МП) и микроконтроллеров (МК)
быстро распространяется в самых разнообразных отраслях народного
хозяйства, охватывает новые сферы.
Характерно, что создание микропроцессорных устройств и систем
все в большей степени становится функцией специалистов в конкретной
предметной области, а не профессиональных программистов и
специалистов по вычислительной технике. Это вызывает большую
потребность в инженерных кадрах, которые, кроме своей предметной
области, дополнительно разбираются в микропроцессорной технике.
Как известно, МТ состоит из двух специфических частей:
аппаратурных средств (АС) и прикладного программного обеспечения
(ППО). При этом, рассматривая общий процесс проектирования МТ,
можно отметить, что в большинстве случаев доля общей трудоемкости
разработки ППО значительно превосходит трудоемкость разработки АС.
Указанное обстоятельство объясняется тем, что разработка аппаратурной
части МТ на базе типовых микропроцессорных БИС сводится (чаще
всего) к выполнению стандартных операций в соответствии с
рекомендациями, изложенными в технической документации на
используемые БИС. Совсем по-другому выглядит инженерный труд при
разработке ППО. Проектная работа носит здесь творческий характер,
изобилует решениями, имеющими "волевую" или "вкусовую" окраску, и
решениями, продиктованными конъюнктурными соображениями. В силу
перечисленных обстоятельств именно при проектировании ППО
разработчик сталкивается с наибольшим количеством проблем и от того,
как они будут решены, зависит успех разработки МТ в целом. Таким
образом, весьма актуальным представляется ориентация будущих
инженеров на более глубокое изучение вопросов, связанных именно с
программированием МТ, в частности языков программирования, средств
автоматизации программирования (ассемблеров, компиляторов с языков
высокого уровня, линкеров и др.), структурных особенностей
микропроцессорной элементной базы.
Известны многочисленные книги, справочники, учебники и учебные
пособия отдельно по программированию МП или МК и по средствам его
автоматизации, причем вся эта литература издана, в основном, на рубеже
90-х годов. Отсюда следует необходимость создания литературы, в
которой совместно, с единых методологических позиций
рассматриваются особенности программирования современных
микропроцессоров или микроконтроллеров и средства автоматизации их
программирования.
Указанным требованиям в полной мере соответствует предлагаемое
учебное пособие, основное внимание в котором уделено одним из
наиболее популярных и перспективных микропроцессорных БИС -
однокристальным микроконтроллерам семейства MCS-51.
Учебное пособие написано на основе курса лекций, читаемых
автором в Ульяновском государственном техническом университете, а
также на основе личного практического опыта, полученного при
разработке и отладке ряда микропроцессорных устройств и систем.
Глава 1. СОСТАВ СЕМЕЙСТВА MCS-51

Несмотря на появление 16- и 32-разрядных микроконтроллеров и


микропроцессоров, наибольшая доля мирового микропроцессорного
рынка остается за 8-разрядными МК. Согласно данным компании Semico
Research Corp., в 1996 году общий мировой объем продаж
микроконтроллеров всех типов составил 11,4 миллиарда долларов, при
этом 5,56 миллиарда долларов (или 48,8%) пришлось на долю 8-
разрядных кристаллов, что примерно в 2,5 раза больше объема продаж
ближайшего конкурента - 16-разрядных микроконтроллеров (2,1 млрд.
долл.). Прогнозы аналитических компаний на период до 2001 года
показывают, что лидирующее положение 8-разрядных МК на мировом
рынке сохранится.
Среди всех 8-разрядных микроконтроллеров семейство MCS-51
является несомненным чемпионом по количеству компаний,
выпускающих его модификации. Важную роль в достижении такой
высокой популярности сыграла открытая политика фирмы Intel,
родоначальницы этого семейства, направленная на широкое
распространение лицензий на ядро MCS-51 среди большого количества
ведущих полупроводниковых компаний мира.
В результате на сегодняшний день существует более 200
модификаций микроконтроллеров семейства MCS-51, выпускаемых почти
20-ю компаниями. Эти модификации включают в себя кристаллы с
широчайшим набором периферии: от простых 20-выводных МК с одним
таймером и резидентной памятью программ (РПП) объемом 1 Кбайт до
сложнейших 100-выводных кристаллов с 10-разрядными АЦП, массивами
таймеров/счетчиков, аппаратными 16-разрядными умножителями и
резидентной памятью программ до 64 Кбайт. Каждый год появляются все
новые варианты представителей семейства MCS-51, основными
направлениями развития которого являются: увеличение быстродействия
(за счет повышения тактовой частоты и (или) переработки архитектуры),
снижение напряжения питания и потребления, увеличение объема РПП и
резидентной памяти данных (РПД), реализация РПП на основе FLASH
технологии с возможностью внутрисхемного программирования,
введение в состав периферии микроконтроллера сложных устройств:
системы управления приводами, CAN и USB интерфейсов и т.п.
Основными производителями модификаций 51-го семейства в мире
являются фирмы Philips, Siemens, Intel, Atmel, Dallas, Temic, Oki, AMD,
MHS, Winbond, Silicon Systems и ряд других. В рамках данной главы
невозможно рассказать о всех представителях семейства MCS-51 и всех
компаниях-производителях микроконтроллеров указанного семейства.
Все фирмы, о которых далее пойдет речь, имеют в России своих
официальных дистрибьюторов, и, соответственно, микроконтроллеры
этих фирм являются реальными кандидатами на применение в российских
проектах.

1.1. Микроконтроллеры фирмы Intel

Фирма Intel является родоначальницей архитектуры семейства MCS-


51, которое получило свое название от первого представителя этого
семейства - микроконтроллера 8051, выпущенного в 1980 году на базе
технологии n-МОП. Удачный набор периферийных устройств,
возможность гибкого выбора внешней или внутренней программной
памяти и приемлемая цена обеспечили этому микроконтроллеру успех на
рынке. С точки зрения технологии микроконтроллер 8051 являлся для
своего времени очень сложным изделием - в кристалле было
использовано 128 тыс. транзисторов, что в 4 раза превышало количество
транзисторов в 16-разрядном микропроцессоре 8086. Указанный
микроконтроллер остается ядром семейства MCS-51 и по сей день.
Основными элементами базовой архитектуры семейства
(архитектуры микроконтроллера 8051) являются:
- 8-разрядное АЛУ;
- 4 банка регистров, по 8 в каждом;
- внутренняя (резидентная) память программ 4 Кбайт, имеющая тип ROM
или EPROM (8751);
- внутренняя (резидентная) память данных 128 байт;
- 21 регистр специальных функций;
- булевый процессор;
- два 16-разрядных таймера/счетчика;
- контроллер последовательного порта (UART);
- контроллер обработки прерываний с двумя уровнями приоритетов;
- четыре 8-разрядных порта ввода/вывода, два из которых используются в
качестве шины адреса/данных для доступа к внешней памяти программ и
данных;
- встроенный тактовый генератор.
Затем был выпущен микроконтроллер 8052, который отличался
увеличенным объемом резидентной памяти программ и данных,
введенным третьим таймером и соответственно расширенным
контроллером прерываний.
Следующим принципиальным шагом в развитии MCS-51 стал
перевод технологии изготовления на КМОП (модификация 8xC51). Это
позволило реализовать режимы Idl (холостой ход) и Power Down
(пониженное потребление), обеспечивающие резкое снижение
энергопотребления кристалла и открывшие дорогу к применению
микроконтроллера в энергозависимых приложениях, например, в
автономных приборах с батарейным питанием.
И последним важным этапом развития МК 8051 фирмой Intel стал
выпуск микроконтроллеров 8xC51FA/FB/FC и 8xC51RA/RB/RC, которые
для краткости часто обозначаются как 8xC51Fx и 8xC51Rx. Главной
отличительной особенностью этой группы кристаллов является наличие у
них специализированного таймера/счетчика (РСА). Кроме того,
микроконтроллеры 8xC51Rx дополнительно содержат сторожевой таймер
(WDT). Рассмотрим архитектуру и функциональные возможности PCA
более подробно.
В состав РСА входят:
- 16-разрядный таймер/счетчик;
- пять 16-разрядных модуля выборки и сравнения, каждый из которых
связан со своей линией порта ввода/вывода микроконтроллера.
Таймер/счетчик обслуживает все пять модулей выборки и сравнения,
которые могут быть запрограммированы на выполнение одной из
следующих функций:
- 16-битовая выборка значения таймера по положительному фронту
внешнего сигнала;
- 16-битовая выборка значения таймера по отрицательному фронту
внешнего сигнала;
- 16-битовая выборка значения таймера по любому фронту внешнего
сигнала;
- 16-битовый программируемый таймер;
- 16-битовое устройство скоростного вывода;
- 8-битовый ШИМ.
Выполнение всех перечисленных функций происходит в РСА на
аппаратном уровне и не загружает центральный процессор. Указанное
позволяет повысить общую пропускную способность, повысить точность
измерений и обработки сигналов и снизить время реакции
микроконтроллера на внешние события, что особенно важно для систем
реального времени. Реализованный в 8xC51Fx (8xC51Rx) РСА оказался
настолько

Обозначение Макс. РПП РПД Таймеры/


частота ROM/EPROM (байт) счетчики
(МГц) (байт)
8051AH 12 ROM 4K 128 2
8751BH 12 EPROM 4K 128 2
8052AH 12 ROM 8K 256 3
8752BH 12 EPROM 8K 256 3
8xC51BH 24 4K 128 2
8xC52 24 8K 256 3
8xC54 33 16K 256 3
8xC58 33 32K 256 3
8xC5x-L 24 8…32K 256 3

8xC51FA 24 8K 256 3+PCA


8xC51FB 24 16K 256 3+PCA

8xC51FC 24 32K 256 3+PCA

8xL51Fx 16 8…32K 256 3+PCA

8xC51RA 24 8K 512 3+PCA+WDT

8xC51RB 24 16K 512 3+PCA+WDT

8xC51RC 24 32К 512 3+PCA+WDT

8xC251SA 16 8K 1K 3+PCA+WDT
8xC251SB 16 16K 1K 3+PCA+WDT
8xC251SP 16 8K 512 3+PCA+WDT
8xC251SQ 16 16K 512 3+PCA+WDT
TSC8xC251A1 16 24K 1K 2+WDT
8xC151SA 16 8K 256 3+PCA+WDT
8xC151SB 16 16K 256 3+PCA+WDT
удачным, что архитектура этих микроконтроллеров стала промышленным
стандартом, а сам РСА многократно воспроизводился в различных
модификациях МК 8051.
Некоторые характеристики ряда микроконтроллеров MCS-51,
выпускаемых фирмой Intel, приведены в табл.1.1.
Изначально наиболее "узкими" местами архитектуры MCS-51 были
8-разрядное АЛУ на базе аккумулятора и относительно медленное
выполнение команд (для выполнения самых быстрых команд требуется
12 пе-
Таблица 1.1
Линии Послед. АЦП, входы Другая U пит. (В)
ввода/вывода каналы x разряды периферия,
особенности
32 UART - - 4,5…5,5
32 UART - - 4,5…5,5
32 UART - - 4,5…5,5
32 UART - - 4,5…5,5
32 UART - - 4,0…6,0
32 UART - - 4,0…6,0
32 UART - - 4,0…6,0
32 UART - - 4,0…6,0
32 UART - Низковольтный 2,7…3,6
вариант
8xC52/54/58
32 UART - - 4,0…6,0
32 UART - 4 уровня IRQ, 4,0…6,0
clock out
32 UART - 4 уровня IRQ, 4,0…6,0
clock out
32 UART - Низковольтный 2,7…3,6
вариант 8xC51Fx
32 UART - 4 уровня IRQ, 4,0…6,0
clock out
32 UART - 4 уровня IRQ, 4,0…6,0
clock out
32 UART - 4 уровня IRQ, 4,0…6,0
clock out
32 UART - - 4,5…5,5
32 UART - - 4,5…5,5
32 UART - - 4,5…5,5
32 UART - - 4,5…5,5
32 UART 4x8 - 4,5…5,5
32 UART - - 4,5…5,5
32 UART - - 4,5…5,5
риодов тактовой частоты (частоты синхронизации МК)). Это
ограничивало применение микроконтроллеров семейства в приложениях,
требующих повышенного быстродействия и сложных вычислений (16- и
32-битовых). Насущным стал вопрос принципиальной модернизации
архитектуры MCS-51. Проблема модернизации осложнялась тем, что к
началу 90-х годов уже была создана масса наработок в области
программного и аппаратного обеспечения семейства MCS-51, в связи с
чем одной из основных задач проектирования новой архитектуры была
реализация аппаратной и программной совместимости с разработками на
базе MCS-51.
Для решения указанной задачи была создана совместная группа из
специалистов компаний Intel и Philips, но позднее пути этих двух фирм
разошлись. В результате в 1995 году появилось два существенно
отличающихся семейства: MCS-251/151 у Intel и MCS-51XA у Philips (см.
подраздел 1.2).
Основные характеристики архитектуры MCS-251:
- 24-разрядное линейное адресное пространство, обеспечивающее
адресацию до 16 Мбайт памяти;
- регистровая архитектура, допускающая обращение к регистрам как к
байтам, словам и двойным словам;
- страничный режим адресации для ускорения выборки команд из
внешней программной памяти;
- очередь инструкций;
- расширенный набор команд, включающий 16-битовые арифметические
и логические операции;
- расширенное адресное пространство стека (до 64 Кбайт);
- выполнение самой быстрой команды за 2 такта.
Система команд MCS-251 включает два набора инструкций - первый
набор является копией системы команд MCS-51, а второй состоит из
расширенных инструкций, реализующих преимущества архитектуры
MCS-251. Перед использованием микроконтроллера его необходимо
сконфигурировать, т.е. с помощью программатора "прожечь"
конфигурационные биты, определяющие, какой из наборов инструкций
станет активным после включения питания. Если установить первый
набор инструкций, то в этом случае МК семейства MCS-251 будет
совместим с MCS-51 на уровне двоичного кода. Такой режим называется
Binary Mode. Если же изначально установить набор расширенных
инструкций (режим Source Mode), то тогда программы, написанные для
MCS-51, потребуют перекомпиляции на кросс-средствах для MCS-251.
Режим Source Mode позволяет с максимальной эффективностью
использовать архитектуру MCS-251 и достигнуть наибольшего
быстродействия.
Для пользователей, ориентированных на применение
микроконтроллеров MCS-251 в качестве механической замены MCS-51,
фирма Intel выпускает микроконтроллеры MCS-151, уже
запрограммированные в состояние Binary Mode.
Некоторые характеристики ряда микроконтроллеров MCS-251/151
приведены в табл.1.1.
В настоящее время Intel, устремленная на рынок Pentium-
процессоров, сворачивает производство кристаллов MCS-51. В целом для
конкретного разработчика это может остаться и незамеченным, если
только он не использует микроконтроллеры 8xC51GB и 80C152Jx,
которые не имеют своих точных аналогов среди изделий других фирм.
Что же касается всех остальных микроконтроллеров семейства MCS-51,
то все они многократно растиражированы другими компаниями.

1.2. Микроконтроллеры фирмы Philips

Фирму Philips можно по праву назвать чемпионом по количеству


выпускаемых модификаций семейства MCS-51 - их более 100. В состав
MCS-51 от Philips входят микроконтроллеры в корпусах от 24 до 80
выводов, работающие при тактовой частоте до 40 МГц и напряжении
питания от 1,8 В. Во всех этих микроконтроллерах используется
стандартное ядро MCS-51 (архитектура микроконтроллера 8051),
дополненное широчайшим набором периферии, среди которой следует
отметить:
- 10-разрядные АЦП;
- 8-разрядный ЦАП;
- широтно-импульсные модуляторы;
- массивы программируемых таймеров/счетчиков;
- интерфейсы I2C, CAN;
- интерфейсы с процессорными шинами (Processor Bus Interface);
- специализированную периферию для телевизионной, видео и аудио
техники.
Кроме того, фирма Philips выпустила микроконтроллеры MCS-51,
обладающие функцией снижения электромагнитных помех (Lower EMI).
Начиная с 1997 года Philips переводит стандартные
микроконтроллеры групп 8xC51, 8xC52/54/58 и 8xC51Fx фирмы Intel на
новую технологию, названную "New-and-Improved", т.е. "Новая и
улучшенная". Отметим новые возможности, которые появились у хорошо
известных кристаллов после модернизации:
- максимальная тактовая частота кристаллов увеличена до 33 МГц;
- расширен диапазон напряжения питания от 2,7 до 5,5 В;
- количество аппаратных уровней прерываний увеличено до 4-х;
- во все кристаллы введена функция программируемого clock-out;
- добавлен второй DPTR;
- потребляемая мощность снижена на 50%.
Кроме того, фирма Philips выпустила группу микроконтроллеров
названную 8xC51Rx+. По сути это дальнейшее развитие группы 8xC51Rx
фирмы Intel, в рамках технологии "New-and-Improved".

Обозначение Макс. РПП РПД Таймеры/


частота ROM/EPROM (байт) счетчики
(МГц) (байт)
8xC51 33 4K 128 2
8xCL51 16 4K 128 2
8xCL410 12 4K 128 2
8xC52 33 8K 256 3
8xC54 33 16K 256 3
8xC58 33 32K 256 3

8xC51FA 33 8K 256 3+PCA


8xC51FB 33 16K 256 3+PCA
8xC51FC 33 32K 256 3+PCA
8xC51RA+ 33 8K 512 3+PCA+WDT
8xC51RB+ 33 16K 512 3+PCA+WDT
8xC51RC+ 33 32K 512 3+PCA+WDT

8xC51RD+ 33 64K 1К 3+PCA+WDT


8xC451 16 4K 128 2
8xC453 16 8K 256 2
8xC524 20 16K 512 3+WDT
8xC528 20 32K 512 3+WDT
8xC552 30 8K 256 3+WDT

8xCL580 12 6K 256 3+WDT


8xC654 24 8K 256 2
8xC748 16 2K 64 1
8xC749 16 2K 64 1
8xC750 40 1K 64 1
8xC754 16 4K 256 1+PCA
8xC592 16 16K 512 3+WDT
8xC598 16 32K 512 3+WDT

Наиболее известные модификации описанных выше


микроконтроллеров от Philips представлены в табл.1.2.
В 1997 году фирма Philips взяла четкий курс на развитие FLASH
технологии в производстве своих МК. Отчасти это было вызвано
высокими технологическими возможностями фирмы, отчасти успехами
конкурентов (в первую очередь Atmel).
Наиболее известные модификации микроконтроллеров MCS-51 с
FLASH памятью, выпускаемых фирмой Philips, представлены в табл.1.3.
Таблица 1.2
Линии Последов. Периферия, особенности U пит. (В)
Ввода/ каналы
вывода
32 UART 2 DPTR, 4 уровня IRQ, clock out 2,7…5,5
32 UART 10 внешних прерываний 1,8…6,0
32 I2C 10 внешних прерываний 1,8…6,0
32 UART 2 DPTR, 4 уровня IRQ, clock out 2,7…5,5
32 UART 2 DPTR, 4 уровня IRQ, clock out 2,7…5,5
32 UART 2 DPTR, 4 уровня IRQ, clock out 2,7…5,5

32 UART 2 DPTR, 4 уровня IRQ, clock out 2,7…5,5


32 UART 2 DPTR, 4 уровня IRQ, clock out 2,7…5,5
32 UART 2 DPTR, 4 уровня IRQ, clock out 2,7…5,5
32 UART 2 DPTR, 4 уровня IRQ, clock out 2,7…5,5
32 UART 2 DPTR, 4 уровня IRQ, clock out 2,7…5,5
32 UART 2 DPTR, 4 уровня IRQ, clock out 2,7…5,5

32 UART 2 DPTR, 4 уровня IRQ, clock out 2,7...5,5


56 UART Processor Bus Interface 4,5…5,5
56 UART Processor Bus Interface 4,5…5,5
32 UART, I2C Lower EMI 4,5…5,5
32 UART, I2C Lower EMI 4,5…5,5
48 UART, I2C АЦП 8x10, ШИМ 2x8 4,5…5,5

40 UART, I2C АЦП 4x8, ШИМ 2,5...6,0


32 UART, I2C Lower EMI 4,5…5,5
19 - Нагрузочная способность 10мА 4,5…5,5
21 I2C АЦП 5x8, ШИМ 1x8 4,5…5,5
19 - Нагрузочная способность 10мА 4,5…5,5
11 UART ЦАП 8 бит 4,5…5,5
48 UART, CAN АЦП 8x10, ШИМ 2x8 4,5…5,5
48 UART, CAN АЦП 8x10, ШИМ 2x8 4,5…5,5

Как уже отмечалось выше фирма Philips предложила свое


оригинальное решение по развитию архитектуры семейства MCS-51,
выпустив семейство микроконтроллеров с индексом 51ХА, что буквально
переводит- ся как "расширенная архитектура 51". Разработчики Philips
решили отказаться от достижения совместимости кодов команд нового
микроконтроллера с 8051. Такое решение, с одной стороны, сделало
невозможным прямую замену микроконтроллера семейства MCS-51 на
микроконтроллер семейства 51ХА, но с другой стороны, развязало руки
разработчикам для

Обозначение Макс. РПП РПД Таймеры/


частота (байт) (байт) счетчики
(МГц)
89C52 33 FLASH 8K 256 3

89C54 33 FLASH 16K 256 3

89C51RA+ 33 FLASH 8K 512 3+PCA+WDT

89C51RB+ 33 FLASH 16K 512 3+PCA+WDT

89C51RC+ 33 FLASH 32K 512 3+PCA+WDT

89C51RD+ 33 FLASH 64K 1K 3+PCA+WDT

89C535 33 FLASH 8K 512 2


89C536 33 FLASH 16K 512 2
89C538 33 FLASH 64K 512 2
89CE558 16 FLASH 32K 1K 3+WDT

P51XAG1x 30 ROM/EPROM 8K 512 3+WDT


P51XAG2x 30 ROM/EPROM 16K 512 3+WDT

P51XAG3x 30 ROM/EPROM 32K 512 3+WDT


P51XAC3x 25 ROM/EPROM 32K 1K 3+WDT

кардинальной переработки архитектуры в направлении создания


полноценного 16-разрядного ядра.
Основные характеристики семейства MCS-51ХА (табл.1.3):
- 16-разрядное АЛУ на базе регистровой архитектуры;
- 24-разрядное адресное пространство, обеспечивающее адресацию до 16
Мбайт памяти программ или данных;
- восемь 16-разрядных регистров для выполнения арифметических и
логических операций;
- расширенный набор команд;
- аппаратная поддержка мультизадачности;
- выполнение инструкций типа регистр-регистр за 100 нс;
- напряжение питания от 2,7 В.
По расчетам Philips архитектура MCS-51ХА обеспечивает
увеличение быстродействия до 100 раз по сравнению с традиционной
архитектурой MCS-51.
Таблица 1.3
Линии Послед. АЦП, входы Другая U пит. (В)
ввода/вывода каналы x разряды периферия,
особенности
32 UART - 2 DPTR, 4 уровня 2,7…5,5
IRQ, clock out
32 UART - 2 DPTR, 4 уровня 2,7…5,5
IRQ, clock out
32 UART - 2 DPTR, 4 уровня 2,7…5,5
IRQ, clock out
32 UART - 2 DPTR, 4 уровня 2,7…5,5
IRQ, clock out
32 UART - 2 DPTR, 4 уровня 2,7…5,5
IRQ, clock out
32 UART - 2 DPTR, 4 уровня 2,7…5,5
IRQ, clock out
32 UART - - 4,5…5,5
32 UART - - 4,5…5,5
32 UART - - 4,5…5,5
48 UART, 8x10 ШИМ 2x8 4,5…5,5
CAN
32 2 UART - - 3,0…5,5
32 2 UART - - 2,7…5,5

32 2 UART - - 3,0…5,5
32 UART, - - 2,7…5,5
CAN

1.3. Микроконтроллеры фирм Siemens, Atmel


и Dallas Semiconductor

Фирма Siemens внесла несомненное своеобразие в развитие


семейства MCS-51, выпустив микроконтроллеры серии C500 (табл.1.4),
которые являются по существу самыми сложными МК 51-го семейства в
мире. Эти микроконтроллеры построены на основе архитектуры МК 8051,
дополненной разнообразной и весьма сложной периферией, среди
которой можно отметить:
- 10-разрядные АЦП;
- 6-канальный 10-разрядный ШИМ для управления электродвигателями
постоянного тока;
- 29-канальный ШИМ;
- 8 DPTR;

Обозначение Макс. РПП РПД Таймеры/


частота (байт) (байт) счетчики
(МГц)
Микроконтроллеры
C502 20 ROM/EPROM 16K 512 3+WDT
C504G 40 ROM/EPROM 16K 512 4+WDT

С505С 20 ROM/EPROM 16K 512 3+WDT


C509 16 - 3328 5+WDT

C515A 24 ROM/EPROM 32K 1280 3+WDT


C515C 10 ROM/EPROM 64K 2304 3+WDT

C517A 24 ROM/EPROM 32K 2304 4+WDT

C540 12 ROM/EPROM 4K 256 2


C541 12 ROM/EPROM 8K 256 2+WDT
Микроконтроллеры
AT89C1051 24 FLASH 1K 64 1
AT89C2051 24 FLASH 2K 128 2
AT89C4051 24 FLASH 4K 128 2
AT89C51 24 FLASH 4K 128 2
AT89LV51 12 FLASH 4K 128 2
AT89C52 24 FLASH 8K 256 3
AT89LV52 12 FLASH 8K 256 3
AT89C55 33 FLASH 20K 256 3
AT89S8252 24 FLASH 8K 256, 3+WDT
EEPROM 2K
AT89S53 24 FLASH 12K 256 3+WDT
Микроконтроллеры
DS5000FP 12 NVRAM 32K 128 2+WDT
DS5001FP 12 NVRAM 128K 128 2+WDT
DS5002FP 12 NVRAM 128K 128 2+WDT
DS80C310 33 - 256 3
DS8xC520 33 ROM/EPROM 16K 1280 3+WDT

- аппаратный блок умножения 16х16 и деления 32/16;


- блок загрузчика программной памяти (БЗПП).
Что касается фирмы Atmel, то ее лицом является FLASH
технология. Владея ею в совершенстве, Atmel строит свою политику на
внедрении FLASH в наиболее известные микросхемы памяти,
программируемой логики и микроконтроллеров, использующие
технологию EPROM. Тот факт,
Таблица 1.4
Линии Последов. Периферия, особенности U пит. (В)
ввода/ каналы
вывода
фирмы Siemens
32 UART 8 DPTR, 4 уровня IRQ 4,25…5,5
32 UART АЦП 8x10, 4,25...5,5
6 ШИМ для двигателя пост. тока
34 UART, CAN АЦП 8x8, 8 DPTR 4,25...5,5
80 2 UART АЦП 15x10, 29 ШИМ, 8 DPTR, 4,25...5,5
умн. 1616, дел. 32/16, БЗПП
56 UART АЦП 8x8, 4 ШИМ 4,25...5,5
57 UART, SSC, АЦП 8x10, 4 ШИМ, 8 DPTR 4,25...5,5
CAN
68 2 UART АЦП 12x10, 21 ШИМ, 8 DPTR, 4,25...5,5
умн. 1616, дел. 32/16
32 USB - 4,25...5,5
32 USB, SSC - 4,25...5,5
фирмы Atmel
15 - Аналоговый компаратор 2,7...6,0
15 UART Аналоговый компаратор 2,7...6,0
15 UART Аналоговый компаратор 2,7...6,0
32 UART - 4,0...6,0
32 UART - 2,7...6,0
32 UART - 4,0...6,0
32 UART - 2,7...6,0
32 UART - 4,0…6,0
32 UART, SPI 2 DPTR 2,7…6,0
32 UART, SPI 2 DPTR 4,0…6,0
фирмы Dallas Semiconductor
32 UART БЗПП, 48-bit encryption key 4,5…5,5
32 UART БЗПП 4,5…5,5
32 UART БЗПП, 64-bit encryption key 4,5…5,5
32 UART 2 DPTR 4,5…5,5
32 2 UART 2 DPTR 4,5…5,5

что в качестве первого кандидата на модернизацию при прорыве на рынок


микроконтроллеров, где господствовали такие мощные фирмы как Philips,
Siemens, Intel, Motorola, Mitsubishi и др., фирма Atmel избрала
микроконтроллер 8051, подтверждает исключительно высокую
популярность этого кристалла.
Среди оригинальных разработок Atmel в рамках семейства MCS-51
отметим следующие (см. табл.1.4):
- 20-выводные микроконтроллеры AT89С2051/1051, открывшие дорогу
семейству MCS-51 в сферу "1-долларовых" приложений;
- микроконтроллеры с каналом SPI, обеспечивающие возможность
внутрисхемного программирования FLASH памяти. Эта функция может
быть очень удобна в производстве, когда программирование микросхем
осуществляется уже после их монтажа;
- микроконтроллер с резидентной памятью типа EEPROM,
обеспечивающей хранение оперативных данных при отключенном
питании микросхемы.
Фирма Dallas Semiconductor в первую очередь получила известность
среди производителей семейства MCS-51 своей серией DS5000 (табл.1.4).
Оригинальность микроконтроллеров этой серии заключается в том, что их
резидентная память программ выполнена в виде NVRAM - оперативной
памяти, энергонезависимость которой обеспечивается литиевой
батарейкой, встроенной непосредственно в корпус микросхемы. Фирма
дает 10-летнюю гарантию на сохранность информации в NVRAM.
Микроконтроллеры серии DS5000 имеют архитектуру стандартного ядра
MCS-51, поэтому их временные характеристики полностью идентичны
характеристикам микроконтроллера 8051.
Отметим, что фирма Dallas Semiconductor первой попыталась
усовершенствовать архитектуру семейства MCS-51. Как известно, базовая
архитектура этого семейства обеспечивает не оптимальную процедуру
выборки и выполнения команд. Например, команда MOV A,Rn
выбирается и выполняется микроконтроллером 8051 за 6 тактов, а
следующие 6 тактов происходит холостая выборка команды по
следующему адресу. В результате затрачивается 12 тактов тактового
генератора МК. Специалисты Dallas Semiconductor переработав
архитектуру МК 8051 создали группу микроконтроллеров DS8xC300/500
(табл.1.4), в которых типовой цикл выборки и выполнения команд
сократился до 4-х тактов, а холостые выборки были исключены. Таким
образом, команда MOV A,Rn стала выполняться за 4 такта тактового
генератора, т.е. в 3 раза быстрее. Команды МК 8051, которые не имели
холостых выборок, в DS8xC300/500 "ускорились" в 1,5 раза.

Список литературы

1. Каталог инструментальных средств для микроконтроллеров/


Фитон. М., 1998.

Глава 2. ОСОБЕННОСТИ ПРОГРАММИРОВАНИЯ


МИКРОКОНТРОЛЛЕРОВ MCS-51

2.1. Программная модель 0FFFH


микроконтроллера 8051
23H  TI, RI
В предыдущей главе было
отмечено, что ядром семейства MCS-51
1BH  T/C1
является микроконтроллер 8051
(отечественный аналог КР1816ВЕ51). В
13H  INT1
связи с этим представляется
целесообразным рассмотрение
0BH  T/C0
особенностей программирования
указанного семейства на примере
именно этого микроконтроллера. 03H  INT0
Программная модель МК 8051
содержит резидентную память данных, 00H
регистры специальных функций,
резидентную память программ и 15 8
программный счетчик PC.
PC
7 0

Рис.1. Структура резидентной


памяти программ
микроконтроллера 8051
Резидентная память программ (рис.1) имеет байтовую организацию и
доступна только по чтению, при этом ее ячейки (4 Кбайт) адресуются с
использованием двенадцати младших разрядов PC. Резидентная память
программ может быть дополнена внешней памятью. В этом случае общий
максимально допустимый объем памяти программ составит 64 К.
Младшие адреса резидентной памяти программ отведены под обработку
внешних прерываний , , прерываний от
таймеров/счетчиков T/C0, T/C1 и прерывания от последовательного
порта. В случае возникновения какого-либо из указанных прерываний
происходит обращение к соответствующей ячейке резидентной памяти
программ (например, при возникновении прерывания в PC
записывается код 0003H).
Резидентная память данных (рис.2) состоит из 128-ми 8-разрядных
ячеек с адресами 00H-7FH и может быть дополнена внешней памятью
данных емкостью до 64 К. При этом пространства резидентной и внешней

Резидентная память данных Регистры специальных функций


7FH F7 F6 F5 F4 F3 F2 F1 F0 0F0H
E7 E6 E5 E4 E3 E2 E1 E0 0E0H
30H D7 D6 D5 D4 D3 D2 D1 D0 0D0H
7F 7E 7D 7C 7B 7A 79 78 2FH - - - BC BB BA B9 B8 0B8H
77 76 75 74 73 72 71 70 2EH B7 B6 B5 B4 B3 B2 B1 B0 0B0H
6F 6E 6D 6C 6B 6A 69 68 2DH AF - - AC AB AA A9 A8 0A8H
67 66 65 64 63 62 61 60 2CH A7 A6 A5 A4 A3 A2 A1 A0 0A0H
5F 5E 5D 5C 5B 5A 59 58 2BH SBUF 99H
57 56 55 54 53 52 51 50 2AH 9F 9E 9D 9C 9B 9A 99 98 98H
4F 4E 4D 4C 4B 4A 49 48 29H 97 96 95 94 93 92 91 90 90H
47 46 45 44 43 42 41 40 28H TH1 8DH
3F 3E 3D 3C 3B 3A 39 38 27H TH0 8CH
37 36 35 34 33 32 31 30 26H TL1 8BH
2F 2E 2D 2C 2B 2A 29 28 25H TL0 8AH
27 26 25 24 23 22 21 20 24H TMOD 89H
1F 1E 1D 1C 1B 1A 19 18 23H 8F 8E 8D 8C 8B 8A 89 88 88H
17 16 15 14 13 12 11 10 22H PCON 87H
0F 0E 0D 0C 0B 0A 09 08 21H DPH 83H
07 06 05 04 03 02 01 00 20H DPL 82H
R7 1FH SP 81H
87 86 85 84 83 82 81 80 80H
R0 18H
R7 17H
R0 10H
R7 0FH

R0 08H Рис.2. Структура резидентной


R7 07H памяти данных и регистров
специальных функций
микроконтроллера 8051
R0 00H
памяти не пересекаются, так как доступ к ним осуществляется с помощью
разных команд.
Младшие 32 байта РПД сгруппированы в 4 банка по 8 регистров R0-
R7 в каждом. Отметим, что Банк0, Банк1, Банк2 и Банк3 занимают
соответственно адреса 00H-07H, 08H-0FH, 10H-17H и 18H-1FH.
Следующие после банков регистров 16 байт (адреса 20H-2FH) или 128 бит
(адреса 00H-7FH) образуют область ячеек, к которым возможно
побитовое обращение. Набор команд МК 8051 содержит значительное
количество инструкций, позволяющих работать с указанными битами.
Область регистров специальных функций (РСФ) (рис.2) содержит 21
регистр, назначение которых приведено в табл.2.1. Как видно из рис.2 и
табл.2.1, 11 РСФ допускают побитовое обращение (биты с адресами 80H-
0F7H).

Таблица 2.1
Наименование Назначение Адрес
P0* Порт 0 80H
SP Указатель стека 81H
DPL Младший байт указателя данных DPTR 82H
DPH Старший байт указателя данных DPTR 83H
PCON Регистр управления потреблением 87H
TCON* Регистр управления таймеров/счетчиков 88H
TMOD Регистр режимов таймеров/счетчиков 89H
TL0 Таймер/счетчик 0. Младший байт 8АH
TL1 Таймер/счетчик 1. Младший байт 8BH
TH0 Таймер/счетчик 0. Старший байт 8CH
TH1 Таймер/счетчик 1. Старший байт 8DH
P1* Порт 1 90H
SCON* Регистр управления последовательным портом 98H
SBUF Буфер последовательного порта 99H
P2* Порт 2 0A0H
IE* Регистр разрешения прерываний 0A8H
P3* Порт 3 0B0H
IP* Регистр приоритетов прерываний 0B8H
PSW* Регистр состояния программы 0D0H
A* Аккумулятор 0E0H
B* Регистр B 0F0H
* - регистры, допускающие побитовую адресацию.

Рассмотрим регистры специальных функций более подробно.


Порты P0, P1, P2, P3 являются двунаправленными портами
ввода/вывода и предназначены для обеспечения обмена информацией МК
с внешними устройствами, образуя 32 линии ввода/вывода. Помимо
обычного ввода/вывода указанные порты могут выполнять ряд
дополнительных функций. В частности, при работе МК с внешней
памятью данных или с внешней памятью программ через порты P0 и P2
выводятся соответственно младший и старший байты адреса, кроме того
через порт P0 выдается (принимается) байт данных (байт данных или байт
команды). При этом обмен байтом данных, ввод байта команды и вывод
младшего байта адреса внешней памяти мультиплексированы во времени.
Линии порта P3 имеют следующие альтернативные функции: P3.0 (P3.1) -
вход (выход) последовательного порта; P3.2 (P3.3) - вход внешнего
прерывания ( ); P3.4 (P3.5) - счетный вход 0 (1); P3.6
(P3.7) - выход сигнала записи (чтения) во внешнюю память данных (из
внешней памяти данных).
Указатель стека SP (Stack Pointer) - регистр, содержимое которого
инкрементируется (увеличивается на единицу) перед записью данных в
стек при выполнении команд PUSH и CALL. Начальный сброс
устанавливает указатель стека в 07H, а область стека в РПД начинается с
адреса 08H. При необходимости, путем переопределения указателя стека
область стека может быть расположена в любом месте РПД.
Указатель данных DPTR (Data PoinTeR) предназначен для хранения
16-разрядного адреса внешней памяти данных и состоит из двух
программно доступных регистров DPH (Data Pointer High) и DPL (Data
Pointer Low), которые могут использоваться в качестве независимых
регистров общего назначения, если нет необходимости в хранении
упомянутого адреса. Кроме того, DPTR служит базовым регистром при
косвенной адресации в некоторых командах пересылки или перехода.
Регистр PCON (Power Control). Конструкция регистра PCON
определяется технологией изготовления микроконтроллера. Для варианта
изготовления по технологи n-МОП (8051) регистр PCON имеет всего один
бит - SMOD, управляющий скоростью передачи последовательного порта.
Для варианта изготовления по технологии КМОП (80С51) наименование
и назначение разрядов регистра PCON приведены в табл.2.2. Для 8051 и
80С51 расположение и назначение разряда SMOD идентичны. Биты GF0 и
GF1 пользователь может задействовать по своему усмотрению. Если в PD
и IDL одновременно записана "1", то преимущество имеет PD.
Особенности режима холостого хода и режима микропотребления
заключаются в том, что при первом блокируются только узлы,
составляющие центральный процессор микроконтроллера (тактовый
генератор продолжает функционировать), а при втором блокируется
работа всех узлов. Токи потребления микроконтроллера 80С51 в режимах
холостого хода и микропотребления составляют соответственно не более
4,2 мА и не более 50 мкА. Для окончания режима холостого хода имеются
два способа. Активизация любого разрешенного прерывания
автоматически приведет к сбросу бита IDL в "0", оканчивая режим
холостого хода, при этом состояние резидентной памяти данных и РСФ
остается таким же, каким оно было на момент перехода в указанный
режим. После исполнения команды (инструкции), обеспечивающей выход
из подпрограммы обслуживания прерывания, будет выполняться
инструкция, которая следует за командой, переведшей микроконтроллер в
режим холостого хода. Другим способом окончания режима холостого
хода является инициализация (сброс) микроконтроллера. В этом случае
сохраняется только содержимое РПД. Указанный способ используется и
для окончания режима микропотребления.

Таблица 2.2
Биты Наименование Назначение
7 SMOD Бит удвоения скорости передачи через
последовательный порт. При установке в "1"
скорость передачи удваивается. Доступен по
чтению.
6 - Не используется.
5 - Не используется.
4 - Не используется.
3 GF1 Программно управляемый флаг пользователя.
2 GF0 Программно управляемый флаг пользователя.
1 PD Бит включения режима микропотребления ("1" -
включение, "0" - отмена). Доступен по чтению.
0 IDL Бит включения режима холостого хода. ("1" -
включение, "0" - отмена). Доступен по чтению.

Регистры TH0, TL0, TH1, TL1 (Timer/counter Low (High) byte).


Исходное (текущее) состояние j-го таймера/счетчика T/Cj в
микроконтроллере определяется (отражается) программно доступными
регистрами THj, TLj. Причем регистр THj - старшие, а регистр TLj -
младшие 8 разрядов. Указанные регистры могут быть программно
прочитаны или загружены как при выключенных, так и при работающих
таймерах/счетчиках. Новая загрузка THj, TLj сразу же означает новую
величину с которой будет начат счет в T/Cj, а старая теряется. Если
загрузка произведена при включенном T/Cj, то счет продолжается с новой
величины. Очередность загрузки регистров THj, TLj произвольная.
Выключение T/Cj не искажает код, находящийся в THj, TLj.
Таймер/счетчик T/Cj можно выключить, через произвольное время вновь
включить и счет начнется с той величины, которая была в регистрах THj,
TLj на момент выключения.
Регистр TCON (Timer/counter Control). Наименование и назначение
разрядов регистра TCON приведены в табл.2.3. Все разряды этого
регистра доступны по записи и по чтению.

Таблица 2.3
Биты Наименование Назначение
7 TF1 Флаг переполнения T/C1.
6 TR1 Бит включения T/C1.
TR1=1 - включен, TR1=0 - выключен.
5 TF0 Флаг переполнения T/C0.
4 TR0 Бит включения T/C0.
TR0=1 - включен, TR0=0 - выключен.
3 IE1 Флаг запроса внешнего прерывания .
2 IT1 Бит, определяющий вид прерывания .
IT1=0 - прерывание по уровню (низкому),
IT1=1 - прерывание по фронту (переход из"1" в "0").
1 IE0 Флаг запроса внешнего прерывания .
0 IT0 Бит, определяющий вид прерывания .
IT0=0 - прерывание по уровню (низкому),
IT0=1 - прерывание по фронту (переход из"1" в "0").

Флаг TFj аппаратно устанавливается в "1" при переходе


T/Cj из состояния "все единицы" в состояние "все нули". Если прерывание
от T/Cj разрешено, то установка флага TFj вызовет прерывание. Бит TFj
аппаратно сбрасывается в "0" при обращении к подпрограмме обработки
прерывания. Флаг IEj аппаратно устанавливается в "1" от внешнего
прерывания : от низкого уровня или перехода из "1" в "0" сигнала
прерывания. Если при этом внешнее прерывание разрешено, то
осуществляется переход к подпрограмме его обслуживания. Сброс флага
IEj выполняется аппаратно при обслуживании прерывания только в том
случае, когда ITj=1.
Регистр TMOD (Timer/counter Mode). Наименование и назначение
разрядов регистра TMOD приведены в табл.2.4. Все разряды этого
регистра доступны по записи и по чтению.
При работе в качестве таймера содержимое T/Cj
инкрементируется с частотой , где f есть частота синхронизации
микроконтроллера. При работе T/Cj в качестве счетчика внешних
событий, его содержимое инкрементируется в ответ на переход из "1" в
"0" сигнала на j-ом счетном входе микроконтроллера. Для надежной
работы T/Cj в режиме счетчика необходимо, чтобы максимальная частота
указанного сигнала была не более , а уровень этого сигнала
оставался неизменным в течение как минимум одного машинного цикла (
).

Таблица 2.4
Биты Наименование Назначение
7 GATE1 Бит разрешает (запрещает) управлять T/C1 от
внешнего вывода .
GATE1=1 - управление разрешено,
GATE1=0 - управление запрещено.
6 Бит определяет работу T/C1 в качестве таймера (
=0), счетчика внешних событий (
=1).
5 М1.1 Биты определяют один из 4-х режимов работы T/
4 М0.1 C1.
M1.1 M0.1 Режим
0 0 0
0 1 1
1 0 2
1 1 3
3 GATE0 Бит разрешает (запрещает) управлять T/C0 от
внешнего вывода .
GATE0=1 - управление разрешено,
GATE0=0 - управление запрещено.
2 Бит определяет работу T/C0 в качестве таймера (
=0), счетчика внешних событий (
=1).
1 М1.0 Биты определяют один из 4-х режимов работы T/
0 М0.0 C0.
M1.0 M0.0 Режим
0 0 0
0 1 1
1 0 2
1 1 3

Таймер/счетчик T/Cj в режиме 0 (1) представляет собой устройство


на основе 13- (16-) разрядного регистра, состоящего из 8-ми разрядов
регистра THj и 5-ти младших разрядов (8-ми разрядов) регистра TLj. В
режиме 2 T/Cj представляет собой устройство на основе 8-разрядного
регистра TLj. При каждом переполнении TLj кроме установки в регистре
TCON флага TFj происходит автозагрузка регистра TLj содержимым THj,
причем указанная автозагрузка не влияет на содержимое регистра THj.
Таймер/счетчик T/C1 в режиме 3 заблокирован (значение кода в регистрах
TH1, TL1 не изменяется). Эффект такой же, как при сбросе TR1 в "0".
Таймер/счетчик T/C0 в режиме 3 представляет собой два независимых
устройства на основе регистров TH0 и TL0. Устройство на основе TL0
может работать в режиме таймера или в режиме счетчика и при
переполнении устанавливает флаг TF0. За этим устройством сохраняются
биты управления TR0, GATE0, . Устройство на основе регистра
TH0 может работать только в режиме таймера. Оно использует бит
включения TR1, при переполнении выставляет флаг TF1. Других битов
управления устройство на основе TH0 не имеет.
Регистр SCON (Serial port Control) предназначен для приема и
хранения кода, который управляет последовательным интерфейсом.
Наименование и назначение разрядов регистра SCON приведены в
табл.2.5. Все разряды этого регистра программно доступны по записи и
чтению.

Таблица 2.5
Биты Наименование Назначение
7 SM0 Биты определяют один из 4-х режимов работы
6 SM1 последовательного порта
SM0 SM1 Режим Характеристика режима
0 0 0 Сдвиговый регистр.
Скорость (частота)
приема/ передачи f/12.
0 1 1 8-битовый универсальный
асинхронный приемник/
передатчик (УАПП).
Скорость (частота)
приема/ передачи задается
частотой переполнений
T/C1.
1 0 2 9-битовый УАПП.
Скорость (частота)
приема/ передачи f/64 или
f/32.
1 1 3 9-битовый УАПП.
Скорость (частота)
приема/ передачи задается
частотой переполнений
T/C1.
5 SM2 Бит разрешения многопроцессорной работы.
4 REN Бит разрешает (запрещает) прием.
REN=1 - прием разрешен,
REN=0 - прием запрещен.
3 TB8 Девятый бит передаваемых данных в режимах 2, 3.
2 RB8 Девятый бит принятых данных в режимах 2, 3.
1 TI Флаг прерывания передатчика.
0 RI Флаг прерывания приемника.

В режимах 2 и 3 при SM2=1 флаг RI не активизируется (не


устанавливается в "1"), если девятый принятый бит данных равен "0". В
режиме 1 при SM2=1 флаг RI не активизируется, если не принят стоп-бит
равный "1". В режиме 0 бит SM2 не используется и должен быть сброшен
в "0". Флаг TI аппаратно устанавливается в "1" в конце периода передачи
8-го бита в режиме 0 или в начале периода передачи стоп-бита в других
режимах. Флаг RI аппаратно устанавливается в "1" в конце периода
приема 8-го бита в режиме 0 или в середине периода приема стоп-бита
(девятого бита) в режиме 1 (в режимах 2 и 3) при SM2=0.
Режим 2 и режим 3 последовательного порта позволяют организовать
работу микроконтроллеров 8051 в многопроцессорных системах,
использующих для обмена информацией между МК разделяемый
моноканал (коаксиальный кабель, витая пара, оптоволокно и др.). В этих
режимах флаг RI установится только в том случае, когда либо SM2=0,
либо принятый девятый бит данных равен "1". Указанную особенность
работы последовательного порта можно использовать для организации
межконтроллерного обмена следующим образом. Пусть ведущему МК
требуется передать блок данных некоторому (нескольким) ведомому
(ведомым) МК. С этой целью ведущий МК в протокольном режиме
"широковещательной" передачи (всем ведомым МК) выдает в моноканал
байт-идентификатор абонента (код адреса МК-получателя), который
отличается от байтов данных только тем, что в его девятом бите
содержится "1". Программа реализации протокола сетевого обмена
информацией должна быть построена таким образом, чтобы при
получении байта-идентификатора во всех ведомых МК произошли
прерывание прикладных программ и вызов подпрограммы сравнения
байта-идентификатора с кодом собственного сетевого адреса.
Адресуемый МК сбрасывает свой управляющий бит SM2 в "0" и
готовится к приему блока данных. Остальные ведомые МК, адрес которых
не совпал с кодом байта-идентификатора, оставляют неизменным
состояние SM2=1 и передают управление основной программе. Байты
данных, поступающие по моноканалу в последовательный порт ведомых
микроконтроллеров у которых SM2=1, прерывание не вызывают (не
устанавливается флаг RI), т.е. игнорируются.
Регистр SBUF (Serial port Buffer). Через SBUF обеспечивается
программный доступ к регистрам передатчика и приемника
последовательного порта. Причем передача начинается любой командой
микроконтроллера, использующей SBUF в качестве регистра назначения,
т.е. выполняющей операцию "запись в SBUF".
Регистр IE (Interrupt Enable) используется для разрешения или
запрещения прерываний от соответствующих источников. Наименование
и назначение разрядов регистра IE приведены в табл.2.6. Все биты
указанного регистра программно доступны по записи и чтению.
Регистр IP (Interrupt Priority) используется для установки уровня
приоритета прерывания для каждого из пяти источников прерываний.
Наименование и назначение разрядов регистра IP приведены в табл.2.7.
Все биты этого регистра программно доступны по записи и чтению.
Наличие в заданном разряде регистра IP "1" устанавливает для
соответствующего источника высокий уровень приоритета, а наличие "0"
- низкий уровень приоритета.

Таблица 2.6
Биты Наименование Назначение
7 EA Бит управления всеми источниками прерываний
одновременно.
EA=0 - прерывания запрещены,
EA=1 - прерывания могут быть разрешены
индивидуальными разрешениями EX0, EX1, ET0,
ET1, ES.
6 - Не используется.
5 - Не используется.
4 ES Бит управления прерыванием от последовательного
порта.
ES=0 - прерывание запрещено,
ES=1 - прерывание разрешено.
3 ET1 Бит управления прерыванием от T/C1.
ET1=0 - прерывание запрещено,
ET1=1 - прерывание разрешено.
2 EX1 Бит управления прерыванием от внешнего
источника .
EX1=0 - прерывание запрещено,
EX1=1 - прерывание разрешено.
1 ET0 Бит управления прерыванием от T/C0.
ET0=0 - прерывание запрещено,
ET0=1 - прерывание разрешено.
0 EX0 Бит управления прерыванием от внешнего
источника .
EX0=0 - прерывание запрещено,
EX0=1 - прерывание разрешено.

Программа обработки прерывания с низким уровнем приоритета


может быть прервана запросом прерывания с высоким уровнем
приоритета, но не может быть прервана другим запросом прерывания с
низким уровнем приоритета. Программа обработки прерывания с
высоким уровнем приоритета не может быть прервана никаким другим
запросом прерывания ни от одного из источников. Если два запроса с
разными уровнями приоритета приняты одновременно, сначала будет
обслужен запрос с высоким уровнем приоритета. Если одновременно
приняты запросы с одинаковым уровнем приоритета, обработка их будет
производится в порядке, задаваемом последовательностью внутреннего
опроса флагов прерываний. Таким образом, в пределах одного
приоритетного уровня существует еще одна структура приоритетов:

Источник Приоритет внутри уровня


IE0 высокий
TF0
IE1
TF1
RI, TI низкий

Необходимо особо подчеркнуть, что структура "Приоритет внутри


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

Таблица 2.7
Биты Наименование Назначение
7 - Не используется.
6 - Не используется.
5 - Не используется.
4 PS Бит установки уровня приоритета прерывания от
последовательного порта.
3 PT1 Бит установки уровня приоритета прерывания от
таймера/счетчика T/C1.
2 PX1 Бит установки уровня приоритета прерывания от
внешнего источника .
1 PT0 Бит установки уровня приоритета прерывания от
таймера/счетчика T/C0.
0 PX0 Бит установки уровня приоритета прерывания от
внешнего источника .

Регистр PSW (Program Status Word). Наименование и назначение


разрядов регистра PSW приведены в табл.2.8.
Аккумулятор A представляет собой 8-разрядный регистр, который
является источником операнда и местом фиксации результата при
выполнении арифметических, логических операций и ряда операций
передачи данных. Кроме того, только с использованием аккумулятора
могут быть выполнены операции сдвигов, проверки на нуль,
формирование флага паритета и т.п.
Регистр B - 8-разрядный регистр, используемый в сочетании с
аккумулятором при выполнении операций умножения и деления для
хранения второго входного операнда и помещения возвращаемых 8-ми
битов результата. В других операциях регистр B является обычным
регистром общего назначения.

Таблица 2.8
Биты Наимен Назначение
ование
7 C Флаг переноса. Устанавливается в "1" (сбрасывается в "0")
аппаратно или программно. Аппаратно устанавливается
(сбрасывается) во время выполнения команды сложения
или вычитания при наличии (отсутствии) соответственно
переноса или заема в 7-ом бите результата. Во время
выполнения команды умножения или деления флаг всегда
аппаратно сбрасывается.
6 AC Флаг дополнительного переноса. Устанавливается
(сбрасывается) аппаратно или программно. Аппаратно
устанавливается (сбрасывается) во время выполнения
команды сложения или вычитания при наличии
(отсутствии) соответственно переноса или заема в 3-ем
бите результата.
5 F0 Программно управляемый флаг пользователя.
4 RS1 Разряды управления выбором банка рабочих регистров.
3 RS0 Устанавливаются (сбрасываются) программно.
RS1 RS0 Банк
0 0 0
0 1 1
1 0 2
1 1 3
2 OV Флаг переполнения. Устанавливается (сбрасывается)
аппаратно или программно. Аппаратно устанавливается во
время выполнения команды сложения (вычитания) если
есть перенос (заем) в 6-ом бите результата и нет переноса
(заема) в бите 7, или есть перенос (заем) в бите 7 и нет в
бите 6, в противном случае флаг сбрасывается. Во время
выполнения команды деления флаг аппаратно
сбрасывается, а в случае деления на нуль -
устанавливается. При умножении флаг аппаратно
устанавливается если результат больше 255, в противном
случае - сбрасывается.
1 без Флаг пользователя. Устанавливается (сбрасывается)
имени программно. Доступен по чтению.
0 P Флаг паритета. Программно доступен только по чтению.
Аппаратно сбрасывается (устанавливается) в каждом
машинном цикле для индикации четности (нечетности)
количества разрядов аккумулятора, находящихся в
состоянии "1". Если в аккумуляторе все разряды сброшены
в "0", флаг аппаратно сбрасывается.

2.2. Ассемблерный язык микроконтроллера 8051

Для эффективной разработки прикладного программного


обеспечения микропроцессоров и микроконтроллеров необходимо
выбрать подходящий язык программирования. Если требуется не очень
сложная и при этом быстрая и компактная программа, которая не
содержит сложных вычислительных операций, то для ее написания лучше
выбрать язык низкого уровня (язык ассемблера). Язык высокого уровня
(ЯВУ) следует выбрать в том случае, если необходимо производить
сложные вычисления: операции над 16-, 32-разрядными числами, числами
с плавающей точкой и др. Очень часто наиболее подходящей является
смешанная модель, где критичные к быстродействию части программы
написаны на ассемблере, а вычислительные процедуры реализованы на
ЯВУ, например, на Си.
Изучение языков программирования целесообразнее всего начинать с
ассемблера, поскольку он дает наглядное представление о
функционировании аппаратной части целевого микропроцессора
(микропроцессора для которого разрабатывается прикладная программа),
что в конечном счете обеспечивает получение оптимальных
схемотехнических решений разрабатываемой микропроцессорной
техники. Язык ассемблера относится к группе машинно-ориентированных
языков. Иначе говоря, каждому типу микропроцессоров или
микроконтроллеров соответствует свой ассемблерный язык.
Оператором языка ассемблера микроконтроллера 8051 (языка
АСМ51) является строка исходного текста микроконтроллерной
программы (МК-программы), имеющая следующий формат:

метка  команда/ директива ;комментарий


операция операнды

Поле команда/ директива является главным полем строки и


состоит из поля операция и поля операнды, разделенных пробелом.
Поле операция содержит мнемоническое обозначение команды
или директивы ассемблера, которое является сокращением
(аббревиатурой) полного английского наименования выполняемого
действия. Например: MOV - move - переслать, JMP - jump - перейти, DB -
define byte - определить байт. Кроме того, поле операция может
содержать символическое имя ассемблерной макрокоманды.
Поле операнды зависит от поля операция и может указывать
группу разделенных запятой операндов, либо может быть исключено
вообще.
Операнды ассемблерных команд определяют тип используемых
данных (бит, байт, 2-байтовое слово), способ адресации этих данных и
адреса переходов в области памяти программ микроконтроллера.
Различают следующие способы адресации данных: регистровый, прямой,
косвенно-регистровый и непосредственный.
Регистровая адресация обеспечивает обращение к байтовому
содержимому регистров A, B или регистров R0-R7 выбранного банка, к 2-
байтовому содержимому регистра DPTR и к битовому содержимому
флага переноса C, при этом в качестве операндов используются принятые
имена перечисленных программно доступных элементов, а также
символические имена (только для регистров R0-R7), определяемые
пользователем.
Прямая адресация применяется для обращения к байтовому
содержимому 128-ми ячеек резидентной памяти данных или 21-го
регистра специальных функций, а также к битовому содержимому 16-ти
ячеек РПД или 11-ти РСФ, допускающих побитовое обращение (рис.2).
При прямой адресации данных в поле операнды указывается прямой
адрес используемых ячейки РПД, регистра специальных функций или
бита. Этот адрес может быть задан числом, символическим именем,
выражением, именем (только для РСФ и битов РСФ). Имена регистров
специальных функций приведены в табл.2.1, а имена битов РСФ - в
табл.2.3, табл.2.5-2.8. Кроме того, имя бита РСФ может быть
представлено структурой вида: имя РСФ.номер бита. Например, имя
пятого бита регистра TCON можно записать как TCON.5, имя второго
бита аккумулятора - как A.2 и т.д.
С помощью косвенно-регистровой адресации обеспечивается
обращение к байтовому содержимому 128-ми ячеек РПД, при этом адрес
используемой ячейки определяется содержимым указателя стека SP или
одного из регистров R0, R1 выбранного банка. Косвенно-регистровая
адресация используется также для обращения к внешней памяти данных.
В этом случае регистром-указателем может быть 16-разрядный указатель
данных DPTR или один из упомянутых выше регистров R0, R1. Для
работы с данными, "зашитыми" в виде констант в память программ
микроконтроллера, применяется косвенно-регистровая адресация по
сумме: базовый регистр (содержимое DPTR или программного счетчика
PC) плюс индексный регистр (содержимое аккумулятора A). Любая такая
константа может быть выбрана по адресу, который вычисляется
сложением содержимого DPTR (PC) с содержимым A. Операнд,
определяющий косвенно-регистровую адресацию данных, задается
именем регистра-указателя или символическим именем (только для R0 и
R1) с обязательным префиксом @.
При непосредственной адресации данные, предназначенные для
обработки, непосредственно указываются в поле операнды и могут
быть представлены в нем числом, символическим именем или
выражением с обязательным префиксом #.
Аналогичным образом (за исключением префикса #) представляется
операнд, определяющий адрес перехода в памяти программ
микроконтроллера.
В качестве операндов ассемблерных директив и макрокоманд обычно
используются числа, символические имена, выражения, имена
программно доступных элементов микроконтроллера (только для
директивы REG и макрокоманд), а в ряде случаев мнемоники языка
АСМ51 (только для макрокоманд).
Символические имена, являющиеся операндами команд или
директив, должны быть обязательно определены с помощью
соответствующих директив (EQU, VAR или REG) языка АСМ51. Кроме
того, символическое имя адреса в памяти программ может быть
определено использованием этого имени в поле метка одной из строк
исходного текста МК-программы. Отметим, что корректное
символическое имя должно быть представлено комбинацией букв
латинского алфавита и цифр и начинаться с буквы, при этом указанная
комбинация допускает использование символа подчеркивания.
Применяемые в качестве операндов числа приводятся с указанием
системы счисления (СС), для чего используется суффикс (латинская
буква, стоящая после числа): B - для двоичной СС, Q - для восьмеричной
СС, D - и H - соответственно для десятичной и шестнадцатеричной СС.
Число без суффикса считается десятичным.
Выражение, используемое в поле операнды, вычисляется в
процессе трансляции исходной МК-программы и представляет собой
совокупность символических имен и (или) чисел (в формате 2-байтовых
слов), содержащую следующие основные операторы:
"+" - сложение (третий уровень приоритета);
"-" - вычитание (третий уровень приоритета);
"" - умножение (четвертый уровень приоритета);
"/" - деление (четвертый уровень приоритета);
"" - возведение в степень (пятый уровень приоритета);
.OR. - ИЛИ (первый уровень приоритета);
.AND. - И (второй уровень приоритета);
.XOR. - исключающее ИЛИ (первый уровень приоритета);
.NOT. - отрицание (шестой уровень приоритета);
"<" (">") - выделение младшего (старшего) байта 2-байтового слова
(шестой уровень приоритета).
Оператор с более высоким уровнем приоритета выполняется в первую
очередь. Если в выражении присутствуют операторы с одинаковым
уровнем приоритета, то вычисления производятся слева направо. Чтобы
изменить указанный порядок выполнения расчетов допускается
использовать скобки. В качестве примера приведем выражение
<.NOT.13H+1, реализующее процедуру преобразования числа 13H в
дополнительный код и эквивалентное числу 0EDH, которое будет
получено при трансляции исходной МК-программы.
Поле метка не является обязательным, отделяется от поля
команда/ директива пробелом и может содержать символическое имя
непосредственных данных, одного из регистров R0-R7, прямого адреса,
макрорасширения или адреса перехода в памяти программ. Если метка
заканчивается двоеточием, то она может быть расположена в любом месте
строки, в противном случае метка должна начинаться в начале строки.
Поле комментарий содержит пояснения различного характера -
может объяснять применение той или иной команды или директивы,
содержать описание алгоритма участка или МК-программы в целом и др.
Это поле не является обязательным и при использовании должно
начинаться символом ;.

2.2.1. Система команд языка АСМ51

Система команд языка АСМ51 содержит 111 команд, которые


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

Таблица 2.9
Обозначение Назначение
addr Символическое имя вычисляемого адреса ячейки памяти
программ.
addr11 Символическое имя 11-битового адреса ячейки памяти
программ.
addr16 Символическое имя 16-битового адреса ячейки памяти
программ.
bit Символическое имя 8-разрядного адреса бита в области
ячеек резидентной памяти данных или регистров
специальных функций, допускающей побитовое
обращение (см. рис.2).
data8 Символическое имя байта данных.
Продолжение табл.2.9
Обозначение Назначение
data16 Символическое имя 16-битовых данных.
direct Символическое имя 8-разрядного адреса ячейки
резидентной памяти данных или регистра специальных
функций.
rel Значение байта смещения, используемое при вычислении
адреса addr.
(X) Содержимое элемента X.
((X)) Содержимое по адресу, хранящемуся в элементе X.
X[M] Разряд M элемента X.
X[3-0] Группа разрядов элемента X.
 Оператор присваивания.
 Дизъюнкция.
 Конъюнкция.
 Сложение по модулю 2.
XY Целочисленное деление элемента X на элемент Y.
mod[XY] Остаток при целочисленном делении.
Время выполнения рассматриваемых команд указывается в
машинных циклах. Напомним, что длительность одного машинного цикла
определяется выражением , где f есть частота синхронизации
микроконтроллера.

ACALL addr11 addr11[10-8] 1 0 0 0 1 addr11[7-0]


Команда "абсолютный вызов подпрограммы" вызывает безусловно
подпрограмму, размещенную по адресу addr11. При этом содержимое
счетчика команд PC увеличивается на 2 для получения адреса следующей
команды, после чего полученное 16-разрядное значение PC помещается в
стек, и содержимое указателя стека SP также увеличивается на 2. Адрес
перехода образуется с помощью конкатенации (сцепления) 5-ти старших
бит увеличенного содержимого счетчика команд PC, содержимого 7-5
битов старшего байта команды и содержимого второго байта команды.
Адрес перехода и указанная команда должны находиться внутри одной
страницы памяти программ (ПП) объемом 2 Кбайт, определяемой
содержимым пяти старших бит PC. Время выполнения команды 2 цикла.
Алгоритм Пример
(PC)(PC)+2, (SP)(SP)+1 ;(SP)=07H, (PC)=28DH,
((SP))(PC[7-0]), (SP)(SP)+1 ;MT1 соответствует адресу
((SP))(PC[15-8]) ;345H в ПП
(PC[10-0])addr11[10-8] addr11[7-0], ACALL MT1 ;(PC)=345H, ;
(SP)=09H,
где есть знак конкатенации
;в РПД (09H)=02H, (08H)=8FH
ADD A,Rn ;где n=0-7 00101rrr где rrrB=000B-111B

Команда "сложение" складывает содержимое аккумулятора A с


содержимым заданного регистра Rn выбранного банка, помещая
результат в A. Содержимое используемого регистра не изменяется. При
появлении переносов из разрядов 7 и 3 результата устанавливаются в "1"
флаг переноса C и флаг дополнительного переноса AC соответственно, в
противном случае эти флаги сбрасываются в "0". Флаг переполнения OV
устанавливается, если есть перенос из бита 6 и нет переноса из бита 7, или
есть перенос из бита 7 и нет - из бита 6, в противном случае флаг OV
сбрасывается. Время выполнения команды 1 цикл.
Алгоритм Пример
(A)(A)+(Rn), где n=0-7 ;(A)=0C3H, (R6)=0AAH
(С)x, (OV)=x, (AC)=x, где x{0,1} ADD A,R6 ;(A)=6DH,(R6)=0AAH,
;(AC)=0, (C)=1, (OV)=1
ADD A,@Ri ;где i{0,1} 0010011i
Команда "сложение" складывает содержимое аккумулятора A с
содержимым ячейки резидентной памяти данных (РПД), адресуемой
содержимым заданного регистра Ri выбранного банка. Результат
размещается в A. Содержимое используемой ячейки не изменяется.
Логика установки (сброса) флагов и время выполнения такие же, как у
рассмотренной выше команды с аналогичной мнемоникой.
Алгоритм Пример
(A)(A)+((Ri)), где i{0,1} ;(A)=95H, (R1)=31H,
(С)x, (OV)=x, (AC)=x, где x{0,1} ;в РПД (31H)=4CH
ADD A,@R1 ;(A)=0E1H, (C)=0,
;(AC)=1, (OV)=0, (31H)=4CH

ADD A,direct 00100101 direct


Команда "сложение" складывает содержимое аккумулятора A с
содержимым ячейки резидентной памяти данных (либо регистра
специальных функций), 8-разрядный адрес которой (которого)
определяется символическим именем direct. Результат помещается в A.
Содержимое используемой ячейки или используемого регистра не
изменяется. Логика установки (сброса) флагов и время выполнения такие
же, как у рассмотренной выше команды с аналогичной мнемоникой.
Алгоритм Пример
(A)(A)+(direct) ;(A)=77H, (P1)=0FFH
(С)x, (OV)=x, (AC)=x, где x{0,1} ADD A,P1 ;(A)=76H,
;(AC)=1, (C)=1, (OV)=0
;(P1)=0FFH
ADD A,#data8 00100100 data8

Команда "сложение" складывает содержимое аккумулятора A с байтом


данных data8, непосредственно указанным в команде. Результат
размещается в A. Логика установки (сброса) флагов и время выполнения
такие же, как у рассмотренной выше команды с аналогичной мнемоникой.
Алгоритм Пример
(A)(A)+data8 ;(A)=09H
(С)x, (OV)=x, (AC)=x, где x{0,1} ADD A,#0D3H ;(A)=0DCH,
;(AC)=0, (C)=0, (OV)=0

ADDC A,Rn ;где n=0-7 00111rrr где rrrB=000B-111B


Команда "сложение с переносом" одновременно складывает содержимое
аккумулятора A, содержимое флага переноса С и содержимое заданного
регистра Rn выбранного банка, помещая результат в A. Содержимое
используемого регистра не изменяется. При появлении переносов из
разрядов 7 и 3 результата устанавливаются в "1" флаг переноса C и флаг
дополнительного переноса AC соответственно, в противном случае эти
флаги сбрасываются в "0". Флаг переполнения OV устанавливается, если
есть перенос из бита 6 и нет переноса из бита 7, или есть перенос из бита
7 и нет - из бита 6, в противном случае флаг OV сбрасывается. Время
выполнения команды 1 цикл.
Алгоритм Пример
(A)(A)+(C)+(Rn), где n=0-7 ;(A)=0B2H, (R3)=99H, (C)=1
(С)x, (OV)=x, (AC)=x, где x{0,1} ADDC A,R3 ;(A)=4CH,(R3)=99H,
;(AC)=0, (C)=1, (OV)=1

ADDC A,@Ri ;где i{0,1} 0011011i


Команда "сложение с переносом" одновременно складывает содержимое
аккумулятора A, содержимое флага переноса C и содержимое ячейки
резидентной памяти данных (РПД), адресуемой содержимым заданного
регистра Ri выбранного банка. Результат помещается в A. Содержимое
используемой ячейки не изменяется. Логика установки (сброса) флагов и
время выполнения такие же, как у рассмотренной выше команды с
аналогичной мнемоникой.
Алгоритм Пример
(A)(A)+(C)+((Ri)), где i{0,1} ;(A)=0D5H, (R0)=3AH,
(С)x, (OV)=x, (AC)=x, где x{0,1} ;в РПД (3AH)=1AH, (C)=1
ADDC A,@R0 ;(A)=0F0H,
;(AC)=1, (C)=0, (OV)=0,
;(3AH)=1AH

ADDC A,direct 00110101 direct


Команда "сложение с переносом" одновременно складывает содержимое
аккумулятора A, содержимое флага переноса C и содержимое ячейки
резидентной памяти данных (либо регистра специальных функций), 8-
разрядный адрес которой (которого) определяется символическим именем
direct. Результат помещается в A. Содержимое используемой ячейки или
используемого регистра не изменяется. Логика установки (сброса) флагов
и время выполнения такие же, как у рассмотренной выше команды с
аналогичной мнемоникой.
Алгоритм Пример
(A)(A)+(C)+(direct) ;(A)=11H, (C)=1,
(С)x, (OV)x, (AC)x, ;(DPH)=0DFH
где x{0,1} ADDC A,DPH ;(A)=0F1H,
;(AC)=1, (C)=0, (OV)=0,
;(DPH)=0DFH

ADDC A,#data8 00110100 data8


Команда "сложение с переносом" одновременно складывает содержимое
аккумулятора A, содержимое флага переноса C и байт данных data8,
непосредственно указанный в команде. Результат размещается в A.
Логика установки (сброса) флагов и время выполнения такие же, как у
рассмотренной выше команды с аналогичной мнемоникой.
Алгоритм Пример
(A)(A)+(C)+data8 ;(A)=55H, (C)=0
(С)x, (OV)x, (AC)x, где x{0,1} ADDC A,#55H ;(A)=0AAH,
;(AC)=0, (C)=0, (OV)=1

AJMP addr11 addr11[10-8] 0 0 0 0 1 addr11[7-0]


Команда "абсолютный переход" передает управление по адресу с
символическим именем addr11, который образуется с помощью
конкатенации (сцепления) 5-ти старших бит содержимого счетчика
команд PC (после увеличения его на 2), содержимого 7-5 битов старшего
байта команды и содержимого второго байта команды. Адрес перехода и
указанная команда должны находиться внутри одной страницы памяти
программ (ПП) объемом 2 Кбайт, определяемой содержимым пяти
старших бит PC. Время выполнения команды 2 цикла.
Алгоритм Пример
(PC)(PC)+2 ;(PC)=28FH,
(PC[10-0])addr11[10-8] addr11[7-0], ;MT2 соответствует адресу
где есть знак конкатенации ;34AH в ПП
AJMP MT2 ;(PC)=34AH
ANL A,Rn ;где n=0-7 01011rrr где rrrB=000B-111B

Команда "логическое И" выполняет поразрядную конъюнкцию


содержимого аккумулятора A с содержимым заданного регистра Rn
выбранного банка, помещая результат в A. Содержимое используемого
регистра не изменяется. Команда на состояние флагов не влияет и имеет
время выполнения 1 цикл.
Алгоритм Пример
(A)(A)(Rn), где n=0-7 ;(A)=0FH, (R2)=0C5H
ANL A,R2 ;(A)=05H,(R2)=0C5H

ANL A,@Ri ;где i{0,1} 0101011i


Команда "логическое И" выполняет поразрядную конъюнкцию
содержимого аккумулятора A с содержимым ячейки резидентной памяти
данных (РПД), адресуемой содержимым заданного регистра Ri
выбранного банка. Результат размещается в A. Содержимое используемой
ячейки не изменяется. Команда на состояние флагов не влияет и имеет
время выполнения 1 цикл.
Алгоритм Пример
(A)(A)((Ri)), где i{0,1} ;(A)=0BCH, (R0)=35H,
;в РПД (35H)=47H
ANL A,@R0 ;(A)=04H,
;в РПД (35H)=47H

ANL A,direct 01010101 direct


Команда "логическое И" выполняет поразрядную конъюнкцию
содержимого аккумулятора A с содержимым ячейки резидентной памяти
данных (либо регистра специальных функций), 8-разрядный адрес
которой (которого) определяется символическим именем direct. Результат
помещается в A. Содержимое используемой ячейки или используемого
регистра не изменяется. Команда на состояние флагов не влияет и имеет
время выполнения 1 цикл.
Алгоритм Пример
(A)(A)(direct) ;(A)=0A3H, (PSW)=85H
ANL A,PSW ;(A)=81H,(PSW)=85H

ANL A,#data8 01010100 data8


Команда "логическое И" выполняет поразрядную конъюнкцию
содержимого аккумулятора A с байтом данных data8, непосредственно
указанным в команде. Результат размещается в A. Команда на состояние
флагов не влияет и имеет время выполнения 1 цикл.
Алгоритм Пример
(A)(A)data8 ;(A)=36H
ANL A,#0DDH ;(A)=14H

ANL direct,A 01010010 direct


Команда "логическое И" выполняет поразрядную конъюнкцию
содержимого аккумулятора A с содержимым ячейки резидентной памяти
данных (либо регистра специальных функций), 8-разрядный адрес
которой (которого) определяется символическим именем direct. Результат
помещается соответственно в используемую ячейку или используемый
регистр. Содержимое A не изменяется. Команда на состояние флагов не
влияет и имеет время выполнения 1 цикл.
Алгоритм Пример
(direct)(direct)(A) ;(A)=55H, (P2)=0AAH
ANL P2,A ;(A)=55H,(P2)=00H

ANL direct,#data8 01010011 direct data8


Команда "логическое И" выполняет поразрядную конъюнкцию байта
данных data8, непосредственно указанного в команде, с содержимым
ячейки резидентной памяти данных (либо регистра специальных
функций), 8-разрядный адрес которой (которого) определяется
символическим именем direct. Результат помещается соответственно в
используемую ячейку или используемый регистр. Команда на состояние
флагов не влияет и имеет время выполнения 2 цикла.
Алгоритм Пример
(direct)(direct)data8 ;(P1)=0FFH
ANL P1,#73H ;(P1)=73H

ANL C,bit 10000010 bit


Команда "логическое И" выполняет конъюнкцию содержимого флага
переноса C с содержимым бита, 8-разрядный адрес которого определяется
символическим именем bit в области ячеек резидентной памяти данных
(РПД) или регистров специальных функций, допускающей побитовое
обращение. Результат помещается в С. Содержимое используемого бита
не изменяется. Команда на состояние других флагов не влияет и имеет
время выполнения 2 цикла.
Алгоритм Пример
(C)(C)(bit) ;(C)=1, (P1[0])=0,
;в РПД (24H)=0FH
ANL C,P1.0 ;(C)=0, (P1[0])=0
ANL C,20H ;(C)=0, (24H)=0FH
ANL C,/bit 10110000 bit

Команда "логическое И" выполняет конъюнкцию содержимого флага


переноса C с инвертированным значением бита из области ячеек
резидентной памяти данных или регистров специальных функций,
допускающей побитовое обращение, при этом содержимое используемого
бита, 8-разрядный адрес которого определяется символическим именем
bit, не изменяется. Результат помещается в С. Команда на состояние
других флагов не влияет и имеет время выполнения 2 цикла.
Алгоритм Пример
(C)(C)  ;(C)=1, (AC)=0
ANL C,/AC ;(C)=1, (AC)=0
CJNE A,direct,addr 10110101 direct rel
Команда "сравнение и переход, если не равно" сравнивает содержимое
аккумулятора A с содержимым ячейки резидентной памяти данных (либо
регистра специальных функций), 8-разрядный адрес которой (которого)
определяется символическим именем direct, и выполняет переход по
адресу addr, если содержимое A не равно содержимому используемой
ячейки или используемого регистра, в противном случае выполняется
следующая команда. Адрес перехода addr определяется при помощи
сложения 8-битового числа rel (со знаком), размещенного в последнем
байте команды, с содержимым счетчика команд PC после увеличения его
на три. Таким образом, указанный переход возможен в пределах от -128
до +127 относительно начального адреса следующей команды, при этом
отрицательное значение rel представляется двоичным числом в
дополнительном коде. Флаг переноса C сбрасывается в "0", если
содержимое A больше (равно) содержимого (содержимому) используемой
ячейки или используемого регистра, в противном случае флаг
устанавливается в "1". Команда не изменяет (A) и (direct) и имеет время
выполнения 2 цикла.
Алгоритм Пример
если (direct)(A), то (PC)(PC)+3+rel ;(A)=97H, (P2)=0F0H, (C)=0,
и (C)0 ;(PC)=3FFH, MT3 соответству-
если (direct)(A), то (PC)(PC)+3+rel ;ет адресу 41FH, rel=1DH
и (C)1 CJNE A,P2,MT3 ;(C)=1,
;(A)=97H, (P2)=0F0H,
если (direct)=(A), то (PC)(PC)+3 и
;(PC)=41FH
(C)0

CJNE A,#data8,addr 10110100 data8 rel


Команда "сравнение и переход, если не равно" сравнивает содержимое
аккумулятора A с байтом данных data8, непосредственно указанным в
команде, и выполняет переход по адресу addr, если содержимое A не
равно data8, в противном случае выполняется следующая команда.
Процедура вычисления адреса перехода, влияние на (A) и время
выполнения такие же, как у рассмотренной выше команды с аналогичной
мнемоникой. Флаг переноса C сбрасывается в "0", если содержимое A
больше (равно) data8, в противном случае флаг устанавливается в "1".
Алгоритм Пример
если data8(A), то (PC)(PC)+3+rel и ;(A)=0FCH, (C)=1, (PC)=3FFH,
(C)0 ;MT4 соответствует адресу
если data8(A), то (PC)(PC)+3+rel и ;3F0H, rel=0EEH
(C)1 CJNE A,#0BFH,MT4 ;(C)=0,
если data8=(A), то (PC)(PC)+3 и ;(A)=0FCH, (PC)=3F0H
(C)0

CJNE Rn,#data8,addr 10111rrr data8 rel


где n=0-7 где rrrB=000B-111B
Команда "сравнение и переход, если не равно" сравнивает содержимое
заданного регистра Rn выбранного банка с байтом данных data8,
непосредственно указанным в команде, и выполняет переход по адресу
addr, если содержимое Rn не равно data8, в противном случае
выполняется следующая команда. Процедура вычисления адреса перехода
и время выполнения такие же, как у рассмотренной выше команды с
аналогичной мнемоникой. Флаг переноса C сбрасывается в "0", если
содержимое Rn больше (равно) data8, в противном случае флаг
устанавливается в "1". Команда не влияет на (Rn).
Алгоритм Пример
если data8(Rn), то (PC)(PC)+3+rel ;(R7)=80H, (C)=0, (PC)=300H,
и (C)0 ;MT5 соответствует адресу
если data8(Rn), то (PC)(PC)+3+rel ;30FH, rel=0CH
и (C)1 CJNE R7,#81H,MT5 ;(C)=1,
;(R7)=80H, (PC)=30FH
если data8=(Rn), то (PC)(PC)+3 и
(C)0

CJNE @Ri,#data8,addr 1011011i data8 rel


где i{0,1}
Команда "сравнение и переход, если не равно" сравнивает содержимое
ячейки резидентной памяти данных (РПД), адресуемой содержимым
заданного регистра Ri выбранного банка, с байтом данных data8,
непосредственно указанным в команде, и выполняет переход по адресу
addr, если содержимое используемой ячейки не равно data8, в противном
случае выполняется следующая команда. Процедура вычисления адреса
перехода и время выполнения такие же, как у рассмотренной выше
команды с аналогичной мнемоникой. Флаг переноса C сбрасывается в "0",
если содержимое используемой ячейки больше (равно) data8, в противном
случае флаг устанавливается в "1". Команда не влияет на ((Ri)).
Алгоритм Пример
если data8((Ri)), то (PC)(PC) ;(R0)=41H, (C)=1, (PC)=200H,
+3+rel и (C)0 ;в РПД (41H)=57H,
если data8((Ri)), то (PC)(PC) ;MT6 соответствует адресу
+3+rel и (C)1 ;22AH, rel=27H
если data8=((Ri)), то CJNE @R0,#29H,MT6 ;(C)=0,
(PC)(PC)+3 и (C)0 ;(PC)=22AH,
;в РПД (41H)=57H

CLR A 11100100
Команда "сброс аккумулятора" сбрасывает (обнуляет) содержимое
аккумулятора A, на состояние флагов не влияет и имеет время
выполнения 1 цикл.
Алгоритм Пример
(A)0 ;(A)=6CH, (C)=0, (AC)=1
CLR A ;(A)=00H, (C)=0, (AC)=1

CLR C 11000011
Команда "сброс флага переноса" сбрасывает (обнуляет) содержимое флага
переноса C, на состояние других флагов не влияет и имеет время
выполнения 1 цикл.
Алгоритм Пример
(C)0 ;(C)=1
CLR C ;(C)=0

CLR bit 11000010 bit


Команда "сброс бита" сбрасывает (обнуляет) содержимое бита, 8-
разрядный адрес которого определяется символическим именем bit в
области ячеек резидентной памяти данных (РПД) или регистров
специальных функций, допускающей побитовое обращение. Команда на
состояние не используемых флагов не влияет и имеет время выполнения 1
цикл.
Алгоритм Пример
(bit)0 ;(P1)=5EH=01011110B
;в РПД (28H)=31H
CLR P1.3 ;(P1)=56H=01010110B
CLR 40H ;(28H)=30H

CPL A 11110100
Команда "инверсия аккумулятора" инвертирует содержимое каждого бита
аккумулятора A, на состояние флагов не влияет и имеет время
выполнения 1 цикл.
Алгоритм Пример
(A) ;(A)=65H=01100101B
CPL A ;(A)=9AH=10011010B

CPL C 10110011
Команда "инверсия флага переноса" инвертирует содержимое флага
переноса C, на состояние других флагов не влияет и имеет время
выполнения 1 цикл.
Алгоритм Пример
(C) ;(C)=1, (AC)=1, (OV)=0
CPL C ;(C)=0, (AC)=1, (OV)=0

CPL bit 10110010 bit


Команда "инверсия бита" инвертирует содержимое бита, 8-разрядный
адрес которого определяется символическим именем bit в области ячеек
резидентной памяти данных или регистров специальных функций,
допускающей побитовое обращение. Команда на состояние не
используемых флагов не влияет и имеет время выполнения 1 цикл.
Алгоритм Пример
(bit) ;(P1)=39H=00111001B
CPL P1.1
CPL P1.3 ;(P1)=33H=00110011B

DA A 11010100
Команда "десятичная коррекция аккумулятора" упорядочивает 8-битовую
величину в аккумуляторе A, полученную в результате выполненной ранее
команды сложения двух переменных, представленных в двоично-
десятичном формате. Для выполнения сложения может использоваться
любая из типов команд ADD или ADDC. Если значение битов 3-0
аккумулятора превышает 9 (xxxx1010B-xxxx1111B) или, если содержимое
флага AC установлено в "1", то к содержимому A прибавляется 06H, при
этом получается соответствующая двоично-десятичная цифра в младшем
полубайте A. Указанное сложение не изменяет содержимое флага AC, но
устанавливает в "1" содержимое флага переноса C, если перенос из поля
младших четырех бит распространяется через все старшие биты A, в
противном случае - не изменяет (C). Далее, если содержимое флага C
равно "1", или если значение битов 7-4 аккумулятора превышает 9
(1010xxxxB-1111xxxxB), то это значение увеличивается на 6, создавая
соответствующую двоично-десятичную цифру в старшем полубайте A.
При этом флаг C устанавливается (не изменяется), если имеется
(отсутствует) перенос из бита 7 аккумулятора. Время выполнения
команды 1 цикл.
Алгоритм Пример
если (A[3-0])9 или (AC)=1, ;(A)=30H, (R3)=99H
то (A)(A)+6 ADD A,R3 ;(A)=0C9H,
если (A[7-4])9 или (C)=1, ;(AC)=0, (C)=0
то (A[7-4])(A[7-4])+6 DA A ;(C)=1, (A)=29H, (AC)=0

DEC A 00010100
Команда "декремент" производит вычитание "1" из содержимого
аккумулятора A, на флаги не влияет и имеет время выполнения 1 цикл.
Алгоритм Пример
(A)(A)-1 ;(A)=00H, (C)=1, (AC)=1
DEC A ;(A)=0FFH, (C)=1, (AC)=1

DEC Rn ;где n=0-7 00011rrr где rrrB=000B-111B


Команда "декремент" производит вычитание "1" из содержимого
заданного регистра Rn выбранного банка, на флаги не влияет и имеет
время выполнения 1 цикл.
Алгоритм Пример
(Rn)(Rn)-1, где n=0-7 ;(R1)=35H, (C)=0, (AC)=1
DEC R1 ;(R1)=34H, (C)=0, (AC)=1

DEC direct 00010101 direct


Команда "декремент" производит вычитание "1" из содержимого ячейки,
8-разрядный адрес которой определяется символическим именем direct в
области резидентной памяти данных или в среде регистров специальных
функций. Команда на флаги не влияет и имеет время выполнения 1 цикл.
Алгоритм Пример
(direct)(direct)-1 ;(SCON)=0A0H, (C)=1, (AC)=0
DEC SCON ;(SCON)=9FH,
;(C)=1, (AC)=0

DEC @Ri ;где i{0,1} 0001011i


Команда "декремент" производит вычитание "1" из содержимого ячейки
резидентной памяти данных (РПД), адресуемой содержимым заданного
регистра Ri выбранного банка, на флаги не влияет и имеет время
выполнения 1 цикл.
Алгоритм Пример
((Ri))((Ri))-1, где i{0,1} ;(R1)=7FH, в РПД (7FH)=40H
DEC @R1 ;(R1)=7FH,
;в РПД (7FH)=3FH

DIV AB 10000100
Команда "деление" делит 8-битовую переменную из аккумулятора A на 8-
битовую переменную из регистра B. Аккумулятору присваивается целая
часть частного (старшие разряды), а регистру B - остаток. Содержимое
флага переноса C сбрасывается в "0". Содержимое флага переполнения
OV также сбрасывается, а в случае деления на нуль - устанавливается в
"1". Содержимое флага AC не изменяется. Команда имеет время
выполнения 4 цикла.
Алгоритм Пример
(A)(A):(B), (B)mod[(A):(B)], (C)0 ;(A)=0FBH=251, (B)=12H=18,
если (В)0, то (OV)0 ;(C)=1, (OV)=1
если (В)=0, то (OV)1 DIV AB ;(C)=0, (OV)=0,
;(A)=0DH=13, (B)=11H=17

DJNZ Rn,addr ;где n=0-7 11011rrr rel где rrrB=000-111B


Команда "декремент и переход, если не равно нулю" выполняет
вычитание "1" из содержимого заданного регистра Rn выбранного банка и
осуществляет переход по адресу addr, если содержимое Rn не равно нулю,
в противном случае выполняется следующая команда. Адрес перехода
addr определяется при помощи сложения 8-битового числа rel (со знаком),
размещенного в последнем байте команды, с содержимым счетчика
команд PC после увеличения его на 2. Таким образом, указанный переход
возможен в пределах от -128 до +127 относительно начального адреса
следующей команды, при этом отрицательное значение rel представляется
двоичным числом в дополнительном коде. Команда DJNZ Rn,addr на
состояние флагов не влияет и имеет время выполнения 2 цикла.
Алгоритм Пример
(Rn)(Rn)-1, где n=0-7 ;(R3)=0AH, rel=0FEH
если (Rn)0, то (PC)(PC)+2+rel MT5: DJNZ R3,MT5 ;команда
если (Rn)0, то (PC)(PC)+2 ;выполнится 10 раз

DJNZ direct,addr 11010101 direct rel


Команда "декремент и переход, если не равно нулю" выполняет
вычитание "1" из содержимого ячейки, 8-разрядный адрес которой
определяется символическим именем direct в области резидентной памяти
данных или в среде регистров специальных функций, и осуществляет
переход по адресу addr, если содержимое используемой ячейки не равно
нулю, в противном случае выполняется следующая команда. Адрес
перехода addr определяется при помощи сложения 8-битового числа rel
(со знаком), размещенного в последнем байте команды, с содержимым
счетчика команд PC после увеличения его на 3. Команда на состояние
флагов не влияет и имеет время выполнения 2 цикла.
Алгоритм Пример
(direct)(direct)-1 ;(P1)=0AH, rel=0FDH
если (direct)0, то (PC)(PC)+3+rel MT5: DJNZ P1,MT5 ;команда
если (direct)0, то (PC)(PC)+3 ;выполнится 10 раз

INC A 00000100
Команда "инкремент байта" производит прибавление "1" к содержимому
аккумулятора A, на флаги не влияет и имеет время выполнения 1 цикл.
Алгоритм Пример
(A)(A)+1 ;(A)=0FFH, (C)=1, (AC)=1
INC A ;(A)=00H, (C)=1, (AC)=1

INC Rn ;где n=0-7 00001rrr где rrrB=000B-111B


Команда "инкремент байта" производит прибавление "1" к содержимому
заданного регистра Rn выбранного банка, на флаги не влияет и имеет
время выполнения 1 цикл.
Алгоритм Пример
(Rn)(Rn)+1, где n=0-7 ;(R1)=35H, (C)=0, (AC)=1
INC R1 ;(R1)=36H, (C)=0, (AC)=1

INC direct 00000101 direct


Команда "инкремент байта" производит прибавление "1" к содержимому
ячейки, 8-разрядный адрес которой определяется символическим именем
direct в области резидентной памяти данных (РПД) или в среде регистров
специальных функций. Команда на флаги не влияет и имеет время
выполнения 1 цикл.
Алгоритм Пример
(direct)(direct)+1 ;(TMOD)=0A5H, (C)=1, (AC)=0
;в РПД (23H)=0FFH
INC TMOD ;(TMOD)=0A6H,
;(C)=1, (AC)=0
INC 23H ;в РПД (23H)=00H,
;(C)=1, (AC)=0
INC @Ri ;где i{0,1} 0000011i

Команда "инкремент байта" производит прибавление "1" к содержимому


ячейки резидентной памяти данных (РПД), адресуемой содержимым
заданного регистра Ri выбранного банка, на флаги не влияет и имеет
время выполнения 1 цикл.
Алгоритм Пример
((Ri))((Ri))+1, где i{0,1} ;(R0)=44H, в РПД (44H)=55H
INC @R0 ;(R0)=44H,
;в РПД (44H)=56H
INC DPTR 10100011
Команда "инкремент двух байтов" производит прибавление "1" к
содержимому 16-битового указателя данных DPTR, причем переполнение
младшего байта DPTR (DPL) приводит к увеличению на "1" содержимого
старшего байта DPTR (DPH). Команда на флаги не влияет и имеет время
выполнения 2 цикла.
Алгоритм Пример
(DPTR)(DPTR)+1 ;(DPH)=12H, (DPL)=0FFH,
INC DPTR ;(DPH)=13H, ;
(DPL)=00H

JB bit,addr 00100000 bit rel


Команда "переход, если бит установлен" выполняет переход по адресу
addr, если содержимое бита, 8-разрядный адрес которого определяется
символическим именем bit в области ячеек резидентной памяти данных
или в среде регистров специальных функций, установлено в "1", в
противном случае выполняется следующая команда. Содержимое
используемого бита не изменяется. Адрес перехода addr определяется при
помощи сложения 8-битового числа rel (со знаком), размещенного в
последнем байте команды, с содержимым счетчика команд PC после
увеличения его на 3. Таким образом, указанный переход возможен в
пределах от -128 до +127 относительно начального адреса следующей
команды, при этом отрицательное значение rel представляется двоичным
числом в дополнительном коде. Команда на флаги не влияет и имеет
время выполнения 2 цикла.
Алгоритм Пример
если (bit)1, то (PC)(PC)+3+rel ;MT6 соответствует
если (bit)0, то (PC)(PC)+3 ;адресу 2FFH,
;(PC)=2F0H, rel=0CH, (A)=96H
JB A.2,MT6 ;(PC)=2FFH, ;
(A)=96H
JBC bit,addr 00010000 bit rel

Команда "переход, если бит установлен и сброс этого бита" выполняет


переход по адресу addr, если содержимое бита, 8-разрядный адрес
которого определяется символическим именем bit в области ячеек
резидентной памяти данных или в среде регистров специальных функций,
установлено в "1", в противном случае выполняется следующая команда.
Содержимое используемого бита сбрасывается в "0". Процедура
вычисления адреса перехода addr, влияние на флаги и время выполнения
такие же, как у рассмотренной выше команды JB bit,addr.
Алгоритм Пример
если (bit)1, то (PC)(PC)+3+rel ;MT8 соответствует адресу 400H,
и (bit)0 ;(PC)=3F1H, rel=0CH, (A)=78H
если (bit)0, то (PC)(PC)+3 JBС A.3,MT8 ;(PC)=400H, (A)=70H

JC addr 01000000 rel


Команда "переход, если флаг переноса установлен" выполняет переход по
адресу addr, если содержимое флага переноса C установлено в "1", в
противном случае выполняется следующая команда. Адрес перехода addr
определяется при помощи сложения 8-битового числа rel (со знаком),
размещенного в младшем байте команды, с содержимым счетчика команд
PC после увеличения его на 2. Таким образом, указанный переход
возможен в пределах от -128 до +127 относительно начального адреса
следующей команды, при этом отрицательное значение rel представляется
двоичным числом в дополнительном коде. Команда на флаги не влияет и
имеет время выполнения 2 цикла.
Алгоритм Пример
если (С)1, то (PC)(PC)+2+rel ;MT1 соответствует адресу 1F0H,
если (C)0, то (PC)(PC)+2 ;(PC)=1FFH, rel=0EFH, (C)=1
JС MT1 ;(PC)=1F0H, (C)=1

JMP @A+DPTR 01110011


Команда "косвенный переход" складывает 8-битовое содержимое
аккумулятора A с 16-битовым содержимым указателя данных DPTR и
загружает полученный результат в счетчик команд PC. Указанное
сложение выполняется таким образом, что перенос из младших 8-ми бит
распространяется на старшие биты результата. Содержимое A и DPTR не
изменяется. Команда на флаги не влияет и имеет время выполнения 2
цикла.
Алгоритм Пример
(PC)(DPTR[15-0])+(A[7-0]) ;(PC)=34EH, (DPTR)=329H, (A)=86H
JMP @A+DPTR ;(PC)=3AFH

JNB bit,addr 00110000 bit rel


Команда "переход, если бит не установлен" выполняет переход по адресу
addr, если содержимое бита, 8-разрядный адрес которого определяется
символическим именем bit в области ячеек резидентной памяти данных
или в среде регистров специальных функций, сброшено в "0", в
противном случае выполняется следующая команда. Содержимое
используемого бита не изменяется. Процедура вычисления адреса
перехода addr, влияние на флаги и время выполнения такие же, как у
рассмотренной выше команды JB bit,addr.
Алгоритм Пример
если (bit)0, то (PC)(PC)+3+rel ;MT2 соответствует адресу 2FFH,
если (bit)1, то (PC)(PC)+3 ;(PC)=2F0H, rel=0CH, (A)=96H
JNB A.0,MT2 ;(PC)=2FFH, (A)=96H

JNC addr 01010000 rel


Команда "переход, если флаг переноса не установлен" выполняет переход
по адресу addr, если содержимое флага переноса C сброшено в "0", в
противном случае выполняется следующая команда. Процедура
вычисления адреса перехода addr, влияние на флаги и время выполнения
такие же, как у рассмотренной выше команды JC addr.
Алгоритм Пример
если (С)0, то (PC)(PC)+2+rel ;MT1 соответствует адресу 200H,
если (C)1, то (PC)(PC)+2 ;(PC)=1F0H, rel=0EH, (C)=0
JNС MT1 ;(PC)=200H, (C)=0

JNZ addr 01110000 rel


Команда "переход, если содержимое аккумулятора не равно нулю"
выполняет переход по адресу addr, если содержимое A не ноль, в
противном случае выполняется следующая команда. Адрес перехода addr
определяется при помощи сложения 8-битового числа rel (со знаком),
размещенного в младшем байте команды, с содержимым счетчика команд
PC после увеличения его на 2. Таким образом, указанный переход
возможен в пределах от -128 до +127 относительно начального адреса
следующей команды, при этом отрицательное значение rel представляется
двоичным числом в дополнительном коде. Команда на флаги и (A) не
влияет и имеет время выполнения 2 цикла.
Алгоритм Пример
если (A)0, то (PC)(PC)+2+rel ;MT4 соответствует адресу 183H,
если (A)0, то (PC)(PC)+2 ;(PC)=200H, rel=81H, (A)=01H
JNZ MT4 ;(PC)=183H, (A)=01H

JZ addr 01100000 rel


Команда "переход, если содержимое аккумулятора равно нулю"
выполняет переход по адресу addr, если все биты аккумулятора равны
нулю, в противном случае выполняется следующая команда. Содержимое
A не изменяется. Процедура вычисления адреса перехода addr, влияние
на флаги и время выполнения такие же, как у рассмотренной выше
команды JNZ addr.
Алгоритм Пример
если (A)0, то (PC)(PC)+2+rel ;MT4 соответствует адресу 231H,
если (A)0, то (PC)(PC)+2 ;(PC)=200H, rel=2FH, (A)=00H
JZ MT4 ;(PC)=231H, (A)=00H

LCALL addr16 0 0 0 1 0 0 1 0 addr16[15-8] addr16[7-0]


Команда "длинный вызов подпрограммы" вызывает безусловно
подпрограмму с начальным адресом addr16. При этом 16-разрядное
содержимое счетчика команд PC увеличивается на 3 для получения адреса
следующей команды и помещается в стек (сначала следует младший
байт), а содержимое указателя стека SP увеличивается на 2. Адрес addr16
получается с помощью второго и третьего байтов команды, которые
загружаются соответственно в старший и младший байты PC.
Выполнение программы продолжается командой, находящейся по
полученному адресу. Подпрограмма, следовательно, может начинаться в
любом месте адресного пространства памяти программ объемом до 64
Кбайт. Команда на флаги не влияет и имеет время выполнения 2 цикла.
Алгоритм Пример
(PC)(PC)+3 ;(SP)=10H, (PC)=135H,
(SP)(SP)+1, ((SP))(PC[7-0]) ;MT соответствует адресу 300H
(SP)(SP)+1, ((SP))(PC[15-8]) LCALL MT ;(SP)=12H, (PC)=300H,
(PC)addr16[15-0] ;в РПД (11H)=38H, (12H)=01H

LJMP addr16 0 0 0 0 0 0 1 0 addr16[15-8] addr16[7-0]


Команда "длинный переход" выполняет безусловный переход по адресу
addr16. Этот адрес получается с помощью второго и третьего байтов
команды, которые загружаются соответственно в старший и младший
байты программного счетчика PC. Переход, таким образом, может
осуществляться по любому адресу пространства памяти программ
объемом до 64 Кбайт. Команда на флаги не влияет и имеет время
выполнения 2 цикла.
Алгоритм Пример
(PC)addr16[15-0] ;(PC)=234H
LJMP 12CH ;(PC)=12CH

MOV A,Rn ;где n=0-7 11101rrr где rrrB=000B-111B


Команда "переслать байт" выполняет загрузку аккумулятора A
содержимым заданного регистра Rn выбранного банка, при этом
содержимое Rn не изменяется. Команда на состояние флагов не влияет и
имеет время выполнения 1 цикл.
Алгоритм Пример
(A)(Rn), где n=0-7 ;(A)=0FAH, (R6)=93H
MOV A,R6 ;(A)=93H, (R6)=93H

MOV A,@Ri ;где i{0,1} 1110011i


Команда "переслать байт" выполняет загрузку аккумулятора A
содержимым ячейки резидентной памяти данных (РПД), адресуемой
содержимым заданного регистра Ri выбранного банка, при этом
содержимое используемой ячейки не изменяется. Команда на состояние
флагов не влияет и имеет время выполнения 1 цикл.
Алгоритм Пример
(A)((Ri)), где i{0,1} ;(A)=0FDH, (R1)=30H,
;в РПД (30H)=17H
MOV A,@R1 ;(A)=17H, (R1)=30H,
;в РПД (30H)=17H

MOV A,direct 11100101 direct


Команда "переслать байт" выполняет загрузку аккумулятора A
содержимым ячейки, 8-разрядный адрес которой определяется
символическим именем direct в области резидентной памяти данных или в
среде регистров специальных функций. При этом содержимое
используемой ячейки не изменяется. Команда на состояние флагов не
влияет и имеет время выполнения 1 цикл.
Алгоритм Пример
(A)(direct) ;(A)=24H, (DPL)=3DH
MOV A,DPL ;(A)=3DH,(DPL)=3DH

MOV A,#data8 01110100 data8


Команда "переслать байт" выполняет загрузку аккумулятора A байтом
данных data8, непосредственно указанным в команде, на состояние
флагов не влияет и имеет время выполнения 1 цикл.
Алгоритм Пример
(A)data8 ;(A)=81H
MOV A,#0FFH ;(A)=0FFH

MOV Rn,A ;где n=0-7 11111rrr где rrrB=000B-111B


Команда "переслать байт" выполняет загрузку заданного регистра Rn
выбранного банка содержимым аккумулятора A, при этом содержимое A
не изменяется. Команда на состояние флагов не влияет и имеет время
выполнения 1 цикл.
Алгоритм Пример
(Rn)(A), где n=0-7 ;(A)=55H, (R6)=93H
MOV R6,A ;(A)=55H, (R6)=55H

MOV Rn,direct ;где n=0-7 10101rrr direct где rrrB=000-111B


Команда "переслать байт" выполняет загрузку заданного регистра Rn
выбранного банка содержимым ячейки, адрес которой определяется
символическим именем direct в области резидентной памяти данных
(РПД) или в среде регистров специальных функций. При этом
содержимое используемой ячейки не изменяется. Команда на состояние
флагов не влияет и имеет время выполнения 2 цикла.
Алгоритм Пример
(Rn)(direct), где n=0-7 ;(R5)=81H, в РПД (16H)=22H
MOV R5,16H ;(R5)=22H,
;в РПД (16H)=22H

MOV Rn,#data8 ;где n=0-7 0 1 1 1 1 r r r data8 где rrrB=000-111B


Команда "переслать байт" выполняет загрузку заданного регистра Rn
выбранного банка байтом данных, непосредственно указанным в команде
и имеющим символическое имя data8. Команда на состояние флагов не
влияет и имеет время выполнения 1 цикл.
Алгоритм Пример
(Rn)data8, где n=0-7 ;(R2)=5DH
MOV R2,#0FCH ;(R2)=0FCH

MOV direct,A 11110101 direct


Команда "переслать байт" пересылает содержимое аккумулятора A в
ячейку, адрес которой определяется символическим именем direct в
области резидентной памяти данных или в среде регистров специальных
функций. При этом содержимое A не изменяется. Команда на состояние
флагов не влияет и имеет время выполнения 1 цикл.
Алгоритм Пример
(direct)(A) ;(A)=3CH, (B)=4DH
MOV B,A ;(A)=3CH,(B)=3CH

MOV direct,Rn ;где n=0-7 10001rrr direct где rrrB=000-111B


Команда "переслать байт" пересылает содержимое заданного регистра Rn
выбранного банка в ячейку, адрес которой определяется символическим
именем direct в области резидентной памяти данных или в среде
регистров специальных функций. При этом содержимое Rn не изменяется.
Команда на состояние флагов не влияет и имеет время выполнения 2
циклa.
Алгоритм Пример
(direct)(Rn), где n=0-7 ;(R7)=5EH, (P1)=0FFH
MOV P1,R7 ;(R7)=5EH, (P1)=5EH

MOV direct,direct 10000101 direct direct


Команда "переслать байт" пересылает байт данных между двумя
ячейками, расположенными в области резидентной памяти данных (РПД)
или (и) в среде регистров специальных функций. Адрес ячейки-источника
(ячейки-приемника) определяется вторым (первым) операндом и
размещается во втором (в третьем) байте команды. Необходимо отметить,
что при пересылке содержимое ячейки-источника не изменяется. Команда
на состояние флагов не влияет и выполняется за 2 циклa.
Алгоритм Пример
(direct)(direct) ;в РПД (4CH)=7AH, (B)=0F4H
MOV 4CH,B ;(B)=0F4H,
;в РПД (4CH)=0F4H

MOV direct,@Ri ;где i{0,1} 1000011i direct


Команда "переслать байт" пересылает содержимое ячейки резидентной
памяти данных (РПД), адресуемой содержимым заданного регистра Ri
выбранного банка, в ячейку, адрес которой определяется символическим
именем direct в области РПД или в среде регистров специальных
функций. При этом содержимое ячейки-источника не изменяется.
Команда на состояние флагов не влияет и имеет время выполнения 2
цикла.
Алгоритм Пример
(direct)((Ri)), где i{0,1} ;в РПД (6FH)=57H,
;(R0)=6FH, (PSW)=0C2H
MOV PSW,@R0 ;(PSW)=57H, ;
(R0)=6FH, в РПД (6FH)=57H

MOV direct,#data8 01110101 direct data8


Команда "переслать байт" копирует байт данных, непосредственно
указанный в команде и имеющий символическое имя data8, в ячейку,
адрес которой определяется символическим именем direct в области
резидентной памяти данных или в среде регистров специальных функций.
Команда на состояние флагов не влияет и имеет время выполнения 2
цикла.
Алгоритм Пример
(direct)data8 ;(P2)=0FFH
MOV P2,#33H ;(P2)=33H

MOV @Ri,A ;где i{0,1} 1111011i


Команда "переслать байт" пересылает содержимое аккумулятора A в
ячейку резидентной памяти данных (РПД), адресуемую содержимым
заданного регистра Ri выбранного банка, при этом содержимое A не
изменяется. Команда на состояние флагов не влияет и имеет время
выполнения 1 цикл.
Алгоритм Пример
((Ri))(A), где i{0,1} ;(A)=11H, (R1)=25H,
;в РПД (25H)=48H
MOV @R1,A ;(A)=11H, (R1)=25H,
;в РПД (25H)=11H

MOV @Ri, direct ;где i{0,1} 1010011i direct


Команда "переслать байт" загружает ячейку резидентной памяти данных
(РПД), адресуемую содержимым заданного регистра Ri выбранного банка,
содержимым ячейки, адрес которой определяется символическим именем
direct в области РПД или в среде регистров специальных функций. При
этом содержимое ячейки-источника не изменяется. Команда на состояние
флагов не влияет и имеет время выполнения 2 цикла.
Алгоритм Пример
((Ri))(direct), где i{0,1} ;в РПД (55H)=31H,
;(R0)=55H, (TH1)=0CDH
MOV @R0,TH1 ;(TH1)=0CDH, ;
(R0)=55H, в РПД (55H)=0CDH

MOV @Ri,#data8 ;где i{0,1} 0111011i data8


Команда "переслать байт" копирует байт данных data8, непосредственно
указанный в команде, в ячейку резидентной памяти данных (РПД),
адресуемую содержимым заданного регистра Ri выбранного банка.
Команда на состояние флагов не влияет и имеет время выполнения 1
цикл.
Алгоритм Пример
((Ri))data8, где i{0,1} ;(R1)=53H, в РПД (53H)=86H
MOV @R1,#77H ;(R1)=53H,
;в РПД (53H)=77H
MOV C,bit 10100010 bit
Команда "переслать бит" загружает флаг переноса C содержимым бита, 8-
разрядный адрес которого определяется символическим именем bit в
области ячеек резидентной памяти данных (либо регистров специальных
функций), допускающей побитовое обращение. Команда на состояние
других флагов, а также используемого бита не влияет и имеет время
выполнения 1 цикл.
Алгоритм Пример
(C)(bit) ;(C)=0, (P1[4])=1
MOV C,P1.4 ;(C)=1,
;(P1[4])=1

MOV bit,C 10010010 bit


Команда "переслать бит" копирует содержимое флага переноса C в бит, 8-
разрядный адрес которого определяется символическим именем bit в
области ячеек резидентной памяти данных (РПД) или регистров
специальных функций, допускающей побитовое обращение. Команда
имеет время выполнения 2 цикла и на состояние флагов не влияет, за
исключением случая, когда флаг является операндом-приемником.
Алгоритм Пример
(bit)(C) ;в РПД (22H)=0D0H, (C)=1
MOV 10H,C ;(C)=1,
;в РПД (22H)=0D1H

MOV DPTR,#data16 1 0 0 1 0 0 0 0 data16[15-8] data16[7-0]


Команда "переслать два байта" загружает указатель данных DPTR 16-
битовой константой data16, непосредственно указанной в команде,
причем содержимое второго и третьего байтов команды загружается
соответственно в старший (DPH) и младший (DPL) байты DPTR. Команда
на флаги не влияет и имеет время выполнения 2 цикла.
Алгоритм Пример
(DPTR)data16 ;(DPH)=23H, (DPL)=0DFH
MOV DPTR,#1234H ;(DPH)=12H,
(DPL)=34H

MOVC A,@A+DPTR 10010011


Команда "переслать байт" загружает аккумулятор A содержимым ячейки
памяти программ (ПП), причем адрес используемой ячейки вычисляется
как сумма исходного содержимого A и содержимого 16-битового
указателя данных DPTR. Таким образом, в указанной пересылке может
участвовать любая ячейка из памяти программ объемом до 64 Кбайт.
Содержимое DPTR не изменяется. Команда на состояние флагов не
влияет и имеет время выполнения 2 цикла.
Алгоритм Пример
(A)((A)+(DPTR)) ;(A)=01H, (DPTR)=30FFH,
;в ПП (3100H)=22H
MOVC A,@A+DPTR ;(A)=22H, ;
(DPTR)=30FFH

MOVC A,@A+PC 10000011


Команда "переслать байт" загружает в аккумулятор A содержимое ячейки
памяти программ (ПП), причем адрес используемой ячейки вычисляется
как сумма исходного содержимого A и содержимого программного
счетчика PC, которое увеличено на единицу. Таким образом, в указанной
пересылке может участвовать любая ячейка из памяти программ объемом
до 64 Кбайт. Команда на состояние флагов не влияет и имеет время
выполнения 2 цикла.
Алгоритм Пример
(A)((A)+(PC)+1) ;(A)=11H, (PC)=2300H,
;в ПП (2312H)=44H
MOVC A,@A+PC ;(A)=44H,
;(PC)=2301H

MOVX A,@Ri ;где i{0,1} 1110001i


Команда "переслать байт" выполняет загрузку аккумулятора A
содержимым ячейки внешней памяти данных (ВПД), адресуемой
содержимым заданного регистра Ri выбранного банка, при этом
содержимое используемой ячейки не изменяется. Команда на состояние
флагов не влияет, имеет время выполнения 2 цикла и обеспечивает доступ
к ВПД объемом до 256 байт.
Алгоритм Пример
(A)((Ri)), где i{0,1} ;(A)=0CCH, (R0)=44H,
;в ВПД (44H)=3EH
MOVX A,@R0 ;(A)=3EH, (R0)=44H,
;в ВПД (44H)=3EH

MOVX A,@DPTR 11100000


Команда "переслать байт" выполняет загрузку аккумулятора A
содержимым ячейки внешней памяти данных (ВПД), адресуемой
содержимым 16-битового указателя данных DPTR, при этом содержимое
используемой ячейки не изменяется. Команда на состояние флагов не
влияет, имеет время выполнения 2 цикла и обеспечивает доступ к ВПД
объемом до 64 Кбайт.
Алгоритм Пример
(A)((DPTR)) ;(A)=76H, (DPTR)=6D44H,
;в ВПД (6D44H)=88H
MOVX A,@DPTR ;(DPTR)=6D44H,
;(A)=88H, в ВПД (6D44H)=88H

MOVX @Ri,A ;где i{0,1} 1111001i


Команда "переслать байт" копирует содержимое аккумулятора A в ячейку
внешней памяти данных (ВПД), адресуемую содержимым заданного
регистра Ri выбранного банка. Команда на состояние флагов не влияет,
имеет время выполнения 2 цикла и обеспечивает доступ к ВПД объемом
до 256 байт.
Алгоритм Пример
((Ri))(A), где i{0,1} ;(A)=0C6H, (R1)=22H,
;в ВПД (22H)=33H
MOVX @R1,A ;(A)=0C6H, (R1)=22H,
;в ВПД (22H)=0C6H

MOVX @DPTR,A 11110000


Команда "переслать байт" копирует содержимое аккумулятора A в ячейку
внешней памяти данных (ВПД), адресуемую содержимым 16-битового
указателя данных DPTR. Команда на состояние флагов не влияет, имеет
время выполнения 2 цикла и обеспечивает доступ к ВПД объемом до 64
Кбайт.
Алгоритм Пример
((DPTR))(A) ;(A)=55H, (DPTR)=1234H,
;в ВПД (1234H)=11H
MOVX @DPTR,A ;(DPTR)=1234H,
;(A)=55H,
;в ВПД (1234H)=55H

MUL AB 10100100
Команда "умножение" умножает 8-битовую переменную из аккумулятора
A на 8-битовую переменную из регистра B, при этом старший и младший
байты произведения загружаются соответственно в B и A. Содержимое
флага переноса C сбрасывается в "0". Содержимое флага переполнения
OV устанавливается в "1" если результат умножения больше 0FFH, в
противном случае - также сбрасывается. Содержимое флага AC не
изменяется. Команда имеет время выполнения 4 цикла.
Алгоритм Пример
(A)(B)=data16 ;(A)=50H=80, (B)=0A0H=160,
(A)data16[7-0], (B)data16[15-8] ;(C)=1, (OV)=0
(C)0 MUL AB ;(C)=0, (OV)=1,
если data16  0FFH, то (OV)0 ;(A)=00H, (B)=32H
если data16  0FFH, то (OV)1

NOP 00000000
Команда "нет операции" увеличивает содержимое программного счетчика
PC на единицу, при этом состояние всех остальных программно
доступных элементов микроконтроллера не изменяется. Команда имеет
время выполнения 1 цикл.
Алгоритм Пример
(PC)(PC)+1 ;(PC)=1FFH
NOP
NOP ;(PC)=201H

ORL A,Rn ;где n=0-7 01001rrr где rrrB=000B-111B


Команда "логическое ИЛИ" выполняет поразрядную дизъюнкцию
содержимого аккумулятора A с содержимым заданного регистра Rn
выбранного банка, помещая результат в A. Содержимое используемого
регистра не изменяется. Команда на состояние флагов не влияет и имеет
время выполнения 1 цикл.
Алгоритм Пример
(A)(A)(Rn), где n=0-7 ;(A)=0FH, (R4)=0F3H
ORL A,R4 ;(A)=0FFH,
;(R4)=0F3H

ORL A,@Ri ;где i{0,1} 0100011i


Команда "логическое ИЛИ" выполняет поразрядную дизъюнкцию
содержимого аккумулятора A с содержимым ячейки резидентной памяти
данных (РПД), адресуемой содержимым заданного регистра Ri
выбранного банка. Результат размещается в A. Содержимое используемой
ячейки не изменяется. Команда на состояние флагов не влияет и имеет
время выполнения 1 цикл.
Алгоритм Пример
(A)(A)((Ri)), где i{0,1} ;(A)=22H, (R0)=55H,
;в РПД (55H)=11H
ORL A,@R0 ;(A)=33H, (R0)=55H,
;в РПД (55H)=11H
ORL A,direct 01000101 direct
Команда "логическое ИЛИ" выполняет поразрядную дизъюнкцию
содержимого аккумулятора A с содержимым ячейки резидентной памяти
данных (либо регистра специальных функций), 8-разрядный адрес
которой (которого) определяется символическим именем direct. Результат
помещается в A. Содержимое используемой ячейки или используемого
регистра не изменяется. Команда на состояние флагов не влияет и имеет
время выполнения 1 цикл.
Алгоритм Пример
(A)(A)(direct) ;(A)=23H, (PSW)=14H
ORL A,PSW ;(A)=37H,
;(PSW)=14H

ORL A,#data8 01000100 data8


Команда "логическое ИЛИ" выполняет поразрядную дизъюнкцию
содержимого аккумулятора A с байтом данных data8, непосредственно
указанным в команде. Результат размещается в A. Команда на состояние
флагов не влияет и имеет время выполнения 1 цикл.
Алгоритм Пример
(A)(A)data8 ;(A)=36H
ORL A,#41H ;(A)=77H

ORL direct,A 01000010 direct


Команда "логическое ИЛИ" выполняет поразрядную дизъюнкцию
содержимого аккумулятора A с содержимым ячейки резидентной памяти
данных (либо регистра специальных функций), 8-разрядный адрес
которой (которого) определяется символическим именем direct. Результат
помещается соответственно в используемую ячейку или используемый
регистр. Содержимое A не изменяется. Команда на состояние флагов не
влияет и имеет время выполнения 1 цикл.
Алгоритм Пример
(direct)(A)(direct) ;(A)=55H, (P2)=0AAH
ORL P2,A ;(A)=55H,
;(P2)=0FFH

ORL direct,#data8 01000011 direct data8


Команда "логическое ИЛИ" выполняет поразрядную дизъюнкцию байта
данных data8, непосредственно указанного в команде, с содержимым
ячейки резидентной памяти данных (либо регистра специальных
функций), 8-разрядный адрес которой (которого) определяется
символическим именем direct. Результат помещается соответственно в
используемую ячейку или используемый регистр. Команда на состояние
флагов не влияет и имеет время выполнения 2 цикла.
Алгоритм Пример
(direct)(direct)data8 ;(P1)=0FFH
ORL P1,#73H ;(P1)=0FFH

ORL C,bit 01110010 bit


Команда "логическое ИЛИ" выполняет дизъюнкцию содержимого флага
переноса C с содержимым бита, 8-разрядный адрес которого определяется
символическим именем bit в области ячеек резидентной памяти данных
(РПД) или регистров специальных функций, допускающей побитовое
обращение. Результат помещается в С. Содержимое используемого бита
не изменяется. Команда на состояние других флагов не влияет и имеет
время выполнения 2 цикла.
Алгоритм Пример
(C)(C)(bit) ;(C)=0, (P1[2])=1,
;в РПД (2EH)=12H
ORL C,P1.2 ;(C)=1, (P1[2])=1
ORL C,70H ;(C)=1,
;в РПД (2EH)=12H

ORL C,/bit 10100000 bit


Команда "логическое ИЛИ" выполняет дизъюнкцию содержимого флага
переноса C с инвертированным значением бита из области ячеек
резидентной памяти данных или регистров специальных функций,
допускающей побитовое обращение, при этом содержимое используемого
бита, 8-разрядный адрес которого определяется символическим именем
bit, не изменяется. Результат помещается в С. Команда на состояние
других флагов не влияет и имеет время выполнения 2 цикла.
Алгоритм Пример
(C)(C) ;(C)=0, (AC)=0
ORL C,/AC ;(C)=1, (AC)=0

POP direct 11010000 direct


Команда "чтение из стека" копирует содержимое ячейки резидентной
памяти данных (РПД), адресуемой содержимым указателя стека SP, в
ячейку, адрес которой определяется символическим именем direct в
области РПД или в среде регистров специальных функций. При этом
содержимое указателя стека уменьшается на единицу. Команда на
состояние флагов не влияет и имеет время выполнения 2 цикла.
Алгоритм Пример
(direct)((SP)) ;(SP)=32H, (DPH)=0AAH,
(SP)(SP)-1 ;в РПД (32H)=55H
POP DPH ;(SP)=31H,(DPH)=55H

PUSH direct 11000000 direct


Команда "запись в стек" увеличивает содержимое указателя стека SP на
единицу и после этого копирует содержимое ячейки, адрес которой
определяется символическим именем direct в области резидентной памяти
данных (РПД) или в среде регистров специальных функций, в ячейку
РПД, адресуемую содержимым SP. Команда на состояние флагов не
влияет и имеет время выполнения 2 цикла.
Алгоритм Пример
(SP)(SP)+1 ;(SP)=44H, (DPL)=33H,
((SP))(direct) ;в РПД (45H)=0CEH
PUSH DPL ;(SP)=45H, в РПД (45H)=33H

RET 00100010
Команда "возврат из подпрограммы" последовательно копирует
содержимое двух ячеек, адресуемых содержимым указателя стека SP в
резидентной памяти данных (РПД), в программный счетчик PC. При этом
содержимое SP уменьшается на два. Команда на состояние флагов не
влияет и имеет время выполнения 2 цикла.
Алгоритм Пример
(PC[15-8])((SP)) ;(SP)=32H, (PC)=3DFH,
(SP)(SP)-1 ;в РПД (31H)=23H, (32H)=01H
(PC[7-0])((SP)) RET ;(SP)=30H, (PC)=123H,
(SP)(SP)-1 ;в РПД (31H)=23H, (32H)=01H

RETI 00110010
Команда "возврат из прерывания" последовательно копирует содержимое
двух ячеек, адресуемых содержимым указателя стека SP в резидентной
памяти данных (РПД), в программный счетчик PC и разрешает
прерывания с уровнем приоритета, равным уровню приоритета только что
обработанного прерывания. При этом содержимое SP уменьшается на два.
Команда на состояние флагов не влияет и имеет время выполнения 2
цикла.
Алгоритм Пример
(PC[15-8])((SP)) ;(SP)=23H, (PC)=0D3FH,
(SP)(SP)-1 ;в РПД (22H)=34H, (23H)=02H
(PC[7-0])((SP)) RETI ;(SP)=21H, (PC)=234H,
(SP)(SP)-1 ;в РПД (22H)=34H, (23H)=02H
RL A 00100011

Команда "сдвиг аккумулятора влево" сдвигает содержимое аккумулятора


A на один бит влево, причем содержимое бита 7 пересылается в бит 0.
Команда на состояние флагов не влияет и имеет время выполнения 1
цикл.
Алгоритм Пример
(A[M+1])(A[M]), где M=0-6 ;(A)=85H, (C)=0
(A[0])(A[7]) RL A
RL A ;(A)=16H, (C)=0

RLC A 00110011
Команда "сдвиг аккумулятора влево через флаг переноса" сдвигает
содержимое аккумулятора A на один бит влево, причем содержимое бита
7 аккумулятора пересылается во флаг переноса C, а содержимое C - в бит
0 аккумулятора. Команда на состояние других флагов не влияет и имеет
время выполнения 1 цикл.
Алгоритм Пример
(A[M+1])(A[M]), где M=0-6 ;(A)=85H, (C)=0
(A[0])(С), (С)(A[7]) RLC A ;(A)=0AH, (C)=1

RR A 00000011
Команда "сдвиг аккумулятора вправо" сдвигает содержимое аккумулятора
A на один бит вправо, причем содержимое бита 0 пересылается в бит 7.
Команда на состояние флагов не влияет и имеет время выполнения 1
цикл.
Алгоритм Пример
(A[M])(A[M+1]), где M=0-6 ;(A)=85H, (C)=1
(A[7])(A[0]) RR A
RR A ;(A)=61H, (C)=1

RRC A 00010011
Команда "сдвиг аккумулятора вправо через флаг переноса" сдвигает
содержимое аккумулятора A на один бит вправо, причем содержимое
бита 0 аккумулятора пересылается во флаг переноса C, а содержимое C - в
бит 7 аккумулятора. Команда на состояние других флагов не влияет и
имеет время выполнения 1 цикл.
Алгоритм Пример
(A[M])(A[M+1]), где M=0-6 ;(A)=85H, (C)=0
(A[7])(С), (С)(A[0]) RRC A ;(A)=42H, (C)=1

SETB C 11010011
Команда "установить бит" устанавливает содержимое флага переноса C в
"1". Команда на состояние других флагов не влияет и имеет время
выполнения 1 цикл.
Алгоритм Пример
(C)1 ;(C)=0
SETB C ;(C)=1

SETB bit 11010010 bit


Команда "установить бит" устанавливает в "1" содержимое бита, 8-
разрядный адрес которого определяется символическим именем bit в
области ячеек резидентной памяти данных или регистров специальных
функций, допускающей побитовое обращение. Команда имеет время
выполнения 1 цикл и на состояние флагов не влияет, за исключением
случая, когда флаг является операндом команды.
Алгоритм Пример
(bit)1 ;(P2)=38H
SETB P2.0 ;(P2)=39H

SJMP addr 10000000 rel


Команда "короткий переход" выполняет безусловный переход по адресу
addr, определяемому при помощи сложения 8-битового числа rel (со
знаком), размещенного в младшем байте команды, с содержимым
счетчика команд PC после увеличения его на 2. Таким образом,
указанный переход возможен в пределах от -128 до +127 относительно
начального адреса следующей команды, при этом отрицательное значение
rel представляется двоичным числом в дополнительном коде. Команда на
флаги не влияет и имеет время выполнения 2 цикла.
Алгоритм Пример
(PC)(PC)+2+rel ;MT4 соответствует адресу 104H,
;(PC)=165H, rel=9DH
SJMP MT4 ;(PC)=104H

SUBB A,Rn ;где n=0-7 10011rrr где rrrB=000B-111B


Команда "вычитание с заемом" вычитает содержимое заданного регистра
Rn выбранного банка вместе с содержимым флага переноса С из
содержимого аккумулятора A, помещая результат в A. Содержимое
используемого регистра не изменяется. При появлении заема в разрядах 7
и 3 аккумулятора устанавливаются в "1" флаг переноса C и флаг
дополнительного переноса AC соответственно, в противном случае эти
флаги сбрасываются в "0". Содержимое флага переполнения OV
устанавливается, если есть заем в бите 6 и нет заема в бите 7, или есть
заем в бите 7 и нет - в бите 6, в противном случае флаг OV сбрасывается.
Время выполнения команды 1 цикл.
Алгоритм Пример
(A)(A)-(C)-(Rn), где n=0-7 ;(A)=0C9H, (R2)=54H, (C)=1
(С)x, (OV)=x, (AC)=x, где x{0,1} SUBB A,R2 ;(A)=74H,(R2)=54H,
;(AC)=0, (C)=0, (OV)=1

SUBB A,@Ri ;где i{0,1} 1001011i


Команда "вычитание с заемом" вычитает содержимое флага переноса С
вместе с содержимым ячейки резидентной памяти данных (РПД),
адресуемой содержимым заданного регистра Ri выбранного банка, из
содержимого аккумулятора A, помещая результат в A. Содержимое
используемой ячейки не изменяется. Логика установки (сброса) флагов и
время выполнения такие же, как у рассмотренной выше команды с
аналогичной мнемоникой.
Алгоритм Пример
(A)(A)-(C)-((Ri)), где i{0,1} ;(A)=49H, (R0)=3AH,
(С)x, (OV)=x, (AC)=x, где x{0,1} ;в РПД (3AH)=68H, (C)=1
SUBB A,@R0 ;(A)=0E0H,
;(AC)=0, (C)=1, (OV)=0

SUBB A,direct 10010101 direct


Команда "вычитание с заемом" вычитает из содержимого аккумулятора A
содержимое флага переноса С вместе с содержимым ячейки резидентной
памяти данных (либо регистра специальных функций), 8-разрядный адрес
которой (которого) определяется символическим именем direct. Результат
помещается в A. Содержимое используемой ячейки или используемого
регистра не изменяется. Логика установки (сброса) флагов и время
выполнения такие же, как у рассмотренной выше команды с аналогичной
мнемоникой.
Алгоритм Пример
(A)(A)-(C)-(direct) ;(A)=97H, (C)=0, (B)=25H
(С)x, (OV)=x, (AC)=x, где x{0,1} SUBB A,B ;(A)=72H, (B)=25H,
;(AC)=0, (C)=0, (OV)=1

SUBB A,#data8 10010100 data8


Команда "вычитание с заемом" вычитает содержимое флага переноса С
вместе с байтом данных data8, непосредственно указанным в команде, из
содержимого аккумулятора A, помещая результат в A. Логика установки
(сброса) флагов и время выполнения такие же, как у рассмотренной выше
команды с аналогичной мнемоникой.
Алгоритм Пример
(A)(A)-(C)-data8 ;(A)=0BEH, (C)=0
(С)x, (OV)=x, (AC)=x, где x{0,1} SUBB A,#3FH ;(A)=7FH,
;(AC)=1, (C)=0, (OV)=1

SWAP A 11000100
Команда "обмен тетрадой" осуществляет обмен содержимым младших
четырех и старших четырех битов аккумулятора A. Команда на флаги не
влияет и имеет время выполнения 1 цикл.
Алгоритм Пример
(A[3-0])(A[7-4]) ;(A)=49H
(A[7-4])(A[3-0]) SWAP A ;(A)=94H

XCH A,Rn ;где n=0-7 11001rrr где rrrB=000B-111B


Команда "обмен байтом" выполняет обмен содержимого аккумулятора A
с содержимым заданного регистра Rn выбранного банка. Команда на
состояние флагов не влияет и имеет время выполнения 1 цикл.
Алгоритм Пример
(A)(Rn), где n=0-7 ;(A)=0FAH, (R6)=93H
(Rn)(A) XCH A,R6 ;(A)=93H, (R6)=0FAH

XCH A,@Ri ;где i{0,1} 1100011i


Команда "обмен байтом" выполняет обмен содержимого аккумулятора A
с содержимым ячейки резидентной памяти данных (РПД), адресуемой
содержимым заданного регистра Ri выбранного банка. Команда на
состояние флагов не влияет и имеет время выполнения 1 цикл.
Алгоритм Пример
(A)((Ri)), где i{0,1} ;(A)=0FDH, (R1)=30H,
((Ri))(A) ;в РПД (30H)=17H
XCH A,@R1 ;(A)=17H, (R1)=30H,
;в РПД (30H)=0FDH

XCH A,direct 11000101 direct


Команда "обмен байтом" выполняет обмен содержимого аккумулятора A
с содержимым ячейки, адрес которой определяется символическим
именем direct в области резидентной памяти данных или в среде
регистров специальных функций. Команда на состояние флагов не влияет
и имеет время выполнения 1 цикл.
Алгоритм Пример
(A)(direct) ;(A)=24H, (DPL)=3DH
(direct)(A) XCH A,DPL ;(A)=3DH,
;(DPL)=24H

XCHD A,@Ri ;где i{0,1} 1101011i


Команда "обмен тетрадой" выполняет обмен содержимого младшей
тетрады (биты 3-0) аккумулятора A с содержимым младшей тетрады
ячейки резидентной памяти данных (РПД), при этом содержимое старших
тетрад A и используемой ячейки, адресуемой содержимым заданного
регистра Ri выбранного банка, не изменяется. Команда на состояние
флагов не влияет и имеет время выполнения 1 цикл.
Алгоритм Пример
(A[3-0])((Ri))[3-0], где i{0,1} ;(A)=0FDH, (R1)=30H,
((Ri))[3-0](A[3-0]) ;в РПД (30H)=17H
XCHD A,@R1 ;в РПД
(30H)=1DH, ;(A)=0F7H,
(R1)=30H

XRL A,Rn ;где n=0-7 01101rrr где rrrB=000B-111B


Команда "логическое ИСКЛЮЧАЮЩЕЕ ИЛИ" выполняет поразрядное
сложение по модулю 2 содержимого аккумулятора A с содержимым
заданного регистра Rn выбранного банка, помещая результат в A. При
этом содержимое используемого регистра не изменяется. Команда на
состояние флагов не влияет и имеет время выполнения 1 цикл.
Алгоритм Пример
(A)(A)(Rn), где n=0-7 ;(A)=0FH, (R4)=0F3H
XRL A,R4 ;(A)=0FCH, (R4)=0F3H

XRL A,@Ri ;где i{0,1} 0110011i


Команда "логическое ИСКЛЮЧАЮЩЕЕ ИЛИ" выполняет поразрядное
сложение по модулю 2 содержимого аккумулятора A с содержимым
ячейки резидентной памяти данных (РПД), адресуемой содержимым
заданного регистра Ri выбранного банка. Результат размещается в A.
Содержимое используемой ячейки не изменяется. Команда на состояние
флагов не влияет и имеет время выполнения 1 цикл.
Алгоритм Пример
(A)(A)((Ri)), где i{0,1} ;(A)=22H, (R0)=55H,
;в РПД (55H)=33H
XRL A,@R0 ;(A)=11H,
;(R0)=55H, в РПД (55H)=33H

XRL A,direct 01100101 direct


Команда "логическое ИСКЛЮЧАЮЩЕЕ ИЛИ" выполняет поразрядное
сложение по модулю 2 содержимого аккумулятора A с содержимым
ячейки резидентной памяти данных (либо регистра специальных
функций), 8-разрядный адрес которой (которого) определяется
символическим именем direct. Результат помещается в A. Содержимое
используемой ячейки или используемого регистра не изменяется.
Команда на состояние флагов не влияет и имеет время выполнения 1
цикл.
Алгоритм Пример
(A)(A)(direct) ;(A)=23H, (PSW)=34H
XRL A,PSW ;(A)=17H, (PSW)=34H

XRL A,#data8 01100100 data8


Команда "логическое ИСКЛЮЧАЮЩЕЕ ИЛИ" выполняет поразрядное
сложение по модулю 2 содержимого аккумулятора A с байтом данных
data8, непосредственно указанным в команде. Результат размещается в A.
Команда на состояние флагов не влияет и имеет время выполнения 1
цикл.
Алгоритм Пример
(A)(A)data8 ;(A)=36H
XRL A,#22H ;(A)=14H

XRL direct,A 01100010 direct


Команда "логическое ИСКЛЮЧАЮЩЕЕ ИЛИ" выполняет поразрядное
сложение по модулю 2 содержимого аккумулятора A с содержимым
ячейки резидентной памяти данных (либо регистра специальных
функций), 8-разрядный адрес которой (которого) определяется
символическим именем direct. Результат помещается соответственно в
используемую ячейку или используемый регистр. Содержимое A не
изменяется. Команда на состояние флагов не влияет и имеет время
выполнения 1 цикл.
Алгоритм Пример
(direct)(A)(direct) ;(A)=55H, (P2)=63H
XRL P2,A ;(A)=55H, (P2)=36H

XRL direct,#data8 01100011 direct data8


Команда "логическое ИСКЛЮЧАЮЩЕЕ ИЛИ" выполняет поразрядное
сложение по модулю 2 байта данных data8, непосредственно указанного в
команде, с содержимым ячейки резидентной памяти данных (либо
регистра специальных функций), 8-разрядный адрес которой (которого)
определяется символическим именем direct. Результат помещается
соответственно в используемую ячейку или используемый регистр.
Команда на состояние флагов не влияет и имеет время выполнения 2
цикла.
Алгоритм Пример
(direct)(direct)data8 ;(P1)=0FFH
XRL P1,#11H ;(P1)=0EEH

2.2.2. Директивы языка АСМ51

Директивы в отличие от команд ассемблерного языка не


преобразуются в объектный код и применяются для управления
процессом трансляции исходной МК-программы.
Рассмотрим основные директивы языка АСМ51.
ASCII операнды
Директива последовательно Пример
размещает в ячейках памяти ;MT1 соответствует адресу
программ (ПП) коды ASCII ;20FH в ПП
MT1 ASCII PEN
символов строки, указанной в поле ;в ПП (20FH)=50H,
операнды и заканчивающейся ;(210H)=45H, (211H)=4EH
возвратом каретки.
DB операнды
Директива последовательно Пример
размещает в ячейках памяти ;MT1 соответствует адресу
программ (ПП) байтовые ;1FFH в ПП
MT1 DB 12H,<.NOT.11H+1
константы, перечисленные через DB 10100101B,32
запятую в поле операнды. Если ;в ПП (1FFH)=12H, ;
указанное поле отсутствует, то (200H)=0EFH,
используется одна ячейка ПП, в ;(201H)=0A5H, (202H)=20H
которую заносится "0".
DS операнды
Директива резервирует ячейки памяти Пример
программ (ПП), причем количество ;MT2 соответствует адресу
этих ячеек определяется значением, ;200H в ПП
MT2 DS 12H ;(PC)=212H
указанным в поле операнды.
DW операнды
Директива последовательно размещает в Пример
ячейках памяти программ (ПП) 2-байтовые ;MT1=20FH
константы, перечисленные через запятую в MT1 DW 3212H
DW
поле операнды. Если указанное поле ;в ПП (20FH)=32H,
отсутствует, то используются две ячейки ;(210H)=12H,
ПП, в которые заносится "0". ;(211H)=(212H)=00H
END
Директива определяет конец МК-программы.
ENDM
Директива определяет конец макроопределения.
метка EQU операнды
Директива присваивает символическому Пример
имени, размещенному в поле метка, SS EQU 25H
ZZ EQU SS+2
байтовое или 2-байтовое значение,
PP EQU ZZ-1
указанное в поле операнды. Это имя MOV A,#PP ;(A)=26H
не может быть переопределено.
EXTERN операнды
Директива объявляет символические имена, указанные через запятую в
поле операнды, как внешние, то есть определяемые в другой (других)
МК-программе (МК-программах).
INCLUDE операнды
Директива включает в трансляцию файл, имя которого вместе с
расширением указаны в поле операнды. Включения не могут
подвергаться вложению.
LIST
Директива разрешает вывод листинга следующего за ней текста МК-
программы. По умолчанию выполняется директива NLIST.
LONG операнды
Директива последовательно Пример
размещает в ячейках памяти ;MT1 соответствует адресу
программ (ПП) 4-байтовые ;4EEH в ПП
MT1 LONG 11223344H
константы, перечисленные через ;в ПП (4EEH)=11H,
запятую в поле операнды. Если ;(4EFH)=22H, (4F0H)=33H,
указанное поле отсутствует, то ;(4F1H)=44H
используются четыре ячейки ПП, в
которые заносится "0".
метка MACRO операнды
Директива начинает макроопределение, которое составляется из
операторов языка АСМ51 (строк исходного текста МК-программы) и
должно заканчиваться директивой ENDM. Любое поле включенных в
макроопределение операторов (кроме поля комментарий) может быть
представлено формальным параметром, которые перечисляются через
запятую в поле операнды. В поле метка указывается символическое
имя макрокоманды, которая будет определяться данным
макроопределением. Макрокоманда может использоваться в МК-
программе произвольное число раз и при трансляции заменяется на тело
своего макроопределения, причем фактические параметры,
перечисленные через запятую в поле операнды макрокоманды
подставляются вместо соответствующих формальных параметров
макроопределения.
До трансляции После трансляции
1 TC MACRO x,y,z
TC MACRO x,y,z 2 MOV A,#z
MOV A,#z 3 x A,#y
x A,#y 4 ENDM
ENDM 5 0000 7819 MOV R0,#25
MOV R0,#25 6 0002 TC ORL,15H,10
TC ORL,15H,10 7 0002 740A MOV A,#10
MOVX @R0,A 8 0004 4415 ORL A,#15H
END 9 0006 ENDM
10 0006 F2 MOVX @R0,A
11 0007 END
NLIST
Директива запрещает вывод листинга следующего за ней текста МК-
программы, если ранее выполнялась директива LIST.
ORG операнды
Директива устанавливает значение программного Пример
счетчика PC, причем указанное значение ;(PC)=1234H
ORG 12H
определяется содержимым поля операнды. При
;(PC)=0012H
отсутствии директивы исходное значение PC
принимается равным нулю.
PUBLIC операнды
Директива объявляет символические имена, указанные через запятую в
поле операнды, как глобальные (общие), то есть такие, к которым
можно осуществлять ссылку из других МК-программ.
метка REG операнды
Директива присваивает символическому Пример
X REG R4 ;X определя-
имени, размещенному в поле метка, ;ется как регистр R4
байтовое или битовое значение, Y REG P3 ;Y определя-
;ется как порт P3
указанное в поле операнды, причем Z REG Y ;Z определяет-
указанное значение может быть задано ;ся как порт P3
не только числом, другим B.0 REG C ;B.0 определя-
символическим именем или ;ется как флаг C
выражением, но и именем программно B.1 REG X.1 ;B.1 опреде-
доступного элемента ;ляется как первый бит
микроконтроллера. Символическое имя, ;регистра R4
размещенное в поле метка, не может
быть переопределено.
RECSIZE операнды
Директива используется для управления редактором связей. В частности,
от содержимого поля операнды этой директивы зависит максимальный
размер записей в загрузочном модуле МК-программы (см. подраздел 3.3).
SYMBOLS
Директива используется для управления редактором связей. В частности,
разрешает формирование специального файла, содержащего
символические имена, в формате MICROTEK или ZAK (см. подраздел
3.3).
метка VAR операнды
Директива присваивает Пример
символическому имени, размещенному SS VAR 25H
MOV A,#SS ;(A)=25H
в поле метка, байтовое или 2-
SS VAR 13H
байтовое значение, указанное в поле MOV A,#SS ;(A)=13H
операнды. Это имя может быть
переопределено.

Список литературы

1. Однокристальные микроЭВМ. М.: МИКАП, 1994.


2. Сташин В.В. и др. Проектирование цифровых устройств на
однокристальных микроконтроллерах/ В.В.Сташин, А.В.Урусов,
О.Ф.Мологонцева. М.: Энергоатомиздат, 1990.
3. Щелкунов Н.Н., Дианов А.П. Микропроцессорные средства и
системы. М.: Радио и связь, 1989.
4. ОСТ 110342.2-87. Язык ассемблера АСМ51. М., 1987.
Глава 3. ТЕХНОЛОГИЯ РАЗРАБОТКИ ПРИКЛАДНОГО
ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
МИКРОКОНТРОЛЛЕРОВ MCS-51

3.1. Этапы проектирования ППО

При проектировании прикладного программного обеспечения прежде


всего возникает необходимость решения задачи об оптимальном (по ряду
критериев) распределении функций между аппаратурными и
программными средствами микропроцессорной техники. При этом в
самом общем случае следует исходить из того, что аппаратурная
реализация функций упрощает разработку и обеспечивает высокое
быстродействие изделия в целом, но сопряжена с увеличением
габаритных размеров, массы, потребляемой мощности, а также со
снижением надежности, обусловленным увеличением количества
элементов и связей между ними. Перечисленные недостатки отсутствуют
при программной реализации функций, которая, однако, усложняет
разработку изделия и снижает его быстродействие, но существенно
увеличивает время его жизни, так как обеспечивает возможность
перенастройки изделия на новые условия, задачи, объекты и др. путем
изменения только программного обеспечения.
После того как требования к прикладному программному
обеспечению изделия (микроконтроллера) определены, разработка
прикладной МК-программы разбивается на два существенно различных
этапа:
- "от постановки задачи к исходной МК-программе";
- "от исходной МК-программы к загрузочному модулю".
В ходе выполнения этапа "от постановки задачи к исходной МК-
программе" разрабатываются общая блок-схема алгоритма (БСА) работы
микроконтроллера и детализированные БСА отдельных процедур. После
чего на основе полученных БСА формируется исходный текст МК-
программы.
Разработка БСА очень похожа на разработку аппаратурных средств
систем автоматики и обработки данных. В основу разработки БСА
положена та же самая процедура модульного проектирования, которая
традиционно используется разработчиками аппаратурных средств.
Отличие состоит в том, что при разработке аппаратурных средств в
качестве "строительного" материала используются логические схемы,
триггеры, регистры и другие интегральные элементы, а при создании
программного обеспечения разработчик оперирует командами,
подпрограммами, таблицами и другими программными объектами из
арсенала средств обработки данных.
Секрет успеха разработки МК-программы заключается в
оптимальной декомпозиции поставленной задачи и в использовании
методов структурного программирования.
При декомпозиции задача последовательно разделяется на
функциональные модули, каждый из которых можно анализировать,
разрабатывать и отлаживать отдельно от других. При выполнении
прикладной программы в микроконтроллере управление без всяких
двусмысленностей передается от одного функционального модуля к
другому. Схема связности этих функциональных модулей, каждый из
которых реализует некоторую процедуру, образует общую БСА МК-
программы. Указанное разделение задачи на модули выполняется
последовательно до такого уровня, когда разработка БСА модуля
становится простым и понятным делом. Последовательная декомпозиция
обладает достаточной гибкостью, что позволяет привести степень
детализации БСА в соответствие со сложностью процедуры. Не следует
стесняться при выполнении декомпозиции дойти до модулей, которые
почти тривиальны. Ведь именно эту цель (получение очень простого и
"прозрачного" алгоритма модуля) преследует разработчик, когда
стремится заставить микроконтроллер надежно решать поставленную
задачу.
Структурное программирование есть процесс построения прикладной
МК-программы из строгого набора программных модулей, каждый из
которых реализует определенную процедуру обработки данных.
Программные модули должны иметь одну точку входа и одну точку
выхода. Только в этом случае отдельные модули можно разрабатывать и
отлаживать независимо, а затем объединять в законченную МК-
программу с минимальными проблемами их взаимосвязей. Источником
подавляющего большинства ошибок программирования является
использование модулей, имеющих один вход и несколько выходов. При
необходимости организации множественных ветвлений в МК-программе
декомпозицию задачи выполняют таким образом, чтобы каждый
функциональный модуль имел только один вход и один выход. Для этого
имеющие два выхода операторы (условные операторы) либо включают
внутрь модуля, объединяя их с операторами обработки, либо выносят в
систему межмодульных связей, формируя тем самым БСА более высокого
ранга.
Разработка БСА функционального модуля МК-программы имеет
ярко выраженный итеративный характер, т.е. требует многократных проб,
прежде чем возникает уверенность, что алгоритм реализации процедуры
правильный и завершенный. Вне зависимости от функционального
назначения процедуры при проектировании ее БСА необходимо
придерживаться следующей очередности работы:
1. Определить, что должен делать модуль. Указанное уже было
сделано при разработке общей БСА, но теперь разработчик имеет дело с
фрагментом, а не с целой МК-программой, и, следовательно, может
потребоваться доопределение и уточнение целевого назначения
процедуры.
2. Определить способы получения модулем исходных данных (от
датчиков через порты ввода, либо из таблиц в памяти программ, через
регистры или др.). Для реализации ввода исходных данных в модуль в его
БСА надо включить соответствующие операторы.
3. Определить необходимость какой-либо предварительной
обработки введенных исходных данных (маскирование, сдвиг,
масштабирование, перекодировка). Если до использования исходных
данных требуется их предобработка, то в БСА включаются
соответствующие операторы.
4. Определить способ преобразования входных данных в требуемые
выходные. Используя операторы процедур и условные операторы
принятия решения, отобразить в виде БСА выбранный метод
содержательной обработки исходных данных.
5. Определить способы выдачи из модуля обработанных данных
(передать в память, в порты вывода или др.). Необходимые действия
отобразить в БСА.
6. Определить необходимость какой-либо постобработки выводимых
данных (изменение формата, перекодирование, масштабирование,
маскирование или др.). При необходимости ввести в БСА
соответствующие операторы.
7. Вернуться к п.1 настоящего перечня работ и проанализировать
полученный результат. Выполнить итеративную корректировку БСА с
целью сделать эту блок-схему простой, логичной, стройной и обладающей
четким графическим образом.
8. Проверить работоспособность алгоритма на бумаге путем
подстановки в него действительных данных. Убедиться в его сходимости
и результативности.
9. Рассмотреть предельные случаи и попытаться определить
граничные значения информационных объектов, с которыми оперирует
алгоритм, за пределами которых он теряет свойства конечности,
сходимости или результативности. Особое внимание при этом следует
уделить анализу возможных ситуаций переполнения разрядной сетки
микроконтроллера, изменения знака результата операции, деления на
переменную, которая может принять нулевое значение и т.п.
10. Провести мысленный эксперимент по определению
работоспособности алгоритма в реальной среде функционирования
микроконтроллера.
Практика разработки прикладного программного обеспечения для
микропроцессорной техники и, в частности, для микроконтроллеров
семейства MCS-51 показала, что применение описанной процедуры
проектирования алгоритмов, базирующейся на декомпозиции и
структурном программировании, позволяет уверенно получать
работоспособные МК-программы.
Этап "от исходной МК-программы к загрузочному модулю"
предусматривает получение машинных (объектных) кодов МК-
программы, настроенных на определенное адресное пространство памяти
программ микроконтроллера. Этот этап поддерживается специальными
программными средствами, функционирующими на базе широко
распространенных персональных компьютеров (ПК). Указанные средства,
а точнее кросс-средства (т.к. системы команд микроконтроллера 8051 и
микропроцессора ПК не совпадают) обычно включают кросс-ассемблер и
кросс-редактор связей.
3.2. Кросс-ассемблер X8051

Кросс-ассемблер X8051 работает в среде операционной системы MS-


DOS (версия не ниже 3.30) и дает пользователю возможность
преобразовывать исходные модули МК-программ, написанные на языке
АСМ51 и содержащие не более 30000 строк, в эквивалентные объектные
модули, которые впоследствии могут быть скомпонованы с другими
объектными модулями и настроены на определенное адресное
пространство памяти программ МК кросс-редактором связей Link.
Основные функции кросс-ассемблера X8051:
- синтаксический и семантический контроль исходного модуля
МК-программы;
- преобразование (трансляция) исходного текста в объектный код;
- формирование листинга трансляции.
Работа кросс-ассемблера начинается с запуска файла x8051.exe и
ведется в диалоговом режиме. Сразу после запуска указанного файла на
экран выдается заголовок, а затем запрос на вывод листинга с указанием
ключей:
Listing Destination (N, T, D, E, L, P, <CR>=N):

где
N - не выводить;
T - выводить на терминал;
D - выводить на диск;
E - выводить только ошибки;
L - выводить листинг (вкл./выкл.);
P - выводить на принтер;
<CR> - равносильно "N".
Если ответить "D" или "P", то задается вопрос - выводить ли таблицу
перекрестных ссылок:

Generate Cross Reference ? (Y/N <CR>=N):

где Y - да, N - нет.


Если ответить "L" (вывод листинга контролируется директивами
LIST, NLIST языка АСМ51), то выводится дополнительное сообщение:

LIST ON/OFF Listing Destination (T, D, P, <CR>=T):


где значение ключей остается прежним.
Если ответить "E" (в листинг будут выводиться только ошибки), то
выводится дополнительное сообщение:

Error Only Listing Destination (T, D, P, <CR>=T):

где значение ключей остается прежним.


Затем запрашиваются имена входного и выходного файлов:

Input Filename:
Output Filename:

Если расширение входного файла (исходного модуля МК-программы) не


указано, то оно по умолчанию принимается равным .asm. Расширение
выходного файла (объектного модуля МК-программы) по умолчанию
равно .obj. Если не указано имя выходного файла, то ему присваивается
имя входного файла с расширением .obj. Файл листинга трансляции имеет
расширение .lst. Таблица перекрестных ссылок, в случае ее вывода,
заносится в файл листинга.
Кросс-ассемблер обрабатывает исходный модуль МК-программы за
два прохода. При первом проходе читается входной файл, контролируется
каждая строка исходного модуля, создается таблица перекрестных
ссылок. При втором проходе создается объектный модуль и листинг
трансляции.
Пример листинга трансляции (файл prim.lst):
2500 A.D. 8051 Macro Assembler - Version 4.02a
Input Filename: prim.asm
Output Filename: prim.obj

1 0000 75 F0 64 BINBCD MOV B,#100


2 0003 84 DIV AB
3 0004 F9 MOV R1,A
4 0005 74 0A MOV A,#10
5 0007 C5 F0 XCH A,B
6 0009 84 DIV AB
7 000A C4 SWAP A
8 000B 25 F0 ADD A,B
9 000D F8 MOV R0,A
10 000E 22 RET

Lines Assembled: 10 Assembly Errors: 0


Здесь крайний слева (первый) столбец содержит номера строк, а второй и
третий столбцы указывают соответственно адреса ячеек памяти программ
микроконтроллера и коды команд, используемых в МК-программе.

3.3. Кросс-редактор связей Link

Кросс-редактор связей Link работает в среде операционной системы


MSDOS (версия не ниже 3.30) и дает пользователю возможность
объединять до 20 сформированных кросс-ассемблером X8051 объектных
модулей, настраивая их на выполнение с определенного адреса. При этом
создается загрузочный модуль МК-программы.
Основные функции кросс-редактора связей Link:
- настройка объектных модулей на заданное адресное пространство
памяти программ микроконтроллера 8051;
- разрешение внешних ссылок;
- формирование в различных форматах загрузочного модуля и таблицы
символических имен;
- выявление ошибок редактирования;
- формирование листинга редактирования в виде карты загрузки.
Работа кросс-редактора связей начинается с запуска файла link.exe и
ведется в диалоговом режиме. Сразу после запуска указанного файла на
экран выдается заголовок, а затем запрашивается имя входного файла и
значение смещения объектного модуля, входящего в этот файл:

Input Filename:
Enter Offset For 'Code':

Эти сообщения повторяются до тех пор, пока все входные файлы не будут
перечислены. Расширение входных файлов по умолчанию принимается
равным .obj. Шестнадцатеричное значение смещения прибавляется к
начальному адресу объектного модуля МК-программы,
устанавливаемому, как известно, директивой ORG.
После того, как все входные файлы перечислены, на запрос имени
следующего входного файла надо нажать клавишу "Enter" и на экране
появится запрос имени выходного файла (загрузочного модуля):

Output Filename:

Если не указано имя выходного файла, то присваивается имя первого


входного файла.
После нажатия клавиши "Enter" на экране появится запрос имени
файла библиотеки:

Library Filename:

Ответ из нажатия клавиши "Enter" завершает ввод имен библиотечных


файлов, расширение которых по умолчанию принимается равным .lib.
В следующем сообщении запрашиваются ключи вывода результатов
работы кросс-редактора связей:

Options (D, S, A, M, Z, X, H, E, T, 1, 2, 3, <CR>=Default):


где
D - вывод на диск выходного файла в шестнадцатеричном формате INTEL
с расширением .hex (по умолчанию) и файла с расширением .map,
содержащего ошибки редактирования, таблицу общих символических
имен в алфавитном порядке, карту загрузки;
S - вывод на диск выходного файла в шестнадцатеричном формате INTEL
с расширением .hex (по умолчанию) и файла с расширением .sym,
содержащего таблицу общих символических имен (длина имени 32
знака);
A - вывод на диск выходного файла в шестнадцатеричном формате INTEL
с расширением .hex (по умолчанию) и файла с расширением .sym,
содержащего таблицу общих символических имен (длина имени 10
знаков);
M - вывод на диск выходного файла в шестнадцатеричном формате IN-
TEL с расширением .hex (по умолчанию) и файла с расширением .sym в
формате MICROTEK, содержащего таблицу символических имен. При
этом в исходный модуль МК-программы должна быть включена
директива SYMBOLS;
Z - вывод на диск выходного файла в шестнадцатеричном формате INTEL
с расширением .hex (по умолчанию) и файла с расширением .sym в
формате ZAK, содержащего таблицу символических имен. При этом в
исходный модуль МК-программы должна быть включена директива
SYMBOLS;
X - не используется;
H - вывод на диск выходного файла с расширением .hex (по умолчанию) в
шестнадцатеричном формате INTEL;
E - вывод на диск выходного файла с расширением .hex (по умолчанию) в
расширенном шестнадцатеричном формате INTEL;
T - вывод на диск выходного файла с расширением .tek (по умолчанию) в
шестнадцатеричном формате TEKTRONIX;
1 - вывод на диск выходного файла с расширением .s19 (по умолчанию) в
формате MOTOROLA S19;
2 - вывод на диск выходного файла с расширением .s28 (по умолчанию) в
формате MOTOROLA S28;
3 - вывод на диск выходного файла с расширением .s37 (по умолчанию) в
формате MOTOROLA S37.
Из перечисленных выше форматов, в которых может быть
представлен выходной файл кросс-редактора связей (загрузочный модуль
МК-программы), наиболее востребованным является шестнадцатеричный
формат INTEL.
Файл в указанном формате состоит из записей (строк), причем
каждая строка содержит шесть полей (поле признак записи, поле
длина, поле адрес загрузки, поле тип записи, поле данные и
поле контрольная сумма).
Поле признак записи состоит из одного символа ":" (двоеточие).
Поле длина занимает один байт и содержит число байтов данных в
записи. Это число не может превышать значение, заданное из диапазона
01H-0FFH операндом директивы RECSIZE. При отсутствии в исходном
модуле МК-программы указанной директивы число в поле длина не
может превышать 10H. Значение поля длина последней записи файла
равно нулю.
Поле адрес загрузки состоит из двух байтов и представляет собой
шестнадцатеричный адрес загрузки первого в записи байта данных. В
последней записи файла это поле содержит нулевой адрес.
Поле тип записи состоит из одного байта, значение которого равно
00H (01H), если запись не последняя (последняя).
Поле данные состоит из фактических данных, байты которых
нумеруются слева направо. В последней записи файла данные
отсутствуют.
Поле контрольная сумма занимает один байт и представляет собой
дополнительный код двоичной суммы значений поля длина, поля
адрес загрузки, поля тип записи и поля данные.
Пример файла в шестнадцатеричном формате INTEL (файл prim.hex):
:0F00000075F06484F9740AC5F084C425F0F82201
:00000001FF

Пример файла с расширением .map (файл prim.map):


Global Symbol Name Global Value Global Filename

***********************************************************
* LOAD MAP *
***********************************************************
* Section Name Starting Address Ending Address Size *
***********************************************************
* prim.obj *
* CODE 0000 000E 000F *
***********************************************************

Link Errors: 0 Output Format: Intel Hex

3.4. Примеры микроконтроллерных программ


широкого применения

Сроки проектирования прикладного программного обеспечения


микроконтроллеров MCS-51 существенно сокращаются при
использовании готовых МК-программ, реализующих типовые процедуры
обработки данных (преобразование системы счисления, работа с
таблицами констант, формирование заданной задержки и др.).
Рассмотрим ряд МК-программ широкого применения, написанных на
языке АСМ51.
Преобразование системы счисления. Подпрограмма BINBCD
выполняет преобразование целого двоичного 8-разрядного числа без
знака, содержащегося в аккумуляторе A (значение в интервале 0-255), в
трехзначное двоично-десятичное число, занимающее два байта и
размещаемое в регистрах R1 (сотни), R2 (десятки и единицы).
BINBCD MOV B,#100
DIV AB ;разделить на 100 для определения
;числа сотен
MOV R1,A ;сохранить число сотен в R1
MOV A,#10
XCH A,B ;поместить остаток в A
DIV AB ;разделить на 10 для определения
;числа десятков
SWAP A ;число десятков в старшей тетраде A
ADD A,B ;число единиц в младшей тетраде A
MOV R0,A ;сохранить число десятков и единиц в R0
RET
Фрагмент МК-программы, предложенный ниже, обеспечивает
преобразование двухзначного двоично-десятичного числа, содержащегося
в R3, в двоичное 8-разрядное число, размещаемое в регистре DPH.
CONV MACRO BCD,BIN ;начало макроопределения с
;формальными параметрами BCD и BIN
MOV A,BCD
MOV B,#10H
DIV AB ;разделить на 16 для отделения
;старшей и младшей тетрад A
MOV R1,B
MOV B,#10
MUL AB
ADD A,R1
MOV BIN,A
ENDM ;конец макроопределения
CONV R3,DPH ;макрокоманда с фактическими
;параметрами R3 и DPH

Считывание таймера/счетчика в процессе работы. Часто


встречаются ситуации, когда необходимо определить текущее состояние
работающего T/Cj (j{0,1}). Указанное может быть легко осуществлено
последовательным чтением регистров THj и TLj, после которого
обязательно следует убедиться в том, что содержимое THj не изменилось
(изменение возникает при переполнении TLj). Если изменение все же
имело место, то следует повторить процедуру чтения сначала.
Изложенный алгоритм реализован в подпрограмме RDT, приведенной
ниже.
RDT MOV A,TH0
MOV R0,TL0 ;пересылка младшего байта T/C0 в R0
CJNE A,TH0,RDT ;контроль старшего байта T/C0
MOV R1,A ;пересылка старшего байта T/C0 в R1
RET

Передача параметров в подпрограмму. Обычно передача


параметров перед вызовом подпрограммы осуществляется путем их
загрузки в заданные регистры. Однако, если большое число параметров
представляют собой константы, то более эффективным оказывается
подход, при котором параметры фактически являются частью
программного кода, следуя непосредственно за командой вызова
подпрограммы. В этом случае подпрограмма определяет их
местонахождение по адресу возврата в стеке. Рассмотрим подпрограмму
ADDBCD, которая иллюстрирует указанный подход при суммировании
четырехзначной двоично-десятичной константы 1234H с четырехзначной
двоично-десятичной переменной, размещенной в резидентной памяти
данных.
LCALL ADDBCD
DW 1234H ;BCD-константа
DB 56H ;адрес мл. байта BCD-переменной
DB 78H ;адрес мл. байта BCD-суммы
.........
ADDBCD POP DPH ;размещение в DPTR
POP DPL ;адреса возврата
MOV A,#2
MOVC A,@A+DPTR ;(A)=56H
MOV R0,A
MOV A,#3
MOVC A,@A+DPTR ;(A)=78H
MOV R1,A
MOV A,#1
MOVC A,@A+DPTR ;(A)=34H
ADD A,@R0 ;вычисление младшего байта суммы
DA A ;десятичная коррекция
MOV @R1,A
INC R0
INC R1
CLR A
MOVC A,@A+DPTR ;(A)=12H
ADDC A,@R0 ;вычисление старшего байта суммы
DA A ;десятичная коррекция
MOV @R1,A
MOV A,#4
Адрес JMP @A+DPTR ;переход к
команде, следующей за
;списком
параметров

Работа с таблицами констант.


Существует довольно широкий круг задач,
в которых используются большие
многомерные таблицы калибровочных
констант, нелинейных параметров и т.п.
Подпрограмма MATRX осуществляет
доступ к байтовым элементам
двумерной таблицы размерности mn
(m,n255), размещенной в одномерной

STRT

Рис.3. Схема размещения


табличных констант в ПП
памяти программ микроконтроллера 8051 (рис.3), при этом адрес ADR
ячейки ПП, содержащей элемент , определяется по формуле:
,
где и есть соответственно номер строки и столбца
таблицы; STRT есть адрес ячейки ПП, содержащей элемент .
Отметим, что адрес ячейки ПП, содержащей элемент , должен
удовлетворять условию .

;(R0)=i, (R1)=j, (DPTR)=STRT


MATRX MOV A,R0 ;(A)=i
DEC A
MOV B,#n
MUL AB
ADD A,DPL
MOV DPL,A ;в DPL младший байт STRT+n(i-1)
MOV A,B
ADDC A,DPH
MOV DPH,A ;в DPH старший байт STRT+n(i-1)
MOV A,R1 ;(A)=j
DEC A
MOVC A,@A+DPTR ;(A)=aij
RET
STRT DB a11,a12,...,a1n
DB a21,a22,...,a2n
..................
DB am1,am2,...,amn

Организация ветвления на n направлений предполагает выбор


одной из n программных процедур в зависимости от выполнения
соответствующего условия. Ниже приводится пример подпрограммы,
эффективно реализующей указанный выбор. Здесь в зависимости от
значения содержимого программно доступного элемента MEMSEL
осуществляется переход к одной из команд с адресами MT1-MTn. При
использовании подпрограммы JMP_n необходимо учитывать, что
количество ячеек памяти программ, отведенное под таблицу адресов
перехода и под область программных процедур, ограниченную адресами
MT1 и MTn, не должно превышать 256 байт.

;(MEMSEL){0,...,n-1}
MEMSEL REG R3
JMP_n MOV A,MEMSEL
MOV DPTR,#TBL
MOVC A,@A+DPTR
JMP @A+DPTR
TBL DB MT1-TBL,MT2-TBL,...,MTn-TBL
MT1 ..........
RET
MT2 ..........
RET
..........
MTn ..........
RET

Программирование последовательного порта. Последовательный


порт микроконтроллера 8051 обеспечивает широкие возможности по
организации приема/передачи данных, при этом настройка на заданную
скорость приема/передачи и требуемый протокол обмена достигается
соответствующей инициализацией регистров PCON (табл.2.2), TMOD
(табл.2.4), SCON (табл.2.5). В качестве примера ниже приводятся три
подпрограммы, которые совместно обеспечивают работу
последовательного порта в режиме 3 со скоростью приема/передачи
данных 2400 бод.
;INIT - подпрограмма инициализации
INIT MOV SCON,#1101xx10B ;x{0,1}
MOV TMOD,#0010xxxxB ;настройка T/C1
MOV PCON,#0 ;сброс бита SMOD

MOV TH1,#<.NOT.K+1 ; ,

где
; МГц есть частота
синхро-
;низации микроконтроллера
SETB TR1 ;включить T/C1
RET

;SP_OUT - подпрограмма передачи данных и контрольного бита


SP_OUT MOV C,P ;пересылка контрольного бита из флага
MOV TB8,C ;паритета в SCON.3
M1 JNB TI,M1 ;синхронизация передачи
CLR TI ;сброс бита SCON.1
MOV SBUF,A ;передача контрольного бита и
;содержимого A через посл. порт
RET

;SP_IN - подпрограмма приема данных и контрольного бита


SP_IN JNB RI,SP_IN ;синхронизация приема
CLR RI ;сброс бита SCON.0
MOV A,SBUF ;загрузка принятого байта данных в A
MOV C,RB8 ;загрузка девятого принятого бита
;данных (контрольного бита) в C
RET

Программная организация задержки. Процедура организации


временной задержки может быть реализована на основе программного
цикла. При этом в заданный регистр загружается число, которое затем в
каждом проходе цикла уменьшается на единицу. Так продолжается до тех
пор, пока содержимое используемого регистра не станет равным нулю,
что интерпретируется МК-программой как момент выхода из цикла.
Время задержки при этом зависит от числа, загруженного в регистр, и
времени выполнения команд, образующих цикл. Например, задержка,
формируемая подпрограммой DELAY1, будет определяться выражением:

где f есть частота синхронизации микроконтроллера. Если ,


то мкс. Задержку большей длительности при той
же частоте синхронизации можно получить вложением циклов, как
показано в подпрограмме DELAY2, для которой
(мкс).

DELAY1 MOV R2,#n


M1 DJNZ R2,M1
RET
DELAY2 MOV R1,#n
MET2 MOV R2,#m
MET1 DJNZ R2,MET1
DJNZ R1,MET2
RET

Отметим, что максимальное время задержки, формируемой


подпрограммой DELAY2, будет составлять
.

Список литературы

1. Сташин В.В. и др. Проектирование цифровых устройств на


однокристальных микроконтроллерах/ В.В.Сташин, А.В.Урусов,
О.Ф.Мологонцева. М.: Энергоатомиздат, 1990.
2. Белов А.М. и др. Средства автоматизации программирования
микропроцессорных устройств/ А.М.Белов, Е.А.Иванов, Л.Л.Муренко. М.:
Энергоатомиздат, 1988.
3. Программирование микропроцессорных устройств: Сборник
лабораторных работ/ Д.В.Андреев. Ульяновск: УлГТУ, 1994.
4. Андреев Д.В. Применение отладочных программных средств в
курсе «Проектирование микропроцессорных устройств»// Сборник
тезисов науч.-метод. конф. «Компьютерные технологии в высшем
образовании». Ульяновск: УлГТУ, 1999.
5. Однокристальные микроЭВМ. М.: МИКАП, 1994.

ОГЛАВЛЕНИЕ

ПРЕДИСЛОВИЕ . . . . . . . . . . . . 3
Глава 1. СОСТАВ СЕМЕЙСТВА MCS-51. . . . . . . 5
1.1. Микроконтроллеры фирмы Intel . . . . . . . . 6
1.2. Микроконтроллеры фирмы Philips. . . . . . . . 11
1.3. Микроконтроллеры фирм Siemens, Atmel и
Dallas Semiconductor. . . . . . . . . . . 15
Список литературы. . . . . . . . . . . . 18
Глава 2. ОСОБЕННОСТИ ПРОГРАММИРОВАНИЯ
МИКРОКОНТРОЛЛЕРОВ MCS-51. . . . . . . 19
2.1. Программная модель микроконтроллера 8051 . . . . . 19
2.2. Ассемблерный язык микроконтроллера 8051. . . . . . 31
2.2.1. Система команд языка АСМ51 . . . . . . . 34
2.2.2. Директивы языка АСМ51 . . . . . . . . 69
Список литературы. . . . . . . . . . . . 72
Глава 3. ТЕХНОЛОГИЯ РАЗРАБОТКИ ПРИКЛАДНОГО
ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
МИКРОКОНТРОЛЛЕРОВ MCS-51. . . . . . . 73
3.1. Этапы проектирования ППО. . . . . . . . . 73
3.2. Кросс-ассемблер X8051. . . . . . . . . . 76
3.3. Кросс-редактор связей Link . . . . . . . . . 78
3.4. Примеры микроконтроллерных программ
широкого применения . . . . . . . . . . 81
Список литературы. . . . . . . . . . . . 87

Вам также может понравиться