Курс лекций - Микропроцессоры

         

в значительной мере предопределяется ее


Архитектура семейства MCS-48 в значительной мере предопределяется ее назначением - построение компактных и дешевых цифровых устройств. Все функции микроЭВМ реализуются с помощью единственной микросхемы. В состав семейства MCS-48 входит целый ряд микросхем отличающихся друг от друга внутренним составом. Поэтому часто выделяют отдельно неизменную часть, которая присутствует во всех микросхемах семейства. Эту часть называют ядром. кроме ядра в состав каждой микросхемы входят части, которыми микросхемы отличаются друг от друга. Эту часть микросхемы называют периферией. Микроконтроллеры семейства MCS-48 позволяют выполнять как задачи управления различными устройствами, так и реализовывать отдельные узлы аналоговой схемы. Все микросхемы этого семейства работают с одной и той же системой команд, в одинаковых корпусах с совпадающей цоколевкой (нумерация ножек для корпуса). Это позволяет использовать для разработанного устройства микросхемы разных фирм - производителей без переделки принципиальной схемы устройства и программы.



Рисунок 1. Структурная схема контроллера К1816ВЕ48

Структурная схема контроллера представлена на рис.1. Основу микроконтроллера составляет системная шина, которая связывает между собой все основные функциональные узлы микросхемы: блок управления, арифметико-логического устройство, блока таймеров/счетчиков, блока последовательного интерфейса и прерываний, программного счетчика, памяти данных и памяти программ. Двусторонний обмен осуществляется с помощью внутренней 8-разрядной магистрали данных. По такой схеме построены все представители семейства MCS-48. Различные микросхемы этого семейства различаются только объёмом внутренней памяти. Система команд всех контроллеров семейства MCS-48 содержит 96 базовых команд с форматом 1 или 2 байта и не изменяется при переходе от одной микросхемы к другой. Это обеспечивает прекрасную переносимость программ с одного типа микросхем на другой. Рассмотрим подробнее назначение каждого блока.

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

устройство формирования временных интервалов, логика ввода-вывода, регистр команд, дешифратор команд, логика управления ЭВМ. Устройство формирования временных интервалов предназначено для формирования и выдачи внутренних синхросигналов фаз, тактов и циклов. Количество машинных циклов определяет продолжительность выполнения команд. Генератор построен на внутреннем инверторе и внешнем кварцевом или LC резонаторе. Допустимая частота кварцевого резонатора от 1 до 6 МГц. Схемы задающих генераторов тактовой частоты с использованием внутренней и внешней синхронизации приведены на рисунке 2.



Рисунок 2. Схемы генераторов тактовой частоты.

Нужно отметить, что запуск задающего генератора этого микроконтроллера был затруднённым (жёсткий режим самовозбуждения), поэтому для надёжного запуска задающего генератора следовало использовать либо внешний генератор, либо шунтировать ножки XTAL1 и XTAL2 внешним резистором.

Практически все команды микроконтроллера выполняются за один или два машинных цикла. Обозначим частоту задающего генератора через Fг. Тогда длительность машинного цикла равна 15/Fг или составляет 15 периодов сигнала задающего генератора. Именно с такой частотой выдаётся сигнал стробирования адреса ALE. Логика ввода - вывода предназначена для приема и выдачи сигналов, обеспечивающих обмен информации с внешними устройствами через порты ввода вывода и системную шину микроконтроллера.



Сброс микроконтроллера можно осуществить при помощи конденсатора, подключенного к ножке сброса RESET, как показано на рисунке 3. Минимальное время сброса контроллера 50 мс. В настоящее время для этой цели лучше бы подошла микросхема супервизора питания ADM809. После сброса микроконтроллера обнуляется содержимое счётчика команд PC, указателя стека в составе регистра PSW, выбираются 0 банк регистров и нулевой банк памяти программ.


Запрещаются прерывания.



Рисунок 3. Схемы сброса микропроцессора.

Регистр команд предназначен для записи и хранения 8- ми разрядного кода операции выполняемой команды. Код операции, с помощью дешифратора команд и логики управления ЭВМ, преобразуется в микропрограмму выполнения команды, считанной из ПЗУ.

Арифметико-логический блок представляет собой параллельное восьмиразрядное устройство, обеспечивающее выполнение арифметических и логических операций. АЛБ состоит из:

регистров временного хранения TMP1 и TMP2, аккумулятора (ACC), ПЗУ констант, арифметико-логического устройства, регистра состояния программ (PSW). Регистры временного хранения - восьмиразрядные регистры, предназначенные для приема и хранения операндов на время выполнения операций над ними. Регистры временного хранения информации программно не доступны.

Аккумулятор - восьмиразрядный регистр, предназначенный для приема и хранения результата, полученного при выполнении арифметико-логических операций или операций сдвига

ПЗУ констант обеспечивает выработку корректирующего кода при двоично-десятичном представлении данных, кода маски при битовых операциях и кода констант.

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

При выполнении операций обработки данных в АЛУ вырабатываются флаги, которые сохраняются в регистре состояния программы PSW.

Кроме того, вырабатываются флаги, по которым осуществляется переход в командах условного перехода, такие как флаг нулевого содержимого аккумулятора и флаг наличия единицы в выбранном бите аккумулятора.

Блок обработки прерываний предназначен для организации ввода - вывода последовательных потоков информации и организации системы прерывания программ. Опрос входа запроса прерывания INT производится во время выдачи сигнала ALE.


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

Счетчик команд (Program Counter) предназначен для формирования текущего 11-разрядного адреса памяти программ. В состав счетчика команд входят 11-разрядные буфер РС, регистр РС и схема инкремента (увеличения содержимого на 1). Кроме того, под управлением команд SEL MB0 и SEL MB1 могут переключаться страницы памяти программ.

Память данных (RAM) предназначена для временного хранения информации, используемой в процессе выполнения программы.

Порты P1 и P2 являются квазидвунаправленными портами ввода - вывода и предназначены для обеспечения обмена информацией микроконтроллера с внешними устройствами, образуя 16 линий ввода- вывода.

Регистр состояния программы (PSW) предназначен для хранения информации о состоянии АЛУ при выполнении программы. Формат регистра PSW приведён ниже:

Номер бита 7 6 5 4 3 2 1 0
Имя флага C AC F0 BS - S2 S1 S0
C - флаг переноса, формируемый АЛУ, AC - флаг вспомогательного переноса между тетрадами, формируемого при десятичных вычислениях. F0 - флаг (битовая переменная), используемый пользователем в своих целях BS - флаг переключения регистровых банков, S0...S2 - биты указателя стека. Память программ предназначена для хранения программ и представляет собой постоянное запоминающее устройство (ПЗУ). В разных микросхемах семейства применяются ПЗУ различного объёма. В микросхеме 1816ВЕ35 внутренняя память программ отсутствует вовсе.

[ ] [ ] [ ]


Арифметические команды


В наборе команд микроконтроллера имеются следующие арифметические операции:

, , , ,

Действия производятся над целыми числами без знака. Команды сложения ADD позволяют сформировать перенос в следующий разряд. Команды сложения с учётом знака переноса позволяют выполнять многобайтное сложение. Вычитание может быть реализовано переводом одного из операндов в дополнительный код с последующим выполнением операции суммирования. Более сложные операции такие как умножение или деление могут быть реализованы только программным способом.



Команды пересылки данных


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

обмен данными во внутреннем ОЗУ: , XCH обмен данными из внешней памяти данных: копирование данных из памяти программ: обмен данными параллельных портов , ,

Примеры использования команд пересылки данных:

Любая ячейка 256- байтового блока внутреннего ОЗУ данных может быть выбрана с использованием косвенно-регистровой адресации через регистры указатели R0 и R1 (выбранного банка рабочих регистров):

;Скопировать число из ячейки памяти с адресом, хранящемся в R0, в аккумулятор ;Скопировать число из аккумулятора, в ячейку памяти с адресом, хранящемся в R1

Таблицы символов (кодов), записанные в ПЗУ программы могут быть скопированы в аккумулятор с помощью команд передачи данных с :

;Скопировать символ из текущей страницы памяти программ в аккумулятор ;Скопировать символ из третьей страницы памяти программ в аккумулятор

Ячейка адресного пространства 256 байт внешнего ОЗУ также может быть выбрана с использованием адресации через регистры R0 или R1:

;Скопировать число из внешней ячейки памяти с адресом,;хранящемся в R0, в аккумулятор ;Скопировать число из аккумулятора, в ячейку памяти с адресом, хранящемся в R1

Содержимое аккумулятора может быть обменено с содержимым рабочих регистров выбранного банка:

XCH A, R0.

Для работы с параллельными портами используется отдельные команды пересылки данных IN и OUTL:

;Скопировать число из порта P0, в аккумулятор ;Скопировать число из аккумулятора, в порт P1

Команды управления режимами работы микроконтроллера


Команды управления микроконтроллером позволяют:

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

Команды ветвления и передачи управления


Команды ветвления позволяют реализовывать условные операторы и операторы циклов. В микроконтроллерах семейства MCS-48 доступны следующие команды:

безусловный переход: Вызов и возврат из подпрограммы: , , RETR проверка содержимого аккумулятора: , , , ... проверка флага переноса С: , проверка сигнала на ножке T0: , проверка сигнала на ножке T1:  , проверка сигнала на ножке INT: Проверка состояния флагов пользователя ,

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

;Переход к команде, расположенной по адресу обозначенному меткой ‘Metka’ CALL Podprogramma ;Вызов подпрограммы по адресу, обозначенному меткой ‘Podprogramma’

В системе команд имеются команды условных переходов. Эти команды позволяют осуществлять переход в пределах страницы 256 байт.

Примеры использования команд условного перехода:

JB5 TstNxtUsl ;Если в 6 бите аккумулятора нулевое значение, CALL Podprogramma ;то вызвать подпрограмму, обозначенную меткой ‘Podprogramma’ JNZ A, #5, TstNxtUsl ;Если в аккумуляторе содержится нулевое значение, CALL Podprogramma ;то вызвать подпрограмму, обозначенную меткой ‘Podprogramma’

Команды проверки содержимого аккумулятора и флага переноса C могут быть использованы для реализации проверки различных условий:

MOV A, 34 ;Если в переменной, хранящейся в ячейке внутренней памяти 34 JB7 TstNxtUsl ;число меньше нуля, CALL Podprogramma ;то вызвать подпрограмму, обозначенную меткой ‘Podprogramma’ ;--------------------------------------------------------------------------------- MOV A, 34 ;Если в переменной, ADD A, -5 ;хранящейся в ячейке внутренней памяти 34 JZ TstNxtUsl ;занесено число 5, CALL Podpr5 ;то вызвать подпрограмму, обозначенную меткой ‘Podpr5’ ;--------------------------------------------------------------------------------- MOV A, 34 ;Если в переменной, ADD A, -5 ;хранящейся в ячейке внутренней памяти 34 JNС TstNxtUsl ;занесено число, меньшее 5, CALL PodprLT5 ;то вызвать подпрограмму, обозначенную меткой ‘PodprLT5’ ;--------------------------------------------------------------------------------- MOV A, 34 ;Если в переменной, ADD A, -6 ;хранящейся в ячейке внутренней памяти 34 JC TstNxtUsl ;занесено число, большее 5, CALL PodprGT5 ;то вызвать подпрограмму, обозначенную меткой ‘PodprGT5’ ;--------------------------------------------------------------------------------- MOV A, 34 ;Если в переменной, ADD A, -5 ;хранящейся в ячейке внутренней памяти 34 JC TstNxtUsl ;занесено число, большее или равное 5, CALL PodprGE5 ;то вызвать подпрограмму, обозначенную меткой ‘PodprGE5’ ;--------------------------------------------------------------------------------- MOV A, 34 ;Если в переменной, ADD A, -6 ;хранящейся в ячейке внутренней памяти 34 JNC TstNxtUsl ;занесено число, меньшее или равное 5, CALL PodprLE5 ;то вызвать подпрограмму, обозначенную меткой ‘PodprLE5’

Косвенный переход JMPP @A в системе команд микроконтроллера обеспечивает ветвление программы по содержимому аккумулятора А.
Это позволяет реализовывать операцию перехода по заданному коду, эквивалентное оператору case в языке программирования pascal, но намного быстрее (за два машинных цикла). Пример реализации команды выбора варианта:

ORG 256 ;Разместить команды переходов по границе страницы JMP Case0 ;Перейти к выполнению кода по числу 0 JMP Case1 ;Перейти к выполнению кода по числу 1 JMP EndCase ;Это число в ячейке 33 в список разрешённых не входит JMP EndCase ;Это число в ячейке 33 в список разрешённых не входит JMP Case4 ;Перейти к выполнению кода по числу 4 BeginOpCase: ;Сюда нужно перейти командой JMP BeginOpCase MOV A, 33 ;В этой ячейке хранится переменная, по которой необходимо осуществить переход на обслуживающую программу CLR C ;Осуществить арифметический сдвиг аккумулятора вправо RLC A ;(умножить на 2) т.к. команды переходов занимают два байта JMPP @A ;Перейти к выполнению заданного в 25 ячейке кода EndCase:

Логические команды


Система команд микроконтроллера позволяет реализовать логические операции:

И ( ), ИЛИ ( ), ИСКЛЮЧАЮЩЕЕ ИЛИ ( ). сброс и инвертирование всех восьми разрядов аккумулятора ( ; ; сброс и инвертирование флагов микроконтроллера ( ; ; ; ; ; ); циклический сдвиг влево и вправо с учетом переноса и без ( ; ; ; ); обмен местами старшей и младшей тетрад внутри аккумулятора ( ).

Система команд микроконтроллеров семейства


1. Внутреннее устройство микроконтроллеров.

. . 2. Система команд микроконтроллеров семейства MCS-48.

. . [ ] [ ]


Описание машинных команд


ADD A, <байт-источник> - сложение.

Описание: складывает содержимое аккумулятора А с содержимым байта- источника. Результат операции помещается в аккумулятор. Флаг переноса C устанавливается при переносе из 7го разряда. Флаг вспомогательного переноса AC устанавливается при переносе из 3го разряда. При сложении знаковых чисел флаг переполнения OV устанавливается при превышении максимального положительного числа или при получении числа меньшего минимально возможного. Для команды сложения разрешены следующие режимы адресации байта - источника:

;

Пример: ADD A, R7
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
(A) = (A) + (Rn) , n=0,1,2,3,4,5,6,7
Машинный код: 0 1 1 0 1 r r r ;

Пример: ADD A, @R0

Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
(A) = (A) + ((Ri)) , i=0,1
Машинный код: 0 1 1 0 0 0 0 i .

Пример: ADD A, #38h

Количество байт: 2
Количество циклов: 1
Действие команды:
(PC) = (PC) + 2
(A) = (A) + (date 8)
Машинный код: 0 0 0 0 0 0 1 1 i i i i i i i i

ADDC A, <байт-источник> - сложение с учетом переноса.

Описание: складывает содержимое аккумулятора А с содержимым байта-источника, к получившемуся результату прибавляется значение флага переноса. Результат операции помещается в аккумулятор. Флаг переноса C устанавливается при переносе из 7го разряда. Флаг вспомогательного переноса AC устанавливается при переносе из 3го разряда. При сложении знаковых чисел флаг переполнения OV устанавливается при превышении максимального положительного числа или при получении числа меньшего минимально возможного. Для команды сложения разрешены следующие режимы адресации байта - источника:

;

Пример: ADDC A, R3

Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
(A) = (A) + (C) + (Rn) , n=0, : ,7
Машинный код:

0 1 1 1 1 r r r ;

Пример: ADDC A, @R0

Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
(A) = (A) + (C) + ((Ri)) , i=0,1


Машинный код:
0 1 1 1 0 0 0 i . Пример: ADDC A, #100
Количество байт: 2
Количество циклов: 1
Действие команды:
(PC) = (PC) + 2
(A) = (A) + (C) + (date 8)
Машинный код:
0 0 0 1 0 0 1 1 i i i i i i i i ANL <байт приемник>,<байт источник> - команда "логическое И" для байтовых переменных.
Описание: выполняет операцию побитового " логического И" над указанными переменными и помещает результат в байт приемник. Команда не воздействует на флаги.
Для команды ANL с аккумулятором в качестве байта назначения разрешены следующие режимы адресации байта - источника:
; Пример: ANL A, R3
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
(A) = (A) & (Rn) , n=0,1,2,3,4,5,6,7
Машинный код:
0 1 0 1 1 r r r ; Пример: ANL A, @R0
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
(A) = (A) & ((Ri)) , i=0,1
Машинный код:
0 1 0 1 0 0 0 i . Пример: ANL A, #100
Количество байт: 2
Количество циклов: 1
Действие команды:
(PC) = (PC) + 2
(A) = (A) & (date 8)
Машинный код:
0 1 0 1 0 0 1 1 i i i i i i i i Для команды ANL возможна работа с портами и шиной данный в качестве приёмника информации. При этом источник информации использует адресацию:
Пример: ANL BUS, #00010010B
Количество байт: 2
Количество циклов: 1
Действие команды:
(PC) = (PC) + 2
(BUS) = (BUS) & (direct)
Машинный код:
1 0 0 1 1 0 0 0 d d d d d d d d Пример: P1, #10000000b
Количество байт: 2
Количество циклов: 2
Действие команды:
(PC) = (PC) + 2
(Pp) = (Pp) & (date 8), pp=1,2
Машинный код:
1 0 0 1 1 0 p p d d d d d d d d Примечание: при выполнении команды ANL над содержимым внешнего порта используется значение из внутреннего регистра, а не данные, присутствующие на выводах микросхемы!
ANLD P, A - "логическое И" порта внешней микросхемы расширителя портов и аккумулятора A.
Описание: выполняет операцию побитового "логического И" над содержимым порта внешней микросхемы расширителя портов и аккумулятора.


Результат  помещается в порт. Команда не воздействует на флаги. При этом как источник, так и приемник информации использует адресацию:
Пример: ANLD P6, A
Количество байт: 1
Количество циклов: 2
Действие команды:
(PC) = (PC) + 2
(Pp) = (Pp) & (A), pp=4,5,6,7
Машинный код:
1 0 0 1 1 1 p p
CALL <addr 11> - вызов подпрограммы.
Описание: вызывает подпрограмму, размещенную по указанному адресу <addr 11>. Команда увеличивает содержимое счетчика команд на 2 и затем помещает полученный результат в стек. Кроме программного счетчика в стеке сохраняется содержимое регистра флагов PSW. После это содержимое указателя стека SP увеличивается на 1.  Команда не воздействует на флаги.
Пример: CALL 311h
Количество байт: 2
Количество циклов: 2
Действие команды:
(PC) = (PC) + 2
((SP)) = (PC), (PSW4-7)
(SP) = (SP) + 1
(PC10-0) = адрес подпрограммы (метки)
Машинный код:
a10 a9 a8 1 0 1 0 0 a7 a6 a5 a4 a3 a2 a1 a0 CLR A - сброс аккумулятора
Описание: сбрасывает (записывает '0' во все биты аккумулятора). Команда не изменяет содержимое флагов. Команда использует адресацию:
Пример: CLR A      ;Записывает в аккумулятор число 00h
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
(A) = 0
Машинный код:
0 0 1 0 0 1 1 1 CLR C - сбрасывает флаг переноса в нулевое значение.
Описание: сбрасывает (записывает '0') в флаг переноса. Команда использует адресацию:
Пример: CLR C ;Записывает во флаг переноса '0'
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
(C) = 0
Машинный код:
1 0 0 1 0 1 1 1 CLR F0 - сбрасывает флаг пользователя F0 в нулевое значение.
Описание: сбрасывает (записывает '0') в флаг пользователя F0. Команда использует адресацию:
Пример: CLR F0 ;Записывает во флаг пользователя F0 '0'
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
(F0) = 0
Машинный код:
1 0 0 0 0 1 0 1 CLR F1 - сбрасывает флаг пользователя F1 в нулевое значение.


Описание: сбрасывает (записывает '0') в флаг пользователя F1. Команда использует адресацию:
Пример: CLR F1 ;Записывает во флаг пользователя F0 '0'
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
(F1) = 0
Машинный код:
1 0 1 0 0 1 0 1 CPL A - каждый бит аккумулятора инвертируется.
Описание: каждый бит аккумулятора инвертируется, т.е. если в каком-либо из восьми бит аккумулятора записана '1', то в этот бит записывается '0' и наоборот.
Пример: CPL A
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
(A) = not(A)
Машинный код:
0 0 1 1 0 1 1 1 CPL C - инвертируется флаг переноса 'C'.
Описание: флаг переноса 'C' инвертируется, т.е. если флаг переноса 'C' содержит '1', то в него записывается '0' и наоборот. Команда использует адресацию:
Пример: CPL C
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
(C) = not(C)
Машинный код:
1 0 1 0 0 1 1 1 CPL F0 - инвертируется флаг пользователя F0 в нулевое значение.
Описание: флаг пользователя 'F0' инвертируется, т.е. если флаг пользователя 'F0' содержит '1', то в него записывается '0' и наоборот. Команда использует адресацию:
Пример: CLR F0 ;Инвертирует флаг пользователя F0
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
(F0) = 0
Машинный код:
1 0 0 0 0 1 0 1 CPL F1 - инвертируется флаг пользователя F1 в нулевое значение.
Описание: флаг пользователя 'F1' инвертируется, т.е. если флаг пользователя 'F1' содержит '1', то в него записывается '0' и наоборот. Команда использует адресацию:
Пример: CLR F1 ;Инвертирует флаг пользователя F0
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
(F1) = 0
Машинный код:
1 0 1 0 0 1 0 1 DA A - десятичная коррекция аккумулятора при сложении двоично-десятичных чисел.
Описание: команда десятичной коррекции позволяет вести сложение чисел, представленных в упакованном двоично-десятичном коде. Команда применяется после инструкций ADD или ADDC.


Инструкции (команды) ADD или ADDC позволяют суммировать сразу две тетрады, расположенные в одном байте.
Если биты аккумулятора с 0 по 3 содержат число большее 9 (xxxx1010:xxxx1111) или флаг вспомогательного переноса AC содержит '1', то к аккумулятору прибавляется число 6 для того, чтобы получить правильную двоично-десятичную цифру в младшей тетраде.
Если старшие биты аккумулятора (с 4 по 7) содержат число большее 9 (1010xxxx :1111xxxx) или флаг переноса C содержит '1', то к аккумулятору прибавляется число 60h для того, чтобы получить правильную двоично-десятичную цифру в старшей тетраде.
Если в результате операции DA A возникнет перенос, то флаг переноса C будет установлен в 1. Единичный флаг переноса после операции DA A означает, что результат суммирования больше 100 и этим можно воспользоваться для суммирования многоразрядных двоично-десятичных чисел. Команда десятичной коррекции не воздействует на флаг переполнения OV.
Примечание: команда DA A не может преобразовать двоичное число из аккумулятора в двоично-десятичный вид или правильно скорректировать двоично-десятичное вычитание.
Пример: DA A
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
IF [[(A3-0) > 9] or [(AC) = 1]] THEN (A3-0) = (A3-0) + 6
AND
IF [[(A7-4) > 9] or [(C) = 1]] THEN (A7-4) = (A7-4) + 6
Машинный код: 0 1 0 1 0 1 1 1 DEC <байт> - производит вычитание 1 из указанного операнда.
Описание: операнд уменьшается на 1. Если первоначально в ячейке было записано значение 00h, то в нее заносится значение 0FFh. Команда не воздействует на флаги.
Для команды DEC разрешены следующие режимы адресации: . Пример: DEC A
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
(A) = (A) - 1
Машинный код:
0 0 0 0 0 1 1 1 ; Пример: DEC R3
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
(Rn) = (Rn) - 1, n=0,1,2,3,4,5,6,7
Машинный код:
1 1 0 0 1 r r r DIS I - запрет внешнего прерывания.


Описание: запрещает прерывание выполнения программы по сигналу низкого уровня на внешней ножке INT.
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
Запретить прерывания от внешней ножки INT
Машинный код:
0 0 0 1 0 1 0 1 DIS TCNTI - запрет прерывания от таймера/счётчика.
Описание: запрещает прерывание выполнения программы по переполнению таймера/счётчика.
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
Запретить прерывания по переполнению таймера/счётчика
Машинный код:
0 0 1 1 0 1 0 1 DJNZ Rn,<адрес> - вычитание 1 из указанной ячейки и переход, если результат не равен 0.
Описание: вычитание 1 из указанной во втором байте команды ячейки памяти и переход к вычисляемому по второму байту команды адресу, если результат вычитания не равен 0. Если первоначально в ячейке памяти содержится '0', то в результате выполнения операции туда будет записано число '0FFH'. Команда не воздействует на флаги. Новое значение программного счетчика при переходе вычисляется соединением содержимого старших бит программного счетчика с вторым операндом (вторым байтом команды). Таким образом осуществляется переход в пределах страницы размером в 256 байт. Если команда окажется на границе двух страниц, то переход осуществляется в пределах страницы, где расположен второй байт команды. Для команды DJNZ используется адресация:
Пример: LABEL1: DJNZ R3 ,LABEL1;
Количество байт: 2
Количество циклов: 2
Действие команды:
(PC) = (PC) + 2
(Rn) = (Rn) - 1, n=0,1,2,3,4,5,6,7
IF (Rn) < > 0, THEN (PC0..7) = Address
Машинный код:
1 1 1 0 1 r r r A d d r e s s EN I - разрешение внешнего прерывания.
Описание: разрешает прерывание выполнения программы по сигналу низкого уровня на внешней ножке INT.
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
Разрешить прерывания от внешней ножки INT
Машинный код:
0 0 0 0 0 1 0 1 EN TCNTI - разрешение прерываний от таймера/счётчика.
Описание: разрешает прерывание выполнения программы по переполнению таймера/счётчика.


Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
Разрешить прерывания от таймера/счётчика
Машинный код:
0 0 1 0 0 1 0 1 ENT0 CLK - разрешение выдачи синхросигнала на вывод T0.
Описание: разрешает выдачу синхросигнала на вывод микросхемы T0.
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
Разрешить  выдачу синхросигнала на вывод T0
Машинный код:
0 1 1 1 0 1 0 1 IN Pp - пересылка данных из порта в аккумулятор.
Описание: копирует данные на выводах микросхемы в аккумулятор. Команда не воздействует на флаги и использует адресацию.
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
(A) = (Pp), p=1,2
Машинный код:
0 0 0 0 1 0 p p INC <байт> - производит прибавление 1 к указанному операнду.
Описание: ячейка памяти адрес, которой указан во втором байте команды увеличивается на 1. Если первоначально в ячейке было записано значение 0FFh, то в нее заносится значение 00h. Команда не воздействует на флаги.
Для команды INC разрешены следующие режимы адресации байта - источника:
. Пример: INC A
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
(A) = (A) + 1
Машинный код:
0 0 0 1 0 1 1 1 ; Пример: INC R3
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
(Rn) = (Rn) + 1, n=0,1,2,3,4,5,6,7
Машинный код:
0 0 0 1 1 r r r ; Пример: INC @R0
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
((Ri)) = ((Ri)) + 1, i=0,1
Машинный код:
0 0 0 1 0 0 0 i JB0 <адрес> - переход если нулевой бит аккумулятора установлен.
Описание: Если нулевой бит аккумулятора равен единице, то производится переход к указанному во втором байте команды адресу. В противном случае выполняется следующая команда. Новое значение программного счетчика при переходе вычисляется соединением содержимого старших бит программного счетчика с вторым операндом (вторым байтом команды). Таким образом осуществляется переход в пределах страницы размером в 256 байт.


Если команда окажется на границе двух страниц, то переход осуществляется в пределах страницы, где расположен второй байт команды. Команда не воздействует на флаги и не изменяет содержимое проверяемого бита.
Пример: JB0 LABEL1
Количество байт: 2
Количество циклов: 2
Действие команды:
(PC) = (PC) + 2
IF (ACC.0) = 1 THEN (PC0..7) = Address
Машинный код:
0 0 0 1 0 0 1 0 A d d r e s s JB1 <адрес> - переход если первый бит аккумулятора установлен.
Описание: Если первый бит аккумулятора равен единице, то производится переход к указанному во втором байте команды адресу. В противном случае выполняется следующая команда. Новое значение программного счетчика при переходе вычисляется соединением содержимого старших бит программного счетчика с вторым операндом (вторым байтом команды). Таким образом осуществляется переход в пределах страницы размером в 256 байт. Если команда окажется на границе двух страниц, то переход осуществляется в пределах страницы, где расположен второй байт команды. Команда не воздействует на флаги и не изменяет содержимое проверяемого бита.
Пример: JB1 LABEL1
Количество байт: 2
Количество циклов: 2
Действие команды:
(PC) = (PC) + 2
IF (ACC.1) = 1 THEN (PC0..7) = Address
Машинный код:
0 0 1 1 0 0 1 0 A d d r e s s JB2 <адрес> - переход если второй бит аккумулятора установлен.
Описание: Если второй бит аккумулятора равен единице, то производится переход к указанному во втором байте команды адресу. В противном случае выполняется следующая команда. Новое значение программного счетчика при переходе вычисляется соединением содержимого старших бит программного счетчика с вторым операндом (вторым байтом команды). Таким образом осуществляется переход в пределах страницы размером в 256 байт. Если команда окажется на границе двух страниц, то переход осуществляется в пределах страницы, где расположен второй байт команды. Команда не воздействует на флаги и не изменяет содержимое проверяемого бита.
Пример: JB2 LABEL1
Количество байт: 2


Количество циклов: 2
Действие команды:
(PC) = (PC) + 2
IF (ACC.2) = 1 THEN (PC0..7) = Address
Машинный код:
0 1 0 1 0 0 1 0 A d d r e s s JB3 <адрес> - переход если третий бит аккумулятора установлен.
Описание: Если третий бит аккумулятора равен единице, то производится переход к указанному во втором байте команды адресу. В противном случае выполняется следующая команда. Новое значение программного счетчика при переходе вычисляется соединением содержимого старших бит программного счетчика с вторым операндом (вторым байтом команды). Таким образом осуществляется переход в пределах страницы размером в 256 байт. Если команда окажется на границе двух страниц, то переход осуществляется в пределах страницы, где расположен второй байт команды. Команда не воздействует на флаги и не изменяет содержимое проверяемого бита.
Пример: JB3 LABEL1
Количество байт: 2
Количество циклов: 2
Действие команды:
(PC) = (PC) + 2
IF (ACC.3) = 1 THEN (PC0..7) = Address
Машинный код:
0 1 1 1 0 0 1 0 A d d r e s s JB4 <адрес> - переход если четвёртый бит аккумулятора установлен.
Описание: Если четвёртый бит аккумулятора равен единице, то производится переход к указанному во втором байте команды адресу. В противном случае выполняется следующая команда. Новое значение программного счетчика при переходе вычисляется соединением содержимого старших бит программного счетчика с вторым операндом (вторым байтом команды). Таким образом осуществляется переход в пределах страницы размером в 256 байт. Если команда окажется на границе двух страниц, то переход осуществляется в пределах страницы, где расположен второй байт команды. Команда не воздействует на флаги и не изменяет содержимое проверяемого бита.
Пример: JB4 LABEL1
Количество байт: 2
Количество циклов: 2
Действие команды:
(PC) = (PC) + 2
IF (ACC.4) = 1 THEN (PC0..7) = Address
Машинный код:
1 0 0 1 0 0 1 0 A d d r e s s JB5 <адрес> - переход если пятый бит аккумулятора установлен.
Описание: Если пятый бит аккумулятора равен единице, то производится переход к указанному во втором байте команды адресу.


В противном случае выполняется следующая команда. Новое значение программного счетчика при переходе вычисляется соединением содержимого старших бит программного счетчика с вторым операндом (вторым байтом команды). Таким образом осуществляется переход в пределах страницы размером в 256 байт. Если команда окажется на границе двух страниц, то переход осуществляется в пределах страницы, где расположен второй байт команды. Команда не воздействует на флаги и не изменяет содержимое проверяемого бита.
Пример: JB5 LABEL1
Количество байт: 2
Количество циклов: 2
Действие команды:
(PC) = (PC) + 2
IF (ACC.5) = 1 THEN (PC0..7) = Address
Машинный код:
1 0 1 1 0 0 1 0 A d d r e s s JB6 <адрес> - переход если шестой бит аккумулятора установлен.
Описание: Если шестой бит аккумулятора равен единице, то производится переход к указанному во втором байте команды адресу. В противном случае выполняется следующая команда. Новое значение программного счетчика при переходе вычисляется соединением содержимого старших бит программного счетчика с вторым операндом (вторым байтом команды). Таким образом осуществляется переход в пределах страницы размером в 256 байт. Если команда окажется на границе двух страниц, то переход осуществляется в пределах страницы, где расположен второй байт команды. Команда не воздействует на флаги и не изменяет содержимое проверяемого бита.
Пример: JB6 LABEL1
Количество байт: 2
Количество циклов: 2
Действие команды:
(PC) = (PC) + 2
IF (ACC.6) = 1 THEN (PC0..7) = Address
Машинный код:
1 1 0 1 0 0 1 0 A d d r e s s JB7 <адрес> - переход если седьмой бит аккумулятора установлен.
Описание: Если седьмой бит аккумулятора равен единице, то производится переход к указанному во втором байте команды адресу. В противном случае выполняется следующая команда. Новое значение программного счетчика при переходе вычисляется соединением содержимого старших бит программного счетчика с вторым операндом (вторым байтом команды). Таким образом осуществляется переход в пределах страницы размером в 256 байт.


Если команда окажется на границе двух страниц, то переход осуществляется в пределах страницы, где расположен второй байт команды. Команда не воздействует на флаги и не изменяет содержимое проверяемого бита.
Пример: JB7 LABEL1
Количество байт: 2
Количество циклов: 2
Действие команды:
(PC) = (PC) + 2
IF (ACC.7) = 1 THEN (PC0..7) = Address
Машинный код:
1 1 1 1 0 0 1 0 A d d r e s s JC <адрес> - переход, если бит переноса установлен.
Описание: Если бит переноса равен единице, то производится переход к указанному во втором байте команды адресу. В противном случае выполняется следующая команда. Новое значение программного счетчика при переходе вычисляется соединением содержимого старших бит программного счетчика с вторым операндом (вторым байтом команды). Таким образом осуществляется переход в пределах страницы размером в 256 байт. Если команда окажется на границе двух страниц, то переход осуществляется в пределах страницы, где расположен второй байт команды. Команда не воздействует на флаги и не изменяет содержимое проверяемого бита.
Пример: JС LABEL1
Количество байт: 2
Количество циклов: 2
Действие команды:
(PC) = (PC) + 2
IF (С) = 1 THEN (PC0..7) = Address
Машинный код:
1 1 1 1 0 1 1 0 A d d r e s s JF0 <адрес> - переход, если бит переноса установлен.
Описание: Если флаг пользователя F0 равен единице, то производится переход к указанному во втором байте команды адресу. В противном случае выполняется следующая команда. Новое значение программного счетчика при переходе вычисляется соединением содержимого старших бит программного счетчика с вторым операндом (вторым байтом команды). Таким образом осуществляется переход в пределах страницы размером в 256 байт. Если команда окажется на границе двух страниц, то переход осуществляется в пределах страницы, где расположен второй байт команды. Команда не воздействует на флаги и не изменяет содержимое проверяемого бита.
Пример: JF0 LABEL1
Количество байт: 2
Количество циклов: 2
Действие команды:


(PC) = (PC) + 2
IF (F0) = 1 THEN (PC0..7) = Address
Машинный код:
1 0 1 1 0 1 1 0 A d d r e s s JF1 <адрес> - переход, если бит переноса установлен.
Описание: Если флаг пользователя F1 равен единице, то производится переход к указанному во втором байте команды адресу. В противном случае выполняется следующая команда. Новое значение программного счетчика при переходе вычисляется соединением содержимого старших бит программного счетчика с вторым операндом (вторым байтом команды). Таким образом осуществляется переход в пределах страницы размером в 256 байт. Если команда окажется на границе двух страниц, то переход осуществляется в пределах страницы, где расположен второй байт команды. Команда не воздействует на флаги и не изменяет содержимое проверяемого бита.
Пример: JF0 LABEL1
Количество байт: 2
Количество циклов: 2
Действие команды:
(PC) = (PC) + 2
IF (F1) = 1 THEN (PC0..7) = Address
Машинный код:
0 1 1 1 0 1 1 0 A d d r e s s JMP <addr 11> - переход на метку.
Описание: осуществляет переход на метку, размещенную по указанному адресу <addr 11>. Команда не воздействует на флаги.
Пример: JMP 311h
Количество байт: 2
Количество циклов: 2
Действие команды:
(PC10-0) = адрес метки
Машинный код:
a10 a9 a8 0 0 1 0 0 a7 a6 a5 a4 a3 a2 a1 a0 JMPP @A - косвенный переход в текущей странице.
Описание: осуществляет переход на адрес, содержащийся в ячейке памяти программ на которую указывает содержимое аккумулятора. Новое значение программного счетчика при переходе вычисляется соединением содержимого старших бит программного счетчика с содержимым аккумулятора. Таким образом осуществляется переход в пределах страницы размером в 256 байт. Команда не воздействует на флаги и не изменяет содержимое аккумулятора.
Пример: JMPP @A
Количество байт: 1
Количество циклов: 2
Действие команды:
(PC7-0) = ((A))
Машинный код:
a10 a9 a8 0 0 1 0 0 a7 a6 a5 a4 a3 a2 a1 a0 JNC <адрес> - переход, если бит переноса сброшен.
Описание: Если бит переноса равен нулю, то производится переход к указанному во втором байте команды адресу.В противном случае выполняется следующая команда. Новое значение программного счетчика при переходе вычисляется соединением содержимого старших бит программного счетчика с вторым операндом (вторым байтом команды). Таким образом осуществляется переход в пределах страницы размером в 256 байт. Если команда окажется на границе двух страниц, то переход осуществляется в пределах страницы, где расположен второй байт команды. Команда не воздействует на флаги и не изменяет содержимое проверяемого бита.
Пример: JNС     LABEL1
Количество байт: 2
Количество циклов: 2
Действие команды:
(PC) = (PC) + 2
IF (С) = 0 THEN (PC0..7) = Address
Машинный код:
1 1 1 0 0 1 1 0 A d d r e s s [ ] [ ] [ ]

если сигнал на ножке запроса


JNI <адрес> - переход, если сигнал на ножке запроса прерывания равен нулю.
Описание: Если на ножке запроса прерывания сигнал равен нулю, то производится переход к указанному во втором байте команды адресу. В противном случае выполняется следующая команда. Новое значение программного счетчика при переходе вычисляется соединением содержимого старших бит программного счетчика с вторым операндом (вторым байтом команды). Таким образом осуществляется переход в пределах страницы размером в 256 байт. Если команда окажется на границе двух страниц, то переход осуществляется в пределах страницы, где расположен второй байт команды. Команда не воздействует на флаги и не изменяет содержимое проверяемого бита.
Пример: JNI     LABEL1
Количество байт: 2
Количество циклов: 2
Действие команды:
(PC) = (PC) + 2
IF (INT) = 0 THEN (PC0..7) = Address
Машинный код:
1 0 0 0 0 1 1 0 A d d r e s s JNT0 <адрес> - переход, если сигнал ножке микроконтроллера T0 равен нулю.
Описание: Если на ножке микроконтроллера T0 сигнал равен нулю, то производится переход к указанному во втором байте команды адресу. В противном случае выполняется следующая команда. Новое значение программного счетчика при переходе вычисляется соединением содержимого старших бит программного счетчика с вторым операндом (вторым байтом команды). Таким образом осуществляется переход в пределах страницы размером в 256 байт. Если команда окажется на границе двух страниц, то переход осуществляется в пределах страницы, где расположен второй байт команды. Команда не воздействует на флаги и не изменяет содержимое проверяемого бита.
Пример: JNT0     LABEL1
Количество байт: 2
Количество циклов: 2
Действие команды:
(PC) = (PC) + 2
IF (T0) = 0 THEN (PC0..7) = Address
Машинный код:
0 0 1 0 0 1 1 0 A d d r e s s JNT1 <адрес> - переход, если бит переноса сброшен.
Описание: Если на ножке микроконтроллера T1 сигнал равен нулю, то производится переход к указанному во втором байте команды адресу.
В противном случае выполняется следующая команда. Новое значение программного счетчика при переходе вычисляется соединением содержимого старших бит программного счетчика с вторым операндом (вторым байтом команды). Таким образом осуществляется переход в пределах страницы размером в 256 байт. Если команда окажется на границе двух страниц, то переход осуществляется в пределах страницы, где расположен второй байт команды. Команда не воздействует на флаги.
Пример: JNT1     LABEL1
Количество байт: 2
Количество циклов: 2
Действие команды:
(PC) = (PC) + 2
IF (T1) = 0 THEN (PC0..7) = Address
Машинный код:
0 1 0 0 0 1 1 0 A d d r e s s JNZ <адрес> - переход, если содержимое аккумулятора не равно нулю.
Описание: Если любой бит аккумулятора равен единице, то производится переход к указанному во втором байте команды адресу. В противном случае выполняется следующая команда. Новое значение программного счетчика при переходе вычисляется соединением содержимого старших бит программного счетчика с вторым операндом (вторым байтом команды). Таким образом осуществляется переход в пределах страницы размером в 256 байт. Если команда окажется на границе двух страниц, то переход осуществляется в пределах страницы, где расположен второй байт команды. Команда не воздействует на флаги и не изменяет содержимое аккумулятора.
Пример: JNZ     LABEL1
Количество байт: 2
Количество циклов: 2
Действие команды:
(PC) = (PC) + 2
IF (A) <> 0 THEN (PC0..7) = Address
Машинный код:
1 0 0 1 0 1 1 0 A d d r e s s JTF <адрес> - переход, если содержимое аккумулятора не равно нулю.
Описание: Если флаг переполнения таймера установлен, то производится переход к указанному во втором байте команды адресу. В противном случае выполняется следующая команда. Новое значение программного счетчика при переходе вычисляется соединением содержимого старших бит программного счетчика с вторым операндом (вторым байтом команды). Таким образом осуществляется переход в пределах страницы размером в 256 байт.


Если команда окажется на границе двух страниц, то переход осуществляется в пределах страницы, где расположен второй байт команды. Команда не воздействует на флаги.
Пример: JTF LABEL1
Количество байт: 2
Количество циклов: 2
Действие команды:
(PC) = (PC) + 2
IF (A) <> 0 THEN (PC0..7) = Address
Машинный код:
0 0 0 1 0 1 1 0 A d d r e s s JT0 <адрес> - переход, если бит переноса сброшен.
Описание: Если на ножке микроконтроллера T0 сигнал равен единице, то производится переход к указанному во втором байте команды адресу. В противном случае выполняется следующая команда. Новое значение программного счетчика при переходе вычисляется соединением содержимого старших бит программного счетчика с вторым операндом (вторым байтом команды). Таким образом осуществляется переход в пределах страницы размером в 256 байт. Если команда окажется на границе двух страниц, то переход осуществляется в пределах страницы, где расположен второй байт команды. Команда не воздействует на флаги и не изменяет содержимое проверяемого бита.
Пример: JT0 LABEL1
Количество байт: 2
Количество циклов: 2
Действие команды:
(PC) = (PC) + 2
IF (T0) = 1 THEN (PC0..7) = Address
Машинный код:
0 0 1 1 0 1 1 0 A d d r e s s JT1 <адрес> - переход, если бит переноса сброшен.
Описание: Если на ножке микроконтроллера T1 сигнал равен единице, то производится переход к указанному во втором байте команды адресу. В противном случае выполняется следующая команда. Новое значение программного счетчика при переходе вычисляется соединением содержимого старших бит программного счетчика с вторым операндом (вторым байтом команды). Таким образом осуществляется переход в пределах страницы размером в 256 байт. Если команда окажется на границе двух страниц, то переход осуществляется в пределах страницы, где расположен второй байт команды. Команда не воздействует на флаги и не изменяет содержимое проверяемого бита.
Пример: JT1 LABEL1
Количество байт: 2
Количество циклов: 2
Действие команды:


(PC) = (PC) + 2
IF (T1) = 1 THEN (PC0..7) = Address
Машинный код:
0 1 0 1 0 1 1 0 A d d r e s s JZ <адрес> - переход, если содержимое аккумулятора не равно нулю.
Описание: Если  все биты аккумулятора равны нулю, то производится переход к указанному во втором байте команды адресу. В противном случае выполняется следующая команда. Новое значение программного счетчика при переходе вычисляется соединением содержимого старших бит программного счетчика с вторым операндом (вторым байтом команды). Таким образом осуществляется переход в пределах страницы размером в 256 байт. Если команда окажется на границе двух страниц, то переход осуществляется в пределах страницы, где расположен второй байт команды. Команда не воздействует на флаги и не изменяет содержимое аккумулятора.
Пример: JZ     LABEL1
Количество байт: 2
Количество циклов: 2
Действие команды:
(PC) = (PC) + 2
IF (A) = 0 THEN (PC0..7) = Address
Машинный код:
1 1 0 0 0 1 1 0 A d d r e s s MOV <приемник>,<источник> - скопировать байтовую переменную.
Описание: переменная, указанная во втором операнде, копируется в ячейку, указываемую первым операндом. Байт источник не изменяется. Другие регистры и флаги не изменяются. Для каждого операнда используется свой вид адресации.
Команда допускает следующие виды адресации:
первый операнд - , второй операнд - адресация;
Пример: MOV A, PSW
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
(A) = (PSW)
Машинный код:
1 1 0 0 0 1 1 1 Пример: MOV A, T
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
(A) = (T)
Машинный код:
0 1 0 0 0 0 1 0 Пример: MOV PSW, A
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
(PSW) = (A)
Машинный код:
1 1 0 1 0 1 1 1 Пример: MOV T, A
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
(T) = (A)
Машинный код:
0 1 1 0 0 0 1 0 первый операнд - , второй операнд - адресация;


Пример: MOV A, R3
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
(A) = (Rn) , n=0,1,2,3,4,5,6,7
Машинный код:
1 1 1 1 1 r r r первый операнд - , второй операнд - адресация;
Пример: MOV A, @R0
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
(A) = ((Ri)) , i=0,1
Машинный код:
1 1 1 1 0 0 0 i первый операнд - , второй операнд - адресация;
Пример: MOV A, #38h
Количество байт: 2
Количество циклов: 1
Действие команды:
(PC) = (PC) + 2
(A) = (data 8)
Машинный код:
0 0 1 0 0 0 1 1 i i i i i i i i первый операнд - , второй операнд - адресация;
Пример: MOV R3, A
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
(Rn) = (A) , n=0,1,2,3,4,5,6,7
Машинный код:
1 0 1 0 1 r r r первый операнд - , второй операнд - адресация;
Пример: MOV R3, #38h
Количество байт: 2
Количество циклов: 1
Действие команды:
(PC) = (PC) + 2
(Rn) = (data 8) , n=0,1,2,3,4,5,6,7
Машинный код:
1 0 1 1 1 r r r i i i i i i i i первый операнд - , второй операнд - адресация;
Пример: MOV @R0, A
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
((Ri)) = (A), i=0,1
Машинный код:
1 0 1 0 0 0 0 i первый операнд - , второй операнд - адресация;
Пример: MOV @R0, #80
Количество байт: 2
Количество циклов: 1
Действие команды:
(PC) = (PC) + 2
((Rn)) = (data 8) , n=0,1,2,3,4,5,6,7
Машинный код:
1 0 1 1 0 0 0 i i i i i i i i i MOVD A,<источник> - считать порт микросхемы расширителя портов.
Описание: содержимое порта расширителя портов копируется в младшую тетраду аккумулятора. Старшая тетрада обнуляется. Команда не воздействует на флаги. В обоих операндах используется адресация.
Пример: MOVD A, P4
Количество байт: 2
Количество циклов: 1
Действие команды:
(PC) = (PC) + 2
(A) = (Pp), p=4,5,6,7
Машинный код:
0 0 0 0 1 1 p p MOVP A, @A - переслать байт из текущей страницы памяти программ в аккумулятор.
Описание: загружает аккумулятор константой из памяти программ.


Адрес считываемого байта задаётся исходным содержимым аккумулятора. Команда не воздействует на флаги.
Пример: MOVP A, @A
Количество байт: 1
Количество циклов: 2
Действие команды:
(PC0..PC7) = (A)
(A) = ((PC))
Машинный код:
1 0 1 0 0 0 1 1 MOVP3 A, @A - переслать байт из третьей страницы памяти программ в аккумулятор.
Описание: загружает аккумулятор константой из памяти программ. Адрес считываемого байта задаётся исходным содержимым аккумулятора. Команда не воздействует на флаги.
Пример: MOVP3 A, @A
Количество байт: 1
Количество циклов: 2
Действие команды:
(PC0..PC7) = (A)
(PC8..PC11) = 0011
(A) = ((PC))
Машинный код:
1 1 1 0 0 0 1 1 MOVX <приемник>,<источник> - переслать байтовую переменную во внешнюю память (из внешней памяти)
Описание: пересылает данные между аккумулятором и байтом внешней памяти.
В первом случае регистр R0 или R1 текущего банка регистров обеспечивает 8- битный адрес, который мультиплексируется с данными на выводах порта P0.
первый операнд - , второй операнд - адресация;
Пример: MOVX A, @R1 ;Скопировать данные из внешней памяти данных в аккумулятор
Количество байт: 1
Количество циклов: 2
Действие команды:
(PC) = (PC) + 1
(A) = ((Ri)), i=0,1
Машинный код:
1 0 0 0 0 0 0 i первый операнд - , второй операнд - адресация;
Пример: MOVX @R0, A ;Скопировать данные из аккумулятора во внешнюю память
Количество байт: 1
Количество циклов: 2
Действие команды:
(PC) = (PC) + 1
((Ri)) = (A), i=0,1
Машинный код:
1 0 0 1 0 0 0 i NOP - нет операции
Описание: Кроме программного счетчика не изменяет ни одного регистра, на флаги не воздействует.
Пример: NOP
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
Машинный код:
0 0 0 0 0 0 0 0 ORL <приемник>,<источник> - "логическое ИЛИ" для байтовых переменных
Описание: выполняет операцию побитового "логического ИЛИ" между указанными переменными. Результат сохраняется в приемнике. Команда не воздействует на флаги.


Для команды ORL с аккумулятором в качестве байта назначения разрешены следующие режимы адресации байта - источника:
первый операнд - , второй операнд - адресация;
Пример: ORL A, R3
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
(A) = (A) V (Rn) , n=0,1,2,3,4,5,6,7
Машинный код:
0 1 0 0 1 r r r первый операнд - , второй операнд - адресация;
Пример: ORL A, @R0
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
(A) = (A) V ((Ri)), i=0,1
Машинный код:
0 1 0 0 0 0 0 i первый операнд - , второй операнд - адресация;
Пример: ORL A, #100
Количество байт: 2
Количество циклов: 2
Действие команды:
(PC) = (PC) + 2
(A) = (A) V (date 8)
Машинный код:
0 1 0 0 0 0 1 1 i i i i i i i i Пример: ORL BUS, #100
Количество байт: 2
Количество циклов: 2
Действие команды:
(PC) = (PC) + 2
(BUS) = (BUS) V (date 8)
Машинный код:
1 0 0 1 1 0 0 0 i i i i i i i i Пример: ORL P1, #10010000b
Количество байт: 2
Количество циклов: 2
Действие команды:
(PC) = (PC) + 2
(Pp) = (Pp) V (date 8), p=1,2
Машинный код:
1 0 0 1 1 0 p p i i i i i i i i Примечание: при выполнении команды ORL над содержимым внешнего порта используется значение из внутреннего регистра, а не данные, присутствующие на выводах микросхемы!
ORLD Pp, A - логическое ИЛИ между портом расширителя и аккумулятором.
Описание: выполняет операцию побитового "логического ИЛИ" между портом микросхемы расширителя портов и аккумулятором. Результат сохраняется в порту. Команда не воздействует на флаги.
Пример: ORLD P5, A
Количество байт: 1
Количество циклов: 2
Действие команды:
(PC) = (PC) + 1
(Pp) = (Pp) V (A0...A3)
Машинный код:
1 0 0 0 1 1 p p OUTL BUS, A - стробируемый вывод данных из аккумулятора в порт BUS.
Описание: осуществляет стробируемый вывод данных из аккумулятора в порт BUS. Команда не воздействует на флаги.
Пример: OUTL BUS, A
Количество байт: 1
Количество циклов: 2
Действие команды:
(PC) = (PC) + 1
(BUS) = (A)


Машинный код:
0 0 0 0 0 0 1 0 OUTL Pp, A - стробируемый вывод данных из аккумулятора в порт.
Описание: осуществляет вывод данных через порт. Команда не воздействует на флаги.
Пример: OUTL Pp, A
Количество байт: 1
Количество циклов: 2
Действие команды:
(PC) = (PC) + 1
(Pp) = (A), p=1,2
Машинный код:
0 0 1 1 1 0 p p RET - возврат из подпрограммы.
Описание: последовательно выгружает старший и младший байты счетчика команд из стека, уменьшая содержимое указателя стека на 1. Выполнение программы продолжается с нового, только что загруженного в счетчик команд адреса. Команда не воздействует на флаги.
Пример: RET
Количество байт: 1
Количество циклов: 2
Действие команды:
(SP) = (SP) - 1
(PC) = ((SP))
Машинный код:
1 0 0 0 0 0 1 1 RETR - возврат из подпрограммы обслуживания прерывания и восстановление слова состояния программы.
Описание: последовательно выгружает старший и младший байты счетчика команд из стека, уменьшая содержимое указателя стека на 1. Кроме того, команда восстанавливает состояние логики прерываний, разрешая обработку следующего прерывания. Выполнение программы продолжается с того же адреса, что был в программном счетчике (PC) до начала обработки прерывания (следующий за командой, во время выполнения которой был обнаружен запрос на прерывание). Команда не воздействует на флаги. Если к этому моменту обнаруживается новый запрос на прерывание, то до нового вызова подпрограммы обслуживания прерывания выполняется одна команда из основной программы.
Пример: RETR
Количество байт: 1
Количество циклов: 2
Действие команды:
(SP) = (SP) - 1
(PC) = ((SP))
(PSW4...PSW7) = ((SP))
Машинный код:
1 0 0 1 0 0 1 1 RL A - сдвиг содержимого аккумулятора влево.
Описание: сдвигает восемь бит аккумулятора на один бит влево, бит 7 засылается на место бита 0. Команда не воздействует на флаги.
Пример: RL A
Количество байт: 1
Количество циклов: 1
Действие команды:
(An+1) = (An) n=0..6
(A0) = (A7)
Машинный код:
1 1 1 0 0 1 1 1 RLC A - сдвиг содержимого аккумулятора влево через флаг переноса.


Описание: сдвигает восемь бит аккумулятора и флаг переноса на один бит влево. Содержимое флага переноса помещается на место бита 0 аккумулятора, а содержимое бита 7 аккумулятора переписывается во флаг переноса. На остальные флаги команда не воздействует.
Пример: RLC A
Количество байт: 1
Количество циклов: 1
Действие команды:
(An+1) = (An) n=0..6
(A0) = (C)
(C) = (A7)
Машинный код:
1 1 1 1 0 1 1 1 RR A - сдвиг содержимого аккумулятора вправо.
Описание: сдвигает восемь бит аккумулятора на один бит вправо, бит 0 засылается на место бита 7. Команда не воздействует на флаги.
Пример: RR A
Количество байт: 1
Количество циклов: 1
Действие команды:
(An) = (An+1) n=0..6
(A7) = (A0)
Машинный код:
0 1 1 1 0 1 1 1 RRC A - сдвиг содержимого аккумулятора через флаг переноса.
Описание: сдвигает восемь бит аккумулятора и флаг переноса на один бит вправо. Содержимое флага переноса помещается на место бита 7 аккумулятора, а содержимое бита 0 аккумулятора переписывается во флаг переноса. На остальные флаги команда не воздействует.
Пример: RRC A
Количество байт: 1
Количество циклов: 1
Действие команды:
(An) = (An+1) n=0..6
(A7) = (C)
(C) = (A0)
Машинный код:
0 1 1 0 0 1 1 1 SEL MB0 - выбор нулевого банка памяти программ.
Описание: сбрасывает старший бит счетчика команд в нулевое состояние. Команда используется для выбора нулевого банка памяти программ.
Пример: SEL MB0
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
(PC11) = 0
Машинный код:
1 1 1 0 0 1 0 1 SEL MB1 - выбор первого банка памяти программ.
Описание: устанавливает старший бит счетчика команд в 1. Команда используется для выбора первого банка памяти программ.
Пример: SEL MB0
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
(PC11) = 1
Машинный код:
1 1 1 1 0 1 0 1 SEL RB0 - выбор нулевого банка памяти программ.
Описание: сбрасывает флаг выбора банков в нулевое состояние. Команда используется для выбора нулевого банка регистров.


Пример: SEL RB0
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
(BS) = 0
Машинный код:
1 1 0 0 0 1 0 1 SEL RB1 - выбор нулевого банка памяти программ.
Описание: устанавливает флаг выбора банков в 1. Команда используется для выбора первого банка регистров.
Пример: SEL RB0
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
(BS) = 1
Машинный код:
1 1 0 1 0 1 0 1 STOP TCNT - остановить таймер-счетчик.
Описание: прекращает подачу импульсов на вход таймера-счетчика.
Пример: STOP TCNT
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
остановить таймер-счетчик
Машинный код:
0 1 1 0 0 1 0 1 STRT CNT - запустить счетчик.
Описание: разрешает подачу импульсов со входа микроконтроллера T1 на вход таймера-счетчика.
Пример: STRT CNT
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
запустить счетчик
Машинный код:
0 1 0 0 0 1 0 1 STRT T - запустить таймер.
Описание: разрешает подачу импульсов с выхода предделителя на вход таймера-счетчика.
Пример: STRT CNT
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
запустить таймер
Машинный код:
0 1 0 1 0 1 0 1 SWAP A - обмен тетрадами внутри аккумулятора.
Описание: команда осуществляет обмен между младшей (биты 0..3) и старшей (биты 4..7) тетрадами аккумулятора. (Тетрада - это четырехбитная переменная). Команду можно интерпретировать как циклический сдвиг на четыре бита. Команда не воздействует на флаги.
Пример: SWAP A
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
(A3..A0) <=> (A7..A4)
Машинный код:
0 1 0 0 0 1 1 1 XCH A,<байт> - обмен содержимого аккумулятора с переменной байтом.
Описание: команда загружает аккумулятор содержимым указанной переменной, в то же самое время первоначальное содержимое аккумулятора заносится по указанному адресу. Команда не воздействует на флаги.
В команде допускается следующие виды адресации: первый операнд - , второй операнд - адресация;


Пример: XCH A, R7
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
(A) <=> (Rn) , n=0,1,2,3,4,5,6,7
Машинный код:
0 0 1 0 1 r r r первый операнд - , второй операнд - адресация;
Пример: XCH A, @R0
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC)= (PC) + 1
(A) <=> ((Ri)) , i=0,1
Машинный код:
0 0 1 0 0 0 0 i XCHD A, @Ri - обмен цифры.
Описание: команда осуществляет обмен между младшей (биты 0..3) тетрадой (тетрада это четырехбитная переменная) аккумулятора, где обычно хранится двоично-десятичная цифра с тетрадой ячейки внутреннего ОЗУ. Используется косвенно регистровая адресация. Старшие тетрады (биты 4..7) обоих операндов не изменяются. Команда не воздействует на флаги.
Пример: XCHD A, @R0
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
(A3..A0) <=> ((Ri3..Ri0)) , i=0,1
Машинный код:
0 0 1 1 0 0 0 i XRL <байт приемник>,<байт источник> - исключающее ИЛИ для переменных байтов.
Описание: выполняет операцию побитового "исключающее логического ИЛИ" между указанными переменными. Результат сохраняется в приемнике. Команда не воздействует на флаги.
Для команды XRL с аккумулятором в качестве байта назначения разрешены следующие режимы адресации:
первый операнд - , второй операнд - адресация;
Пример: XRL A, R3
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
(A) = (A) xor (Rn) , n=0,1,2,3,4,5,6,7
Машинный код:
1 1 0 1 1 r r r
первый операнд - , второй операнд - адресация;
Пример: XRL A, @R0
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
(A) = (A) xor ((Ri)) , i=0,1
Машинный код:
1 1 0 1 0 0 0 i
первый операнд - , второй операнд - адресация;
Пример: XRL A, #100
Количество байт: 2
Количество циклов: 1
Действие команды:
(PC)= (PC) + 2
(A) = (A) xor (date 8)
Машинный код:
1 1 0 1 0 0 1 1
i i i i i i i i
[ ] [ ] [ ]

и имеет отдельное от памяти


Память программ предназначена для хранения программ и имеет отдельное от памяти данных адресное пространство объемом 4 Кбайта, причем для некоторых микросхем (например КР1816ВЕ48, КМ1816ВЕ49) для хранения программ на кристалле микроконтроллера расположено ПЗУ. Это ПЗУ отображается в область младших адресов памяти программ. Учитывая, что выполнение программы после сброса микроконтроллера всегда начинается с нулевого адреса памяти программ, то при включении питания начнет выполняться программа, записанная во внутреннем ПЗУ микроконтроллера. Микроконтроллеры, не имеющие внутреннего ПЗУ (например КР1816ВЕ35 или 8035) могут работать только с внешней микросхемой ПЗУ емкостью до 4 Кбайт. Микроконтроллеры семейства MCS-48 имеют внешний вывод EA, с помощью которого можно запретить работу внутренней памяти, для чего необходимо подать на вывод EA логический "0" (соединить этот вывод с корпусом). При этом внутренняя память программ отключается и, начиная с нулевого адреса, все обращения происходят к внешней памяти программ.

Доступ к внешней памяти программ осуществляется в двух случаях:

при действии сигнала EA=0 независимо от адреса обращения, в любом случае, если программный счетчик (РС) содержит число большее, чем максимальная ячейка внутренней памяти программ. Распределение памяти программ микроконтроллера КР1816ВЕ48 представлено ниже:

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

Переключение страниц памяти программ осуществляется командами

;Выбрать первую страницу

;Выбрать нулевую страницу
Рисунок 2. Адресное пространство памяти программ.

Для других микроконтроллеров этого семейства изменяется только объем внутренней памяти программ. При использовании портов P1 и P2 в качестве дополнительных адресных расширителей объём доступной внешней памяти программ может быть увеличен до 16 Мбайт.

Ниже приведены адреса векторов прерываний и соответствующие им аппаратурные источники прерываний программы:

Вектор прерывания Флаги, вызывающие прерывание Источник прерывания
0000Н - Рестарт (сброс) контроллера RESET
0003Н IE внешнее прерывание INT
0007Н TF Таймер


построены по Гарвардской архитектуре.


Микроконтроллеры семейства MCS- 48 построены по Гарвардской архитектуре. Это означает, что память данных и память программ в этих микросхемах разделены и имеют отдельное адресное пространство. В этих микроконтроллерах имеется три адресных пространства: , и . Такое построение памяти позволяет реализовывать максимально надёжные системы.

Схема подключения внешних микросхем памяти к микроконтроллерам семейства MCS-48 показана на рисунке 1. Регистр адреса D3 на этой схеме предназначен для запоминания младших 8-ми бит адреса, передаваемых через шину данных/памяти. Старшие четыре бита адреса передаются через шину адреса, совмещенную с портом P2. Во время передачи адреса, микроконтроллер вырабатывает синхроимпульс на ножке ALE. Именно этот импульс позволяет запомнить младший байт адреса в регистре D3.

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



Рисунок 1. Схема подключения схем внешней памяти к микроконтроллерам семейства MCS-48


Режим счётчика


В режиме счетчика содержимое счетчика инкрементируется под воздействием перехода из 1 в 0 внешнего входного сигнала, подаваемого на вывод микроконтроллера T1. Так как на распознавание периода требуются три машинных цикла то, минимальное время между импульсами равно 7,5 мкс. Минимальная длительность единичного сигнала на входе T1 при частоте кварцевого резонатора 6 МГц равна 0,5 мкс. На длительность периода входных сигналов ограничений сверху нет.

Запуск счётчика осуществляется командой , а остановка . Количество подсчитанных импульсов можно считать командой  .

[ ] [ ] [ ]



Режим таймера


Таймер состоит из пятиразрядного предварительного делителя на 32 и восьмиразрядного суммирующего счётчика. На вход предделителя поступают сигналы основной синхронизации ALE с периодом 2,5 мкс (15 периодов задающего генератора тактовой частоты). Таким образом минимальный промежуток времени, задаваемый при помощи таймера равен 80 мкс. Путём предварительной записи информации в таймер можно регулировать время, задаваемое таймером от 80 мкс до 20,48 мс. Эти значения определяются тем, что в таймер T можно записать 256 различных чисел. Если требуется больший временной интервал, то его можно получить программным путём с использованием любой ячейки внутренней памяти. Схема таймера приведена на рисунке 1.

Рисунок 1. Схема таймера микроконтроллеров семейства MCS-48.

Когда содержимое счетчика изменяется из состояния все "1" в состояние все "0" , то устанавливается (принимает значение "1") флаг прерывания таймера TF0 или TF1.

Обычно пользователя интересует не максимальный интервал времени, а свой конкретный интервал времени, меньший максимально возможного. Для уменьшения интервала времени в регистр таймера можно предварительно занести число и тем самым сформировать произвольный интервал времени. Рассмотрим пример подготовки таймера T для формирования временного интервала 5мс.

;Настроить таймер на генерацию 5-ти миллисекундного интервала времени-------------------------------------- mov A, #-62 ;Загрузить таймер числом 9Eh, равным числу -62 - количество периодов mov T, A ;входной частоты таймера (62 периода таймера = 62*80 мкс = 4,96 мс) STRT T ;Запустить таймер OjidanTimer: JTF SledKomanda ;Подождать пока не переполнится таймер JMP OjidanTimer SledKomanda: STOP TCNT ;Остановить таймер

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


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

Реализована побайтовая (8 бит) и потетрадная (4 бита) обработка данных. Микросхемы семейства MCS-48 - это 8-разрядные микропроцессоры, а это означает, что ПЗУ, ОЗУ, регистры специального назначения, АЛУ и внешние шины имеют байтовую организацию.

В машинном коде команда занимает один, или два байта в зависимости от типа команды. Команды выполняются за один или два машинных цикла. При этом большинство команд выполняются за один машинный цикл длительностью 2,5 мкс (при 6 МГц кварцевом резонаторе).

Запись команд в машинных кодах для человека неудобна, кроме того, разные машинные команды выполняют одинаковые действия только над разными ячейками памяти. Поэтому для записи команд микропроцессоров была придумана система мнемонических обозначений. Для записи команды микропроцессора сначала ставится мнемоническое обозначение, затем указывается ячейка памяти – приёмник результата выполнения операции и наконец источник данных для выполнения операции. Например, в команде

MOV A, R2 символы MOV обозначают операцию копирования, второй операнд R2 определяет, что данные необходимо взять из регистра R2 текущего банка регистров, а первый операнд A определяет, что результат необходимо поместить в регистр – аккумулятор. При этом старое значение регистра – аккумулятора будет стёрто.

Мнемоническое обозначение команды отделяется от операндов одним или несколькими символами пробела или табуляции, а операнды отделяются друг от друга запятыми.

Если операция требует для выполнения двух источников и одного приёмника результата операции (например, команда сложения ADD или логического умножения ANL), то первый операнд является одновременно и источником и приёмником результата операции. Например, в команде

ADD A, R1 символы ADD обозначают операцию сложения двух чисел, данные будут взяты из регистра R1 текущего банка регистров и аккумулятора а результат будет помещён в аккумулятор вместо старого значения этого регистра.



В таблице 1 приведены инструкции, влияющие на установку флагов.

Таблица 1

Мнемоника Флаги
C AC F0 F1 TF BS DBF
ADD, ADDC + + - - - - -
DA + + - - - - -
CLR C 0 - - - - - -
CPL C + - - - - - -
CLR F0 - - 0 - - - -
CPL F0 - - + - - - -
CLR F1 - - - 0 - - -
CPL F1 - - - + - - -
JTF - - - - 0 - -
RRC + - - - - - -
RLC + - - - - - -
MOV A, PSW + + + - - + -
RETR + + + - - + -
SEL MB0, SEL MB1 - - - - - - +
SEL RB0, SEL RB1 - - - - - + -
Систему команд микроконтроллера условно можно разбить на пять групп:



Микроконтроллеры этого семейства явились одним


Микроконтроллеры этого семейства явились одним из первых представителей однокристальных ЭВМ - . Первоначально фирмой Intel была разработана микросхема 8048, на основе модификации которой и было построено всё семейство микроконтроллеров. В структуре этого микроконтроллера явно прослеживается наследие от микропроцессора 8085 (отечественный аналог 1821ВМ85). Отечественная промышленность тоже выпускала микроконтроллеры этого семейства. Производство микроконтроллера 8048 осуществлялось в Новосибирске (КР1816ВЕ48, КР1816ВЕ49, КР1816ВЕ35, 1850ВЕ49). В таблице 1 приведены параметры этих микросхем.

Таблица 1. Микросхемы, входящие в состав семейства MCS-48

Микроконтроллер ОЗУ ПЗУ Таймер порты системная шина
8048 64 байт 1К байт 1 6 2 есть
8049 128 байт 2К байт 1 11 2 есть
8035 64 байт - 1 11/6 2 есть
КР1816ВЕ48 64 байт 1К байт 1 6 2 есть
КР1816ВЕ49 128 байт 2К байт 1 11 2 есть
КР1816ВЕ35 64 байт - 1 11/6 2 есть
КР1850ВЕ49 256 байт 2К байт 1 11 2 есть
Удачный набор периферийных устройств, возможность гибкого выбора внешней или внутренней программной памяти и приемлемая цена обеспечили популярность этому микроконтроллеру успех. К сожалению недостаточное количество параллельных портов и малые возможности внутреннего таймера привели к тому, что это семейство было быстро вытеснено семейством микроконтроллеров MCS-51.

Недостаточный объём внутренней памяти, как показал успех PIC-контроллеров фирмы microchip, не являлся определяющим в том, что это семейство микроконтроллеров исчезло с рынка. Возможно большую роль сыграло нежелание фирмы Intel снижать цены на свою продукцию. Стоимость отечественных микросхем семейства MCS-48 и MCS-51 практически не различались, поэтому естественно разработчики как только появилась возможность перешли на использование микроконтроллеров семейства MCS-51.

[ ] [ ] [ ]


Способы адресации операндов


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

Неявная адресация При неявной адресации регистр источник или регистр приёмник подразумевается в самом коде операции. Например:

RR A ;сдвиг содержимого аккумулятора вправо DA A ;десятичная коррекция аккумулятора

Регистровая адресация используется для обращения к восьми рабочим регистрам выбранного банка рабочих регистров. Номер регистра записывается в трех младших битах команды. Например:

 MOV A, R7 ;Во втором операнде использована регистровая адресация (в первом операнде неявная адресация)

Косвенно-регистровая адресация используется для обращения к ячейкам внутреннего ОЗУ данных. В качестве регистров-указателей используются регистры R0, R1 выбранного банка регистров. Примеры использования косвенно-регистровой адресации:

;Косвенно-регистровая адресация использована во втором операнде ;Косвенно-регистровая адресация использована в первом операнде

Косвенно - регистровая адресация используется также для обращения к внешней памяти данных. В этом случае с помощью регистров- указателей R0 и R1 (рабочего банка рабочих регистров) выбирается ячейка из блока 256 байт внешней памяти данных. Номер блока предварительно задается содержимым порта Р2. Например:

;Косвенно-регистровая адресация использована во втором операнде ;Косвенно-регистровая адресация использована в первом операнде

Косвенно- регистровая адресация по содержимому аккумулятора А упрощает просмотр таблиц, записанных в памяти программ. Любой байт из таблицы может быть выбран по адресу, определяемому содержимым аккумулятора А, например:

Непосредственная адресация позволяет выбрать из адресного пространства памяти программ константы, явно указанные в команде, например:

;помещает в аккумулятор число 11h ;помещает в регистр R5 число 48

[ ] [ ] [ ]



и предназначены для обеспечения обмена


Порты P1, P2 являются квазидвунаправленными портами ввода - вывода и предназначены для обеспечения обмена информацией микроконтроллера с внешними устройствами, образуя 16 линий ввода- вывода. Каждый из портов содержит восьмиразрядный регистр, позволяющий устанавливать (запись '1') или сбрасывать (запись '0') любой разряд этого регистра с помощью программного обеспечения. Выходы регистров квазидвунаправленного порта соединены с внешними ножками микросхемы. Упрощенная схема одного разряда порта показана на рисунке 1

При записи в разряд порта (в триггере Т) логического '0' выходной транзистор открывается и на выводе микросхемы появляется низкий потенциал, изменить который извне невозможно. Поэтому при опросе ножки микросхемы входная информация в этом случае всегда будет восприниматься как логический '0' независимо от состояния выходов внешних устройств. Если в указанный разряд записать логическую '1', то выходной транзистор закрывается и на выводе микросхемы появляется высокий потенциал за счет генератора тока. Он может извне изменен на нулевой потенциал (замыканием этой ножки микросхемы на корпус). В этом случае, считываемая микроконтроллером информация, будет соответствовать информации на выходе внешнего устройства. Поэтому, перед тем как осуществить ввод информации по какому-либо выводу порта, соответствующий разряд необходимо настроить на ввод - записать в него логическую '1'.

Рисунок 1. Упрощенная схема одного бита порта.
Один разряд регистра - защелки порта представляет собой D-триггер. Данные с внутренней шины микроконтроллера записываются в регистр-защелку по сигналу "запись в защелку". Значение сигнала с внешнего вывода порта считывается по сигналу "чтение вывода". При чтении ножки микросхемы осуществляется операция логического "И" между сигналом на ножке микросхемы и содержимым триггера квазидвунаправленного порта. Поэтому перед чтением ножки микросхемы необходимо записать в соответствующий разряд порта логическую единицу. Чтение внешних ножек микросхемы осуществляется командами: ;Скопировать состояние ножек порта P1 в аккумулятор ;Скопировать состояние ножек порта P2 в аккумулятор Вывод информации через параллельные порты осуществляется командами:

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

Порты микросхемы служат для управления , подключенными к микроконтроллеру. Схема подключения простейших внешних устройств приведена на рисунке 2. Этот рисунок иллюстрирует особенности подключения индикаторов к параллельным портам микроконтроллера MCS-48.



Рисунок 2. Схема подключения светодиодных индикаторов к параллельному порту.

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



Рисунок 3. Эквивалентная схема подключения светодиодного индикатора к параллельному порту.

Для умощнения выводов порта можно применить транзисторный ключ, показанный на рисунке 2. Обратите внимание, что база транзистора подключена непосредственно к выводу порта. Это стало возможным только благодаря использованию в схеме порта генератора тока в верхнем плече выходного каскада (Схему подключения устройств к портам с TTL выходами можно посмотреть ). Если выходного тока достаточно для открывания транзисторного ключа, то резистор R2 не используется. Этот резистор подключается для увеличения базового тока транзисторного ключа. На максимальное значение тока через этот резистор накладываются те же ограничения, что и для непосредственного подключения светодиодного индикатора к выводам порта.

Это были рассмотрены схемотехнические особенности применения параллельных портов. Однако управлять напряжением на выходе параллельного порта микроконтроллера можно только при помощи программы. В приведённой на рисунке 2 схеме, для зажигания светодиода VD1, в шестой вывод порта P0 необходимо записать логический 0. Для зажигания светодиода VD2 необходимо в седьмой разряд порта P2 записать логическую единицу.



Для записи числа в порт ( изменения потенциалов на ножках микросхемы) можно воспользоваться следующими способами:

OUTL (выдача в порт константы), например  MOV A, #56h ;Установить единичный сигнал на ножках 1,2,4 и 6 порта P2 OUTL P2, A ;и нулевой потенциал на ножках 0,3,5 и 7 MOV A, #01110011b ;Выдать на все восемь выводов порта P1 OUTL P1, A ;двоичное число 01110011 ANL (использование логического 'И' для обнуления выбранных маской бит), например: MOV A, 56 ;Занести в аккумулятор копию порта P1 ANL P1, #11110011b ;сформировать низкий потенциал на ножках P1.2 и P1.3 OUTL P1, A ;записать новое значение в порт P1 XRL (использование операции исключающее 'ИЛИ' для инвертирования выбранных бит), например MOV A, 56 ;Занести в аккумулятор копию порта P1 XRL A, #01000010b ;инвертировать состояние ножек P1.1 и P1.6 OUTL P1, A ;записать новое значение в порт P1 ORL (использование операции логическое 'ИЛИ' для записи единиц в выбранные биты), например MOV A, 56 ;Занести в аккумулятор копию порта P1 ORL A, #00100001b ;выдать высокий потенциал на ножках P1.0 и P1.5 OUTL P1, A ;записать новое значение в порт P1 По той же причине при настройке выводов порта на выполнение альтернативных функций в соответствующие разряды должны быть записаны логические '1'.

Порт P1. Этот квазидвунаправленный порт никаких особенностей не имеет. При сбросе микросхемы во все разряды порта P2 записываются '1'.



Рисунок 4. Подключение внешней памяти программ и памяти данных.

Порт P2. Младшая тетрада порта может быть использована для передачи старших четырёх бит адреса при работе с внешней памятью программ и внешней памятью данных (с 12- разрядным адресом). Схема использования порта P2 в качестве шины адреса приведена на рисунке 4. При сбросе микросхемы во все разряды порта P2 записываются '1'. Кроме того через младшие четыре разряда порта 2 могут быть использованы для подключения микросхемы расширителя портов.

Порт D/A. Может быть использован для стробируемого вывода данных. Стробирование данных производится сигналом WR.Над этим портом возможно выполнение логических операций, что может сократить длину программ, приведённых выше, до одной команды.

