в значительной мере предопределяется ее
Архитектура семейства 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 |
[ ] [ ] [ ]
Арифметические команды
В наборе команд микроконтроллера имеются следующие арифметические операции:
, , , ,Действия производятся над целыми числами без знака. Команды сложения 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
Машинный код:
Пример: 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 представлено ниже:
Для чтения таблиц элементарных функций, перекодировок или строк, выводимых на дисплей, из памяти программ используются команды
и Переключение страниц памяти программ осуществляется командами ;Выбрать первую страницу ;Выбрать нулевую страницу |
Для других микроконтроллеров этого семейства изменяется только объем внутренней памяти программ. При использовании портов 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
Микроконтроллер | ОЗУ | ПЗУ | Таймер | Fт | порты | системная шина |
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 | есть |
Недостаточный объём внутренней памяти, как показал успех 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 (команды записи) |
Отметим, что в качестве внешней памяти данных могут быть использованы как микросхемы ОЗУ так и микросхемы ПЗУ.
предназначена для временного хранения информации,
Внутренняя память данных (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) = адрес подпрограммы (метки)
Машинный код:
Пример:
адрес команда исходный текст 1000 7111 ACALL 311hДействие команды:
до команды после команды PC=1000 PC=0311 *SP=35 *SP=1002ADD A, <байт-источник> - сложение.
Описание: складывает содержимое аккумулятора А с содержимым байта- источника. Результат операции помещается в аккумулятор. Флаг переноса C устанавливается при переносе из 7го разряда. Флаг вспомогательного переноса AC устанавливается при переносе из 3го разряда. При сложении знаковых чисел флаг переполнения OV устанавливается при превышении максимального положительного числа или при получении числа меньшего минимально возможного.
Для команды сложения разрешены следующие режимы адресации:
1) Первый операнд - , второй операнд - ;
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
(A) = (A) + (Rn) , n=0,1,2,3,4,5,6,7
Машинный код:
Пример:
адрес команда исходный текст 0000 2F ADD A, R7Действие команды:
до команды после команды PC=0000 PC=0001 A=35 A=7A R7=46 R7=46 C=0 C=02) Первый операнд - , второй операнд - ;
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
(A) = (A) + ((Ri)) , i=0,1
Машинный код:
Пример:
адрес команда исходный текст 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 |
Для других микроконтроллеров этого семейства изменяется только объем внутренней памяти программ и количество доступных векторов прерываний программы.
Ниже приведены адреса векторов прерываний и соответствующие им аппаратурные источники прерываний программы:
Вектор прерывания | Флаги, вызывающие прерывание | Источник прерывания |
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
|
|||||||||||||||
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ЕЕВН |
Режим 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 | + | + | + |
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. Схема подключения светодиодных индикаторов к параллельному порту.
Присутствие в схеме мощного транзистора позволяет подключать к выводам порта светодиодные индикаторы непосредственно без усилителя мощности.
Однако при этом необходимо следить за максимальной допустимой мощностью, рассеиваемой на микросхеме и напряжением, подаваемом на светодиод. Эквивалентная схема, на которой показан путь протекания выходного тока порта приведена на рисунке 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 полностью идентично, то приведём назначение битов по именам: