Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Применение микроконтроллеров MCS-51 при проектировании электронных устройств. Учебное пособие
.pdf
С помощью этих команд можно, например, некоторый внутренний
флаг (бит) вывести на одну из линий порта:
MOV C, FLAG
MOV P1.0, C
Хотя среди битовых инструкций нет операции "исключающее
ИЛИ", она достаточно просто реализуется программно (см., например,
[5], стр. 1–15).
7.4. Команды переходов
Команды группы переходов можно подразделить на 3 подгруппы.
Первая подгруппа – безусловные переходы. Список команд этой подгруппы приведён в табл. 7.7.
Таблица 7.7
Команды безусловных переходов
Мнемоника Операция Время, мкс
JMP addr Переход по адресу 2
JMP @A+DPTR Переход по @A+DPIR 2
CALL addr Вызов подпрограммы по адресу 2
RET Возврат из подпрограммы 2
RETI Возврат из прерывания 2
NOP No operation 1
Под одним мнемоническим обозначением JMP скрыты три команды перехода: SJMP, LJMP и AJMP, которые отличаются форматом адреса перехода. JMP является общим обозначением, применяемым в тех
случаях, когда программисту безразлично, какую команду перехода
использовать.
Для короткого перехода (Short JMP, Short – короткий) адрес
перехода определяется смещением, в качестве которого выступает
второй байт
команды. Этот байт интерпретируется как число со знаком, что обеспечивает переход на величину от –128 до +127 байт относительно адреса команды, следующей за инструкцией SJMP.
Инструкция длинного перехода LJMP (Long JMP, Long – длин-
ный) имеет длину в три байта, причём два последних байта представ-
41

ляют адрес. Эта команда дает возможность перехода к любому адресу
из 64 Кбайт памяти программ.
Команда среднего перехода (Average JMP, Average – сред-
ний) является двухбайтной. Первый байт помимо кода операции содержит 3 бита адреса перехода, а второй байт – остальные 8 бит адреса
перехода. При выполнении команды AJMP эти 11 бит подставляются в
11 младших разрядов PC
, а старшие 5 бит остаются без изменений.
Следовательно, переход возможен в пределах блока в 2 Кбайт, в котором расположена команда AJMP.
Во всех случаях программисту следует описывать адрес перехода
или в виде метки, или в виде 16-битной константы. Ассемблер сам
подставит корректный формат адреса.
Инструкция JMP @A+DPTR предназначена для выполнения переходов по
таблице. В момент выполнения команды адрес перехода вычисляется как сумма содержимого шестнадцатибитного DPTR и содержимого аккумулятора. Обычно DPTR устанавливается на адрес
таблицы переходов, а в аккумуляторе находится смещение (индекс)
относительно начала таблицы. Практический пример использования
этой команды приведен ниже:
MOV DPTR, #JUMP_TABLE
MOV A, INDEX_NUMBER
RL A ;обеспечивается двухбайтовый интервал
;при последовательных значениях номера
;индекса (0,1,2,3...)
JMP «A+DPTR
JMP_TABLE:
AJMP CASE_0
AJMP CASE_1
AJMP CASE_2
AJMP CASE_3
AJMP CASE_4
По аналогии с командой JMP команда CALL addr имеет две формы: короткую и среднюю: LCALL и ACALL. Все замечания относительно форматов JMP верны и для CALL.
Единственное различие команд RET и RETI заключается в том, что
при выполнении команды RETI система организации прерываний уведомляется об окончании подпрограммы прерываний.
42