[ ] [ ] [ ]


внутренний таймер может быть


В микроконтроллерах семейства MCS- 48 внутренний таймер может быть использован как в режиме так и в режиме .


предназначена для временного хранения информации,


Внешняя память данных предназначена для временного хранения информации, используемой в процессе выполнения программы. Эта память физически должна быть подключена к микросхеме микроконтроллера при помощи схемы, изображенной на рисунке 1. Максимальный объем этой памяти определяется регистрами R0 и R1 и составляет 256 байт. Точно также как и в случае внешней памяти программ, объем внешней памяти данных может быть увеличен за счет использования портов P1 и P2 до 16 Мбайт.

Для обращения к внешней памяти данных используются команды: или (команды чтения)

MOVX @R0, или MOVX @R1, A (команды записи)
Рисунок 3. Адресное пространство внешней памяти данных.

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


предназначена для временного хранения информации,


Внутренняя память данных (RAM) предназначена для временного хранения информации, используемой в процессе выполнения программы. Адресное пространство внутренней памяти данных представляет собой 256 восьмиразрядных ячеек, с адресами от 000h до 0FFh. Для микроконтроллеров 8048, 8035, КР1816ВЕ35, КР1816ВЕ48 из них доступно только 64 ячейки памяти.  Для микроконтроллеров 8049, КР1816ВЕ49 из них доступно 128 ячеек памяти. И только для микроконтроллеров 1850ВЕ49 доступны все 256 ячеек внутренней памяти данных. Распределение адресного пространства памяти данных микроконтроллеров серии MCS-48 приведено на рисунке 4.

Младшие 32 байта внутреннего ОЗУ данных объединены с 2мя банками регистров (RB0 - RB1) и восьмиуровневым стеком микроконтроллера. Банк регистров состоит из восьми восьмиразрядных регистров с именами R0, R1, …, R7. Два банка регистров служат для организации независимой работы основной программы и подпрограмм обслуживания прерываний. Переключение банков регистров производится при помощи особого бита BS регистра слова состояния программы PSW командами SEL RB0 и SEL RB1.

Команды программы могут обращаться к регистрам, используя их имена R0-R7 (MOV A, R0 или MOV R7, A), или используя их адрес во внутренней памяти данных (доступна только косвенно-регистровая адресация). Например:

MOV R0, #5 MOV A, @R0 или

MOV R0, #7 MOV @R0, A).


Рисунок 4. Адресное пространство внутренней памяти данных.

Следующие после второго банка регистров ячейки памяти образуют обычное ОЗУ.

Ячейки внутренней памяти данных с адресами 8 - 23 представляют из себя аппаратный 8 - ми уровневый стек, где сохраняются адреса возвратов из подпрограмм. В составе системы команд отсутствуют команды сохранения регистров в стеке. То есть разработчик программы вынужден следить за использованием регистров во вложенных подпрограммах. Это, наряду с малой глубиной аппаратного стека, сильно ограничивает возможности по написанию программ для микроконтроллеров семейства MCS-48.

[ ] [ ] [ ]


в значительной мере предопределяется ее


Архитектура семейства MCS-51 в значительной мере предопределяется ее назначением - построение компактных и дешевых цифровых устройств. Все функции микроЭВМ реализуются с помощью единственной микросхемы. В состав семейства MCS-51 входит целый ряд микросхем от самых простых микроконтроллеров до достаточно сложных. Микроконтроллеры семейства MCS-51 позволяют выполнять как задачи управления различными устройствами, так и реализовывать отдельные узлы аналоговой схемы. Все микросхемы этого семейства работают, большинство из них выполняется в одинаковых корпусах с совпадающей цоколевкой (нумерация ножек для корпуса). Это позволяет использовать для разработанного устройства микросхемы разных фирм - производителей (таких как и т.д.) без переделки принципиальной схемы устройства и программы.

Рис 1. Структурная схема контроллера К1830ВЕ751

Структурная схема контроллера представлена на рис.1. и состоит из следующих основных функциональных узлов: блока управления, арифметико-логического устройства, блока таймеров/счетчиков, блока последовательного интерфейса и прерываний, программного счетчика, памяти данных и памяти программ. Двусторонний обмен осуществляется с помощью внутренней 8-разрядной магистрали данных. Рассмотрим подробнее назначение каждого блока. По такой схеме построены практически все представители семейства MCS-51. Различные микросхемы этого семейства различаются только регистрами специального назначения (в том числе и количеством портов). Система команд всех контроллеров семейства MCS-51 содержит 111 базовых команд с форматом 1, 2 или 3 байта и не изменяется при переходе от одной микросхемы к другой. Это обеспечивает прекрасную переносимость программ с одной микросхемы на другую.

Блок управления и синхронизации

Блок управления и синхронизации (Timing and Control) предназначен для выработки синхронизирующих и управляющих сигналов, обеспечивающих координацию совместной работы блоков ОЭВМ во всех допустимых режимах ее работы.В состав блока управления входят:



устройство формирования временных интервалов, логика ввода-вывода, регистр команд, регистр управления потреблением электроэнергии, дешифратор команд, логика управления ЭВМ. Устройство формирования временных интервалов предназначено для формирования и выдачи внутренних синхросигналов фаз, тактов и циклов. Количество машинных циклов определяет продолжительность выполнения команд. Практически все команды ОЭВМ выполняются за один или два машинных цикла, кроме команд умножения и деления, продолжительность выполнения которых составляет четыре машинных цикла. Обозначим частоту задающего генератора через Fг. Тогда длительность машинного цикла равна 12/Fг или составляет 12 периодов сигнала задающего генератора. Логика ввода - вывода предназначена для приема и выдачи сигналов, обеспечивающих обмен информации с внешними устройствами через порты ввода вывода Р0-Р3.

Регистр команд предназначен для записи и хранения 8-ми разрядного кода операции выполняемой команды. Код операции, с помощью дешифратора команд и логики управления ЭВМ, преобразуется в микропрограмму выполнения команды.

Регистр управления потреблением (PCON) позволяет останавливать работу микроконтроллера для уменьшения потребления электроэнергии и уменьшения уровня помех от микроконтроллера. Еще большего уменьшения потребления электроэнергии и уменьшения помех можно добиться, остановив задающий генератор микроконтроллера. Этого можно достичь при помощи переключения бит регистра управления потреблением PCON. Для варианта изготовления по технологии n-МОП (серия 1816 или иностранных микросхем, в названии которых в середине отсутствует буква 'c') регистр управления потреблением PCON содержит только один бит, управляющий скоростью передачи последовательного порта SMOD, а биты управления потреблением электроэнергией отсутствуют.

Арифметико-логическое устройство (ALU) представляет собой параллельное восьмиразрядное устройство, обеспечивающее выполнение арифметических и логических операций. АЛУ состоит из:

регистров аккумулятора, регистров временного хранения TMP1 и TMP2, ПЗУ констант, сумматора, дополнительного регистра (регистра В), аккумулятора (ACC), регистра состояния программ (PSW). Регистр аккумулятор и регистры временного хранения - восьмиразрядные регистры, предназначенные для приема и хранения операндов на время выполнения операций над ними.


Эти регистры программно не доступны.

ПЗУ констант обеспечивает выработку корректирующего кода при двоично-десятичном представлении данных, кода маски при битовых операциях и кода констант.

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

Регистр B - восьмиразрядный регистр, используемый во время операций умножения и деления. Для других инструкций он может рассматриваться как дополнительный сверхоперативный регистр.

Аккумулятор - восьмиразрядный регистр, предназначенный для приема и хранения результата, полученного при выполнении арифметико-логических операций или операций сдвига

Блок последовательного интерфейса и прерываний (ПИП) предназначен для организации ввода - вывода последовательных потоков информации и организации системы прерывания программ. В состав блока входят:

буфер ПИП, логика управления, регистр управления, буфер передатчика, буфер приемника, приемопередатчик последовательного порта, регистр приоритетов прерываний, регистр разрешения прерываний, логика обработки флагов прерываний и схема выработки вектора. Счетчик команд (Program Counter) предназначен для формирования текущего 16-разрядного адреса внутренней памяти программ и 8/16-разрядного адреса внешней памяти программ. В состав счетчика команд входят 16-разрядные буфер РС, регистр РС и схема инкремента (увеличения содержимого на 1).

предназначена для временного хранения информации, используемой в процессе выполнения программы.

являются квазидвунаправленными портами ввода - вывода и предназначены для обеспечения обмена информацией ОЭВМ с внешними устройствами, образуя 32 линии ввода- вывода.

Регистр состояния программы (PSW) предназначен для хранения информации о состоянии АЛУ при выполнении программы.

предназначена для хранения программ и представляет собой постоянное запоминающее устройство (ПЗУ).В разных микросхемах применяются масочные, стираемые ультрафиолетовым излучением или FLASH ПЗУ.

Регистр указателя данных (DPTR) предназначен для хранения 16 - разрядного адреса внешней памяти данных или памяти программ.

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

[ ]


Арифметические команды


В наборе команд микроконтроллера имеются следующие арифметические операции:

, , , , , .

Действия производятся над целыми числами без знака.

При операции умножения содержимое аккумулятора A умножается на содержимое регистра B, и результат размещается следующим образом: младший байт в регистре B, старший - в регистре А.

В случае выполнения операции деления целое от деления помещается в аккумулятор A, остаток - в регистр В.



Битовые команды


Каждый бит из битового пространства внутренней памяти может быть установлен в 1, сброшен в 0, или инвертирован:

установить бит (записать логическую единицу) ; сбросить бит (записать логический ноль) ; проинвертировать значение бита (изменить на прямо противоположное) ; бит может быть записан во флаг переноса или считан из флага переноса .

Могут быть реализованы переходы:

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

Между любым битом из битового пространства внутренней памяти и флагом переноса могут быть произведены логические операции "И" или "ИЛИ".

И ( ), ИЛИ ( ),

Использование таймера в качестве частотомера


Известно, что измерение частоты можно произвести, подсчитав количество периодов неизвестной частоты за единицу времени. Принцип измерения частоты иллюстрируется рисунком 10.

Рисунок 10. Принцип измерения частоты

Для измерения частоты измеряемый сигнал подаётся на вывод микроконтроллера Tx. Таймер/счётчик настраивается в режим счётчика записью в бит C/Tx логической единицы. Содержимое таймера обнуляется. Таймер включается на строго определённый интервал времени. Этот интервал задаётся оставшимся таймером.

Пример программы измерения частоты сигнала на ножке микроконтроллера T0 приведён на рисунке 11.

mov TMOD,#00010101b ; ;++-------Перевести таймер T0 в шестнадцатиразрядный режим ;|+---------Работать от сигнала на ножке T0 ;+----------Запретить управление таймером от ножки INT0 ;++-----------Перевести таймер T1 в шестнадцатиразрядный режим ;|+-------------Синхронизироваться от внутреннего генератора ;+--------------Запретить управление таймером от ножки INT1 mov TH0, #0 ;Обнулить старший байт счётчика mov TL0, #0 ;Обнулить младший байт счётчика ;---измерение вести 1 мс--------------------------------------------------------- mov TH1, #HIGH(-1000) ;Загрузить старший байт таймера mov TL1, #LOW(-1000) ;Загрузить младший байт таймера mov TCON,#01010000b ;Включить частотомер ; ;|+-------Прерывание от ножки INT1возникает по фронту ;+--------Сбросить запрос прерывания от ножки INT1 ;|+---------Прерывание от ножки INT1возникает по фронту ;+----------Сбросить запрос прерывания от ножки INT1 ;|+-----------Включить таймер T0 ;+------------Обнулить флаг таймера T0 ;|+-------------Включить таймер T1 ;+--------------Обнулить флаг таймера T1 TstTimeOut: jnb TF1, TstTimeOut ;Если 1 мс прошла mov TCON, #00000000b ;то отключить частотомер ; ;|+-------Прерывание от ножки INT1 возникает по фронту ;+--------Сбросить запрос прерывания от ножки INT1 ;|+---------Прерывание от ножки INT1возникает по фронту ;+----------Сбросить запрос прерывания от ножки INT1 ;|+-----------Отключить таймер T0 ;+------------Обнулить флаг таймера T0 ;|+-------------Отключить таймер T1 ;+--------------Обнулить флаг таймера T1

Рисунок 11. Программа измерения частоты

Если теперь на вход микроконтроллера T0 подать сигнал с неизвестной частотой, то в регистрах TH0 и TL0 будет записана его частота в килогерцах.

[ ]



Использование таймера в качестве измерителя ширины импульсов


Известно, что измерение длительности импульса можно произвести, подсчитав импульсы эталонной частоты. Принцип измерения длительности импульсов иллюстрируется рисунком 8.

Для измерения длительности импульса измеряемый сигнал подаётся на вывод микроконтроллера INTx и в бит управления GATE записывается разрешающий сигнал логической единицы. Таймер/счётчик настраивается в режим таймера записью в бит C/Tx логического нуля. Содержимое таймера обнуляется.

Пример программы измерения длительности импульса приведён на рисунке 9.

Рисунок 8. Принцип измерения длительности импульсов

mov TMOD,#00001001b ; ;++--Перевести таймер T0 в шестнадцатиразрядный режим ;|+----Синхронизироваться от внутреннего генератора ;+-----Включать таймер от ножки микроконтроллера INT0 ;++------Перевести таймер T1 в тринадцатиразрядный режим ;|+--------Синхронизироваться от внутреннего генератора ;+---------Запретить управление таймером от ножки INT1 mov TH0, #0 ;Обнулить старший байт таймера mov TL0, #0 ;Обнулить младший байт таймера setb TR0 ;Включить измеритель ширины импульса TstLog0: jnb INT0, TstLog0 ;Подождать начало импульса TstLog1: jnb INT0, TstLog1 ;Подождать конец импульса Clr TR0 ;Отключить измеритель ширины импульса

Рисунок 9. Программа измерения длительности импульсов

Если теперь на вход микроконтроллера INT0 подать импульс с неизвестной длительностью, то в регистрах TH0 и TL0 будет записана его длительность в микросекундах.



Команды пересылки данных


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

копирование данных во внутреннем ОЗУ: ; обмен данными аккумулятора с внутренним ОЗУ: , копирование из внешней памяти данных: копирование данных из памяти программ:

Примеры использования команд пересылки данных:

Любая ячейка 256- байтового блока внутреннего ОЗУ данных может быть выбрана с использованием косвенно-регистровой адресации через регистры указатели R0 и R1 (выбранного банка рабочих регистров):

;Скопировать число из ячейки памяти с адресом, хранящемся в R0, в аккумулятор ;Скопировать число из аккумулятора, в ячейку памяти с адресом, хранящемся в R1

Команды пересылки с прямой адресацией между ячейками памяти позволяют заносить содержимое порта в ячейку внутреннего ОЗУ или обмениваться содержимым ячеек внутреннего ОЗУ между собой без использования аккумулятора:

;Скопировать содержимое 25-й ячейки в 15-ю ячейку

Таблицы символов (кодов), записанные в ПЗУ программы могут быть скопированы в аккумулятор с помощью команд передачи данных с :

;Скопировать символ в аккумулятор

Ячейка адресного пространства 64 Кбайт внешнего ОЗУ также может быть выбрана с использованием адресации через регистр указатель данных DPTR:

;Скопировать число из внешней ячейки памяти с адресом, ;хранящемся в DPTR, в аккумулятор

Содержимое аккумулятора может быть обменено с содержимым рабочих регистров выбранного банка:

A, R0.

Кроме того, любой бит с может быть скопирован в бит переноса и наоборот:

C, AdrBit

Команды ветвления и передачи управления


Команды ветвления позволяют реализовывать и . В микроконтроллерах семейства MCS-51 доступны следующие команды:

безусловный переход: , , Вызов и возврат из подпрограммы: , , , проверка содержимого аккумулятора: , , , проверка флага переноса С: , проверка содержимого любого бита в : , ,

Команды 16-разрядных безусловных переходов и вызовов позволяют осуществить переход в любую точку адресного пространства памяти программ объемом до 64 Кбайт. Примеры команд:

LJMP Metka ;Переход к команде, расположенной по адресу обозначенному меткой ‘Metka’ LCALL Podprogramma ;Вызов подпрограммы по адресу, обозначенному меткой ‘Podprogramma’

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

AJMP Metka ;Переход к команде, расположенной по адресу обозначенному меткой ‘Metka’ ACALL Podprogramma ;Вызов подпрограммы по адресу, обозначенному меткой ‘Podprogramma’

В системе команд имеются команды условных и безусловных переходов относительно начального адреса следующей команды в пределах от (РС)-127 до (РС)+127. Примеры команд:

SJMP Metka ;Переход к команде, расположенной по адресу обозначенному меткой ‘Metka’ JB P3.5, TstNxtUsl ;Если на 6 выводе порта P3 нулевой потенциал, ACALL Podprogramma ;то вызвать подпрограмму, обозначенную меткой ‘Podprogramma’ CJNE A, #5, TstNxtUsl ;Если в аккумуляторе содержится число 5, ACALL Podprogramma ;то вызвать подпрограмму, обозначенную меткой ‘Podprogramma’

Команды проверки содержимого аккумулятора и флага переноса C могут быть использованы для реализации проверки различных условий. При этом содержимое не изменяется, то есть если требуется произвести несколько проверок одной и той же переменной, то повторно заносить значение этой переменной в аккумулятор не нужно. Например:


MOV A, 34 ;Если в переменной, хранящейся в ячейке внутренней памяти 34 JNB ACC_7, TstEQ5 ;число меньше нуля, CALL Podprogramma ;то вызвать подпрограмму, обозначенную меткой ‘Podprogramma’ TstEQ5 ;------------------------------------------------------------------------------------------------------ CJNE A,#5,TstLT5 ;Если в переменной, хранящейся в ячейке внутренней памяти 34 занесено число 5, CALL Podpr5 ;то вызвать подпрограмму, обозначенную меткой ‘Podpr5’ TstLT5 ;------------------------------------------------------------------------------------------------------ JNС TstGE5 ;Если в переменной, хранящейся в ячейке внутренней памяти 34 занесено число, меньшее 5, CALL PodprLT5 ;то вызвать подпрограмму, обозначенную меткой ‘PodprLT5’ TstGE5 ;--------------------------------------------------------------------------------- JC TstNxtUsl ;Если в переменной, хранящейся в ячейке внутренней памяти 34 занесено число, большее или равное 5, CALL PodprGE5 ;то вызвать подпрограмму, обозначенную меткой ‘PodprGE5’ TstGT5 ;------------------------------------------------------------------------------------------------------ CJNE A,#6,$+3 ;Если в переменной, хранящейся в ячейке внутренней памяти 34 JC TstNxtUsl ;занесено число, большее 5, CALL PodprGT5 ;то вызвать подпрограмму, обозначенную меткой ‘PodprGT5’ ;--------------------------------------------------------------------------------- JNC TstNxtUsl ;Если в переменной, хранящейся в ячейке внутренней памяти 34 занесено число, меньшее или равное 5, CALL PodprLE5 ;то вызвать подпрограмму, обозначенную меткой ‘PodprLE5’ Как видно из приведённых примеров, команды переходов этого микроконтроллера позволяет реализовать намного более эффективные по количеству команд программы по сравнению с другими процессорами, такими как, например .

Косвенный переход в системе команд микроконтроллеров семейства MCS-51 обеспечивает ветвление программы по содержимому аккумулятора А. Это позволяет реализовывать операцию перехода по заданному коду, эквивалентную оператору case в языке программирования pascal, но намного быстрее (за два машинных цикла).


Использование в этой команде указателя данных DPTR позволяет размещать таблицу переходов в любом месте . Пример реализации команды выбора варианта:

BeginOpCase: ;Начало команды выбора вариантов------------------------------------------------------ MOV DPTR, #JMP_TBL ;Задать начальный адрес таблицы переходов MOV A, 33 ;В этой ячейке хранится переменная, по которой необходимо осуществить переход на обслуживающую программу CLR C ;Осуществить арифметический сдвиг аккумулятора вправо RLC A ;(умножить на 2) т.к. команды переходов занимают два байта JMP @A+DPTR ;Перейти к выполнению заданного в 33 ячейке кода JMP_TBL: ;начало таблицы переходов по содержимому переменной в ячейке памяти 33----------------- JMP Case0 ;Перейти к выполнению кода по числу 0 JMP Case1 ;Перейти к выполнению кода по числу 1 JMP EndCase ;Это число в ячейке 33 в список разрешённых не входит JMP EndCase ;Это число в ячейке 33 в список разрешённых не входит JMP Case4 ;Перейти к выполнению кода по числу 4 EndCase:;------------------------------------------------------------------------------------------

Логические команды с байтовыми переменными


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

И ( ), ИЛИ ( , ИСКЛЮЧАЮЩЕЕ ИЛИ ( ).

Логические операции выполняются над аккумулятором или непосредственно над портами ввода/вывода.

Существуют логические операции, которые выполняются только на аккумуляторе:

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

Описание машинных команд


ACALL <addr 11> - абсолютный вызов подпрограммы.

Описание: вызывает подпрограмму, размещенную по указанному адресу <addr 11>. Команда увеличивает содержимое счетчика команд на 2 и затем помещает полученный результат в стек (младший байт первым). После это содержимое указателя стека SP увеличивается на 2. Т.к. в команде используется 11-разрядный адрес, полученный соединением пяти старших бит счетчика команд и второго байта команды, то подпрограмма должна начинаться в пределах той же 2K-байтной страницы. Команда не воздействует на флаги.

Количество байт: 2
Количество циклов: 2
Действие команды:
(PC) = (PC) + 2
(SP) = (SP) + 1
((SP)) = (PC7-0)
(SP) = (SP) + 1
((SP)) = (PC15-8)
(PC10-0) = адрес подпрограммы (метки)
Машинный код:

a10 a9 a8 1 0 0 0 1 a7 a6 a5 a4 a3 a2 a1 a0

Пример:

адрес команда исходный текст 1000 7111 ACALL 311h

Действие команды:

до команды после команды PC=1000 PC=0311 *SP=35 *SP=1002

ADD A, <байт-источник> - сложение.

Описание: складывает содержимое аккумулятора А с содержимым байта- источника. Результат операции помещается в аккумулятор. Флаг переноса C устанавливается при переносе из 7го разряда. Флаг вспомогательного переноса AC устанавливается при переносе из 3го разряда. При сложении знаковых чисел флаг переполнения OV устанавливается при превышении максимального положительного числа или при получении числа меньшего минимально возможного.

Для команды сложения разрешены следующие режимы адресации:

1) Первый операнд - , второй операнд - ;

Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
(A) = (A) + (Rn) , n=0,1,2,3,4,5,6,7
Машинный код:

0 0 1 0 1 r r r

Пример:

адрес команда исходный текст 0000 2F ADD A, R7

Действие команды:

до команды после команды PC=0000 PC=0001 A=35 A=7A R7=46 R7=46 C=0 C=0

2) Первый операнд - , второй операнд - ;

Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
(A) = (A) + ((Ri)) , i=0,1
Машинный код:

0 0 1 0 0 1 1 i

Пример:


адрес команда исходный текст 0010 26 ADD A, @R0 Действие команды:
до команды после команды PC=0010 PC=0011 R0=15 R0=15 A=95 A=16 *15=81 *15=81 C=0 C=1 3) Первый операнд - , второй операнд - ;
Количество байт: 2
Количество циклов: 1
Действие команды:
(PC) = (PC) + 2
(A) = (A) + (direct)
Машинный код:
0 0 1 0 0 1 0 1 d d d d d d d d Пример:
адрес команда исходный текст 0012 2564 ADD A, 100 Действие команды:
до команды после команды PC=0012 PC=0014 A=95 A=96 *100=01 *100=81 C=1 C=0 4) Первый операнд - , второй операнд - .
Пример: ADD A, #38h
Количество байт: 2
Количество циклов: 1
Действие команды:
(PC) = (PC) + 2
(A) = (A) + (date 8)
Машинный код:
0 0 1 0 0 1 0 0 i i i i i i i i Пример:
адрес команда исходный текст 0014 2564 ADD A, #38h Действие команды:
до команды после команды PC=0014 PC=0016 A=95 A=CD C=1 C=0 ADDC A, <байт-источник> - сложение с учетом переноса.
Описание: складывает содержимое аккумулятора А с содержимым байта-источника, к получившемуся результату прибавляется значение флага переноса. Результат операции помещается в аккумулятор. Флаг переноса C устанавливается при переносе из 7го разряда. Флаг вспомогательного переноса AC устанавливается при переносе из 3го разряда. При сложении знаковых чисел флаг переполнения OV устанавливается при превышении максимального положительного числа или при получении числа меньшего минимально возможного. Для команды сложения разрешены следующие режимы адресации байта - источника:
; Пример: ADDC A, R3
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
(A) = (A) + (C) + (Rn) , n=0, : ,7
Машинный код: 0 0 1 1 1 r r r
; Пример: ADDC A, @R0
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
(A) = (A) + (C) + ((Ri)) , i=0,1
Машинный код: 0 0 1 1 0 1 1 i
; Пример: ADDC A, 30h
Количество байт: 2
Количество циклов: 1
Действие команды: (PC) = (PC) + 2
(A) = (A) + (C) + (direct)
Машинный код:
0 0 1 1 0 1 0 1


d d d d d d d d
. Пример: ADDC A, #100
Количество байт: 2
Количество циклов: 1
Действие команды:
(PC) = (PC) + 2
(A) = (A) + (C) + (date 8)
Машинный код:
0 0 1 1 0 1 0 0
i i i i i i i i
AJMP <addr 11> - абсолютный переход в пределах 2K-байтной страницы.
Описание: передает управление команде, размещенной по указанному адресу <addr 11>. Команда увеличивает содержимое счетчика команд на 2 и затем заменяет младший байт счетчика команд на содержимое второго байта команды. Три младших бита старшего байта заменяются тремя старшими битами первого байта команды. Т.к. в команде используется 11- разрядный адрес, то адрес перехода должен начинаться в пределах той же 2K-байтной страницы памяти программ.
Пример: AJMP 1024
Количество байт: 2
Количество циклов: 2
Действие команды:
(PC) = (PC) + 2
(PC10-0) = адрес метки
Машинный код:
a10 a9 a8 0 0 0 0 1
a7 a6 a5 a4 a3 a2 a1 a0
ANL <байт приемник>,<байт источник> - команда "логическое И" для байтовых переменных.
Описание: выполняет операцию побитового "логического И" над указанными переменными и помещает результат в байт приемник. Команда не воздействует на флаги.
Для команды ANL с аккумулятором в качестве байта назначения разрешены следующие режимы адресации байта - источника:
; Пример: ANL A, R3
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
(A) = (A) & (Rn) , n=0,1,2,3,4,5,6,7
Машинный код: 0 1 0 1 1 r r r
; Пример: ANL A, @R0
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
(A) = (A) & ((Ri)) , i=0,1
Машинный код: 0 1 0 1 0 1 1 i
; Пример: ANL A, 30h
Количество байт: 2
Количество циклов: 1
Действие команды:
(PC) = (PC) + 2
(A) = (A) & (direct)
Машинный код:
0 1 0 1 0 1 0 1
d d d d d d d d
. Пример: ANL A, #100
Количество байт: 2
Количество циклов: 1
Действие команды:
(PC) = (PC) + 2
(A) = (A) & (date 8)
Машинный код:


0 1 0 1 0 1 0 0
i i i i i i i i
Для команды ANL с произвольным адресом ячейки внутренней памяти данных в качестве байта назначения разрешены следующие режимы адресации байта - источника:
; Пример: ANL 30h,A
Количество байт: 2
Количество циклов: 1
Действие команды:
(PC) = (PC) + 2
(direct) = (A) & (direct)
Машинный код:
0 1 0 1 0 0 1 0
d d d d d d d d
. Пример: ANL direct, #100
Количество байт: 3
Количество циклов: 2
Действие команды: (PC) = (PC) + 3
(direct) = (A) & (date 8)
Машинный код:
0 1 0 1 0 0 1 1
d d d d d d d d
i i i i i i i i
Примечание: при выполнении команды ANL над содержимым внешнего порта используется значение из внутреннего регистра, а не данные, присутствующие на выводах микросхемы!
ANL C,<бит источника> - "логическое И" битовой переменной и флага переноса C.
Описание: Если бит источника равен 0, то происходит сброс флага переноса, в противном случае флаг переноса не изменяет текущего значения. На остальные флаги команда не воздействует.
; Пример: ANL С, 20h
Количество байт: 2
Количество циклов: 2
Действие команды: (PC) = (PC) + 2
(C) = (C) & (bit)
Машинный код:
0 1 0 1 0 0 1 0
b b b b b b b b
Знак '/' перед операндом в языке ассемблера указывает на то, что в качестве значения используется логическое отрицание адресуемого бита, при этом сам бит источника не изменяется.
CJNE <байт назначения>,<байт источника>,<смещение> - сравнение и переход, если не равно.
Описание: сравнивает значения первых двух операндов и выполняет переход, если операнды не равны. Если значение байта назначения без учета знака меньше байта источника без учета знака, то флаг переноса C устанавливается в '1', иначе сбрасывается в '0'. Ни один из операндов после выполнения команды не изменяется. Новое значение программного счетчика при переходе вычисляется суммирование содержимого программного счетчика со вторым операндом (третьим байтом команды). Перед выполнением суммирования в программный счетчик заносится адрес первого байта следующей команды.


Суммирование производится с учетом знака третьего байта команды, представленного в дополнительном коде.
Первые два операнда допускают четыре вида адресации:
байт назначения - аккумулятор ; Пример: CJNE A, 30h, 15; direct=30h, rel=15
Количество байт: 3
Количество циклов: 2
Действие команды:
(PC) = (PC) + 3
IF (A) < > (direct) THEN
(PC) = (PC) + rel
IF (A) < (direct) THEN
(C) = 1
ELSE
(C) = 0
Машинный код:
1 0 1 1 0 1 0 1
d d d d d d d d
R e l A d r e s
. Пример: CJNE A, #100, -78; data=100, rel=-78
Количество байт: 3
Количество циклов: 2
Действие команды: (PC) = (PC) + 3
IF (A) < > data THEN
(PC) = (PC) + rel
IF (A) < data THEN
(C) = 1
ELSE
(C) = 0
Машинный код:
1 0 1 1 0 1 0 0
i i i i i i i i
R e l A d r e s
байт назначения - ячейка ОЗУ с косвенно-регистровой или регистровой адресацией к Пример: CJNE R5, #100, 78; Rn=R5 data=100, rel=78
Количество байт: 3
Количество циклов: 2
Действие команды: (PC) = (PC) + 3
IF (Rn) < > data THEN
(PC) = (PC) + rel
IF (Rn) < data THEN
(C) = 1
ELSE
(C) = 0
Машинный код:
1 0 1 1 1 r r r
i i i i i i i i
R e l A d r e s
к Пример: CJNE @R0, #100, 78; Ri=R0 data=100, rel=78
Количество байт: 3
Количество циклов: 2
Действие команды: (PC) = (PC) + 3
IF ((Ri)) < > data, i=0,1 THEN
(PC) = (PC) + rel
IF ((Ri)) < data, i=0,1 THEN
(C) = 1
ELSE
(C) = 0
Машинный код:
1 0 1 1 0 1 1 i
i i i i i i i i
R e l A d r e s
CLR A - сброс аккумулятора
Описание: сбрасывает (записывает '0' во все биты аккумулятора). Команда не изменяет содержимое флагов.
Пример: CLR A      ;Записывает в аккумулятор число 00h
Количество байт: 1
Количество циклов: 1
Действие команды: (PC) = (PC) + 1
(A) = 0
Машинный код:
1 1 1 0 0 1 0 0
CLR <bit> - сбрасывает указанный бит в нуль.
Описание: сбрасывает (записывает '0') в указанный во втором байте команды бит. Команда не изменяет содержимое флагов.


Пример: CLR C ;Записывает во флаг переноса '0'
Количество байт: 1
Количество циклов: 1
Действие команды: (PC) = (PC) + 1
(C) = 0
Машинный код:
1 1 0 0 0 0 1 1
; Пример: CLR P1.2       ; Записывает во второй бит порта 1 '0'
Количество байт: 2
Количество циклов: 1
Действие команды: (PC) = (PC) + 2
(bit) = 0
Машинный код:
1 1 0 0 0 0 1 0
b b b b b b b b
CPL A - каждый бит аккумулятора инвертируется.
Описание: каждый бит аккумулятора инвертируется, т.е. если в каком-либо из восьми бит аккумулятора записана '1', то в этот бит записывается '0' и наоборот.
Пример: CPL A
Количество байт: 1
Количество циклов: 1
Действие команды: (PC) = (PC) + 1
(A) = not(A)
Машинный код: 1 1 1 1 0 1 0 0
CPL <bit> - инвертируется указанный бит.
Описание: бит адрес, которого указан во втором байте команды инвертируется, т.е. если бит содержит '1', то в этот бит записывается '0' и наоборот.
; Пример: CPL 27
Количество байт: 2
Количество циклов: 1
Действие команды: (PC) = (PC) + 1
(bit) = not(bit)
Машинный код:
1 0 1 1 0 0 1 0
b b b b b b b b
CPL C - инвертируется флаг переноса 'C'.
Описание: флаг переноса 'C' инвертируется, т.е. если флаг переноса 'C' содержит '1', то в него записывается '0' и наоборот.
Пример: CPL C
Количество байт: 1
Количество циклов: 1
Действие команды: (PC) = (PC) + 1
(C) = not(C)
Машинный код: 1 0 1 1 0 0 1 1
DA A - десятичная коррекция аккумулятора при сложении двоично-десятичных чисел.
Описание: команда десятичной коррекции позволяет вести сложение чисел, представленных в упакованном двоично-десятичном коде. Команда применяется после инструкций ADD или ADDC. Инструкции (команды) ADD или ADDC позволяют суммировать сразу две тетрады, расположенные в одном байте.
Если биты аккумулятора с 0 по 3 содержат число большее 9 (xxxx1010:xxxx1111) или флаг вспомогательного переноса AC содержит '1', то к аккумулятору прибавляется число 6 для того, чтобы получить правильную двоично-десятичную цифру в младшей тетраде.


Если старшие биты аккумулятора (с 4 по 7) содержат число большее 9 (1010xxxx :1111xxxx) или флаг переноса C содержит '1', то к аккумулятору прибавляется число 60h для того, чтобы получить правильную двоично-десятичную цифру в старшей тетраде.
Если в результате операции DA A возникнет перенос, то флаг переноса C будет установлен в 1. Единичный флаг переноса после операции DA A означает, что результат суммирования больше 100 и этим можно воспользоваться для суммирования многоразрядных двоично-десятичных чисел. Команда десятичной коррекции не воздействует на флаг переполнения OV.
Примечание: команда DA A не может преобразовать двоичное число из аккумулятора в двоично-десятичный вид или правильно скорректировать двоично-десятичное вычитание.
Пример: DA A
Количество байт: 1
Количество циклов: 1
Действие команды: (PC) = (PC) + 1
IF [[(A3-0) > 9] or [(AC) = 1]] THEN
(A3-0) = (A3-0) + 6
AND
IF [[(A7-4) > 9] or [(C) = 1]] THEN
(A7-4) = (A7-4) + 6
Машинный код:
1 1 0 1 0 1 0 0
DEC <байт> - производит вычитание 1 из указанного операнда.
Описание: ячейка памяти адрес, которой указан во втором байте команды уменьшается на 1. Если первоначально в ячейке было записано значение 00h, то в нее заносится значение 0FFh. Команда не воздействует на флаги.
Примечание: при выполнении команды DEC над содержимым внешнего порта используется значение из внутреннего регистра, а не данные, присутствующие на выводах микросхемы!
Для команды DEC разрешены следующие режимы адресации байта - источника: . Пример: DEC A
Количество байт: 1
Количество циклов: 1
Действие команды: (PC) = (PC) + 1
(A) = (A) - 1
Машинный код:
0 0 0 1 0 1 0 0
; Пример: DEC R3
Количество байт: 1
Количество циклов: 1
Действие команды: (PC) = (PC) + 1
(Rn) = (Rn) - 1, n=0,1,2,3,4,5,6,7
Машинный код:
0 0 0 1 1 r r r
; Пример: DEC @R0
Количество байт: 1
Количество циклов: 1
Действие команды: (PC) = (PC) + 1
((Ri)) = ((Ri)) - 1, i=0,1
Машинный код:


0 0 0 1 0 1 1 i
; Пример: DEC 30h
Количество байт: 2
Количество циклов: 1
Действие команды: (PC) = (PC) + 2
(direct) = (direct) - 1
Машинный код:
0 0 0 1 0 1 0 1
d d d d d d d d
DIV AB - деление.
Описание: делит 8- битовое беззнаковое целое число из аккумулятора А на 8-битовое целое без знака в регистре В. В аккумулятор A заносится целая часть результата деления, а в регистр В - остаток. Флаги переноса C и переполнения OV будут очищены (записан '0'). Если в регистре B перед операцией деления содержится '0', то в аккумуляторы A и B будут занесены неопределенные значения, а флаг переполнения будет установлен (записана '1').
Количество байт: 1
Количество циклов: 4
Действие команды: (PC) = (PC) + 1
(A) = (A) div (B)
(A) = (A) mod (B)
Машинный код:
0 1 0 0 0 1 0 0
DJNZ <байт>,<смещение> - вычитание 1 из указанной ячейки и переход, если результат не равен 0.
Описание: вычитание 1 из указанной во втором байте команды ячейки памяти и переход к вычисляемому по третьему байту команды адресу, если результат вычитания не равен 0. Если первоначально в ячейке памяти содержится '0', то в результате выполнения операции туда будет записано число '0FFH'. Команда не воздействует на флаги. Новое значение программного счетчика при переходе вычисляется суммирование содержимого программного счетчика со вторым операндом (третьим байтом команды). Перед выполнением суммирования в программный счетчик заносится адрес первого байта следующей команды. Суммирование производится с учетом знака третьего байта команды, представленного в дополнительном коде.
Примечание: при выполнении команды DJNZ над содержимым внешнего порта используется значение из внутреннего регистра, а не данные, присутствующие на выводах микросхемы!
Для команды DJNZ разрешены следующие режимы адресации байта - источника:
; Пример: DJNZ R3 ,LABEL1;
Количество байт: 2
Количество циклов: 2
Действие команды: (PC) = (PC) + 2
(Rn) = (Rn) - 1, n=0,1,2,3,4,5,6,7
IF (Rn) < > 0, THEN n=0,1,2,3,4,5,6,7
(PC) = (PC) + rel
Машинный код:
1 1 0 1 1 r r r
R e l A d r e s
; Пример: DJNZ 30h,LABEL1;
Количество байт: 3
Количество циклов: 2
Действие команды: (PC) = (PC) + 3
(direct) = (direct) - 1
IF (direct) < > 0 THEN
(PC) = (PC) + rel
Машинный код:
1 1 0 1 0 1 0 1
d d d d d d d d
R e l A d r e s
[ ]

перемножает целые восьмибитовые беззнаковые числа,


MUL AB - умножение.
Описание: перемножает целые восьмибитовые беззнаковые числа, хранящиеся в аккумуляторе и регистре В. Старший байт 16-битового произведения помещается в регистр В, а младший байт - в регистр А.
Пример: MUL AB
Количество байт: 1
Количество циклов: 4
Действие команды: (PC) = (PC) + 1
(A) = Low((A)*(B))
(B) = High(A)*(B)
Машинный код:
1 0 1 0 0 1 0 0
NOP - нет операции
Описание: Кроме программного счетчика не изменяет ни одного регистра, на флаги не воздействует.
Пример: NOP
Количество байт: 1
Количество циклов: 1
Действие команды: (PC) = (PC) + 1
Машинный код:
0 0 0 0 0 0 0 0
ORL <байт приемник>,<байт источник> - "логическое ИЛИ" для байтовых переменных
Описание: выполняет операцию побитового "логического ИЛИ" между указанными переменными. Результат сохраняется в приемнике. Команда не воздействует на флаги.
Для команды ORL с аккумулятором в качестве байта назначения разрешены следующие режимы адресации байта - источника:
; Пример: ORL A, R3
Количество байт: 1
Количество циклов: 1
Действие команды: (PC) = (PC) + 1
(A) = (A) V (Rn) , n=0,1,2,3,4,5,6,7
Машинный код:
0 1 0 0 1 r r r
; Пример: ORL A, @R0
Количество байт: 1
Количество циклов: 1
Действие команды: (PC) = (PC) + 1
(A) = (A) V ((Ri)), i=0,1
Машинный код:
0 1 0 0 0 1 1 i
; Пример: ORL A, 30h
Количество байт: 2
Количество циклов: 1
Действие команды: (PC) = (PC) + 2
(A) = (A) V (direct)
Машинный код:
0 1 0 0 0 1 0 1
d d d d d d d d
. Пример: ORL A, #100
Количество байт: 2
Количество циклов: 1
Действие команды: (PC) = (PC) + 2
(A) = (A) V (date 8)
Машинный код:
0 1 0 0 0 1 0 0
i i i i i i i i
Для команды ORL с произвольным адресом ячейки внутренней памяти данных в качестве байта назначения разрешены следующие режимы адресации байта - источника:
; Пример: ORL 30h,A
Количество байт: 2
Количество циклов: 1
Действие команды: (PC) = (PC) + 2
(direct) = (A) V (direct)


INC <байт> - производит прибавление 1 к указанному операнду.
Описание: ячейка памяти адрес, которой указан во втором байте команды увеличивается на 1. Если первоначально в ячейке было записано значение 0FFh, то в нее заносится значение 00h. Команда не воздействует на флаги.
Примечание: при выполнении команды INC над содержимым внешнего порта используется значение из внутреннего регистра, а не данные, присутствующие на выводах микросхемы!
Для команды INC разрешены следующие режимы адресации байта - источника:
. Пример: INC A
Количество байт: 1
Количество циклов: 1
Действие команды: (PC) = (PC) + 1
(A) = (A) + 1
Машинный код:
0 0 0 0 0 1 0 0
; Пример: INC R3
Количество байт: 1
Количество циклов: 1
Действие команды: (PC) = (PC) + 1
(Rn) = (Rn) + 1, n=0,1,2,3,4,5,6,7
Машинный код:
0 0 0 0 1 r r r
; Пример: INC @R0
Количество байт: 1
Количество циклов: 1
Действие команды: (PC) = (PC) + 1
((Ri)) = ((Ri)) + 1, i=0,1
Машинный код:
0 0 0 0 0 1 1 i
; Пример: INC 30h
Количество байт: 2
Количество циклов: 1
Действие команды: (PC) = (PC) + 2
(direct) = (direct) + 1
Машинный код:
0 0 0 0 0 1 0 1
d d d d d d d d
INC DPTR - увеличивает на 1 содержимое указателя данных.
Описание: увеличивает на 1 содержимое 16-разрядного указателя данных. Если первоначально в младшем байте DPTR (ячейка DPL) было записано значение 0FFh, то в него заносится значение 00h и увеличивается на 1 содержимое старшего байта DPTR (ячейка DPH). Команда не воздействует на флаги.
Количество байт: 1
Количество циклов: 2
Действие команды: (PC) = (PC) + 1
(DPTR) = (DPTR) + 1
Машинный код:
0 1 0 1 0 0 1 1
JB <bit>,<rel8> - переход если бит установлен.
Описание: Если указанный во втором байте команды бит равен единице, то производится переход к вычисляемому по третьему байту команды адресу. В противном случае выполняется следующая команда. Новое значение программного счетчика при переходе вычисляется суммирование содержимого программного счетчика со вторым операндом (третьим байтом команды).

и имеет отдельное от памяти


Память программ предназначена для хранения программ и имеет отдельное от памяти данных адресное пространство объемом 64 Кбайт, причем для некоторых микросхем (например КР1816ВЕ51, КМ1819ВЕ751, КР1830ВЕ51) для хранения программ на кристалле микроконтроллера расположено ПЗУ. Это ПЗУ отображается в область млаших адресов памяти программ. Учитывая, что выполнение программы после сброса микроконтроллера всегда начинается с нулевого адреса памяти программ, то при включении питания начнет выполняться программа, записанная во внутненнем ПЗУ микроконтроллера. Микроконтроллеры, не имеющие внутреннего ПЗУ (например КР1816ВЕ31 и КР1830ВЕ31) могут работать только с внешней микросхемой ПЗУ емкостью до 64 Кбайт (при использовании портов P1 и P3 в качестве расширителя адреса объем подключаемой ПЗУ может быть увеличен до 1Гбайта). Микроконтроллеры семейства MCS-51 имеют внешний вывод EA, с помощью которого можно запретить работу внутренней памяти, для чего необходимо подать на вывод EA логический "0" (соединить этот вывод с корпусом). При этом внутренняя память программ отключается и, начиная с нулевого адреса, все обращения происходят к внешней памяти программ.

Доступ к внешней памяти программ осуществляется в двух случаях:

при действии сигнала EA=0 независимо от адреса обращения, в любом случае, если программный счетчик (РС) содержит число большее, чем максимальная ячейка внутренней памяти программ. Распределение памяти программ микроконтроллера КР1830ВЕ51 представлено ниже:

Для чтения памяти программ используются команды MOVC A, A+@DPTR и MOVC A, A+@PC
Рисунок 2. Адресное пространство памяти программ.

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

Ниже приведены адреса векторов прерываний и соответствующие им аппаратурные источники прерываний программы:

Вектор прерывания Флаги, вызывающие прерывание Источник прерывания
0000Н - Рестарт (сброс) контроллера RESET
0003Н IE0 внешнее прерывание INT0
000bН TF0 Таймер 0
0013Н IE1 внешнее прерывание INT1
001bН TF1 Таймер 1
0023Н RI, TI Последовательный порт
002bН TF2, EXF2 Таймер 2
0033Н CF, CCFn(n=0:4) Набор программируемых счётчиков (РСА)
003bН AIF Аналого-цифровой преобразователь
0043Н CF1,C1CCFn(n=1:4) Набор программируемых счётчиков (РСА1)
004bН SEPIF Последовательный порт SEP
0053Н IE2 внешнее прерывание INT2
005bН IE3 внешнее прерывание INT3
0063Н IE4 внешнее прерывание INT4
006bН IE5 внешнее прерывание INT5
0073Н IE6 внешнее прерывание INT6
Примечание: вектора прерывания, выделенные:

жирным подчеркнутым текстом- присутствуют во всех микросхемах семейства; жирным текстом- отсутствуют в микросхемах 8051,8031, КР1816ВЕ31, КР1816ВЕ51, КР1816ВЕ751 КР1830ВЕ31, КР1830ВЕ51, КР1830ВЕ751; обычным текстом- присутствуют только в микросхемах 8Х51FA, FB, FC и GB курсивом- присутствуют только в микросхеме 8Х51GB

Через универсальный последовательный порт осуществляются


Через универсальный последовательный порт осуществляются прием и передача информации, представленной в (младшими битами вперед). Наличие буферного регистра приемника позволяет совмещать операцию чтения ранее принятого байта с приемом очередного. Но если к моменту окончания приема байта предыдущий не был считан из SBUF, то он будет потерян. Работой последовательного порта управляют три регистра:

Бит SMOD Буферный регистр приемопередатчика SBUF Последовательный порт может работать в четырех различных режимах. Информация передается, и принимается через вывод входа приемника RxD. Принимаются или передается 8 бит данных. Через вывод TxD выдаются импульсы синхронизации, которые сопровождают каждый бит. Скорость передачи фиксирована и составляет 1/12 Fген. Передаются (через TXD) или принимаются (через RXD) 10 бит: старт-бит (логический 0), 8 бит данных (младшим разрядом вперед) и стоп-бит (логическая 1). При приеме, стоп-бит поступает в бит RB8 регистра SCON. Скорость передачи в режиме 1 переменная: для управления скоростью передачи вы можете использовать таймер Т1 и/или Т2. Передаются (через TXD) или принимаются (через RXD) 11 бит: старт-бит. 8 бит данных (младшим разрядом вперед), программируемый 9-й бит данных и стоп-бит. При передаче, в 9-й бит данных (бит ТВ8 регистра SCON) может быть записан логический 0 или 1, например, значение бита четности (бит Р регистра PSW). При приеме, 9-й бит данных поступает в бит RB8 регистра SCON. Присутствие стоп-бита контролируется схемой обнаружения ошибки кадра. Скорость передачи программируется и может быть равна либо 1/32, либо 1/64 частоты резонатора в зависимости от управляющего бита SMOD. совпадает с режимом 2 во всех деталях, за исключением частоты приема/передачи, которая задается таймером. Во всех четырех режимах передача начинается любой командой, которая использует SBUF как регистр-приемник. Прием в режиме 0 начинается при условии RI = 0, REN = 1. Прием в других режимах начинается с приходом старт-бита, если бит REN установлен.


построены по Гарвардской архитектуре.


Микроконтроллеры семейства MCS- 51 построены по Гарвардской архитектуре. Это означает, что память данных и память программ в этих микросхемах разделены и имеют отдельное адресное пространство. В этих микроконтроллерах имеется пять адресных пространств: , три для . Такое построение памяти позволяет удвоить доступное адресное пространство. Кроме того такое построение памяти позволяет в ряде случаев увеличить быстродействие микросхем.

Схема подключения внешних микросхем памяти к микроконтроллерам семейства MCS-51 показана на рисунке 1. Регистр адреса D3 на этой схеме предназначен для запоминания младших 8-ми бит адреса, передаваемых через шину данных/памяти, совмещенную с портом P0. Старшие восемь бит адреса передаются через шину адреса, совмещенную с портом P2. Во время передачи адреса через порт P0, микроконтроллер вырабатывает синхроимпульс на ножке ALE. Именно этот импульс позволяет запомнить младший байт адреса в регистре D3.

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



Рисунок 1. Схема подключения схем внешней памяти к микроконтроллерам семейства MCS-51


Регистр управления/статуса приемопередатчика SCON


Управление режимом работы приемопередатчика осуществляется через специальный регистр с символическим именем SCON. Этот регистр содержит не только управляющие биты, определяющие режим работы последовательного порта, но и девятый бит принимаемых или передаваемых данных (RB8 и ТВ8) и биты прерывания приемопередатчика (R1 и Т1).

Функциональное назначение бит регистра управления/статуса приемопередатчика SCON.

Символ Позиция Имя и назначение
SM0 SCON.7 Биты управления режимом работы приемопередатчика. Устанавливаются/сбрасываются программно см. примечание 1
SM0 SM1 Режим работы приемопередатчика
0 Сдвигающий регистр расширения ввода/вывода
0 1 8 битовый приемопередатчик, изменяемая скорость передачи
1 0 9 битовый приемопередатчик. Фиксированная скорость передачи
1 1 9 битовый приемопередатчик, изменяемая скорость передачи
SM1 SCON.6
SM2 SCON.5 Бит управления режимом приемопередатчика. Устанавливается программно для запрета приема сообщения, в котором девятьй бит имеет значение 0
REN SCON.4 Бит разрешения приема. Устанавливается/сбрасывается программно для разрешения/запрета приема последовательных данных
TB8 SCON. 3 Передача бита 8. Устанавливается/сбрасывается программно для задания девятого передаваемого бита в режиме 9-битового передатчика
RB8 SCON.2 Прием бита 8. Устанавливается/сбрасывается аппаратно для фиксации девятого принимаемого бита в режиме 9-битового приемника
TI SCON. 1 Флаг прерывания передатчика. Устанавливается аппаратно при окончании передачи байта. Сбрасывается программно после обслуживания прерывания
RI SCON.0 Флаг прерывания приемника. Устанавливается аппаратно при приеме байта. Сбрасывается программно после обслуживания прерывания

Прикладная программа путем загрузки в старшие биты регистра SCON двухбитного кода определяет режим работы приемопередатчика. Во всех четырех режимах работы передача инициализируется любой командой, в которой буферный регистр SBUF указан как получатель байта. Как уже отмечалось, прием в режиме 0 осуществляется при условии, что R1 = 0 и REN = 1, в остальных режимах - при условии, что REN = 1.