Вторая подгруппа – условные переходы. Их характеристики приведены в табл.7.8. Все команды этой подгруппы выполняют короткий
переход и содержат байт смещения, который из-за отсутствия места в
табл. 7.8 не показан. Отметим, что переход по нулевому/ненулевому
условию производится на основе содержимого аккумулятора, а флаг Z
в слове состояния программы отсутствует.
Таблица 7.8
Команды условных переходов
Мнемоника Операция
JZ
JNZ
DJNZ <byte> Decr. and jump if not 0 X X 2
CJNE A, <byte> Переход, если А=<byte> X X 2
CJNE <byte>,
#data
Переход, если А = 0 Только аккумулятор 2
Переход, если А ≠ 0 Только аккумулятор 2
Jump if <byte>≠#data X X 2
Режим адресации
Reg Ind Imm Dir
Время,
мкс
Инструкция DJNZ (Decrement and Jump if Not Zero – уменьшить и
перейти, если не нуль) используется для организации циклов. Чтобы
выполнить цикл N раз, в байт-счетчик загружается число N и в конце
цикла ставится команда перехода DJNZ, указывающая на начало цикла, как это показано ниже:
MOV COUNTER, #10
LOOP: ;(начало цикла)
*
*
*
;(конец цикла)
DJNZ COUNTER, LOOP
;(продолжение)
Инструкции «сравнить
и перейти» CJNE (Compare and Jump if Not
Equal) также может быть использована для управления циклом. В этой
инструкции происходит сравнение двух байт, указанных в поле операндов, и переход произойдет, если эти байты не равны.
43

Другое применение этой конструкции – сравнение типа «больше
чем, меньше чем». Два байта в поле операнда рассматриваются как
беззнаковые целые. Если первый байт меньше второго, то флаг C устанавливается в 1. Если первый байт больше второго или равен ему, то
флаг C очищается.
Таблица 7.9
Условные переходы по состоянию бита
Мнемоника Операция Время, мкс
JC rel
JNC rel
JB bit, rel
JNB bit, rel
JBC bit, rel
Переход, если С=1 2
Переход, если С=0 2
Переход, если бит=1 2
Переход, если бит=0 2
Переход, если бит=1, сброс
бита
2
Команды, относящиеся к третьей подгруппе, перечислены в табл. 7.9.
Это команды, анализирующие состояние адресуемого бита и осуществляющие (или не осуществляющие) короткий (Short) переход в
соответствии с байтом смещения.
44

8. ПОРТЫ ВВОДА-ВЫВОДА
Остановимся несколько подробнее на работе с портами P0 - P1 в
моделях i8051 - i8052. Каждый порт состоит из защёлки (Special Function Registers от P0 до P3 с адресами 80H, 90H, A0H и B0H соответственно), выходного драйвера и входного буфера.
Выходные драйверы портов P0 и P2 и входные буферы P0 используются при обращении к внешней памяти. В этом случае P0 выводит
младший байт адреса внешней памяти, мультиплексированный
мени с записываемым или читаемым байтом. При 16-разрядном адресе
внешней памяти порт P2 выводит старший байт адреса внешней памяти. В противном случае P2 продолжает передавать содержимое P2
SFR.
Все выводы порта P3 (а также выводы P1.0 и P1.1 для i8052) являются многофункциональными. Они не только служат выводами порта,
но и выполняют некоторые специальные функции
ниже:
Вывод порта Альтернативная функция
P1.0 T2 (внешний вход для Timer/Counter 2 в i8052)
P1.1 T2EX (запуск Timer/Counter 2 Capture/Reload в i8052)
P3.0 RxD (вход последовательного порта)
P3.1 TxD (выход последовательного порта)
P3.2 INT0\ (внешнее прерывание)
P3.3 INT1\ (внешнее прерывание)
P3.4 T0 (внешний вход Timer/Counter 0)
P3.5 T1 (внешний вход Timer/Counter 1)
P3.6 WR\ (строб записи во внешнюю память данных)
P3.7 RD\ (строб чтения из внешней памяти данных)
, как это показано
во вре-
Альтернативная функция будет активизироваться, если
ствующий бит защёлки SFR записана единица. В противном случае
вывод порта будет поддерживать уровень 0.
45
в соответ-