В бите ТВ8 программно устанавливается значение девятого бита данных, который будет передан 8 режиме 2 или 3. В бите RB8 в этих режимах фиксируется девятый принимаемый бит данных. В режиме 1 в бит RB8 заносится стоп-бит. В режиме 0 бит RB8 не используется.

Флаг прерывания передатчика ТI устанавливается аппаратно в конце периода передачи стоп-бита во всех режимах. Соответствующая подпрограмма обслуживания прерывания должна сбрасывать бит TL.

Флаг прерывания приемника RI устанавливается аппаратно в конце периода приема восьмого бита данных в режиме 0 и в середине периода приема стоп-бита в режимах 1, 2 и 3. Подпрограмма обслуживания прерывания должна сбрасывать бит RI.



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


Регистры специальных функций - это дополнительные устройства, которые отображаются в адресное пространство внутренней памяти данных. В различных микроконтроллерах состав дополнительных устройств различается. Микроконтроллеры различаются между собой количеством , , . Некоторые из регистров специальных функций с указанием их адресов в адресном пространстве SFR внутреннего ОЗУ приведены на рисунке 5:

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

Примечание: регистры, выделенные: жирным подчеркнутым текстом- присутствуют во всех микросхемах семейства; жирным текстом- отсутствуют в микросхемах 8051,8031, КР1816ВЕ31, КР1816ВЕ51, КР1816ВЕ751 КР1830ВЕ31, КР1830ВЕ51, КР1830ВЕ751; обычным текстом- присутствуют только в микросхемах 8Х51FA, FB, FC и GB курсивом- присутствуют только в микросхеме 8Х51GB

[ ]



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


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

В этой системе команд реализована побитная, потетрадная (4 бита), побайтовая (8 бит) и 16-разрядная обработка данных. Микросхемы семейства MCS-51 - это 8-разрядные микропроцессоры, а это означает, что ПЗУ, ОЗУ, регистры специального назначения, АЛУ и внешние шины имеют байтовую организацию. Двухбайтовые данные используются только регистром-указателем (DPTR) и счетчиком команд (PC).

В машинном коде команда занимает один, два или три байта в зависимости от типа .

Команды выполняются за один, два или четыре (умножение и деление) машинных цикла.

Запись команд в машинных кодах для человека неудобна, кроме того, разные машинные команды выполняют одинаковые действия только над разными ячейками памяти. Поэтому для записи команд микропроцессоров была придумана система мнемонических обозначений. Для записи команды микропроцессора сначала ставится мнемоническое обозначение, затем указывается ячейка памяти – приёмник результата выполнения операции и наконец источник данных для выполнения операции. Например, в команде

E535 MOV A, 35h символы MOV обозначают операцию копирования, второй операнд 35 определяет, что данные необходимо взять из 35 ячейки памяти, а первый операнд A определяет, что результат необходимо поместить в регистр – аккумулятор. При этом старое значение регистра – аккумулятора будет стёрто. Слева приведена машинная команда микроконтроллера в шестнадцатеричной записи, соответствующая мнемонической записи команды.

Мнемоническое обозначение команды отделяется от операндов одним или несколькими символами пробела или табуляции, а операнды отделяются друг от друга запятыми.

Если операция требует для выполнения двух источников и одного приёмника результата операции (например, команда сложения ADD или вычитания SUBB), то первый операнд является одновременно и источником и приёмником результата операции.
Например, в команде

2535 ADD A, 35h символы ADD обозначают операцию сложения двух чисел, данные будут взяты из 35 ячейки памяти и аккумулятора а результат будет помещён в аккумулятор вместо старого значения этого регистра.

В таблице 1 приведены инструкции, влияющие на установку флагов микроконтроллера.

Таблица 1

Мнемоника Флаги Мнемоника Флаги
C OV AC C OV AC
ADD + + + CLR C 0  
ADDC + + + CPL C +    
SUBB + + + ANL C, bit +    
MUL 0 +   ANL C, /bit      
DIV 0 +   ORL C, bit +    
DA +     ORL C, /bit +    
RRC +     MOV C, bit +    
RLC +     CJNE +    
SETB C 1            
Систему команд микроконтроллера условно можно разбить на пять групп:



Скорость приема/передачи информации через последовательный порт


Скорость приема/передачи, т.е. частота работы приемопередатчика в различных режимах, определяется различными способами.

В режиме 0 частота передачи зависит только от резонансной частоты кварцевого резонатора f РЕЗ:

f=fРЕЗ/12.

За машинный цикл последовательный порт передает один бит информации. В режимах 1, 2 и 3 скорость приема/передачи зависит от значения управляющего бита SMOD в регистре специальных функций PCON.

Регистр управления мощностью PCON

Символ Позиция Наименование и функция
SMOD PCON.7 Удвоенная скорость передачи. Если бит установлен в 1, то скорость передачи вдвое больше, чем при SMOD = 0. По сбросу SMOD = 0.
  PCON.6 Не используется
  PCON.5 Не используется
  PCON.4 е используется
GF1
GF0
PCON.3 PCON.2 Флаги, специфицируемые пользователем (флаги общего назначения)
PD PCON.1 Бит пониженной мощности. При установке бита в 1 микро-ЭВМ переходит в режим пониженной потребляемой мощности
IDL PCON.0 Бит холостого хода. Если бит установлен в 1, то микро-ЭВМ переходит в режим холостого хода

Примечание. При одновременной записи 1 в PD и IDL бит PD имеет преимущество. Сброс содержимого PCON выполняется путем загрузки в него кода 0XXX0000.

В режиме 2 частота передачи определяется выражением

f =2SMODfРЕЗ/64.

Иными словами, при SMOD = 0 частота передачи равна 1/64 частоты fРЕЗ, а при SMOD = 1 - 1/32 частоты fРЕЗ.

В режимах 1 и 3 в формировании частоты передачи, кроме управляющего бита SMOD, принимает участие таймер 1. При этом частота передачи f зависит от частоты переполнения f OVLT и определяется следующим образом:

f=2SMODfOVTL1/32

При использовании таймера 1 для тактирования последовательного порта прерывания от этого таймера должны быть запрещены. Таймер может быть использован как в режиме , так и в режиме . Обычно используется режим таймера с автозагрузкой (старшая тетрада регистра TMOD = 0010В). При этом скорость передачи последовательного порта определяется выражением:

f = 2SMODfРЕЗ/(32х12х(256 -ТН1)).


Предельно низких скоростей приема и передачи по последовательному порту можно достичь при использовании таймера в (старший полубайт TMOD = 0001В). Перезагрузка 16-битного таймера должна осуществляться программным путем. При этом для того, чтобы можно было независимо от передачи выполнять дополнительные задачи, необходимо использовать механизм обработки прерываний и для этого разрешить прерывания от таймера 1.

Настройка таймера 1 для управления скоростью работы последовательного порта.

Частота приема/передачи (BAUD RATE) Частота резонатора МГц Таймер/счетчик 1
SMOD С/Т Режим (MODE) Перезагружаемое число
Режим 0, макс: 1 МГц 12 X X X X
Режим 2, макс: 375 КГц 12 1 X X X
Режим 1, 3: 62,2 Кгц 12 1 0 2 0FFH
19,2 Кгц 11,059 1 0 2 0FDH
9,6 Кгц 11,059 0 0 2 0FDH
4,8 Кгц 11,059 0 0 2 0FAH
2,4 Кгц 11,059 0 0 2 0F4H
1,2 Кгц 11,059 0 0 2 0F4H
137,5 Гц 11,059 0 0 2 1DH
110 Гц 6 0 0 2 72H
110 Гц 12 0 0 1 0FЕЕВН
Отметим, что для старших моделей семейства MCS-51 при использовании для синхронизации последовательного порта таймеров 1 и 2 скорости приема и передачи информации по последовательному порту могут различаться.

Режим 0. Синхронный последовательный порт.

В нулевом режиме последовательный порт работает как обыкновенный сдвиговый регистр. Это позволяет использовать последовательный порт для увеличения количества внешних ножек микросхемы. Использование сдвиговых регистров для этой цели показано на рисунке 1 и 3. Передача по последовательному порту начинается после записи байта в регистр данных . Временная диаграмма сигнала, вырабатываемого последовательным портом микроконтроллера при передаче восьми бит данных приведена на рисунке 2. Приём байта по последовательному порту начинается после обнуления флага готовности приёмника . Временная диаграмма приёма входной информации последовательным портом в нулевом режиме приведена на рисунке 4.



Рисунок 1. Использование нулевого режима работы последовательного порта в качестве расширителя портов.




Рисунок 2. Временная диаграмма работы последовательного порта в нулевом режиме после записи передаваемого байта в регистр данных SBUF. Нулевой режим работы задаётся записью комбинации 00 в биты SM0 и SM1 регистра . В синхронном режиме работы информация передается, и принимается через вывод входа приемника RxD, то есть в этом режиме работы последовательный порт работаем в симплексном режиме. Через вывод TxD выдаются импульсы синхронизации, которые сопровождают каждый информационный бит. Скорость передачи в этом режиме фиксирована и составляет 1/12*Fген. Это означает, что при частоте задающего генератора 24 МГц обмен данными осуществляется на скорости 2 мегабита в секунду.

Для осуществления передачи байта данных достаточно занести его в буфер данных SBUF, как это показано в примере:

MOV SCON, #0 ;Настроить последовательный порт на передачу в синхронном режиме MOV SBUF, A ;Передать содержимое аккумулятора по последовательному порту JNB TI, $ ;Подождать окончания передачи MOV SBUF, #56H ;Передать по последовательному порту число 56h JNB TI, $ ;Подождать окончания передачи


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


Рисунок 4. Временная диаграмма приёма входной информации последовательным портом в нулевом режиме после обнуления флага готовности приёмника RI. Для осуществления приёма байта данных достаточно настроить порт на приём в синхронном режиме работы и обнулить флаг приёма , как это показано в примере, приведённом на рисунке 5.

;Настроить режим работы последовательного порта----------------------------------------------------------------------------------- mov SCON,#00010000b ;настроить последовательный порт на нулевой режим работы ; ;|+-------Обнулить флаг приёмника RI ;+--------Обнулить флаг передатчика TI ;|+---------Обнулить девятый бит приёмника RB8 ;+----------Обнулить девятый бит передатчика TB8 ;|+-----------Разрешить работу приёмника ;+------------В синхронном режиме не имеет значения ;++-------------Включить синхронный режим работы последовательного порта ;Так как предыдущая команда обнуляет флаг RI то с этого момента начинается приём байта-------------------------------------------- JNB RI, $ ;Подождать окончания приёма байта по последовательному порту MOV A, SBUF ;и скопировать его в аккумулятор Рисунок 5.


Программа считывания одного байта из внешнего регистра по последовательному порту.

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

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

Режим 1. Асинхронный восьмиразрядный последовательный порт.

В первом режиме работы последовательный порт работает в . Временная диаграмма передаваемых сигналов через последовательный порт в асинхронном режиме работы показана на рисунке 6. Первый режим работы задаётся записью комбинации 01 в биты SM0 и SM1 регистра . В асинхронном режиме работы информация передается через ножку передатчика последовательного порта микроконтроллера TxD, а принимается через вывод входа приемника RxD, то есть в этом режиме работы последовательный порт работает в дуплексном режиме. Это означает, что передача и приём информации может вестись независимо друг от друга. в этом режиме настраивается при помощи .



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


Обычно используются стандартные скорости передачи, такие как 1200бит/с, 2400 бит/с и т.д. Для таких скоростей передачи обычно используется кварцевый резонатор с частотой 11.0592 МГц. Скорости передачи и коэффициенты, загружаемые в таймер 1, для этих скоростей передачи приведены в .

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



Рисунок 7. Схема обмена информацией между двумя микроконтроллерами по последовательному порту. В первом режиме работы, также как и в нулевом для передачи байта через последовательный порт достаточно скопировать его в буфер данных SBUF. Единственное отличие заключается в том, что, кроме настройки регистра необходимо настроить для задания скорости передачи информации по последовательному порту. При приёме байта по последовательному порту приём начинается только после обнаружения стартового бита.

В качестве примера работы с последовательным портом приведём подпрограмму инициализации последовательного порта для работы в асинхронном режиме на скорости 9600 бит/с. Настройка режима работы последовательного порта в этой программе производится записью двоичной константы в регистр управления . Выбор конкретных значений бит двоичной константы подробно приводится в комментариях к программе.

Так как для последовательного порта требуется таймер, то, кроме настройки последовательного порта, при помощи регистра выбора режима работы таймеров настраивается таймер T1. Эта настройка тоже производится при помощи записи двоичной константы.

Скорость работы последовательного порта настраивается записью константы 0FDh в старший байт .

;********************************************************************************************************************************* ;НАСТРОЙКА ПОСЛЕДОВАТЕЛЬНОГО ПОРТА ;********************************************************************************************************************************* ;Настроить режим работы последовательного порта----------------------------------------------------------------------------------- mov SCON,#01110000b ;настроить последовательный порт на первый режим работы ; ;|+-------Обнулить флаг приёмника RI ;+--------Обнулить флаг передатчика TI ;|+---------Обнулить девятый бит приёмника RB8 ;+----------Обнулить девятый бит передатчика TB8 ;|+-----------Разрешить работу приёмника ;+------------Проверять ошибку кадра (приём нулевого бита на месте стоп-бита) ;++-------------Включить асинхронный режим работы последовательного порта ;Настроить режим работы таймера T1 ---------------------------------------------------------------------------------------------- anl TMOD,#00001111b ;Подготовить таймер T1 к настройке (таймер T0 не трогать!) orl TMOD,#00100000b ;перевести таймер T1 вo второй режим работы (таймер T0 не трогать!) ; ;++--------------Перевести таймер T1 в режим автозагрузки ;|+----------------Синхронизироваться от внутреннего генератора ;+-----------------Запретить управление таймером от ножки INT1 ;Настроить таймер на генерацию 3-x микросекундного интервала времени-------------------------------------------------------------- mov TH0, #fdh ;Загрузить старший байт таймера mov TL0, #fdh ;Загрузить младший байт таймера setb TR1 ;Включить таймер 1 ;********************************************************************************************************************************* ;РАБОТА С ПОСЛЕДОВАТЕЛЬНЫМ ПОРТОМ ;********************************************************************************************************************************* JNB RI, $ ;Подождать окончания приёма байта по последовательному порту MOV A, SBUF ;и скопировать его в аккумулятор Рисунок 8.


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

Возможность работы в асинхронном режиме позволяет использовать последовательный порт для связи с универсальным компьютером через его последовательный COM порт. К сожалению уровни последовательного порта микроконтроллера не совпадают с уровнями последовательного порта компьютера, поэтому для подключения микроконтроллера к последовательному порту компьютера используются специализированные микросхемы согласования уровней. Эти же микросхемы обеспечивают защиту микроконтроллера от вывода из строя статическим потенциалом при подключении разъёмов.

Обычно для работы используются только сигнальные цепи COM-порта компьютера. Тем не менее, оставшиеся буферы интерфейсной микросхемы могут быть использованы для контроля питания микроконтроллерной схемы. Типовая схема подключения компьютера к последовательному порту микроконтроллеров семейства MCS-51 с применением микросхемы ADM3202 приведена на рисунке 9.



Рисунок 9. Подключение последовательного порта микроконтроллеров семейства MCS-51 к последовательному COM порту компьютера.

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

Режим 2. Асинхронный девятиразрядный последовательный порт с фиксированной скоростью передачи.

В этом режиме последовательный порт работает на фиксированной скорости передачи также как и в нулевом режиме работы. определяется значением бита SMOD и при частоте кварцевого резонатора 12 МГц составляет 375 кбит/с то есть для современных микроконтроллеров может превышать скорость передачи 1 Мбит/с.

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


Для вычисления чётности передаваемого байта можно воспользоваться аппаратным вычислителем, подключенным к аккумулятору микроконтроллера A. Результат вычисления чётности байта сохраняется в бите чётности P регистра PSW, откуда его можно скопировать в девятый информационный бит последовательного порта TB8, расположенный в регистре управления последовательным портом .

Ещё большие возможности для построения устройств предоставляет девятиразрядный режим работы при реализации многопроцессорных систем. микроконтроллеров семейства MCS-51 построены по схеме с открытым стоком. Это позволяет объединять несколько выходов передатчиков в одну шину. Такое выполнение выходных каскадов микросхем облегчает построение многопроцессорных систем. В многопроцессорной системе один процессор должен быть главным (master), остальные - подчинёнными (slave). Естественно команды главного процессора должны восприниматься подчинёнными процессорами, поэтому выход передатчика главного процессора соединяется со входами приёмников подчинённых. Выходы же передатчиков подчинённых процессоров объединяются и подключаются ко входу приёмника главного процессора. Схема примера многопроцессорной системы приведена на рисунке 10.



Рисунок 10. Схема соединения нескольких микроконтроллеров между собой по последовательному порту, работающему в асинхронном режиме. Команды главного процессора могут быть обращены к конкретному подчинённому процессору, поэтому в состав команд включается адрес подчинённого процессора. При работе в шине необходимо уметь отличать адресную информацию от данных. Это можно осуществить при помощи девятого бита. Обычно при передаче адреса в девятый бит записывают единицу, а в байтах данных и команд - 0. Таким образом микроконтроллер, даже подключившийся к шине позднее остальных, легко может осуществить синхронизацию с многопроцессорной шиной. Временная диаграмма работы многопроцессорной шины приведена на рисунке 11.



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

Режим 3. Асинхронный девятиразрядный последовательный порт.

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

[ ]


В настоящее время среди всех


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

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

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

Микросхемы для этого семейства производятся целым рядом фирм различных стран мира таких как Philips, Siemens, Intel, Atmel, Dallas, Temic, Oki, AMD, MHS, Gold Star, Winbond, Silicon Systems и ряд других.
Микроконтроллеры семейства MCS 51 выпускают и российские заводы. Производство микроконтроллера 8051 осуществлялось в Киеве, Воронеже (1816ВЕ31/51, 1830ВЕ31/51), Минске (1834ВЕ31) и Новосибирске (1850ВЕ31). В качестве примера, в таблице 1 приведены названия нескольких микросхем, производимых зарубежными фирмами, в таблице 2 приведены микросхемы российского производства.

Таблица 1. Микросхемы, производимые зарубежными фирмами

Микроконтроллер ОЗУ ПЗУ EEPROM SPI Таймеры PCA PCA1 АЦП
AT89C1051 128 байт 1К байт - - 2 - - комп
AT89C2051 128 байт 2К байт - - 2 - - комп
I8051 128 байт 4К байт - - 2 - - -
I8031 128 байт - - - 2 - - -
I8Х52 256 байт 8К байт - - 3 - - -
AT89c52 256 байт 8К байт - - 3 - - -
AT89с8252 256 байт 8К байт 2K байт + 3 - - -
AT89c55 256 байт 20К байт - - 3 - - -
I8Х54 256 байт 16К байт - - 3 - - -
I8Х58 256 байт 32К байт - - 3 - - -
I8Х51FA 128 байт 8К байт - - 4 + - -
I8Х51FB 256 байт 16К байт - - 4 + - -
I8Х51FC 256 байт 32К байт - - 4 + - -
I8Х51GB 256 байт 8К байт - + 5 + + +
Примечание: вместо символа 'X' в названии микроконтроллера должны стоять символы:

0 - n-МОП без ПЗУ 3 - n-МОП с ПЗУ 7 - n-МОП с РПЗУ 0с - КМОП без ПЗУ 3с - КМОП с ПЗУ 7с - КМОП с РПЗУ 9с - КМОП с FLASH Таблица 2. Микросхемы российского производства

Микроконтроллер ОЗУ ПЗУ ППЗУ Таймер 2 PCA PCA1 АЦП
КР1816ВЕ51 128 байт 4К байт - - - - -
КР1816ВЕ751 128 байт - 4К байт - - - -
КР1816ВЕ31 128 байт - - - - - -
КР1830ВЕ51 128 байт 4К байт - - - - -
КР1830ВЕ751 128 байт - 4К байт - - - -
КР1830ВЕ 31 128 байт - - - - - -
Примечание:

Серия микросхем 1816 выполнена по n-МОП технологии, Серия микросхем 1830 выполнена по КМОП технологии [ ]


Способы адресации операндов


При определении способа адресации операндов в команде необходимо учитывать, что адресация для каждого операнда команды своя. В общем случае адресация источника и приёмника могут не совпадать.

Неявная адресация При неявной адресации регистр источник или регистр приёмник подразумевается в самом коде операции. Например:

03 RR A ;Сдвинуть содержимое аккумулятора вправо D4 DA A ;Произвести десятичную коррекцию результата суммирования E8 MOV A, R0 ;В первом операнде использована неявная адресация, а во втором - регистровая

Регистровая адресация используется для обращения к восьми рабочим регистрам выбранного банка рабочих регистров, а также для обращения к регистрам А, В, АВ (сдвоенному регистру), DPTR, и к флагу переноса С. Номер регистра записывается в трех младших битах команды. Например:

F8 MOV R5, A ;в первом операнде использована регистровая адресация, а во втором - неявная

Прямая байтовая адресация используется для обращения к ячейкам внутренней памяти (ОЗУ) данных (адреса 0:127) и к регистрам специального назначения (адреса 128:256). Адрес ячейки памяти помещается во второй байт команды. Например:

E520 MOV A, 20h ;во втором операнде использована прямая байтовая адресация, а в первом – неявная 8D15 MOV 15h,R6 ;в первом операнде использована прямая байтовая адресация, а во втором – регистровая

Прямая битовая адресация используется для обращения к отдельно адресуемым 128 битам, расположенным в ячейках с адресами 20Н-2FH, и к отдельно адресуемым битам регистров специального назначения. Например:

D220 SETB 20h ;использована прямая битовая адресация C215 CLR 15h ;использована прямая битовая адресация

Косвенно-регистровая адресация используется для обращения к ячейкам внутреннего ОЗУ данных. В качестве регистров-указателей адреса используются регистры R0, R1 выбранного банка регистров. Например:

E6 MOV A,@R0 ;В первом операнде использована неявная адресация, а во втором - косвенно-регистровая F7 MOV @R1,A ;В первом операнде использована косвенно-регистровая адресация, а во втором - неявная

Косвенно - регистровая адресация используется также для обращения к внешней памяти данных.
В этом случае с помощью регистров- указателей R0 и R1 (рабочего банка рабочих регистров) выбирается ячейка из блока 256 байт внешней памяти данных. Номер блока предварительно задается содержимым порта Р2. Например:

E2 MOVX A,@R0 ;В первом операнде использована неявная адресация, а во втором - косвенно-регистровая F3 MOVX @R1,A ;В первом операнде использована косвенно-регистровая адресация, а во втором - неявная Если в качестве регистра - указателя используется 16 - разрядный указатель данных (DPTR), то можно выбрать любую ячейку внешней памяти данных объемом до 64 Кбайт. (В некоторых моделях микроконтроллеров семейства MSC-51 таким образом можно обращаться к внутренней памяти данных объемом более 256 байт).

E0 MOVX A,DPTR;В первом операнде использована неявная адресация, а во втором - косвенно-регистровая F0 MOVX DPTR,A;В первом операнде использована косвенно-регистровая адресация, а во втором - неявная Косвенно-регистровая адресация по сумме базового и индексного регистра (содержимое аккумулятора А) упрощает просмотр таблиц, записанных в памяти программ. Любой байт из таблицы может быть выбран по адресу, определяемому суммой содержимого DPTR или РС и содержимого А, например:

83 MOV A, @A+PC ;В первом операнде использована неявная адресация, а во втором - косвенно-регистровая 93 MOV A, @A+DPTR ;В первом операнде использована неявная адресация, а во втором - косвенно-регистровая. Непосредственная адресация позволяет выбрать из адресного пространства памяти программ константы, явно указанные в команде, например:

7414 MOV A, #14h ;В первом операнде использована неявная адресация, а во втором - непосредственная 902048 MOV DPTR, #2048h ;В первом операнде использована неявная адресация, а во втором - непосредственная [ ]


Управление таймерами-счётчиками


Схема управления таймерами 0 и 1 идентична и для таймера T0 приведена на рисунке 6. Для схемы управления таймером T1 изменятся только номера управляющих бит (нули будут заменены на 1). В приведенной схеме заштрихованным прямоугольником обозначены внешние ножки микросхемы микроконтроллера.

Рисунок 6. Схема управления таймерами 0 или 1.

Из схемы видно, что таймер может включаться и выключаться битами TRx. Таким образом можно уменьшать потребление микросхемы и уровень помех, создаваемый ею. Учитывая, что счетчики таймеров переключаются на высокой частоте, то они могут потреблять до половины тока потребления микроконтроллера. Следует отметить, что при включении и после сброса микроконтроллера работа таймеров запрещена.

Есть возможность управлять работой таймера извне при помощи внешней ножки T0 для таймера T0 или T1 для таймера T1. Для этого необходимо записать в бит GATEx логическую единицу (не забыв при этом разрешить работу таймера при помощи бита TRx).

Кроме того, таймер может синхронизироваться от внешнего генератора. Для этого в бит управления C/T нужно записать логическую единицу.

Биты включения таймеров TR0 и TR1 размещены в регистре TCON (control - управлять), а биты GATE и C/T в регистре TMOD. Формат регистра TCON приведён на следующем рисунке:

Рисунок 7. Формат регистра управления режимами работы таймеров TCON.

Символ Позиция Имя и назначение
TF1 TCON.7

Флаг переполнения таймера 1. Устанавливается аппаратно при переполнении таймера/счетчика. Сбрасывается при обслуживании прерывания аппаратно

TR1 TCON.6

Бит управления таймера 1. Устанавливается/сбрасывается программой для пуска/останова

TF0 TCON.5

Флаг переполнения таймера 0. Устанавливается аппаратурно. Сбрасывается при обслуживании прерывания

TR0 TCON.4

Бит управления таймера 0. Устанавливается / сбрасывается программой для пуска/останова таймера/счетчика

IE1 TCON.3

Флаг фронта прерывания 1. Устанавливается аппаратно, когда детектируется срез внешнего сигнала INT1. Сбрасывается при обслуживании прерывания

IT1 TCON.2

Бит управления типом прерывания 1. Устанавливается / сбрасывается программно для определения типа запроса прерывания INT1 (срезу/низким уровнем).

IE0 TCON.1

Флаг фронта прерывания 0. Устанавливается по срезу сигнала INT0. Сбрасывается при обслуживании прерывания

IT1 TCON .0

Бит управления типом прерывания 0. Устанавливается / сбрасывается программно для определения типа запроса прерывания INT0 (срез/низкий уровень)

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

являются квазидвунаправленными портами ввода- вывода


Порты P0, P1, P2, P3 являются квазидвунаправленными портами ввода- вывода и предназначены для обеспечения обмена информацией микроконтроллера с внешними устройствами, образуя 32 линии ввода- вывода. Каждый из портов содержит восьмиразрядный регистр, имеющий байтовую и битовую адресацию для установки (запись '1') или сброса (запись '0') разрядов этого регистра с помощью программного обеспечения. Выходы этих регистров соединены с внешними ножками микросхемы. Упрощенная схема одного разряда порта показана на рис. 1

Рис. 1. Упрощенная схема одного бита порта.
Один разряд регистра - защелки порта представляет собой D-триггер. Данные с внутренней шины микроконтроллера записываются в регистр-защелку по сигналу "запись в защелку". Выход "Q" D-триггера подключается к внутренней шине (считывается) по сигналу "чтение защелки". Значение сигнала непосредственно с внешнего вывода порта считывается по сигналу "чтение вывода". Некоторые команды чтения порта используют сигнал "чтение защелки ", другие "чтение выода". Чтение внешних ножек микросхемы осуществляется командами: MOV A, P3 ;Скопировать состояние ножек порта P3 в аккумулятор JB P3.4, Metka ;Если на 4 ножке порта P3 логическая ‘1’, то перейти на метку Чтение регистра - защелки осуществляется командами чтение - модификация - запись. Например:

CPL P3.1 ;Проинвертировать сигнал на первой ножке порта P3 ORL P2,#56h ;Установить единичный сигнал на ножках 1,2,4 и 6 порта P2 ANL P3,#03h ;Установить нулевой сигнал на ножках 0 и 1 порта P3
Порты микросхемы служат для управления , подключенными к микроконтроллеру. Схема подключения простейших внешних устройств приведена на рисунке 2. Этот рисунок иллюстрирует особенности подключения индикаторов к параллельным портам микроконтроллера MCS-51.



Рисунок 2. Схема подключения светодиодных индикаторов к параллельному порту.

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


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



Рисунок 2. Эквивалентная схема подключения светодиодного индикатора к параллельному порту.

Для умощнения выводов порта можно применить транзисторный ключ, показанный на рисунке 2. Обратите внимание, что база транзистора подключена непосредственно к выводу порта. Это стало возможным только благодаря использованию в схеме порта генератора тока в верхнем плече выходного каскада (Схему подключения устройств к портам с TTL выходами можно посмотреть ). Если выходного тока достаточно для открывания транзисторного ключа, то резистор R2 не используется. Этот резистор подключается для увеличения базового тока транзисторного ключа. На максимальное значение тока через этот резистор накладываются те же ограничения, что и для непосредственного подключения светодиодного индикатора к выводам порта.

Микроконтроллеры предназначены для управления внешними устройствами, однако управлять напряжением на выходе параллельного порта микроконтроллера можно только при помощи программы, записанной в память программ. Какие напряжения необходимо подавать на выходы микросхемы зависят от схемы подключения индикатора. В приведённой на рисунке 2 схеме, для зажигания светодиода VD1, в шестой вывод порта P0 необходимо записать логический 0. Для зажигания светодиода VD2 необходимо в седьмой разряд порта P2 записать логическую единицу, а для его гашения – логический ноль.

Для записи числа в порт (изменения потенциалов на ножках микросхемы) можно воспользоваться командами с байтовой адресацией:

MOV (пересылка), например  MOV P2, #56h ;Установить единичный сигнал на ножках 1,2,4 и 6 порта P2 ;и нулевой потенциал на ножках 0,3,5 и 7 MOV P1, #01110011b ;Выдать на все восемь выводов порта P1 число 011100112 MOV P3, A ;Выдать на все восемь выводов содержимое аккумулятора ANL (логическое 'И'), например ANL P1, #11110011b ;выдать низкий потенциал на ножках P1.2 и P1.3 XRL (исключающее 'ИЛИ'), например XRL P3, #01000100b ;инвертировать состояние ножек P3.2 и P3.6 ORL (логическое 'ИЛИ'), например ORL P1, #00001100b ;выдать высокий потенциал на ножках P1.2 и P1.3 Эти команды изменяют потенциал сразу на нескольких выводах порта.


Кроме того, для изменения потенциалов на ножках микросхемы, можно воспользоваться командами с битовой адресацией:

MOV (пересылка), например MOV P1.2, C ;выдать содержимое бита переноса через 2-й бит порта P2 CPL (инверсия), например CPL P1.2 ;проинвертировать второй бит порта P2 SETB (установить бит), например SETB P2.3 ;выдать высокий потенциал на 3-й ножке порта P2 CLR (сбросить бит), например CLR P2.3 ;выдать низкий потенциал на 3-й ножке порта P2 При записи в разряд порта (в триггере Т) логического '0' выходной транзистор открывается и на выводе микросхемы появляется низкий потенциал, изменить который извне невозможно. Поэтому при опросе ножки микросхемы входная информация в этом случае всегда будет восприниматься как логический '0' независимо от состояния выходов внешних устройств. Если в указанный разряд записать логическую '1', то выходной транзистор закрывается и на выводе микросхемы появляется высокий потенциал за счет генератора тока. Он может извне изменен на нулевой потенциал (замыканием этой ножки микросхемы на корпус). В этом случае, считываемая микроконтроллером информация, будет соответствовать информации на выходе внешнего устройства. Поэтому, перед тем как осуществить ввод информации по какому-либо выводу порта, соответствующий разряд необходимо настроить на ввод - записать в него логическую '1'.

По той же причине при настройке выводов порта на выполнение альтернативных функций в соответствующие разряды должны быть записаны логические '1'.

Кроме работы в качестве обычных портов ввода - вывода, внешние выводы портов Р0 .. Р3 могут выполнять ряд дополнительных (альтернативных) функций:

Порт P0 может быть использован для организации шины данных при работе микроконтроллера с внешней памятью данных или программ, при этом через него выводится младший байт адреса A0 - A7, выдается из микроконтроллера или принимается в микроконтроллер байт данных. Во время доступа к внешней памяти  во все   триггеры - защелки порта P0 аппаратно записываются "1" (т.е.


содержимое порта теряется). Кроме того, через порт P0 передаюься данные при программировании внутреннего ППЗУ, и читается содержимое внутренней памяти программ при работе с программатором. При сбросе микросхемы во все разряды порта записываются '1'. Схема порта P0 отличается от всех других портов тем, что у этого порта нет внутреннего генератора тока. Поэтому при работе с этим портом приходится подключать внешние резисторы.



Схема использования порта P0 в качестве шины данных приведена на рисунке 3.


Рисунок 3. Использование порта P0 в качестве шины данных.

Порт P1 может быть использован для чтения внутренней памяти программ или для передачи младшего байта адреса при программировании внутреннего РПЗУ. В младших моделях микроконтроллера семейства других альтернативных функций у порта P1 нет. При сбросе микросхемы во все разряды порта записываются '1'.



P1.0 T2 -внешний вход таймера/счетчика 2
P1.1 T2EX -вход управления перезагрузки/захвата таймера
P1.2 ECI - внешний вход набора программируемых счетчиков (РСА)
P1.3 CEX0 -внешний вход/выход для вывода ШИМ или сравнения/захвата модуля 0
P1.4 CEX1 -внешний вход/выход для вывода ШИМ или сравнения/захвата модуля 0
P1.5 CEX2 -внешний вход/выход для вывода ШИМ или сравнения/захвата модуля 0
P1.6 CEX3 -внешний вход/выход для вывода ШИМ или сравнения/захвата модуля 0
P1.7 CEX4 -внешний вход/выход для вывода ШИМ или сравнения/захвата модуля 0

Примечание: альтернативные функции, выделенные: жирным подчеркнутым текстом - присутствуют во всех микросхемах жирным текстом - отсутствуют в микросхемах 8051,8031, КР1816ВЕ31, КР1816ВЕ51, КР1816ВЕ751 КР1830ВЕ31, КР1830ВЕ51, КР1830ВЕ751; курсивом - присутствуют только в микросхемах 8Х51FA, FB, FC и GB Порт P2 может быть использован для передачи старшего байта адреса при программировании внутреннего ППЗУ и при чтении внутренней памяти программ. Через порт Р2 выводится старший байт адреса А8 - А15 при работе с внешней памятью программ и внешней памятью данных (с 16- разрядным адресом).


Во время доступа к внешней памяти содержимое регистра - защелки порта P2 не изменяется. Схема использования порта P2 в качестве шины адреса приведена на рисунке 2. При сбросе микросхемы во все разряды порта P2 записываются '1'.



Порт P3. Каждая линия порта Р3 имеет индивидуальную альтернативную функцию, которая может быть задействована простым обращением к устройству, соединенному с ножкой порта (например, для того чтобы был выработан строб WR, достаточно обратиться с внешней памяти командой MOVX @DPTR, A или MOVX @R0,A). Линии порта Р3 могут выполнять альтернативные функции только в том случае, если в соответствующие этим линиям разряды регистра записаны логические '1', иначе на линиях порта будет присутствовать '0' независимо от характера принимаемой или передаваемой информации. При сбросе микросхемы во все разряды порта записываются '1'.



Р3.0 RxD - вход последовательного порта;
Р3.1 TxD - выход последовательного порта;
Р3.2 INT0 -используется как вход 0 внешнего запроса прерываний;
Р3.3 INT1 -используется как вход 1 внешнего запроса прерываний;
Р3.4 Т0 - используется как вход счетчика внешних событий 0;
Р3.5 Т1 - используется как вход счетчика внешних событий 1;
Р3.6 WR - строб записи во внешнюю память данных;
Р3.7 RD - строб чтения из внешней памяти данных.

[ ] [ ] [ ]


В базовых моделях семейства имеются


В базовых моделях семейства имеются два программируемых 16-битных таймера/счетчика (T/C0 и T/C1), которые могут быть использованы как в качестве таймеров, так и в качестве счетчиков внешних событий. Каждый из них состоит из двух 8-битных регистров TH0 (старший байт) и TH0 (младший байт) для таймера 0 или TH1 (старший байт) и TH1 (младший байт) для таймера 1.

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

В содержимое соответствующего таймера/счетчика инкрементируется под воздействием перехода из 1 в 0 внешнего входного сигнала, подаваемого на T0 или T1. Так как на распознавание периода требуются два машинных цикла, максимальная частота подсчета входных сигналов равна 1/24 частоты резонатора. На длительность периода входных сигналов ограничений сверху нет. Для гарантированного прочтения входной сигнал должен удерживать значение 1, как минимум, в течение одного машинного цикла микро-ЭВМ.

идентичны. Таймер 0 и Таймер 1 могут работать в четырех режимах работы: Кроме того, Таймер 1 можно использовать для задания скорости передачи (baud rate) последовательного порта.

Для переключения режимов работы таймеров используются биты M0 и M1 регистра специальной функции TMOD. Название образовано от сокращения двух английских слов: T(timer)- таймер и mode - режим. Имена и расположение битов приведено на рисунке 1:



Рисунок 1. Формат регистра управления режимами работы таймеров TMOD.

Так как управление таймерами 0 и 1 полностью идентично, то приведём назначение битов по именам:

Символ Позиция бита Имя и назначение
GATE TMOD.7 для таймера 1 и TMOD.3 для таймера 0 Управление блокировкой таймера от ножки INTx. Если бит установлен в 1, то таймер/счетчик "x" разрешен до тех пор, пока на входе "lNTx" высокий уровень и бит управления "TRx" установлен. Если бит сброшен в 0, то Т/С разрешается, как только бит управления "TRx" устанавливается в 1.
С/Т TMOD.6 для таймера 1 и TMOD.2 для таймера 0 Бит выбора режима таймера или счетчика событий. Если бит сброшен в 0, то таймер работает от внутреннего генератора, если установлен в 1, то работает от внешних сигналов на входе "Tx"
M1 TMOD.5 для таймера 1 и TMOD.1 для таймера 0 Выбор режима работы таймера
M1 M0
0 0 13 битный таймер/счетчик "TLx" работает как 5-битный предварительный делитель
0 1 16 битный таймер/счетчик. "THx" и "TLx" включены последовательно
1 0 8-битный автоперезагружаемый таймер/счетчик. "THx" хранит значение, которое должно быть перезагружено в "TLx" каждый раз по переполнению
1 1 Таймер/счетчик 1 останавливается. Таймер/счетчик 0: TL0 работает как 8-битный таймер/счетчик, и его режим определяется управляющими битами таймера 0. TH0 работает только как 8 битный таймер, и его режим определяется управляющими битами таймера 1

Эти функции присутствуют в большинстве ассемблеров для микроконтроллеров MCS-51. Если же язык программирования не содержит в своём составе подобные функции, то можно для выделения байтов воспользоваться операцией деления на 256.

mov TH0, #-5000/256 ;Загрузить старший байт таймера mov TL0, #-(5000-5000/256) ;Загрузить младший байт таймера Режим 1

В первом режиме работы таймер работает как шестнадцатиразрядный счётчик. Режим 1 похож на режим 0, за исключением того, что в регистрах таймера использует все 16 бит. В этом режиме регистры ТНх и TLx также включены друг за другом. Работе таймера 0 или таймера 1 в режиме 1 соответствует схема:



Рисунок 3. Схема таймеров 0 или 1 в режиме 1.

В этом режиме можно обеспечить формирование интервала времени длительностью до 65536 мкс при частоте задающего генератора 12 МГц.

Рассмотрим пример использования таймера T0 для формирования временного интервала 15мс.

;Настроить режим работы таймера------------------------------------------------------------------------------------------- mov TMOD,#00000001b ;перевести таймер T0 в первый режим работы, а T1 - в нулевой ; ;++-------Перевести таймер T0 в шестнадцатиразрядный режим работы ;|+-----------Синхронизироваться от внутреннего генератора ;+------------Запретить управление таймером от ножки INT0 ;++-------------Перевести таймер T1 в тринадцатиразрядный режим ;|+----------------Синхронизироваться от внутреннего генератора ;+-----------------Запретить управление таймером от ножки INT1 ;Настроить таймер на генерацию 15-ти миллисекундного интервала времени------------------------------------ mov TH0, #HIGH(-15000) ;Загрузить старший байт таймера mov TL0, #LOW(-15000) ;Загрузить младший байт таймера OjidanTimer: jnb TF0, OjidanTimer ;Подождать пока не переполнится таймер В рассмотренном примере переполнение таймера произойдёт через 15000 циклов процессора, то есть через 15 мс. Программа будет постоянно проверять состояние флага переполнения таймера и как только он установится в единицу перейдёт к выполнению следующей команды.



Нулевой и первый режимы работы таймеров T0 и T1 предназначены для формирования одиночного интервала времени. Если возникает необходимость формировать последовательность интервалов времени для периодических процессов, то загрузка регистров TH0 и TL0 для задания нужного интервала времени производится программно, что для коротких интервалов времени может привести к значительным затратам процессорного времени.

Для формирования последовательности одинаковых интервалов времени используется режим работы таймера с перезагрузкой - режим 2.

Режим 2

В режиме 2 регистр таймера TLx работает как 8-битный счетчик с автоматической перезагрузкой начального значения из регистра ТНх в регистр TLx. Переполнение регистра TLx не только устанавливает флаг TFx, но и загружает регистр TLx содержимым регистра ТНх, который предварительно инициализируется программно. Перезагрузка не изменяет содержимое регистра ТНх. Работе таймера 0 или таймера 1 в режиме 2 соответствует схема:



Рисунок 4. Схема таймеров 0 или 1 в режиме 2.

Работа с таймерами во втором режиме не отличается от рассмотренных ранее примеров, поэтому следующий пример инициализации таймера на генерацию частоты с периодом сто микросекунд (10кГц) приводится без комментария.

;Настроить режим работы таймера------------------------------------------------------------------------------------------- mov TMOD, #00000010b ;перевести таймер T0 во второй режим работы, а T1 - в нулевой ; ;++---Перевести таймер T0 в режим 8-ми разр. таймера с автозагрузкой ;|+-----Синхронизироваться от внутреннего генератора ;|+-------Запретить управление таймером от ножки INT0 ;++-------Перевести таймер T1 в тринадцатиразрядный режим ;|+---------Синхронизироваться от внутреннего генератора ;+----------Запретить управление таймером от ножки INT1 mov TMOD,#2 ;перевести таймер T0 во второй режим работы, а T1 - в нулевой mov TH0, #-50 ;Загрузить старший байт таймера mov TL0, #-50 ;Загрузить младший байт таймера OjidanTimer: jnb TF0, OjidanTimer ;Подождать пока не переполнится таймер cpl P2.6 ;Проинвертировать сигнал на шестой ножке второго порта и sjmp OjidanTimer ;снова перейти к ожиданию окончания временного интервала Режим 3 Таймер 1 при работе в режиме 3 просто хранит свое значение.Эффект такой же как при сбросе бита TR1.

Таймер 0 в режиме 3 представляет собой два раздельных 8 битных счетчика (регистры TL0 и ТН0), Регистр TL0 использует биты управления таймера 0: С/Т0. GATE0, TR0 и TF0. Регистр ТН0 работает только в режиме таймера и использует биты TR1 и TF1 таймера 1. Таким образом, регистр ТН0 управляет прерыванием таймера 1. Логика работы таймера 0 в режиме 3 показана на схеме:



Рисунок 5. Схема таймерa 0 в режиме 3.

Работа таймера TL0 разрешается, если бит TR0 = 1, а таймера TH0 - если бит TR1 = 1. Таймер 1 при работе таймера 0 в режиме 3 постоянно включен.

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


предназначена для временного хранения информации,


Внешняя память данных предназначена для временного хранения информации, используемой в процессе выполнения программы. Эта память физически должна быть подключена к микросхеме микроконтроллера при помощи схемы, изображенной на рисунке 1. Максимальный объем этой памяти определяется регистром DPTR и составляет 64 Кбайта. Точно также как и в случае внешней памяти программ, объем внешней памяти данных может быть увеличен за счет использования портов P1 и P3 до 1 Гбайта. Внешняя память данных для своей работы требует использование портов P0, P2 и P3. Это приводит к увеличению габаритов устройства, увеличению уровня помех и, в конечном итоге, увеличения стоимости устройства в целом. Поэтому в современных устройствах внешняя память не используется. Однако, в некоторых микроконтроллерах (например 87с550 фирмы DALLAS) команды обращения к внешней памяти используются для работы с дополнительной внутренней памятью большого объема.

Для обращения к внешней памяти данных используются команды MOVX A, @DPTR (команда чтения) и

MOVX @DPTR, A (команда записи)
Иногда для того, чтобы сохранить порт P2  в качестве порта общего использования, для обращения к памяти данных используются команды MOVX A, @R0 или MOVX A, @R0 (команды чтения)

MOVX@R0, A MOVX@R0, A (команды записи)
Рисунок 3. Адресное пространство внешней памяти данных.

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



Несмотря на то, что это самое маленькое адресное пространство из рассматриваемых, оно устроено наиболее сложным образом. Распределение памяти данных микроконтроллеров серии MCS-51 приведено на рисунке 4.



Рисунок 4. Адресное пространство внутренней памяти данных.

Внутреннее ОЗУ данных предназначено для временного хранения информации, используемой в процессе выполнения программы, и занимает 128 младших байт, с адресами от 000h до 07Fh для микроконтроллеров 8051, 8031, КР1816ВЕ31, КР1816ВЕ51, КР1816ВЕ751 КР1830ВЕ31, КР1830ВЕ51, КР1830ВЕ751 или 256 восьмиразрядных ячеек, с адресами от 000h до 0FFh для всех остальных микроконтроллеров семейства.

занимают адреса внутренней памяти данных с 080h по 0FFh. Так как адреса регистров специальных функций совпадают со старшими адресами внутреннего ОЗУ данных, то имеются особенности при использовании этих адресов внутренней памяти данных.

Система команд микроконтроллера позволяет обращаться к ячейкам внутренней памяти данных при помощи и адресации. При обращении к ячейкам памяти с адресами 0-127 использование любого из этих видов адресации будет производить выборку одной и той же ячейки памяти. При обращении к ячейкам ОЗУ с адресами 128-256 следует воспользоваться . Учитывая, что работа со стеком ведётся при помощи косвенной адресации, то имеет смысл размещать в этой области памяти . Если же требуется обратиться к , то нужно использовать . Например:

MOV A, 80h ;Скопировать сигналы с внешних ножек порта P0 в аккумулятор MOV R0, #80h ;Скопировать в аккумулятор содержимое MOV A, @R0 ;ячейки внутреннего ОЗУ с адресом 80h Регистры общего назначения позволяют писать самые эффективные программы. У микроконтроллеров семейства MCS-51 программирующему инженеру доступны восемь регистров. Более того, в этом семействе микроконтроллеров есть целых четыре набора (банка) регистров с именами RB0 - RB3. Банк регистров состоит из восьми восьмиразрядных регистров с именами R0, R1, …, R7.  Несколько банков регистров служат для организации независимой работы нескольких параллельно выполняемых программ.


Переключение банков регистров производится при помощи двух особых бит регистра слова состояния программы PSW (RS0 и RS1). Если организация нескольких параллельных потоков обработки данных не нужна, то можно пользоваться только нулевым банком регистров, включающимся автоматически после включения питания и сброса микроконтроллера, остальные ячейки памяти использовать как обычное ОЗУ.

Все четыре банка регистров объединены с 32 младшими байтами внутреннего ОЗУ данных (см. рисунок 4). Так как физически регистры и ячейки внутреннего ОЗУ объединены, то команды программы могут обращаться к регистрам, используя их имена R0-R7 ( ):

MOV A, R0 ;Скопировать содержимое регистра R0 в аккумулятор MOV R7, A ;Скопировать содержимое регистра R7 в аккумулятор или используя их адрес во внутренней памяти данных ( ):

MOV A, 0 ;Скопировать содержимое нулевой ячейки ОЗУ в аккумулятор MOV 7, A ;Скопировать содержимое аккумулятора в седьмую ячейку ОЗУ Следующие после банков регистров внутреннего ОЗУ данных 16 ячеек памяти (адреса 20Н-2FH) образуют область памяти, к которой возможна как байтовая, так и битовая адресация. В этих ячейках располагаются 128 программных флагов (битовых ячеек памяти). Обращение к отдельным битам этих ячеек возможно по их битовым адресам. Например команды:

SETB 15 ;Запомнить в 15 флаге логическую единицу JB 15, Metka ;Если в 15 флаге записана логическая единица, то перейти на метку обращаются к 15 флагу, расположенному в старшем бите байтовой ячейки памяти 21h. Использование однобитовых ячеек памяти позволяет сократить необходимый для работы программы объём памяти данных, так как для хранения битовых переменных выделяется один бит в памяти данных, а не машинное слово, как это делается в универсальных микропроцессорах (компьютерах).

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

CPL 92 ;Проинвертировать второй бит порта P1 Оставшаяся область памяти используется как обычное ОЗУ без особенностей. Хотя, надо отметить, что в современных микроконтроллерах эту память следует рассматривать как встроенные 256 регистров сверхоперативного ОЗУ. Основной памятью постепенно становится внутренняя память, доступная при помощи команд MOVX @DPTR, A


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


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

Максимальный коэффициент деления на таймере можно получить 65536. Попробуем необходимый коэффициент деления генератора эталонных интервалов времени равный 12000000 разделить на несколько сомножителей. Прежде всего, выделим сомножитель, равный 12. Это внутренний делитель таймера, который всегда присутствует в составе микросхемы и не может быть нами отключен. То есть нам остаётся реализовать делитель на 1000000.

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

Как уже обсуждалось ранее, алгоритм и программу можно писать одновременно. Начнём написание программы с организации простейшей программы-монитора. Этот первоначальный вариант программы приведен на рисунке 9.18.

Как видно из приведённого исходного текста программы эта программа пока ничего не делает. Однако в этой программе предусмотрен бесконечный цикл, который не позволит программе когда-либо завершиться до выключения питания устройства. По циклу при подключенном к микроконтроллеру кварцевом резонаторе 12МГц программа будет проходить один раз за 2 мкс.

;-------------СБРОС МИКРОКОНТРОЛЛЕРА--------------------------- ORG 0 Jmp init ;Переход на начало выполнения программы ;-------------ИНИЦИАЛИЗАЦИЯ МИКРОКОНТРОЛЛЕРА------------------- init: ;-------------ОСНОВНАЯ ПРОГРАММА МИКРОКОНТРОЛЛЕРА-------------- Begin: Jmp begin ;Переход на начало выполнения программы end

Рисунок 9.18. Исходный текст первоначального варианта программы.

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

Программа в основном режиме может ожидать переполнения таймера, опрашивая флаг TF0, но при использовании прерываний от таймера можно значительно снизить потребление микроконтроллера. Экономия реализуется при переведении микроконтроллера в спящий режим командой orl PCON,#1. После выполнения этой команды микроконтроллер может проснуться только после сброса микроконтроллера или возникновения прерывания.

Для реализации прохождения микроконтроллером по основному циклу один раз в 50мс разместим команду orl PCON,#1 в конце цикла. В качестве источника прерываний будет служить таймер T0. Переход на начало цикла будет осуществляться сразу после возврата из подпрограммы обслуживания прерывания.

Так как прерывания нам потребуются каждые 50 мс, то разрешение прерываний от таймера разместим тоже в подпрограмме инициализации таймера. Разрешение прерываний от таймера производится записью единиц в биты регистра специального назначения IE. Разрешение прерываний от таймера производится битом ET0, а общее разрешение всех прерываний битом EA. Установим эти биты в единичное состояние командой orl IE,#10000010b.