В качестве иллюстрации на рис. 8.1 и рис. 8.2 показаны схемы за-
Z
Z
щёлок портов P0 и P3.
Чтение защёлки
Внутр.
шина
Запись
в защёлку
Чтение вывода
TT
D
Защёлка P0.X
Q
QC
Адрес/Данные
MUX
Управлени
е Vcc
&
Вывод
P0.X
Рис. 8.1. Схема защёлок порта P0
Из них следует, что защёлки для каждого разряда представляют собой D-триггер, в который записывается информация с внутренней шины в соответствии с сигналом CPU "записать в защёлку". Выход триггера Q может быть прочитан на внутреннюю шину по сигналу CPU
"прочитать защёлку". Состояние вывода порта может быть прочитано
на внутреннюю шину с
помощью сигнала CPU "прочитать вывод порта". Некоторые инструкции, которые читают порт, активизируют сигнал "прочитать защёлку", другие – "прочитать вывод порта".
Как следует из рис. 8.1, выходные драйверы P0 (а также и порта P2)
могут переключаться на внутреннюю шину ADDR и ADDR/DATA с
помощью внутреннего сигнала CONTROL для доступа к внешней памяти. Во время доступа к внешней
памяти в P0 SFR записываются 1, а
значения P2 SFR остаются неизменными.
Кроме того, из рис. 8.2 видно, что альтернативные функции могут
быть активизированы, если соответствующие защёлки P3 содержат 1.
В то же время входные сигналы альтернативных функций доступны
всегда.
46

Чтение защёлки
у
Z
Z
Внутр.
шина
D
TT
Vcc
Альтернативная
выходная
функция
Внутренняя
«подтяжка»
Q
Вывод
РЗ.Х
Запись
в защёлк
Чтение вывода
C Q
Защёлка
РЗ.Х
&
Альтернативная
входная функция
Рис. 8.2. Схема защёлок порта P3
Порты P1, P2, и P3 имеют внутреннюю «подтяжку» к напряжению
источника питания. Каждая линия ввода-вывода может быть независимо использована как входная или выходная. (К портам P0 и P1 это
относится, когда они не используются как шины адреса-данных.) Чтобы линии могли быть использованы как входные, защёлки должны содержать 1, чтобы закрыть МОП-транзистор
выходного драйвера.
Порт P0 отличается тем, что не имеет внутренней «подтяжки».
МОП-транзистор используется в качестве «подтяжки» только тогда,
когда при обращении к внешней памяти порт P0 выводит 1. В остальных случаях этот транзистор отключен. Следовательно, выходные линии порта P0 могут рассматриваться как выходные линии с открытым
стоком. Запись 1 в бит защёлки
оставляет оба МОП-транзистора за-
47

крытыми, поэтому вывод оказывается «плавающим». В этих условиях
он может рассматриваться как высокоимпедансный вход.
Поскольку порты P1, P2, и P3 имеют внутреннюю фиксированную
«подтяжку», они часто называются квазидвунаправленными портами.
Рассматриваемые как входы, они имеют на входе 1 и служат источниками тока при подключении внешней нагрузки. С другой стороны,
порт P0 считается истинно двунаправленным, поскольку
как входной
он является плавающим.
При сбросе во все порты записываются 1. Если затем в них записывается 0, то для осуществления ввода нужно записать 1.
Нагрузочная способность выходных буферов портов P1, P2 и P3
составляет четыре маломощных ТТЛШ входа. Для порта P0 в режиме
обращения к внешней памяти нагрузочная способность выходных буферов равна восьми маломощным
ТТЛШ входам. В качестве выводов
порта они нуждаются во внешней «подтяжке» для управления другими
входами.
Некоторые инструкции при обращении к портам читают защёлки,
другие – состояние выводов. Инструкции, которые читают защёлки,
могут считывать значения выходов защёлок, изменять их и снова записывать в защёлку. Они являются командами считывания-модификации-записи. Ниже
перечислены такие инструкции. Когда операндомприемником является порт или бит порта, инструкции считывают значение защёлки, а не выводов.
ANL (логическая операция AND, например, ANL P1, A)
ORL (логическая операция OR, например, ORL P1,A)
XRL (логическая операция XOR, например, XRL P1,A)
JBC (переход, если бит=1 и сброс бита, например, JBC P1.1 LABEL)
CPL (инвертировать бит, например, CPL P3.0)
INC (инкрементировать, например, INC P2)
DEC (декрементировать, например, DEC P2)
DJNZ (декремент и переход, если не 0: DJNZ P3, LABEL)
MOV PX.Y,C (поместить флаг переноса
CLR PX.Y (очистить бит Y порта X)
SETB PX.Y (установить бит Y порта X)
в бит Y порта X)
Совсем не очевидно, что три последние команды относятся к ин-
струкциям чтения-модификации-записи, но это именно так. Они чита-
48