Теперь микроконтроллер каждые 50 мс будет не только просыпаться, но и передавать управление на вектор прерывания таймера T0. Этот вектор находится по адресу 0Bh. Подпрограмму повторной записи числа 50мс в таймер нужно поместить точно на этот адрес. Размещение подпрограммы на векторе прерывания можно произвести директивой ORG 0Bh. Так как пока нет прерываний от других источников, то подпрограмму обслуживания прерывания не будем выносить в конец программы.

;-------------СБРОС МИКРОКОНТРОЛЛЕРА--------------------------------- ORG jmp init ;Переход на начало выполнения программы ;-------------ВЕКТОР ПРЕРЫВАНИЯ ТАЙМЕРА T0--------------------------- ORG 0Bh mov TH0, #HIGH(-50000) ;Загрузить старший байт таймера mov TL0, #LOW(-50000) ;Загрузить младший байт таймера reti ;-------------ИНИЦИАЛИЗАЦИЯ МИКРОКОНТРОЛЛЕРА------------------------- init: call Timer0_Init ;Настроить таймер T0 на прерывания с периодом 50мс ;-------------ОСНОВНАЯ ПРОГРАММА МИКРОКОНТРОЛЛЕРА-------------------- Begin: orl PCON,#1;Перевести микроконтроллер в пониженный режим ;потребления тока и подождать переполнения таймера jmp begin ;Переход на начало выполнения программы ;-------------КОНЕЦ ОСНОВНОЙ ПРОГРАММЫ МИКРОКОНТРОЛЛЕРА-------------- ;******************************************************************** ;Подпрограмма настройки таймера T0 на 50мс режим работы ;******************************************************************** Timer0_Init: mov TMOD,#00000001b ;перевести таймер T0 в первый режим ; работы, а T1 - в нулевой режим ;++------Перевести таймер T0 в ; шестнадцатиразрядный режим работы ;|+--------Синхронизироваться от внутреннего ;| генератора ;+---------Запретить управление таймером от ; ножки INT0 ;++----------Перевести таймер T1 в ; тринадцатиразрядный режим ;|+------------Синхронизироваться от внутреннего ;|+------------генератора ;+-------------Запретить управление таймером ; от ножки INT1 ;Настройка таймера на генерацию 50-ти миллисекундного интервала ;времени mov TH0, #HIGH(-50000) ;Загрузить старший байт таймера mov TL0, #LOW(-50000) ;Загрузить младший байт таймера orl IE,#10000010b ;Разрешить прерывания от таймера SetB TR0 ;включить таймер ret ;и вернуться в основную программу end Рисунок 9.19.


Исходный текст программы с 50мс циклом.

Исходный текст варианта программы c 50 мс циклом приведен на рисунке 9.19. Этот вариант программы можно тщательно проверить на работоспособность на программном эмуляторе или непосредственно на собранном устройстве. При измерении тока микроконтроллера будут отчётливо видны импульсы повышенного тока с периодом 50мс.

Программа, приведенная на рисунке 9.19, реализует генератор эталонных интервалов времени с периодом 50мс. Нам же требуется генератор с периодом 1с. То есть, нужен ещё один делитель с коэффициентом деления 20. Его можно реализовать на одиночной ячейке внутренней памяти микроконтроллера.

;-------------ОБЪЯВЛЕНИЕ ПЕРЕМЕННЫХ---------------------------------- Delit equ 8 ;Номер ячейки памяти делителя NachStek equ 8 ;Номер начальной ячейки памяти стека ;-------------СБРОС МИКРОКОНТРОЛЛЕРА--------------------------------- ORG 0 jmp init ;Переход на начало выполнения программы ;-------------ВЕКТОР ПРЕРЫВАНИЯ ТАЙМЕРА T0--------------------------- ORG 0Bh mov TH0, #HIGH(-50000) ;Загрузить старший байт таймера mov TL0, #LOW(-50000) ;Загрузить младший байт таймера reti ;-------------ИНИЦИАЛИЗАЦИЯ МИКРОКОНТРОЛЛЕРА------------------------- init: mov SP,#NachStek ;Изменить размер стека call Timer0_Init ;Настроить таймер T0 на прерывания с периодом 50мс mov Delit,#20 ;Настроить делитель на коэффициент деления 20 ;-------------ОСНОВНАЯ ПРОГРАММА МИКРОКОНТРОЛЛЕРА-------------------- Begin: DJNZ Delit,Sleep ;Если прошла одна секунда, то mov Delit,#20 ;настроить делитель на коэффициент деления 20 call Clock ;и вызвать подпрограмму реализации часов. Sleep: orl PCON,#1;Перевести микроконтроллер в пониженный режим ;потребления тока и подождать переполнения таймера jmp begin ;Переход на начало выполнения программы ;-------------КОНЕЦ ОСНОВНОЙ ПРОГРАММЫ МИКРОКОНТРОЛЛЕРА-------------- ;******************************************************************** ;Подпрограмма реализации часов ;******************************************************************** Clock: ret Рисунок 9.20.


Исходный текст программы с 1 сек циклом.

Для выделения переменной воспользуемся директивой equ. Выделим для делителя ячейку с адресом 8. Это ячейка находится непосредственно после нулевого банка регистров. Кроме того, теперь потребуется изменить первоначальное значение указателя стека, равное 8, иначе при первом же вызове подпрограммы содержимое делителя будет уничтожено. Новый вариант программы приведен на рисунке 9.20.

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

Учитывая, что программа изменится незначительно, приведем исходный текст только изменённых участков программы. Эти участки программы приведены на рисунке 9.20. В первой части объявляется переменная SEC будет осуществляться счёт секунд. Во второй части этой переменной присваивается первоначальное значение, а переключение счётчика производится непосредственно в подпрограмме Clock

;-------------ОБЪЯВЛЕНИЕ ПЕРЕМЕННЫХ---------------------------------- Delit equ 8 ;Номер ячейки памяти делителя SEC equ 9 ;Номер ячейки памяти счётчика секунд NachStek equ 9 ;Номер начальной ячейки памяти стека ... ;-------------ИНИЦИАЛИЗАЦИЯ МИКРОКОНТРОЛЛЕРА------------------------- init: mov SP,#NachStek ;Изменить размер стека call Timer0_Init ;Настроить таймер T0 на прерывания с периодом 50мс mov Delit,#20 ;Настроить делитель на коэффициент деления 20 mov SEC,#60 ;Настроить счётчик секунд на коэффициент деления 60 ... ;******************************************************************** ;Подпрограмма реализации часов ;******************************************************************** Clock: DJNZ SEC,ExitClock;Если прошла одна минута, то mov SEC,#60 ;настроить счётчик секунд на коэффициент деления 60 ExitClock: ret Рисунок 9.21. Исходный текст участков программы, отвечающих за организацию счётчика секунд.



И предделитель и счётчик секунд представляют собой двоичные вычитающие счетчики, реализованные при помощи команды DJNZ. Счётчик минут необходимо будет в дальнейшем отображать на светодиодных индикаторах, поэтому этот счётчик желательно реализовать как двоично-десятичный счётчик.

Готовой команды, способной реализовать суммирующий двоично-десятичный счётчик на любой ячейке памяти, в системе команд микроконтроллера нет. Поэтому придётся реализовывать двоично-десятичный счётчик на аккумуляторе. Исходный текст подпрограммы, реализующей счётчик минут, приведен на рисунке 9.22.

;-------------ОБЪЯВЛЕНИЕ ПЕРЕМЕННЫХ---------------------------------- Delit equ 8 ;Номер ячейки памяти делителя SEC equ 9 ;Номер ячейки памяти счётчика секунд MIN equ 10 ;Номер ячейки памяти счётчика минут NachStek equ 10 ;Номер начальной ячейки памяти стека ... ;-------------ИНИЦИАЛИЗАЦИЯ МИКРОКОНТРОЛЛЕРА------------------------- init: mov SP,#NachStek ;Изменить размер стека call Timer0_Init ;Настроить таймер T0 на прерывания с периодом 50мс mov Delit,#20 ;Настроить делитель на коэффициент деления 20 mov SEC,#60 ;Настроить счётчик секунд на коэффициент деления 60 mov MIN,#0 ;Обнулить счётчик минут ... ;******************************************************************** ;Подпрограмма реализации часов ;******************************************************************** Clock: DJNZ SEC,ExitClock;Если прошла одна минута, то mov SEC,#60 ;настроить счётчик секунд на коэффициент деления 60 mov A,MIN ; add A,#1 ;Переключить счётчик минут DA A ; mov MIN,A ; CJNE A,#60h,ExitClock ;Если прошло 60 минут, mov MIN,#0 ;то обнулить счётчик минут ExitClock: ret Рисунок 9.22. Исходный текст участков программы, отвечающих за организацию счётчика минут.

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

Команды ADD и INC могут быть выполнены только над аккумулятором, поэтому в аккумулятор сначала копируется содержимое переменной счётчика минут, а затем, после выполнения операции двоично-десятичного суммирования, снова сохраняется в переменной счётчика минут.


Исходный текст программы с подпрограммой реализации часов приведен на рисунке 9.23.

;-------------ОБЪЯВЛЕНИЕ ПЕРЕМЕННЫХ---------------------------------- Delit equ 8 ;Номер ячейки памяти делителя SEC equ 9 ;Номер ячейки памяти счётчика секунд MIN equ 10 ;Номер ячейки памяти счётчика минут Chas equ 11 ;Номер ячейки памяти счётчика минут NachStek equ 11 ;Номер начальной ячейки памяти стека ... ;-------------ИНИЦИАЛИЗАЦИЯ МИКРОКОНТРОЛЛЕРА------------------------- init: mov SP,#NachStek ;Изменить размер стека call Timer0_Init ;Настроить таймер T0 на прерывания с периодом 50мс mov Delit,#20 ;Настроить делитель на коэффициент деления 20 mov SEC,#60 ;Настроить счётчик секунд на коэффициент деления 60 mov MIN,#0 ;Обнулить счётчик минут mov Chas,#0 ;Обнулить счётчик часов ... ;******************************************************************** ;Подпрограмма реализации часов ;******************************************************************** Clock: DJNZ SEC,ExitClock;Если прошла одна минута, то mov SEC,#60 ;настроить счётчик секунд на коэффициент деления 60 Call IncMin JC ExitClock Call IncChas ExitClock: ret ;******************************************************************** ;Подпрограмма увеличения содержимого счётчика минут ;******************************************************************** IncMin: mov A,MIN ; add A,#1 ;Переключить счётчик минут DA A ; mov MIN,A ; CJNE A,#60h,ExitIncMin ;Если прошло 60 минут, mov MIN,#0 ;то обнулить счётчик минут ExitIncMin: ret ;******************************************************************** ;Подпрограмма увеличения содержимого счётчика часов ;******************************************************************** IncChas: mov A,Chas ; add A,#1 ;Переключить счётчик часов DA A ; mov Chas,A ; CJNE A,#24h,ExitIncHr;Если прошло 24 часа, mov Chas,#0 ;то обнулить счётчик часов ExitIncHr: ret Рисунок 9.23. Исходный текст участков программы, отвечающих за реализацию электронных часов.

Для того чтобы полностью воспользоваться преимуществами структурного программирования, операторы, выполняющие увеличение показаний счётчика минут, оформлены в виде подпрограммы.


В результате подпрограмма реализации часов выглядит полностью как алгоритм. Для переключения счётчика часов используется команда проверки флага переноса C. Этот флаг устанавливается командой CJNE.

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

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

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

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

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

Теперь можно заняться подпрограммой блока индикации. На принципиальной схеме часов не указано, что и на каком индикаторе должно отображаться. Зададимся, что на индикаторе, подключенном к порту P0, будут отображаться единицы минут. На индикаторе, подключенном к порту P1, будут отображаться десятки минут. На индикаторе, подключенном к порту P2, будут отображаться десятки минут.


На индикаторе, подключенном к порту P3, будут отображаться десятки минут.

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

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

Delit equ 8 ;Номер ячейки памяти делителя SEC equ 9 ;Номер ячейки памяти счётчика секунд MIN equ 10 ;Номер ячейки памяти счётчика минут Chas equ 11 ;Номер ячейки памяти счётчика минут NachStek equ 11 ;Номер начальной ячейки памяти стека ;-------------СБРОС МИКРОКОНТРОЛЛЕРА--------------------------------- ORG 0 jmp init ;Переход на начало выполнения программы ;-------------ВЕКТОР ПРЕРЫВАНИЯ ТАЙМЕРА T0--------------------------- ORG 0Bh mov TH0, #HIGH(-50000) ;Загрузить старший байт таймера mov TL0, #LOW(-50000) ;Загрузить младший байт таймера reti ;-------------ИНИЦИАЛИЗАЦИЯ МИКРОКОНТРОЛЛЕРА------------------------- init: mov SP,#NachStek ;Изменить размер стека call Timer0_Init ;Настроить таймер T0 на прерывания с периодом 50мс mov Delit,#20 ;Настроить делитель на коэффициент деления 20 mov SEC,#60 ;Настроить счётчик секунд на коэффициент деления 60 mov MIN,#0 ;Обнулить счётчик минут mov Chas,#0 ;Обнулить счётчик часов ;-------------ОСНОВНАЯ ПРОГРАММА МИКРОКОНТРОЛЛЕРА-------------------- Begin: call Indic ;Произвести индикацию состояния часов на светодиодных ;индикаторах DJNZ Delit,Sleep ;Если прошла одна секунда, то mov Delit,#20 ;настроить делитель на коэффициент деления 20 call Clock ;и вызвать подпрограмму счётчика секунд. Sleep: orl PCON,#1;Перевести микроконтроллер в пониженный режим ;потребления тока и подождать переполнения таймера jmp begin ;Переход на начало выполнения программы ;-------------КОНЕЦ ОСНОВНОЙ ПРОГРАММЫ МИКРОКОНТРОЛЛЕРА-------------- ;******************************************************************** ;Подпрограмма блока индикации ;******************************************************************** Indic: ret Рисунок 9.24.


Исходный текст программы с вызовом подпрограммы блока индикации.

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

;******************************************************************** ;Подпрограмма блока индикации ;******************************************************************** Indic: Mov A,MIN ;Считать содержимое счётчика минут AnL A,#0Fh ;Выделить младшую тетраду Call Decod ;Преобразовать её в семисегментный код Mov P1,A ;и передать через порт P1 на индикатор Mov A,MIN ;Считать содержимое счётчика минут SWAP A ;Выделить AnL A,#0Fh ;старшую тетраду Call Decod ;Преобразовать её в семисегментный код Mov P2,A ;и передать через порт P2 на индикатор Mov A,Chas ;Считать содержимое счётчика часов AnL A,#0Fh ;Выделить младшую тетраду Call Decod ;Преобразовать её в семисегментный код Mov P0,A ;и передать через порт P0 на индикатор Mov A,Chas ;Считать содержимое счётчика часов SWAP A ;Выделить AnL A,#0Fh ;старшую тетраду Call Decod ;Преобразовать её в семисегментный код Mov P3,A ;и передать через порт P3 на индикатор ret Рисунок 9.25. Исходный текст подпрограммы индикации.

Старшая тетрада счётчика выделяется аналогичным образом. Отличие заключается в том, что перед логическим умножением старшая и младшая тетрады меняются местами при помощи команды SWAP.

Собственно говоря, индикация осуществляется при копировании полученного из подпрограммы декодирования семисегментного кода двоично-десятичного числа в параллельный порт.

Рассмотрим подпрограмму преобразования двоично-десятичного кода в семисегментный. Исходный текст программы подпрограммы декодирования  двоично-десятичного числа приведен на рисунке 9.26. Декодирование осуществляется за счёт таблицы перекодировки. Количество строк в таблице соответствует количеству комбинаций двоично-десятичного кода, то есть равно десяти. Нули и единицы в получаемом коде определяются свечением сегментов светодиодного индикатора.



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

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

;******************************************************************** ;Подпрограмма семисегментного декодера ;******************************************************************** Decod: Mov DPTR,#TabSemiSeg ;Установить указатель на начало таблицы MovC A,@A+DPTR ;Считать значение кода и ret ;вернуть через аккумулятор TabSemiSeg: ; abcdefg DB 11111110b ;символ '0' a DB 10110000b ;символ '1' ------- DB 11101101b ;символ '2' | | DB 11111001b ;символ '3' f| | b DB 10110011b ;символ '4' | g | DB 11011011b ;символ '5' ------- DB 11011111b ;символ '6' | | DB 11110000b ;символ '7' e| |c DB 11111111b ;символ '8' | d | DB 11111011b ;символ '9' ------- Рисунок 9.26. Исходный текст подпрограммы семисегментного декодера.

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



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

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

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

Рисунок 9.27. Временные диаграммы напряжения на контактах кнопки и сигнала, введенного в микроконтроллер.

Новый вариант программы с включенной в цикл подпрограммой опроса кнопок блока коррекции времени приведен на рисунке 9.28. Для хранения состояния кнопок в этой программе пришлось ввести новую переменную. В программе мы не будем использовать битовое пространство. Это позволит увеличить глубину стека и не вводить ещё один сегмент данных.



Теперь можно заняться реализацией подпрограммы опроса кнопок. Её задача состоит в копировании логических уровней с выводов порта во внутреннюю переменную микроконтроллера SostKn. Так как это будет происходить быстро и с постоянной задержкой по времени, то время взятия отсчетов (а также время вывода на индикаторы) будет строго постоянным. Исходный текст подпрограммы опроса кнопок приведён на рисунке 9.29.

В этой подпрограмме кнопки, разнесённые по портам, сводятся в одну переменную. Копирование производится битовыми командами MOV через флаг переноса C.

;-------------ОБЪЯВЛЕНИЕ ПЕРЕМЕННЫХ---------------------------------- Delit equ 8 ;Номер ячейки памяти делителя SEC equ 9 ;Номер ячейки памяти счётчика секунд MIN equ 10 ;Номер ячейки памяти счётчика минут Chas equ 11 ;Номер ячейки памяти счётчика часов SostKn equ 12 ;Номер ячейки переменной состояния кнопок NachStek equ 12 ;Номер начальной ячейки памяти стека ;-------------СБРОС МИКРОКОНТРОЛЛЕРА--------------------------------- ORG 0 jmp init ;Переход на начало выполнения программы ;-------------ВЕКТОР ПРЕРЫВАНИЯ ТАЙМЕРА T0--------------------------- ORG 0Bh mov TH0, #HIGH(-50000) ;Загрузить старший байт таймера mov TL0, #LOW(-50000) ;Загрузить младший байт таймера reti ;-------------ИНИЦИАЛИЗАЦИЯ МИКРОКОНТРОЛЛЕРА------------------------- init: mov SP,#NachStek ;Изменить размер стека call Timer0_Init ;Настроить таймер T0 на прерывания с периодом 50мс mov Delit,#20 ;Настроить делитель на коэффициент деления 20 mov SEC,#60 ;Настроить счётчик секунд на коэффициент деления 60 mov MIN,#0 ;Обнулить счётчик минут mov Chas,#0 ;Обнулить счётчик часов ;-------------ОСНОВНАЯ ПРОГРАММА МИКРОКОНТРОЛЛЕРА-------------------- Begin: call OprosKnop ;Опросить кнопки call Indic ;Произвести индикацию состояния часов на светодиодных ;индикаторах DJNZ Delit,Sleep ;Если прошла одна секунда, то mov Delit,#20 ;настроить делитель на коэффициент деления 20 call Clock ;и вызвать подпрограмму реализации часов. Sleep: orl PCON,#1;Перевести микроконтроллер в пониженный режим ;потребления тока и подождать переполнения таймера jmp begin ;Переход на начало выполнения программы ;-------------КОНЕЦ ОСНОВНОЙ ПРОГРАММЫ МИКРОКОНТРОЛЛЕРА-------------- ;******************************************************************** ;Подпрограмма опроса кнопок ;******************************************************************** OprosKnop: ret Рисунок 9.28.


Исходный текст программы с вызовом подпрограммы блока индикации.

;******************************************************************** ;Подпрограмма опроса кнопок ;******************************************************************** OprosKnop: Mov A,SostKn ;Считать переменную состояния кнопок Mov C,P1.7 ;Скопировать состояние кнопки "уст сек" Mov AСС.0,C ;в нулевой бит аккумулятора Mov C,P2.7 ;Скопировать состояние кнопки "уст мин" Mov AСС.1,C ;в первый бит аккумулятора Mov C,P3.7 ;Скопировать состояние кнопки "уст часов" Mov AСС.2,C ;во второй бит аккумулятора Mov SostKn,A ; Сохранить новое значение переменной состояния кнопок ret Рисунок 9.29. Исходный текст подпрограммы опроса кнопок.

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

Первое действие, которое мы выполним в этой подпрограмме – это обработаем команду, вводимую кнопкой установка секунд. По этой команде нужно просто обнулить счётчик секунд.

;******************************************************************** ;Подпрограмма блока коррекции часов ;******************************************************************** CorrClock: Mov A,SostKn ;Считать переменную состояния кнопок JB ACC.0, ;Если нажата кнопка "уст сек", Mov SEC,#0 ;то обнулить переменную SEC ret Рисунок 9.30. Исходный текст подпрограммы коррекции показания часов.

Обработка нажатия на кнопки "уст мин" и "уст часов" производится несколько иначе. Дело в том, что при нажатии на эти кнопки необходимо непрерывно увеличивать показания счётчика часов или минут. Пусть изменение показаний часов происходит пять раз в секунду. Эта скорость изменения показаний часов ещё может восприниматься человеком.


Подпрограмма коррекции показания часов будет выглядеть так, как это приведено на рисунке 9.31.

Если такая скорость коррекции показаний часов пять раз в секунду покажется слишком высокой, то можно изменить соотношение коэффициентов деления таймера и делителя, например: 32*31250. Тогда можно будет выбрать скорость коррекции показания часов из набора вариантов два или четыре раза в секунду.

;******************************************************************** ;Подпрограмма блока коррекции часов ;******************************************************************** CorrClock: Mov A,SostKn ;Считать переменную состояния кнопок JB ACC.0,TstKnMin ;Если нажата кнопка "уст сек", Mov SEC,#0 ;то обнулить переменную SEC TstKnMin: Mov A,Delit ;Если в предделителе ANL A,#3 ;число кратно 2, CJNE A,#2,ExitCorrClock; Mov A,SostKn ;то считать переменную состояния кнопок. JB ACC.1,TstKnChs ;Если нажата кнопка "уст мин", Call IncMin ;то увеличить содержимое счётчика минут TstKnChs: JB ACC.2, ExitCorrClock;Если нажата кнопка "уст мин", Call IncChas ;то увеличить содержимое счётчика часов ExitCorrClock: ret Рисунок 9.31. Изменённый исходный текст подпрограммы коррекции показания часов.

В приведенном варианте программы проверяется два младших бита делителя. Для выделения двух младших бит используется логическое умножение содержимого переменной Delit с маской 00011b. Так как эти биты принимают значение 10b пять раз в секунду, то, соответствующее количество раз, будет вызываться подпрограмма увеличения значения содержимого счётчика минут (или часов).

[ ] [ ] [ ]


Проектирование цифровых устройств на микроконтроллерах


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

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

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

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

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

Как и разработка любого устройства, разработка микропроцессорного устройства начинается с разработки структурной схемы.



Разработка принципиальной схемы


Разработка принципиальной схемы начинается с анализа структурной схемы. Структурная схема приведена на рисунке 1.

Рисунок 1. Структурная схема часов.

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

Из блока индикации только дешифратор можно реализовать программно. Светодиодные индикаторы естественно должны быть подключены к выводам микроконтроллера.

Так как у микроконтроллера есть четыре восьмиразрядных параллельных порта, то к ним можно подключить четыре семисегментных светодиодных индикатора. Четырёх индикаторов достаточно для отображения информации о текущем времени. Это десятки и единицы минут и десятки и единицы секунд.

После подключения этих индикаторов остаются свободными четыре одиночных вывода параллельных портов. Эти выводы можно использовать для подключения трёх кнопок блока коррекции. Трёх кнопок будет вполне достаточно. Это кнопки коррекции часов, минут и установки счётчика секунд в нулевое состояние.

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

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

Для правильной работы микроконтроллера при включении питания необходимо осуществить сброс микросхемы. В типовых схемах подключения микроконтроллеров обычно в качестве схемы сброса при включении питания используется конденсатор номиналом 1 мкф. Однако при плавном нарастании напряжения питания напряжения на выходе конденсатора может оказаться недостаточно для надёжного сброса микроконтроллера.

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



Рисунок 2. Принципиальная схема подключения микроконтроллера.

Получившаяся принципиальная схема часов приведена на рисунке 3.

Рисунок 3. Принципиальная схема часов.

[ ] [ ] [ ]


Разработка структурной схемы


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

Рисунок 1. Структурная схема устройства измерения времени.

В простейшем случае генератор импульсов эталонной длительности должен вырабатывать минутные импульсы. В качестве генератора эталонных импульсов мог бы подойти , так как этот тип генераторов обладает высокой стабильностью колебаний. Но кварцевые генераторы вырабатывают колебания в диапазоне от 1 до 30 МГц. Это соответствует временным интервалам от 0.03 до 1 мкС. Тем не менее, если воспользоваться , можно получить импульсы с периодом 1 минута.

Выберем частоту работы кварцевого генератора. Мы предполагаем использовать микроконтроллер семейства MCS-51, поэтому выберем частоту кварцевого генератора обычную для этих микроконтроллеров - 12 МГц. Тогда для формирования секундных импульсов (частота 1 Гц) потребуется делитель частоты на 12000000. Для формирования минутных импульсов потребуется ещё один делитель частоты. Так как в минуте содержится 60 секунд, то нам потребуется делитель на 60.

Уточнённая структурная схема разрабатываемого микропроцессорного устройства приведена на рисунке 2.

 

Рисунок 2. Уточнённая структурная схема устройства измерения времени.

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

И, наконец, последнее замечание. Любые часы время от времени требуют коррекции своего значения с целью синхронизации своих показаний с всемирным временем. Это будет делать блок коррекции, который в свою очередь будет состоять из кнопок и схемы установки внутреннего состояния счётчика временных интервалов.

Структурная схема часов с учётом блока индикации и блока коррекции времени приведена на рисунке 3.

Рисунок 3. Структурная схема часов.

[ ] [ ] [ ]