ют байт порта, все 8 бит, модифицируют адресуемый бит и записывают новый байт обратно в защёлку.
Одной из причин, по которой команды чтения-модификациизаписи обращаются к защёлкам, становится необходимость устранить
возможные ошибки при чтении уровня напряжения. Например, вывод
порта может быть подключен к базе транзистора. Когда в данный бит
будет записана 1, транзистор будет включен (и на его базе напряжение
будет около 0.6 В). Если CPU будет читать этот вывод, он прочтёт
напряжение базы транзистора, которое будет интерпретировано как
уровень 0. В то же время при чтении защёлки будет прочитано значение 1, что соответствует истине.
Во время обращения к внешней памяти CPU записывает 0FFH в
защёлки
порта P0 (SFR), что уничтожает предыдущую информацию в
SFR P0. Если пользователь записывает что-либо в порт P0 во время
выборки команд из внешней памяти, коды команд могут быть искажены. Поэтому ничего не записывайте в порт P0 во время работы с
внешней памятью.
Внешняя память программ доступна при двух условиях:
1) когда активен сигнал EA\ (т
. е. когда на нем 0);
2) когда PC содержит адрес, больший чем 0FFFH (для i8051) или
1FFFH (для i8052), – ведь здесь рассматриваются только эти модели.
Из этого следует, что при использовании версии без ПЗУ вывод
EA\ должен быть подсоединен к уровню 0.
Когда CPU выполняет команды из внешней памяти программ, все
8 бит предназначены только для работы с памятью
и не могут быть
использованы как линии ввода-вывода общего назначения. Во время
выборки команд из внешней памяти порт P2 выставляет старший
байт PC.
При обращении к внешней памяти данных может быть использована как шестнадцатиразрядная адресация (MOVX @DPTR), так и восьмиразрядная (MOVX @Ri). Во время использования 16 разрядов содержимое SFR P2 заменяется на значение адреса, а
в следующем цикле
(если он, конечно, снова не является циклом обращения к внешней памяти данных) вновь восстанавливается значение SFR P2. Во время
страничной адресации на выходах порта P2 всегда находятся значения
SFR P2.
В заключение раздела приведём информацию о состоянии SFR по-
сле включения питания или сброса для микроконтроллеров i8051 и
i8052 (табл. 8.1).
49

Таблица 8.1
Начальные значения регистров специального назначения
Регистр Значение в двоичном коде
SP
PO
P1
P2
P3
IP
IE
SBUF
PCON
00000111
11111111
11111111
11111111
11111111
8051 XXX00000
8052 XX000000
8051 0XX00000
8052 0X000000
Не определено
CHMOS 0XXX0000
Регистры ACC, B, PSW, DPTR (DPH, DPL), TMOD, TCON,
TH0, TL0, TH1, TL1, SCON (и регистры T2CON, TH2, TL2,
RCAP2H, RCAP2L в 8052) при этом обнуляются.
50
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
