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

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ

Бийский технологический институт (филиал)


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

Е.В. Сыпин, Е.С. Повернов, А.Н. Павлов

МИКРОКОНТРОЛЛЕР АТ89С51 СЕМЕЙСТВА АТ89


ФИРМЫ ATMEL. ОПИСАНИЕ И ПРОГРАММИРОВАНИЕ

3-е издание, переработанное и дополненное

Рекомендовано Сибирским региональным учебно-методическим


центром высшего профессионального образования для межвузовского
использования в качестве учебного пособия для студентов,
обучающихся по специальностям 200106.65 «Информационно-
измерительная техника и технологии» и 230201.65 «Информационные
системы и технологии»

Бийск
Издательство Алтайского государственного технического
университета им. И.И. Ползунова
2011
УДК 681.326 (031)
С95

Рецензенты: С.Н. Цыганок, к.т.н., доцент директор


по производству ООО «ЦУТ»
Г.С. Ломакин, к.т.н., доцент кафедры
ИУС БТИ АлтГТУ

Работа подготовлена на кафедре МСИА

Сыпин, Е.В.
С95 Микроконтроллер AT89C51 семейства AT89 фирмы ATMEL.
Описание и программирование: учебное пособие / Е.В. Сыпин,
Е.С. Повернов, А.Н. Павлов; Алт. гос. техн. ун-т, БТИ. – 3-е изд.,
перераб. и доп. – Бийск: Изд-во Алт. гос. техн. ун-та, 2011. –
122 с.

ISBN 978-5-9257-0220-8

В учебном пособии подробно рассмотрен микроконтроллер


АТ89С51 семейства АТ89 фирмы ATMEL. Приведена информация по
популярному пакету программирования фирмы 2500 A.D. Основной
упор сделан на описание типичных применений микроконтроллера с
подробным описанием принципов подключения различных
периферийных устройств к нему и примерами управляющих программ.
Приведенный материал будет полезен студентам специальностей
200106 «Информационно-измерительная техника и технологии» и
230201 «Информационные системы и технологии» при выполнении
ими лабораторных работ, расчетных заданий, курсовых проектов и для
углубленного изучения принципов построения и программирования
микроконтроллерных устройств.

УДК 681.326 (031)

ISBN 978-5-9257-0220-8 © Сыпин Е.В., Повернов Е.С.,


Павлов А.Н., 2011
© БТИ АлтГТУ, 2011

2
СОДЕРЖАНИЕ

Список сокращений......................................................................................5
Введение........................................................................................................6
1 Структура микроконтроллера..................................................................7
1.1 Процессор микроконтроллера...........................................................9
1.2 Адресное пространство микроконтроллера...................................11
1.2.1 Подключение EROM и ERAM к микроконтроллеру.............13
1.3 Периферийные устройства микроконтроллера.............................16
1.3.1 Параллельные порты ввода-вывода.........................................16
1.3.2 Таймер-счетчик Т/С0.................................................................17
1.3.3 Таймер-счетчик Т/С1.................................................................19
1.3.4 Последовательный порт............................................................20
1.3.5 Контроллер прерываний...........................................................23
2 Система команд микроконтроллера......................................................28
3 Общие сведения о языке Ассемблер для микроконтроллеров
стандарта MCS-51 и о программном пакете фирмы 2500 A.D..............40
3.1 Синтаксис языка Ассемблер............................................................40
3.1.1 Определители основания системы счисления........................40
3.1.2 Примеры констант и применения директивы RADIX...........41
3.1.3 Комментарии..............................................................................41
3.1.4 Программный счётчик...............................................................41
3.1.5 Метки..........................................................................................41
3.1.6 Директивы..................................................................................41
3.1.7 Макроопределения....................................................................42
3.2 Сообщения о некоторых ошибках ассемблирования....................43
3.3 Рекомендуемая процедура инициализации микроконтроллера...44
4 Типичные применения микроконтроллеров.........................................48
4.1 Ввод информации с датчиков..........................................................48
4.1.1 Опрос двоичного датчика.........................................................48
4.1.1.1 Ожидание события............................................................48
4.1.1.2 Ожидание импульсного сигнала......................................50
4.1.2 Устранение дребезга контактов...............................................53
4.1.3 Подсчет числа импульсов.........................................................56
4.1.3.1 Подсчет числа импульсов за интервал времени между
двумя событиями...........................................................................56
4.1.3.2 Подсчет числа импульсов за заданный промежуток
времени...........................................................................................59
4.1.4 Опрос группы двоичных датчиков..........................................65
4.1.5 Ввод информации с матричной клавиатуры...........................67
4.2 Вывод управляющих сигналов из микроконтроллера..................71

3
4.2.1 Формирование статических сигналов......................................71
4.2.2 Формирование импульсных сигналов.....................................74
4.2.2.1 Генерация меандра............................................................74
4.2.2.2 Формирование сигнала с заданной скважностью..........75
4.2.3 Вывод и отображение информации.........................................75
4.2.3.1 Динамический вывод информации на дисплей из
семисегментных индикаторов......................................................78
4.3 Реализация функций реального времени.......................................81
4.3.1 Программное формирование временной задержки................82
4.3.2 Формирование временной задержки с использованием
таймеров..............................................................................................84
4.3.3 Измерение временных интервалов..........................................85
4.4 Преобразование кодов......................................................................87
4.4.1 Преобразование унитарного кода в двоичный
позиционный.......................................................................................87
4.4.2 Преобразование двоичного позиционного кода
в унитарный.........................................................................................88
4.4.3 Преобразование кодов из одной системы счисления
в другую...............................................................................................89
4.4.4 Преобразование данных из параллельного кода в
последовательный и обратно.............................................................92
4.4.5 Цифро-аналоговое преобразование.........................................96
4.4.6 Аналого-цифровое преобразование.........................................97
4.4.6.1 Метод последовательного приближения........................98
4.4.6.2 Метод двойного интегрирования...................................100
4.5 Операции с памятью.......................................................................102
4.5.1 Тестирование ОЗУ...................................................................104
4.5.2 Программа тестирования ПЗУ...............................................106
4.6 Обмен данными по шине I2С.........................................................107
4.6.1 Общие положения и введение в логику работы шины I2С. .107
4.6.2 Пример обмена данными по шине I2C...................................109
4.7 Приём данных по протоколу Centronics.......................................116
Литература.................................................................................................121

4
СПИСОК СОКРАЩЕНИЙ
ALU – арифметико-логическое устройство
CPU – процессор
ERAM – внешнее оперативное запоминающее устройство
EROM – внешнее постоянное запоминающее устройство
I2С – шина соединения микросхем
IRAM – внутреннее оперативное запоминающее устройство
IROM – внутреннее постоянное запоминающее устройство
OSC – генератор тактового сигнала
Serial – последовательный порт
SRAM – статическое оперативное запоминающее устройство
UART – универсальный асинхронный приемопередатчик
АЦП – аналого-цифровой преобразователь
ЗУ – запоминающее устройство
ИМ – исполнительный механизм
МК – микроконтроллер
МСИ – матричный светодиодный индикатор
МЦ – машинный цикл
ОЗУ – оперативное запоминающее устройство
ПЗУ – постоянное запоминающее устройство
ССИ – семисегментный индикатор
УС – управляющее слово
ЦАП – цифро-аналоговый преобразователь

5
ВВЕДЕНИЕ

Однокристальные микроЭВМ (микроконтроллеры) AT89С51


семейства AT89 фирмы ATMEL, программно- и аппаратно-
совместимые с микроконтроллерами семейства MCS-51 фирмы Intel
(отечественный аналог 1816ВВ51 и 1830АА51), предназначены для
использования в качестве встраиваемых управляющих микроЭВМ в
приборах и системах различного назначения.
Основным преимуществом микроконтроллеров AT89C51
является использование в них в качестве внутреннего постоянного
запоминающего устройства для хранения команд программы и
констант (IROM) репрограммируемого постоянного запоминающего
устройства с электрическим стиранием записи. При этом существенно
упрощается процедура репрограммирования памяти, открывается
возможность выполнять запись кодов в постоянную память после
установки микроконтроллера в аппаратуру и снижать стоимость
микроконтроллера по сравнению с микроконтроллерами со стиранием
памяти путем облучения ультрафиолетовым излучением.
Ряд глав и параграфов настоящего издания переработан и
дополнен по сравнению с одноименным учебным пособием,
вышедшим в 2010 г. Добавлены новые контрольные вопросы для
лучшей оценки усвоения материала.

6
1 СТРУКТУРА МИКРОКОНТРОЛЛЕРА

Микроконтроллер типа АТ89С51 (далее МК) выпускается в


корпусе типа cerDIP40. Условное графическое изображение МК
приведено на рисунке 1.1, назначение выводов – в таблице 1.1

Рисунок 1.1 – Условное графическое обозначение микроконтроллера

Выходы портов в статическом режиме при низком уровне сигнала


могут пропускать ток нагрузки величиной до 10 мА, при этом
суммарный ток нагрузки для порта Р0 должен быть не более чем
26 мА, а для остальных портов не более чем 15 мА. Суммарный ток
нагрузки для всех выходов микроконтроллера должен быть не более
чем 71 мА.
В динамическом режиме к выходу порта Р0 могут быть
подключены 8 входов TTL, а к выходу портов Р1, Р2, Р3 – по четыре
входа TTL.
В состав МК (рисунок 1.2) входят:
– процессор (CPU);
– внутреннее постоянное запоминающее устройство (IROM);
– внутреннее оперативное запоминающее устройство (IRAM);
– группа периферийных устройств.

7
К микроконтроллеру могут быть подключены внешнее
постоянное запоминающее устройство (EROM) и внешнее оперативное
запоминающее устройство (ERAM).

Таблица 1.1 – Назначение выводов микроконтроллера


выводаНомер

Обозначение

Описание

40 VCC Напряжение питания +5 В


20 GND Общий провод
XTAL1, Вход и выход для подключения кварцевого
18,19
XTAL2 резонатора
9 RST Вход для приема сигнала сброса
39–32 P0.0–P0.7 Параллельный порт ввода-вывода P0
1–8 P1.0–Р1.7 Параллельный порт ввода-вывода P1
21–28 P2.0–P2.7 Параллельный порт ввода-вывода P2
Вход синхронно-ассинхронного
10 P3.0(RXD)

Параллельный порт ввода-вывода Р3


приёмопередатчика
Выход синхронно-ассинхронного
11 P3.1(TXD)
приёмопередатчика
Вход запроса прерываний от внешнего
12 P3.2( INT0 )
источника 0
P3.3( Вход запроса прерываний от внешнего
13
INT1 ) источника 1
14 P3.4(T0) Вход таймер-счётчика 0
15 P3.5(T1) Вход таймер-счётчика 1
P3.6( WR ) Вход стробирования записи данных
16
во внешнюю память
Вход стробирования чтения данных
17 Р3.7( RD )
из внешней памяти
Выход для выдачи сигнала управления записью
30 ALE
во внешний регистр адреса
Выход для выдачи сигнала управления чтением
29 PSEN
из внешней постоянной памяти (EROM)
Вход для управления выбором обращения
31 ЕА
к IROM и EROM

8
9
Рисунок 1.2 – Упрощенная структурная схема микроконтроллера

1.1 Процессор микроконтроллера

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


выполнение в заданной последовательности. Система команд
микроконтроллеров семейства АТ89С51 содержит 111 команд.
Процессор содержит генератор тактового сигнала (OSC),
шестнадцатиразрядный счётчик команд (PC), шестнадцатиразрядный
регистр-указатель данных (DPTR), состоящий из двух
восьмиразрядных регистров – старшего (DPH) и младшего (DPL),

10
восьмиразрядный регистр - указатель стека (SP), восьмиразрядный
регистр управления (PCON) и арифметико-логическое устройство
(ALU).
Генератор тактового сигнала формирует последовательность
тактовых импульсов. Период следования тактовых импульсов, равный
длительности такта работы микроконтроллера, определяется
резонансной частотой подключённого к микроконтроллеру кварцевого
резонатора (рисунок 1.3). При использовании внешнего
синхрогенератора сигнал подается на вход XTAL1, а выход XTAL2
остается неподключенным.

С1, С2 = 30 пФ10 пФ; R1=8,2 кОм; С3=10 мкФ

Рисунок 1.3 – Типовая схема включения микроконтроллера

Микроконтроллеры семейства АТ89С51 изготовлены по КМОП


(CMOS) технологии и имеют полностью статическую структуру. Они
могут работать при значениях тактовой частоты от 0 Гц. Максимальное
значение тактовой частоты у микроконтроллера составляет 24 МГц.
В состав ALU входят восьмиразрядные регистры: регистр-
аккумулятор ACC, вспомогательный регистр B и регистр слова-
состояния программы PSW.

Контрольные вопросы
1. На какие выводы микроконтроллера подается питание?
2. Каким уровнем организуется сброс микроконтроллера?
3. Что означает термин «статическая структура»?
4. Какие устройства входят в состав микроконтроллера?
5. Каков состав и назначение регистров процессора микроконтроллера?

11
1.2 Адресное пространство микроконтроллера

Адресуемым элементом памяти МК является восьмиразрядная


ячейка.
Внутреннее постоянное запоминающее устройство (IROM)
представляет собой программируемое запоминающее устройство с
электрическим стиранием записи, выполненное по CMOS Flash-
технологии (Flash Memory). Число восьмиразрядных ячеек в IROM
микроконтроллера составляет 4 К.
IROM и внешнее постоянное запоминающее устройство (EROM)
предназначены для хранения команд программы и констант. Адреса,
используемые при обращении к IROM и EROM, образуют единое
адресное пространство 64 К.
Внутреннее оперативное запоминающее устройство (IRAM)
является статическим оперативным запоминающим устройством
(SRAM). Адреса, используемые при обращении к IRAM, образуют
адресное пространство внутренней оперативной памяти объёмом 256
байт (таблица 1.2).
Младшая половина адресов (от 00h до 7Fh) используется только
для обращения к ячейкам IRAM. Старшая половина адресов
используется для обращения к регистрам, расположенным в CPU и в
периферийных устройствах. Обращение к ячейкам IRAM, которым
соответствуют адреса от 00H до 7Fh, можно выполнять как по
командам с прямой, так и по командам с косвенной адресацией.
В IRAM микроконтроллера образован стек типа LIFO. Адрес при
записи байта в стек образуется путём увеличения на единицу адреса,
хранящегося в регистре-указателе стека (SP). Адрес при чтении байта
из стека берётся из регистра-указателя стека, после чего адрес в этом
регистре уменьшается на единицу. При сбросе микроконтроллера в
регистр-указатель стека заносится код 07Н. Путём записи в регистр SP
иного начального адреса стек может быть смещён в другую область
IRAM.
32 ячейки памяти в IRAM, которым соответствуют адреса от 00Н
до 1FH, могут использоваться как регистры. К этим ячейкам можно
обращаться как по командам с прямой или косвенной адресацией, так и
по командам с регистровой адресацией. Группа из 32 регистров
разделена на 4 банка (RB0–RB3). Регистры в пределах банка имеют
номера от 0 до 7 (R0–R7).

12
Таблица 1.2 – Структура IRAM микроконтроллера
Адреса Назначение Тип адресации
FF Прямая*,
… Регистры специальных функций (SFR) косвенная**,
80 поразрядная***
7F

поразрядного
обращения
2F 7F 7E 7D 7C 7B 7A 79 78

Область
2E 77 76 75 74 73 72 71 70
… … … … … … … … …
21 0F 0E 0D 0C 0B 0A 09 08
20 07 06 05 04 03 02 01 00
1F R7

RB3
… … Прямая,
18 R0 косвенная,
17 R7 поразрядная

Банки регистров
RB2
… …
10 R0
0F R7

RB1
… …
08**** R0
07 R7

RB0
… …
00 R0
При обращении к ячейкам как к регистрам специальных
*
функций
**При обращении к ячейкам как к памяти
***Допускают только адреса, кратные восьми (80h, 88h,…, F8h)
****Дно стека при сбросе микроконтроллера

Выбор регистрового банка, в котором при обращении находится


регистр с указанным номером, выполняется путём предварительной
установки в определённое состояние двух разрядов в регистре PSW.
Схема распределения разрядов в регистре PSW приведена на
рисунке 1.4.

13
7 6 5 4 3 2 1 0
CY AC F0 RS1 RS0 OV – P

Рисунок 1.4 – Схема распределения разрядов в регистре PSW

Для выбора регистрового банка используются разряды регистра


PSW.4=RS1 и PSW.3=RS0. Регистровые банки RB0–RB3 выбираются
при комбинациях значений RS1, RS0=00, 01, 10 и 11 соответственно.
Регистры R0 и R1 в каждом регистровом банке могут быть
использованы для размещения адресов при выполнении команд с
косвенной адресацией.
16 ячеек памяти в IRAM, которым соответствуют адреса от 20Н
до 2FH, допускают поразрядное обращение. Биты в ячейках памяти
IRAM с побитовой адресацией имеют адреса от 00H до 7FH.

1.2.1 Подключение EROM и ERAM к микроконтроллеру

На рисунке 1.5 приведена типовая схема подключения EROM и


ERAM к микроконтроллеру, на рисунках 1.6, 1.7, 1.8 – временные
диаграммы сигналов при чтении байта из EROM, ERAM и записи
байта в ERAM соответственно.

Рисунок 1.5 – Типовая схема подключения EROM и ERAM

14
Рисунок 1.6 – Чтение байта из EROM

Рисунок 1.7 – Чтение байта из ERAM

Рисунок 1.8 – Запись байта в ERAM

В таблице 1.3 приведены значения параметров, указанных на


временных диаграммах.

15
Таблица 1.3 – Значения параметров, указанных на временных
диаграммах
Чтение из EROM Чтение из ERAM Запись в ERAM
Fosc, МГц
Trd max, нс Trd max, нс Twr min, нс
12 312 585 400
16–24 5Tosc–55 9Tosc–165 6Tosc–100

Параллельные порты ввода-вывода P0 и P2 при подключении к


микроконтроллеру внешней памяти (EROM и ERAM) используются
для выдачи шестнадцатиразрядного кода адреса, а порт Р0, кроме того,
для выдачи и приема байтов данных. Младший байт кода адреса
(A0–A7) выдается через порт Р0 и запоминается во внешнем регистре.
Запись кода во внешний регистр выполняется при высоком уровне
сигнала на выходе ALE. Старший байт кода адреса (А8–А15) выдается
через порт Р2 и удерживается на выводах порта Р2 в течение всего
времени обращения к внешней памяти.
Чтение байта из EROM происходит при низком уровне сигнала на
выходе PSEN, чтение байта из ERAM – при низком уровне сигнала RD
на выходе порта Р3.7, а запись байта в ERAM – при низком уровне
сигнала WR на выходе порта Р3.6.

Контрольные вопросы

1. Какова емкость внутреннего ОЗУ микроконтроллера?


2. Какая часть адресов внутреннего ОЗУ микроконтроллера используется
только для обращения к ячейкам IRAM?
3. К чему может привести некорректное использование старшей половины
адресов?
4. Что означает понятие «банк регистров»?
5. Каким образом осуществляется активация банка регистров?
6. Номера регистров какого банка совпадают с адресами ячеек ОЗУ?
7. К каким ячейкам памяти из старшей половины адресов допускается
поразрядное обращение?
8. Каков принцип работы стека LIFO?
9. Какой адрес соответствует дну стека при сбросе микроконтроллера?
10. Изменится ли значение ячейки по адресу 07H при помещении значения
в стек сразу же после сброса микроконтроллера?
11. Что необходимо сделать для безопасного использования всех банков
регистров при использовании стека?

16
12. К чему приведут загрузка в указатель стека числа 7FH и дальнейшее
использование стека?
13. Для чего необходим регистр RG на рисунке 1.5? Возможно ли
программно записать данные в этот регистр, не нарушив обращение к
внешней памяти? Почему?
14. Чем отличается подключение внешних памяти программ и памяти
данных?
15. Возможно ли одновременное подключение ОЗУ и ПЗУ, емкость каждой
из которых 64 кБ?
16. Какая часть адреса удерживается в течение всего цикла обращения к
памяти?

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

В группу периферийных устройств микроконтроллеров типа Х51


входят следующие периферийные устройства:
1) параллельный порт ввода-вывода P0;
2) параллельный порт ввода-вывода P1;
3) параллельный порт ввода-вывода P2;
4) параллельный порт ввода-вывода P3;
5) таймер-счётчик T/C0;
6) таймер-счётчик T/C1;
7) последовательный порт (Serial);
8) контроллер прерываний (IC).

1.3.1 Параллельные порты ввода-вывода

Параллельные порты ввода-вывода предназначены для приема,


выдачи байтов данных. Отдельные разряды портов могут быть
использованы независимо друг от друга для приема и выдачи битов.
Порты P0 и P2 могут использоваться для подключения внешней
памяти (см. п. 1.2.1).
Параллельный порт ввода-вывода Р3, кроме функций по приему и
выдаче байтов и битов, выполняет альтернативные функции.
Выводы порта Р3.0 и Р3.1 при работе последовательного порта
являются входом приемника (RXD) и выходом передатчика (TXD)
соответственно.
Выводы порта Р3.2 и Р3.3 используются для приема сигналов
запросов прерывания от внешних источников (INT0 и INT1
соответственно).

17
Выводы порта Р3.4 и Р3.5 используются для приема внешних
сигналов Т0 и Т1, поступающих в таймеры-счетчики Т/С0 и Т/С1
соответственно при работе в режиме счета внешних событий.
Выводы Р3.6 и Р3.7 при подключении к микроконтроллеру
внешней памяти данных (ERAM) используются для выдачи сигналов
записи (WR) и чтения (RD) соответственно (см. п. 1.2.1).

1.3.2 Таймер-счетчик Т/С0

Таймер-счетчик Т/С0 ведет счет импульсов, поступающих от


внутреннего источника с частотой Fosc/12 (счет времени) или со входа
Т0 (Р3.4) (счет внешних событий). Событием является отрицательный
перепад сигнала. Счет может вестись по модулю 2 8, 213 или 216. При
переполнении счетчика (счет ведется на увеличение) формируется
запрос прерывания, поступающий в контроллер прерываний. Счет
продолжается без остановки.
В состав таймера-счетчика Т/С0 входят два восьмиразрядных
регистра TL0 и ТН0. Работой таймера-счетчика Т/С0 управляют
разряды регистров специальных функций TCON (TCON.7–4) и ТМОD
(TMOD.3–0). Схемы распределения разрядов в регистрах TCON и
ТМОD представлены на рисунке 1.9.

7 6 5 4 3 2 1 0
TF1 TR1 TF0 TR0

а)
7 6 5 4 3 2 1 0
GAT С/Т M1 М0 GAT С/Т M1 М0
E E
Т/С1 Т/С0
б)
а) регистр TCON.7–4; б) регистр TMOD
Рисунок 1.9 – Схемы распределения разрядов
в регистрах TCON и TMOD

Таймер-счетчик Т/С0 может работать в четырех режимах. Выбор


режима определяется комбинацией состояний разрядов TMOD.1,
TMOD.0=M1, M0.

18
При M1,М0=0,0 (режим 0) таймер-счетчик ведет счет по модулю
213 (т.е. максимальное число для счета 213). При этом используются
оба регистра ТН0 и TL0 (ТН0 старший в паре регистров).
При M1, М0=0,1 (режим 1) счет ведется по модулю 216. При
M1,М0=1,0 (режим 2) счет ведется по модулю 28, который хранится в
регистре TL0. ТН0 используется в качестве регистра памяти. Код,
хранящийся в этом регистре, загружается в регистр TL0 при каждом
его переполнении (автоперезагрузка регистра TL0).
В режимах 0, 1, 2 на счетный вход счетчика поступает
внутренний сигнал с частотой Fosc/12 (при TMOD.2=С/Т=0) или
внешний сигнал, поступающий на вход Р3.4 (при TMOD.2=С/Т=1).
При TMOD.3=GATE=0 счет ведется при единичном состоянии
разряда TCON.4=TR0. При TR0=0 счет остановлен.
При TMOD.3=GATE=1 счет ведется при единичном состоянии
разряда TCON.4=TR0 и единичном значении сигнала INT0 на входе
Р3.2. При нулевом состоянии разряда TR0 или нулевом значении
сигнала INT0 счет остановлен.
При переполнении счетчика устанавливается в единичное
состояние разряд TCON.5=TF0 и в контроллер прерываний поступает
запрос прерывания от таймера-счетчика Т/С0.
Сброс разряда TCON.5=TF0 в нулевое состояние выполняется
автоматически при переходе к выполнению соответствующей
прерывающей программы.
В режиме 3 (M1,М0=1,1) регистры TL0 и ТН0 работают
независимо и каждый ведет счет по модулю 28.
На вход счетчика с регистром TL0 в зависимости от значения
разряда TMOD.2=С/Т поступает или внутренний сигнал с частотой Fosc/12
(при С/Т=0), или внешний сигнал с входа Р3.4 (при С/Т=1). На вход
счетчика с регистром ТН0 поступает внутренний сигнал с частотой Fosc/12.
Счетчик с регистром TL0 ведет счет при TCON.4=TR0=1 (при
TMOD.3=GATE=0) или при ТR0=1 и INT0=1 (при GATE=1), а счетчик
с регистром ТН0 – при TCON.6=TR1=1.
При переполнении регистра TL0 устанавливается в единичное
состояние разряд TCON.5=TF0 и в контроллер прерываний поступает
запрос прерывания TF0. При переполнении регистра ТН0 в единичное
состояние устанавливается разряд TCON.7=TF1. Разряды TF0 и TF1
сбрасываются в нулевое состояние при переходе к выполнению
соответствующих прерывающих программ.
Запрос прерывания TF1 в таймере-счетчике Т/С0 в режиме 3 не
формируется.

19
1.3.3 Таймер-счетчик Т/С1

Таймер-счетчик Т/С1 ведет счет импульсов, поступающих от


внутреннего источника с частотой Fosc/12 (счет времени) или со входа
Т1 (Р3.5) (счет внешних событий). Событием является отрицательный
перепад сигнала. Счет может вестись по модулю 2 8, 213 или 216. При
переполнении счетчика формируется запрос прерывания,
поступающий в контроллер прерываний. Счет продолжается.
В состав таймера-счетчика Т/С1 входят два восьмиразрядных
регистра TL1 и ТН1. Работой таймера-счетчика T/C1 управляют
разряды регистра специальных функций TCON (TCON.7,6) и разряды
регистра специальных функций TMOD (TMOD.74) (см. рисунок 1.9).
Таймер-счетчик Т/С1 может работать в трех режимах. Выбор
режима определяется комбинацией состояний разрядов TMOD.5,
TMOD.4=М1,М0.
При M1,М0=0,0 (режим 0) таймер-счетчик ведет счет по модулю
213. Данный режим полностью аналогичен режиму 0 для таймера-счет-
чика Т/С0.
При М1,М0=0,1 (режим 1) таймер-счетчик ведет счет по модулю
216. Данный режим полностью аналогичен режиму 0 для таймера-
счетчика Т/С0.
При М1,М0=1,0 (режим 2) счет ведет регистр TL1 по модулю 28.
ТН1 используется в качестве регистра. Код, хранящийся в этом
регистре, загружается в регистр TL1 при каждом его переполнении
(автоперезагрузка регистра TL1).
При М1,М0=1,1 таймер-счетчик Т/С1 остановлен.
На счетный вход счетчика поступает внутренний сигнал с
частотой Fosc/12 (при TMOD.6=С/Т=0) или внешний сигнал,
поступающий на вход Р3.5 (при TMOD.6=С/Т=1).
При TMOD.7=GATE=0 счет ведется при единичном состоянии
разряда TCON.6=TR1. При TR1=0 счет остановлен.
При TMOD.7=GATE=1 счет ведется при единичном состоянии
разряда TCON.6=TR1 и единичном значении сигнала INT1 на входе
Р3.3. При TR1=0 или INT1=0 счет остановлен.
При переполнении счетчика устанавливается в единичное
состояние разряд TCON.7=TF1 и в контроллер прерываний поступает
запрос от таймера-счетчика Т/С1. Сброс разряда TCON.7=TF1 в
нулевое состояние выполняется автоматически при переходе к
выполнению соответствующей прерывающей программы.

20
Таймер-счетчик Т/С1 используется в качестве генератора
синхросигнала при работе последовательного порта (Serial). Частота
прерываний в таймере-счетчике Т/С1 определяет скорость передачи и
приема битов в последовательном порте. При работе в качестве
генератора синхросигнала таймер-счетчик Т/С1 должен находиться в
режиме 2 (счет по модулю 2 с автоперезагрузкой). Скорость передачи
определяется числом, которое записано в регистр ТН1.
При работе таймера-счетчика Т/С0 в режиме 3 разряды регистров
TCON.6=TR1 и TCON.7=TF1 используются в таймере-счетчике Т/С0.
Таймер-счетчик Т/С1 в этом случае может использоваться в качестве
генератора синхросигнала для последовательного порта.

1.3.4 Последовательный порт

Последовательный порт (Serial) предназначен для приема и


выдачи байтов данных в последовательном коде. Последовательный
порт содержит приемник, передатчик, управляющий регистр SCON и
буферный регистр SBUF, состоящий, по сути, из двух регистров –
буферного регистра передатчика и буферного регистра приемника,
которые имеют одно и то же имя. Это обеспечивает возможность
одновременной работы приемника и передатчика. Схема
распределения разрядов в регистре SCON приведена на рисунке 1.10.

7 6 5 4 3 2 1 0
SM0 SM1 SM2 REN TB8 RB8 TI RI

Рисунок 1.10 – Схема распределения разрядов в регистре SCON

Последовательный порт может работать в четырех режимах.


Выбор режима работы определяется комбинацией состояний разрядов
SCON.7=SM0 и SCON.6=SM1.
При SM0,SM1=0,0 (режим 0) последовательный порт работает в
режиме сдвигающего регистра с частотой сдвига Fosc/12. Вывод порта
Р3.1=TXD используется в качестве выхода для выдачи серии из восьми
импульсов, управляющих сдвигом во внешнем сдвигающем регистре.
Вывод порта Р3.0=RXD используется для последовательной выдачи
или последовательного приема байта, начиная с младшего бита (D0).
Временные диаграммы сигналов на выводах P3.1=TXD и Р3.0=RXD
при выдаче и приеме байта в этом режиме изображены на рисунке 1.11.

21
Рисунок 1.11 – Временные диаграммы сигналов на выводах TXD
и RXD в режиме 0

Выдача происходит после выполнения команды программы, по


которой осуществляется запись байта данных в регистр SBUF. При
завершении выдачи байта устанавливается в единичное состояние
разряд регистра SCON.1=TI и в контроллер прерываний поступает
запрос прерывания от передатчика последовательного порта. Сброс
разряда TI выполняется только программным способом, по команде в
программе.
Прием начинается при единичном состоянии разряда регистра
SCON.4=REN и сбросе в нулевое состояние разряда регистра
SCON.0=RI (или при нулевом состоянии разряда SCON.0=RI и
установке в единичное состояние разряда SCON.4=REN).
При завершении приема разряд регистра SCON.0=RI
устанавливается в единичное состояние и в контроллер прерываний
поступает запрос прерывания от приемника последовательного порта.
Сброс разряда RI выполняется программным способом, по команде в
программе.
При других комбинациях состояний разрядов SM0 и SM1
последовательный порт работает в качестве универсального
асинхронного приемопередатчика (UART).
UART предназначен для передачи и приема байтов по
последовательному каналу связи (например, по интерфейсу RS-232С).
При передаче байта формируется посылка (кадр), содержащая
десять или одиннадцать битов. Кадр содержит стартовый бит (Start=0),
восемь битов данных (D0, D1,..., D7) и стоповый бит (Stop=1). Между
старшим битом данных (D7) и стоповым битом может помещаться
контрольный бит (СВ). Структура кадров, содержащих десять и
одиннадцать битов, показана на рисунке 1.12.

22
а)

б)

а) режим 1; б) режимы 2, 3

Рисунок 1.12 – Структура кадров

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


программы, по которой происходит запись байта в регистр SBUF. При
завершении передачи кадра устанавливается в единичное состояние
разряд SCON.1=TI и в контроллер прерывания поступает запрос
прерывания от передатчика. Разряд TI сбрасывается в нулевое
состояние по команде в программе.
Прием кадра возможен при единичном состоянии разряда
регистра SCON.4=REN. Прием начинается при поступлении
стартового бита (отрицательный перепад сигнала) на вход Р3.0=RXD.
Принятый байт записывается в буферный регистр приемника и
сохраняется в нем до завершения приема следующего кадра. Следует
помнить, что принятый байт необходимо считать до прихода
следующего байта, в противном случае он будет потерян. UART может
работать в трех режимах.
В режиме 1 (SM0,SM1=0,1) кадр содержит десять битов.
Скорость передачи и приема (BR, бит/с) зависит от частоты
переполнений таймера-счетчика Т/С1 и определяется по формуле
SMOD
2 Fosc
BR  , (1)
32 12  256  N 
где SMOD – состояние разряда регистра PCON.7=SMOD;
Fosc – тактовая частота работы микроконтроллера, Гц;
N – число, код которого записан в счетчик ТН1 таймера-счетчика
Т/С1, работающего в режиме 2 (с автоперезагрузкой).
При приеме стоповый бит заносится в разряд регистра
SCON.2=RB8.
В режиме 2 (SM0,SM1=1,0) и в режиме 3 (SM0,SM1=1,1) кадр
содержит одиннадцать битов. Значение контрольного бита перед пе-
редачей кадра записывается в разряд регистра SCON.3=ТВ8.

23
Значение контрольного бита в принятом кадре переписывается в
разряд регистра SCON.2=RB8.
Скорость передачи и приема (BR) в режиме 2 зависит только от
значения бита SMOD и тактовой частоты работы микроконтроллера и
определяется по формуле
SMOD
BR  2
(2
Fosc .
64 )

Скорость передачи и приема в режиме 3 зависит от частоты


переполнений таймера-счетчика Т/С1 и определяется по формуле (1).
Для получения стандартных значений скорости передачи по
интерфейсу RS-232 в режимах 1 и 3 следует использовать кварцевый
резонатор с резонансной частотой, кратной 12. Типичными значениями
являются 18432 кГц и 11059 кГц.
При завершении приема кадра в режимах 1, 2, 3 установка в
единичное состояние разряда регистра SCON.0=RI и поступление
запроса прерывания от приемника в контроллер прерываний зависит от
состояния разряда регистра SCON.5=SM2.
При SM2=0 разряд регистра SCON.0=RI устанавливается в
единичное состояние и запрос прерывания от приемника поступает в
контроллер прерываний при завершении приема любого кадра.
При SM2=1 в режиме 1 разряд регистра SCON.0=RI
устанавливается в единичное состояние и запрос прерывания от
приемника поступает в контроллер прерываний, если в принятом кадре
бит на десятой позиции имеет единичное значение (есть стоповый
бит).
В режимах 2 и 3 разряд SCON.0=RI устанавливается в единичное
состояние и запрос прерывания от приемника поступает в контроллер
прерываний, если в принятом кадре контрольный бит имеет единичное
значение.

1.3.5 Контроллер прерываний

Контроллер прерываний (IC) принимает и обрабатывает запросы


прерывания от внешних и внутренних источников запросов. В состав
контроллера прерываний входят регистры специальных функций IE и
IР и младшая половина разрядов регистра TCON (TCON.3–0). Схемы

24
распределения разрядов в регистрах IE, IP и TCON представлены на
рисунке 1.13.

7 6 5 4 3 2 1 0
EA – – ES ET1 EX1 ET0 EX0
а)
7 6 5 4 3 2 1 0
– – – PS PT1 PX1 PT0 PX0
б)
7 6 5 4 3 2 1 0
IE1 IT1 IE0 IT0
в)

а) регистр IE; б) регистр IP; в) регистр TCON

Рисунок 1.13 – Схемы распределения разрядов в регистрах IE, IP


и TCON

Сигналы запросов прерывания от внешних источников INT0 и


INT1 поступают на входы порта Р3.2 и Р3.3 соответственно. Запрос
прерывания представлен или низким уровнем сигнала INT0 (INT1),
или переходом сигнала INT0 (INT1) от высокого уровня к низкому
уровню. Запрос прерывания представлен уровнем сигнала при
TCON.0=IT0=0 (TCON.2=IТ1=0). При IT0=1 (IT1=1) запрос
представлен отрицательным перепадом сигнала.
При поступлении запроса прерывания на входы INT0 или INT1
устанавливается в единичное состояние разряд TCON.1=IE0 или
TCON.3=IЕ1 соответственно. Если запрос прерывания представлен
переходом сигнала, разряд IE0 (IE1) сбрасывается в нулевое состояние
автоматически при переходе микроконтроллера к выполнению
соответствующей прерывающей программы. Если запрос прерывания
представлен уровнем сигнала, состоянием разряда IЕ0 (IЕ1) управляет
внешний сигнал INT0 (INT1).
Запросы прерывания от внутренних источников запросов: от
таймера-счетчика Т/С0, таймера-счетчика Т/С1, передатчика и
приемника последовательного порта – представлены единичным
значением сигналов, поступающих из разрядов регистров
TCON.5=TF0, TCON.7=TF1, SCON.1=TI и SCON.0=RI соответственно.
Сигналы запросов прерывания от передатчика (TI) и приемника (RI)

25
последовательного порта объединены по схеме логического ИЛИ на
входе контроллера прерываний.
С использованием разрядов регистра IE разрешается или
запрещается прием запросов прерывания в контроллер прерываний.
Каждому запросу соответствует свой разряд регистра. Биты ET0, ET1
соответствуют запросам прерываний от таймеров, биты EX0, EX1 –
запросам прерывания от внешних источников, бит ES – от
последовательного порта. При IЕ.Х=0 (Х=0, 1,..., 4) прием
соответствующего запроса запрещается, при IЕ.Х=1 – разрешается. С
использованием разряда IE.7=ЕА запрещается прием любого запроса
прерывания (при ЕА=0).
В контроллере прерываний реализованы два уровня приоритета –
высший и низший. Любой запрос прерывания может быть отнесен к
любому из уровней. Отнесение запроса прерывания к уровню
приоритета выполняется с использованием разрядов регистра IР
(соответствие битов совпадает с регистром IE, см. выше). Каждому
запросу прерывания соответствует свой разряд регистра. При IР.Х=0
(X=0, 1,..., 4) запрос относится к низшему уровню, при IР.X=1 – к
высшему уровню.
Для запросов прерывания, отнесенных к одному уровню,
приоритет запросов задан аппаратно и не может быть изменен.
В таблице 1.4 перечислены сигналы запросов прерывания, для
каждого сигнала указано устройство-источник запроса прерывания,
указан приоритет запросов при отнесении их к одному уровню и
приведен вектор прерывания (начальный адрес прерывающей
программы) для каждого запроса прерывания.
В контроллере прерываний уровень приоритета принятого
запроса сравнивается с уровнем приоритета запроса, по которому
произошел запуск текущей программы. Если уровень приоритета
принятого запроса оказался выше, происходит переход по вектору
прерывания от выполнения текущей программы к выполнению
прерывающей программы. Программа, запущенная по сигналу сброса с
начальным адресом 0000Н, прерывается запросом прерывания с
любым уровнем приоритета.
При одновременном поступлении нескольких запросов
прерывания для обслуживания выбирается запрос высшего уровня, а в
пределах уровня – запрос с высшим приоритетом в пределах уровня.

26
Таблица 1.4 – Описание прерываний микроконтроллера
Сигнал запроса Устройство- Вектор
Приоритет
прерывания источник прерывания
INT0 Внешний 1 (высший) 0003H
TF0 Т/С0 2 000BH
INT1 Внешний 3 0013Н
TF1 Т/С1 4 001BH
TI+RI Serial 5 (низший) 0023Н

При переходе к выполнению прерывающей программы адрес


очередной команды прерываемой программы из счетчика команд
переписывается в стек, а начальный адрес прерывающей программы
(вектор прерывания) заносится в счетчик команд.

Контрольные вопросы

1. Какие периферийные устройства входят в состав


микроконтроллера?
2. Какие функции, кроме непосредственного ввода-вывода,
выполняет порт P3?
3. Что является источником счетных импульсов для таймеров-
счетчиков?
4. Опишите режимы работы таймеров счетчиков ТC0 и TC1, если
в регистр TMOD загружено значение 2BH.
5. В каких режимах может работать последовательный порт?
6. Возможен ли в режиме асинхронного приемо-передатчика
одновременный прием и выдача символа?
7. Какие числа необходимо загрузить в TH0 и TL0, чтобы в
режиме 1 осуществлялся обмен со скоростью 19200 бит/с при частоте
резонатора 18,432 МГц (SMOD=1)?
8. Какова максимально допустимая скорость передачи для
данного микроконтроллера?
9. Каков алгоритм приема и передачи символов при условии, что
контроллер прерывания не используется?
10. Что такое «прерывание»?
11. Какие устройства микроконтроллера могут являться источниками
запросов прерываний?

27
12. Что необходимо для разрешения и запрещения прерываний?
13. Что означает понятие «приоритет»? Перечислите в порядке возрастания
приоритетов источники, если в регистр IP загружено число 13H.
14. Каким образом временно запретить обработку всех прерываний?
15. Что означает понятие «вектор прерывания»?

28
2 СИСТЕМА КОМАНД МИКРОКОНТРОЛЛЕРА

Список принятых сокращений, используемых при описании


системы команд, приведён в таблице 2.1.

Таблица 2.1 – Принятые сокращения


Сокраще Описание сокращения
ние
Rn Регистры R0–R7 активного банка регистров
direct Восьмибитный адрес внутренней памяти данных (ОЗУ).
Это может быть адрес ячейки памяти или адрес регистра
специального назначения
@Ri Восьмибитные данные из внутренней памяти данных,
адресуемые косвенно через регистры R0 и R1
#data Восьмибитная константа
#data 16 Шестнадцатибитная константа
addr 16 Шестнадцатиразрядный адрес. Используется в командах
LCALL и LJMP, что позволяет делать ветвления в
пределах 64 кБ адресуемого адресного пространства
памяти программ
addr 11 Одиннадцатиразрядный адрес. Используется командами
ACALL и AJMP, что позволяет выполнять ветвления в
пределах 2 кБ страниц памяти
Rel Байт восьмибитного смещения со знаком. Используется
командами SJMP и всеми командами условных
переходов, что позволяет делать переходы в пределах от
минус 128 до плюс 127 байт
Bit Непосредственно адресуемый бит во внутренней памяти
данных или в регистрах специального назначения

В системе команд микроконтроллера можно выделить следующие


группы:
– группа арифметических команд, к ней относятся команды
сложения, вычитания, умножения и деления (таблица 2.2);
– группа логических команд, в которую входят команды
логического И, ИЛИ, ИСКЛЮЧАЮЩЕГО ИЛИ, инверсии, обмена и
ротации (таблица 2.3);
– группа команд пересылки (таблица 2.4);
– группа команд манипуляции с битами, в которую входят
команды изменения битов и проверки их состояния (таблица 2.5);

29
– группа команд ветвления, которая включает в себя команды
условных и безусловных переходов, команды вызова подпрограмм и
возврата из них, а также команды организации циклов (таблица 2.6).
Таблица 2.7 содержит список инструкций, воздействующих на
флаги состояния микроконтроллера.

Таблица 2.2 – Арифметические команды

генератораЧисло периодов
Длина, байт
Мнемоника Описание

1 2 3 4
ADD A, Rn Прибавляет регистр к аккумулятору 1 12
ADD A, direct Прибавляет содержимое ячейки
внутренней памяти данных direct к 2
аккумулятору
ADD A, @Ri Прибавляет содержимое ячейки
внутренней памяти данных, адрес
1
которой задан в регистре R0 или R1,
к аккумулятору
ADD A, #data Прибавляет к аккумулятору
2
восьмиразрядное число #data
ADDC A, Rn Прибавляет регистр к аккумулятору
1
с учетом и флага переноса
ADDC A, direct Прибавляет содержимое ячейки
внутренней памяти данных direct, к
2
аккумулятору с учетом флага
переноса
ADDC A, @Ri Прибавляет содержимое ячейки 1
внутренней памяти данных, адрес
которой задан в регистре R0 или R1,
к аккумулятору с учетом флага
переноса

30
ADDC A, #data Прибавляет к аккумулятору
восьмиразрядное число #data с 2
учетом флага переноса

Продолжение таблицы 2.2


1 2 3 4
SUBB A, Rn Вычитает регистр из аккумулятора с
1
учетом флага переноса
SUBB A, direct Вычитает содержимое ячейки
внутренней памяти данных direct из
2
аккумулятора с учетом флага
переноса
SUBB A, @Ri Вычитает содержимое ячейки
внутренней памяти данных, адрес
которой задан в регистре R0 или R1, 1
из аккумулятора с учетом флага
переноса
SUBB A, #data Вычитает восьмиразрядное число
#data из аккумулятора с учетом 2
флага переноса
12
INC A Инкрементирует аккумулятор 1
INC Rn Инкрементирует регистр
INC direct Инкрементирует содержимое ячейки
2
внутренней памяти данных direct
INC @Ri Инкрементирует содержимое ячейки
внутренней памяти данных, адрес
которой задан в регистре R0 или R1 1
DEC A Декрементирует аккумулятор
DEC Rn Декрементирует регистр
DEC direct Декрементирует содержимое ячейки
2
внутренней памяти данных direct
DEC @Ri Декрементирует содержимое ячейки 1
внутренней памяти данных, адрес
которой задан в регистре R0 или R1
INC DPTR Инкрементирует регистровую пару
24
DPTR
MUL AB Перемножает аккумулятор и регистр 48
В
DIV AB Делит аккумулятор на регистр В

31
DA A Выполняет десятичную коррекцию
12
аккумулятора

Таблица 2.3 – Логические команды

генератораЧисло периодов
Длина, байт
Мнемоника Описание

1 2 3 4
ANL A, Rn Выполняет логическое И
1
аккумулятора и регистра
ANL A, direct Выполняет логическое И
аккумулятора и содержимого ячейки 2
внутренней памяти данных direct
ANL A, @Ri Выполняет логическое И
аккумулятора и содержимого ячейки
1
внутренней памяти данных, адрес
12
которой задан в регистре R0 или R1
ANL A, #data Выполняет логическое И
аккумулятора и восьмиразрядного
числа #data
ANL direct, A Выполняет логическое И 2
содержимого ячейки внутренней
памяти данных direct и аккумулятора.
Результат в ячейке памяти
ANL direct, #data Выполняет логическое И
содержимого ячейки внутренней
памяти данных direct и 3 24
восьмиразрядного числа #data.
Результат в ячейке памяти
ORL A, Rn Выполняет логическое ИЛИ 1 12
аккумулятора и регистра

32
ORL A, direct Выполняет логическое ИЛИ
аккумулятора и содержимого ячейки 2
внутренней памяти данных direct
ORL A, @Ri Выполняет логическое ИЛИ
аккумулятора и содержимого ячейки
1
внутренней памяти данных, адрес
которой задан в регистре R0 или R1

Продолжение таблицы 2.3


1 2 3 4
ORL A, #data Выполняет логическое ИЛИ
аккумулятора и восьмиразрядного 2
числа #data
ORL direct, A Выполняет логическое ИЛИ 12
содержимого ячейки внутренней
2
памяти данных direct и аккумулятора.
Результат в ячейке памяти
ORL direct, #data Выполняет логическое ИЛИ
содержимого ячейки внутренней
памяти данных direct и 3 24
восьмиразрядного числа #data.
Результат в ячейке памяти
XRL A, Rn Выполняет логическое ИСКЛЮЧА- 12
1
ЮЩЕЕ ИЛИ аккумулятора и регистра
XRL A, direct Выполняет логическое ИСКЛЮЧА-
ЮЩЕЕ ИЛИ аккумулятора и
содержимого ячейки внутренней 2
памяти данных, адрес которой задан в
команде
XRL A, @Ri Выполняет логическое ИСКЛЮЧА-
ЮЩЕЕ ИЛИ аккумулятора и
содержимого ячейки внутренней 1
памяти данных, адрес которой задан в
регистре R0 или R1
XRL A, #data Выполняет логическое ИСКЛЮЧА- 2
ЮЩЕЕ ИЛИ аккумулятора и
восьмиразрядного числа #data

33
XRL direct, A Выполняет логическое ИСКЛЮЧА-
ЮЩЕЕ ИЛИ содержимого ячейки
внутренней памяти данных direct и
аккумулятора. Результат в ячейке
памяти
XRL direct, #data Выполняет логическое ИСКЛЮЧАЮ-
ЩЕЕ ИЛИ содержимого ячейки
внутренней памяти данных direct и 3 24
восьмиразрядного числа #data.
Результат в ячейке памяти

Продолжение таблицы 2.3


1 2 3 4
CLR A Обнуляет аккумулятор
CPL A Комплементирует аккумулятор
RL A Ротирует аккумулятор влево
RLC A Ротирует аккумулятор влево с
использованием флага переноса
RR A Ротирует аккумулятор вправо 1 12
RRC A Ротирует аккумулятор вправо с
использованием флага переноса
SWAP A Обменивает полубайты в
аккумуляторе

Таблица 2.4 – Команды пересылки


генератораЧисло периодов
Длина, байт

Мнемоника Описание

1 2 3 4
MOV A, Rn Пересылает регистр в 1 12
аккумулятор

34
MOV A, direct Пересылает содержимое
ячейки внутренней памяти 2
данных directв аккумулятор
MOV A, @Ri Пересылает содержимое
ячейки внутренней памяти
данных, адрес которой задан 1
в регистре R0 или R1, в
аккумулятор
MOV A, #data Пересылает данные #data в
2
аккумулятор
MOV Rn, A Пересылает аккумулятор в
1
регистр
MOV Rn, direct Пересылает содержимое
ячейки внутренней памяти 2 24
данных direct в регистр

Продолжение таблицы 2.4


1 2 3 4
MOV Rn, #data Пересылает данные #data в
регистр
MOV direct, A Пересылает аккумулятор в 12
ячейку внутренней памяти
2
данных direct
MOV direct, Rn Пересылает регистр в ячейку
внутренней памяти данных di-
rect
MOV direct1, direct2 Пересылает ячейку
внутренней памяти данных di-
3
rect2, в ячейку внутренней
памяти данных direct1
MOV direct, @Ri Пересылает ячейку
24
внутренней памяти данных,
адрес которой задан в регистре
2
R0 или R1, в ячейку
внутренней памяти данных di-
rect
MOV direct, #data Пересылает данные #data в
ячейку внутренней памяти 3
данных direct
MOV @Ri, A Пересылает аккумулятор в 1 12

35
ячейку внутренней памяти
данных, адрес которой задан в
регистре R0 или R1
MOV @Ri, direct Пересылает ячейку
внутренней памяти данных di-
rect в ячейку внутренней 2 24
памяти данных, адрес которой
задан в регистре R0 или R1
MOV @Ri, #data Пересылает данные #data в
ячейку внутренней памяти
2 12
данных, адрес которой задан в
регистре R0 или R1
MOV DPTR, #data 16 Загружает регистровую пару
DPTR шестнадцатиразрядным 3 24
числом #data 16

Продолжение таблицы 2.4


1 2 3 4
MOVC A, @A+DPTR Загружает аккумулятор 1 24
содержимым ячейки памяти
программ, адрес которой
вычисляется как сумма
содержимого регистровой
пары DPTR и аккумулятора
MOVC A, @A+PC Загружает аккумулятор
содержимым ячейки памяти
программ, адрес которой
вычисляется как сумма
содержимого счётчика команд
PC и аккумулятора
MOVX A, @Ri Загружает аккумулятор
содержимым ячейки внешней
памяти данных, адрес которой
задан в регистре R0 или R1.
Старший байт адреса задается
содержимым порта Р2

36
MOVX A, @DPTR Загружает аккумулятор
содержимым ячейки внешней
памяти данных, адрес которой
задан в регистровой паре
DPTR
MOVX @Ri, A Загружает ячейку внешней
памяти данных, адрес которой
задан в регистре R0 или R1,
аккумулятором. Старший
байт адреса задается
содержимым порта P2
MOVX @DPTR, A Загружает аккумулятором
ячейку внешней памяти
данных, адрес которой задан в
регистровой паре DPTR
PUSH direct Записывает ячейку
внутренней памяти данных
direct в стек
2
POP direct Считывает в ячейку
внутренней памяти данных
direct из стека
Продолжение таблицы 2.4
1 2 3 4
XCH A, Rn Обменивает содержимое
1
аккумулятора и регистра
XCH A, direct Обменивает содержимое
аккумулятора и ячейки 2
внутренней памяти данных direct
XCH A, @Ri Обменивает содержимое
аккумулятора и ячейки
внутренней памяти данных,
12
адрес которой задан в регистре
R0 или R1
XCHD A, @Ri Обменивает содержимое четырёх 1
младших бит аккумулятора и
четырех младших бит ячейки
внутренней памяти данных,
адрес которой задан в регистре
R0 или R1

Таблица 2.5 – Команды работы с битами

37
Длина, байт

генератораЧисло периодов
Мнемоника Описание

1 2 3 4
CLR C Сбрасывает в 0 флаг переноса 1 12
CLR Bit Сбрасывает в 0 бит 2
SETB C Устанавливает в 1 флаг переноса 1
SETB Bit Устанавливает в 1 бит 2 12
CPL C Инвертирует флаг переноса 1
CPL Bit Инвертирует бит
ANL C, bit Логическое И флага переноса и бита
ANL C, /bit Логическое И флага переноса и
инверсии бита
24
ORL C, bit Логическое ИЛИ флага переноса и бита 2
ORL C, /bit Логическое ИЛИ флага переноса и
инверсии бита
MOV C, bit Загрузить флаг переноса из бита 12
MOV bit, C Загрузить бит из флага переноса 24
Таблица 2.6 – Команды ветвления
генератораЧисло периодов
Длина, байт

Мнемоника Описание

1 2 3 4
JC rel Переход, если флаг переноса 2 24
равен 1

38
JNC rel Переход, если флаг переноса
равен 0
JB bit, rel Переход, если бит равен 1
3
JNB bit, rel Переход, если бит равен 0
JBC bit, rel Переход, если бит равен 1, с
3
последующим сбросом бита в 0
ACAL addr11 Вызов подпрограммы по
2
L абсолютному адресу
LCAL addr16 Вызов подпрограммы по
3
L длинному абсолютному адресу
RET Возврат из подпрограммы
1
RETI Возврат из прерывания
AJMP addr11 Безусловный переход по
2
абсолютному адресу
LJMP addr16 Безусловный переход по
3
длинному абсолютному адресу
SJMP rel Безусловный переход по
2
относительному адресу
JMP @A+DPT Безусловный переход по
R адресу, равному сумме
1
содержимого DPTR и
аккумулятора
JZ rel Переход, если аккумулятор
равен 0
2
JNZ rel Переход, если аккумулятор не
равен 0
CJNE A, direct, Сравнивает аккумулятор и
rel ячейку внутренней памяти
данных direct. Переход по 3
относительному адресу, если
они не равны
Продолжение таблицы 2.6
1 2 3 4
CJN A, #data, rel Сравнивает аккумулятор и 3 24
E данные #data. Переход по
относительному адресу, если
они не равны

39
CJN Rn, #data, rel Сравнивает регистр и данные
E #data. Переход по
относительному адресу, если
они не равны
CJN @Ri, #data, Сравнивает ячейку внутренней
E rel памяти данных, адрес которой
задан в регистре R0 или R1, и
данные #data. Переход по
относительному адресу, если
они не равны
DJN Rn, rel Декрементирует регистр.
Z Переход по относительному
2
адресу, если результат
декремента не 0
DJN direct, rel Декрементирует ячейку
Z внутренней памяти данных di-
rect. Переходит по 3
относительному адресу, если
результат декремента не 0
NOP Нет операции 1 12

Таблица 2.7 – Инструкции, влияющие на флаги переноса (С),


переполнения (OV) и полупереноса (АС)
Инструкци Флаги Инструкция Флаги
я C OV AC C OV AC
ADD X X X CLR C 0
ADDC X X X CPL C X
SUBB X X X ANL C, bit X
MUL 0 X ANL C, /bit X
DIV 0 X ORL C, bit X
DA X ORL C, /bit X
RRC X MOV C, bit X
RLC X CJNE X
SETB C 1
Примечание – Символ «Х» означает влияние команды на флаг,
символ «1» – установку флага, символ «0» – сброс флага

Контрольные вопросы

40
1. В каком случае результат выполнения команд ADD A, #10H
и ADDC A, #10H будет идентичным?
16. Что необходимо знать, чтобы вычислить содержимое
аккумулятора после выполнения команды SUBB A, 10H?
17. Куда необходимо поместить аргументы перед выполнением
команд умножения и деления?
18. Что может являться первым аргументом логических команд
И, ИЛИ, ИСКЛЮЧАЮЩЕЕ ИЛИ?
19. Чем отличаются команды RRC A и RR A?
20. Какое число будет находиться в аккумуляторе после
выполнения команды SWAP A, если перед выполнением команды в
аккумулятор было загружено число 232?
21. К какой ячейке внешней памяти будет обращение при
выполнении команды MOVX A, @R0, если перед выполнением
команды в регистр R0 было загружено число 32, а в порт P2 число 240?
22. Какая ячейка внутренней памяти данных микроконтроллера
будет перезаписана, если сразу после сброса будет выполнена команда
PUSH A?
23. Каков синтаксис команды логического ИЛИ флага переноса
и инверсии бита?
24. Какая команда обменивает содержимое аккумулятора и регистра R7?
25. В чём различие команд RET и RETI?
26. В результате выполнения какой команды будет выполнен переход с
последующим сбросом бита, если бит, указанный в качестве
аргумента, равен 1?
27. Какие команды ветвления уменьшают один из аргументов на единицу?
28. Для чего может быть использована команда NOP?

3 ОБЩИЕ СВЕДЕНИЯ О ЯЗЫКЕ АССЕМБЛЕР


ДЛЯ МИКРОКОНТРОЛЛЕРОВ СТАНДАРТА MCS-51
И О ПРОГРАММНОМ ПАКЕТЕ ФИРМЫ 2500 A.D.

41
Язык Ассемблер для микроконтроллеров стандарта MCS-51
является достаточно типичным для микроконтроллеров такого класса.
Программный пакет для программирования на языке Ассемблер
микроконтроллеров стандарта MCS51 фирмы 2500 A.D. состоит из
программы компилятора, программы линковщика и программы
библиотекаря. Все эти программы запускаются из командной строки
DOS и используют большое количество параметров. Для повышения
удобства работы с пакетом применяется интегрированная среда
АsmEdit, запускаемая под WINDOWS ХР.
Ниже рассматривается синтаксис языка Ассемблер и некоторые
наиболее употребимые директивы.

3.1 Синтаксис языка Ассемблер

Для директив и команд можно использовать как прописные, так и


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

3.1.1 Определители основания системы счисления

По умолчанию используется десятичная система исчисления. Для


того чтобы задать число в другой системе исчисления, необходимо
добавить специальную литеру в конец константы:
B, b – двоичная система исчисления;
O, o, Q, q – восьмеричная система исчисления;
D, d – десятичная система исчисления;
H, h – шестнадцатеричная система исчисления.
Кроме того, имеется специальная директива для изменения
системы исчисления по умолчанию. Это директива RADIX
<значение>, где <значение> может быть:
2 или B, b – для двоичной системы исчисления;
8 или О, о, Q, q – для восьмеричной системы исчисления;
10 или D, d – для десятичной системы исчисления;
16 или H, h – для шестнадцатеричной системы исчисления.
3.1.2 Примеры констант и применения директивы RADIX

100101b – число написано в двоичной системе исчисления.


.radix 10 – система исчисления по умолчанию – десятичная.

42
.radix h – система исчисления по умолчанию –
шестнадцатеричная.
6fh – число написано в шестнадцатеричной системе счисления.

3.1.3 Комментарии

Строки комментариев начинаются точкой с запятой «;» или со


звёздочки «*» перед комментариями.

3.1.4 Программный счётчик

Специальные символы доллар «$» и звёздочка «*» следует


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

3.1.5 Метки

Метки могут состоять из любого числа символов, но только 32


символа будут значащими. Метки ставятся в любой колонке, если имя
оканчивается двоеточием. Если двоеточие не используется, метка
должна начинаться с первой колонки. Большие и маленькие буквы
считаются различными.

3.1.6 Директивы

ORG VALUE – устанавливает адрес программы. Если директива


не выполнена, адрес по умолчанию устанавливается в 0.
Пример:
.ORG 8000H – устанавливается адрес программы в 8000H.

LABEL: DB VALUE – Ассемблер помещает величины VALUE в


последовательные ячейки памяти. Выражение DB позволяет
смешивать типы операндов, разделенные запятыми. Строки символов
следует заключать в апострофы. Если строка содержит апострофы, то
следует поставить два апострофа подряд. Если после директивы не
следует выражение, один байт резервируется и обнуляется. Метка
является необязательной. Следующий пример показывает применение
директивы DB в составе программы.
.DB – резервирует один нулевой байт.
.DB 10 – резервирует байт со значением 10.
.DB 1, 2, 3 – резервирует три байта, равные 1, 2 и 3.

43
.DB SYMBOL-10 – ищет в таблице символов метку SYMBOL,
вычитает из нее 10 и запоминает результат в резервируемых ячейках
памяти.
.DB 'HELLO' – размещает в памяти ASCII эквивалент символов
слова HELLO.
.DB 'OK',0DH – то же, что и предыдущее, но добавляет в конце
байт 0DH.
.DB 'IT''S' – размещает в памяти ASCII эквивалент символов
слова IT’S.

LABEL: DW VALUE – эта директива помещает 16-битные


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

LABLE: BLKB SIZE, VALUE – резервируется некоторое число


байтов, определяемое SIZE. Если поле VALUE присутствует, величина
VALUE запоминается в каждом байте. В противном случае
резервируемые байты обнуляются. Метка является необязательной.
BLKB 20 – резервирует в памяти 20 нулевых байтов.
BLKB 20, 0 – резервирует в памяти 20 нулевых байтов.
BLKB 20, FFH – резервирует в памяти 20 байтов со значением
FFH.

LABLE: BLKW SIZE, VALUE – резервируется некоторое число


16-битных слов, определяемое SIZE. Если поле VALUE присутствует,
величина VALUE запоминается в каждом слове. В противном случае
резервируемые слова обнуляются. Метка является необязательной.
BLKW 20 – резервирует в памяти 20 нулевых слов.
BLKW 20, 0 – резервирует в памяти 20 нулевых слов.
BLKW 20, FFFFH – резервирует в памяти 20 слов со значением
FFFFH.

3.1.7 Макроопределения

LABEL: EQU VALUE – присваивает имени LABEL значение


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

44
3.2 Сообщения о некоторых ошибках ассемблирования
Ошибка:
CAN'T CREATE OUTPUT FILE - DISK MAY BE FULL
(Невозможно создание выходного (результирующего) файла –
возможно, диск полон.)
Значение: либо возможно, что диск действительно полон, либо
операционная система не позволяет, чтобы одновременно было бы
открыто необходимое число файлов.
Ошибка:
CAN'T OPEN INPUT FILE
(Невозможно открытие входного файла.)
Значение: Операционная система не допускает одновременное
открытие необходимого числа файлов.
Ошибка:
CAN'T FIND FILENAME.OBJ
(Файл с именем <имя файла>.OBJ не обнаружен.)
Значение. Имя объектного файла (файла с расширением
имени .OBJ) не существует, либо операционная система не допускает
одновременного открытия необходимого числа файлов.
Ошибка:
SYNTAX ERROR (Синтаксическая ошибка.)
Значение: обычно эта ошибка возникает из-за пропущенной
запятой или круглой скобки.
Ошибка:
ILLEGAL ADDRESSING MODE
(Неверный режим адресации.)
Значение: адресация операнда с использованием данной формы
адресации в данной команде недопустима.
Ошибка:
MULTIPLY DEFINED SYMBOL
(Символ уже описан.)
Значение: данный символ уже описан ранее. Например, две метки
с одинаковым именем.

Ошибка:
UNDEFINED SYMBOL
(Символ не определен.)
Значение: символ не был описан в период выполнения первого
прохода Ассемблера. Например, команда ссылается на отсутствующую
метку.

45
Ошибка:
RELATIVE JUMP TOO LARGE
(Слишком далекий относительный переход.)
Значение: результирующий адрес перехода находится на другой
странице. Часто возникает при адресации далекой метки командой
SJMP.
Ошибка:
ILLEGAL REGISTER
(Недопустимое использование регистра.)
Значение: для данной команды недопустимо использование
указанного регистра.
Ошибка:
ILLEGAL LABEL 1ST CHARACTER
(Неверен первый символ метки.)
Значение: Метка должна начинаться с алфавитного символа.
Ошибка:
MISSING LABEL
(Пропущена метка.)
Значение: в данной команде требуется присутствие метки.

3.3 Рекомендуемая процедура инициализации


микроконтроллера

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


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

Листинг 3.1 – Процедура инициализации микроконтроллера


.ORG 0000H ; Адрес начала программы
JMP BEGIN ; Переход к основной части
; программы
.ORG 0003H ; Адрес обработчика
; прерываний по входу INT0
JMP EXT0 ; Переход на процедуру
; обработки прерываний по
; входу INT0
.ORG 000BH ; Адрес обработчика
; прерываний от таймера
; T/C0
JMP TIMER0 ; Переход на процедуру
; обработки прерываний от

46
; таймера T/C0
.ORG 0013H ; Адрес обработчика
; прерываний по входу INT1
JMP EXT1 ; Переход на процедуру
; обработки прерываний по
; входу INT1
.ORG 001BH ; Адрес обработчика
; прерываний от таймера
; T/C0
JMP TIMER1 ; Переход на процедуру
; обработки прерываний от
; таймера T/C0
.ORG 0023H ; Адрес обработчика
; прерываний от
; последовательного порта
JMP SERIAL ; Переход на процедуру
; обработки прерываний от
; последовательного порта
BEGIN:
CLR EA ; Запрет всех прерываний
MOV R0, #7FH ; Очистка оперативной
CLEAR: MOV @R0, #00H ; памяти микроконтроллера
DJNZ R0, CLEAR
MOV SP, #30H ; Переопределение дна стека
… ; Здесь должна находиться
; основная программа
JMP $ ; Останов программы
; (команда перехода «сама на
; себя»)

EXT0:
… ; Здесь может находиться
; процедура обработки
; прерывания от входа INT0
RETI ; Команда выхода из
; прерывания

EXT1:
… ; Здесь может находиться
; процедура обработки
; прерывания от входа INT1
RETI ; Команда выхода из

47
; прерывания
TIMER0:
… ; Здесь может находиться
; процедура обработки
; прерывания от таймера
; T/C0
RETI ; Команда выхода из
; прерывания
TIMER1:
… ; Здесь может находиться
; процедура обработки
; прерывания от таймера
; T/C1
RETI ; Команда выхода из
; прерывания
SERIAL:
… ; Здесь может находиться
; процедура обработки
; прерывания от
; последовательного порта
RETI ; Команда выхода из
; прерывания

В данной процедуре выполняется определение векторов и


процедур всех прерываний. Эта процедура позволяет исключить все
возможные последствия «случайного попадания» в область векторов
прерывания.
Сброс флага EA необходим для запрета всех прерываний до
момента инициализации всех переменных, используемых как основной
программой, так и подпрограммами обработки прерываний.
Очистку оперативной памяти микроконтроллера рекомендуется
выполнять тем программистам, которые привыкли «рассчитывать» на
нулевые значения впервые используемых регистров и ячеек памяти.
Переопределение дна стека рекомендуется выполнять, если
предполагается активная работа со стеком (команды POP, PUSH,
CALL, ACALL, LCALL, RET). Данная операция необходима и при
использовании аппаратных прерываний, т.к. при прерывании адрес
программы, которая была прервана, сохраняется в стеке и извлекается
из стека при выходе из прерывания по команде RETI.

48
Контрольные вопросы
1. Какая система счисления по умолчанию предполагается
компилятором?
29. Является ли компилятор регистрозависимым?
30. Допускается ли писать текст программы, начиная с первой колонки?
31. Как оформляются комментарии?
32. Обязательно ли ставить точку перед именем директивы?
33. Что такое макроопределения?
34. Для чего при инициализации микроконтроллера рекомендуется
настраивать все вектора прерываний?
35. Почему рекомендуется выполнять переопределение указателя стека и
очистку внутреннего ОЗУ?

49
4 ТИПИЧНЫЕ ПРИМЕНЕНИЯ МИКРОКОНТРОЛЛЕРОВ

4.1 Ввод информации с датчиков

4.1.1 Опрос двоичного датчика

В устройствах и системах логического управления объектами


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

а) структура датчика; б) сигнал на выходе

Рисунок 4.1 – Концевой датчик

4.1.1.1 Ожидание события

Типовая процедура ожидания события состоит из следующих


действий: ввода сигнала от датчика, анализа значения сигнала и
передачи управления в зависимости от состояния датчика. Программа,
реализующая эту процедуру, зависит от того, каким образом датчик
подключен к МК. Он может быть подключен к одной из линий портов
МК или к специальным входам прерываний (INT0, INT1).
Например, при подключении датчика к третьему разряду порта P1
программа реализации процедуры ожидания размыкания, а затем
замыкания контакта представлена в листинге 4.1):

50
Листинг 4.1 – Регистрации события
.ORG 0000H ; Адрес начала программы
SETB P1.3 ; Настройка разряда 3 порта
; P1 на ввод сигнала
MAIN:
JNB P1.3, $ ; Ожидание размыкания
; контакта датчика
… ; Подпрограмма обработки
; размыкания
JB P1.3,$ ; Ожидание замыкания
; контакта датчика
… ; Подпрограмма обработки
; размыкания
JMP MAIN ; Переход на регистрацию
; размыкания контакта
При подключении датчика к входу INT0, в режиме прерывания
возможно отслеживание только замыкания контакта. Программа,
реализующая регистрацию замыкания контакта, имеет следующий вид
(листинг 4.2):

Листинг 4.2 – Регистрация события с использованием входа


прерывания
.ORG 0000H ; Адрес начала программы
JMP BEGIN ; Переход к основной части
; программы
.ORG 0003H ; Адрес процедуры
; обработчика прерываний
; по входу INT0
JMP EXT0 ; Переход к процедуре
; обработчика
BEGIN:
MOV TCON, #01H ; Настройка контроллера
на
; режим прерываний по
; заднему фронту сигнала
; на входе INT0
MOV IE, #81H ; Разрешение обработки
; прерываний по входу INT0

51
JMP $ ; Остановка основной
; программы («команда
; перехода на саму себя»)
; для ожидания прерывания
EXT0:
… ; Подпрограмма обработки
; замыкания контакта
RETI ; Выход из процедуры
; обработки прерывания

Следует отметить, что:


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

4.1.1.2 Ожидание импульсного сигнала

Схема подключения датчика импульсного сигнала аналогична


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

52
Последовательность
объединения процедур
ожидания нуля и единицы
зависит от формы импульса.
Для отрицательного импульса
(рисунок 4.2) процедура
ожидания замыкания контакта
а) отрицательный; предшествует процедуре
б) положительный ожидания размыкания, для
положительного импульса –
Рисунок 4.2 – Формы импульса следует за ней.
Ниже приведены примеры
программной реализации процедуры ожидания «отрицательного»
импульсного сигнала при подключении датчика к разряду 3 порта P1
(листинг 4.3):
Листинг 4.3 – Программа регистрации отрицательного импульса
.ORG 0000H ; Адрес начала программы
SETB P1.3 ; Настройка разряда 3
; порта P1 на ввод сигнала
MAIN: JB P1.3, $ ; Ожидание логического «0»

JNB P1.3, $ ; Ожидание логической «1»


… ; Подпрограмма обработки
; импульса
JMP MAIN ; Переход на регистрацию
; следующего импульса

Аналогичным образом строится программа при подключении


датчика положительного импульсного сигнала (листинг 4.4):
Листинг 4.4 – Программа регистрации положительного импульса
.ORG 0000H ; Адрес начала программы
SETB P1.3 ; Настройка разряда 3
; порта P1 на ввод сигнала
MAIN: JNB P1.3, $ ; Ожидание логической «1»
JB P1.3, $ ; Ожидание логического «0»
… ; Подпрограмма обработки
; импульса
JMP MAIN ; Переход на регистрацию
; следующего импульса

53
Программная реализация цикла ожидания накладывает
ограничения на длительность импульса: импульсы длительностью
меньше времени выполнения цикла ожидания могут быть «не
замечены» МК. Минимально допустимые длительности импульсов
определяются тактовой частотой процессора. Гарантирована
регистрация событий, частота которых не превышает 1/24
частоты процессора.
Для обнаружения кратковременных импульсов можно
использовать способ фиксации импульса на внешнем триггере флага
(рисунок 4.3).

Рисунок 4.3 – Схема фиксации кратковременного импульса на


триггере флага

На вход МК в этом случае поступает не кратковременный сигнал


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

Листинг 4.5 – Программа регистрации кратковременного импульса,


ориентированная на использование внешнего триггера
.ORG 0000H ; Адрес начала программы
SETB P1.3 ; Настройка разряда 3
; порта P1 на ввод

54
; сигнала
BEGIN: CLR P2.0 ; Сброс триггера флага
SETB P2.0
JNB P1.3, $ ; Ожидание логической «1»
… ; Подпрограмма обработки
; импульса
JMP BEGIN ; Переход на начало
; программы

4.1.2 Устранение дребезга контактов

При работе МК с
датчиками, имеющими
механические или
электромеханические
Рисунок 4.4 – Переходные процессы контакты (кнопки, клавиши,
при дребезге контактов реле и т.п.), возникает
явление, называемое
дребезгом контактов (рисунок
4.4). Это явление заключается
в том, что при замыкании
контактов возможно
появление отскока контактов,
которое приводит к
переходному процессу. При
этом сигнал с контакта может
быть прочитан МК как
Рисунок 4.5 – Схема подавления случайная последовательность
дребезга контактов нулей и единиц. Подавить это
нежелательное явление можно схемотехническими средствами с
использованием буферного триггера (рисунок 4.5), но чаще это
делается программным путем.
Наибольшее распространение получили два программных
способа ожидания установившегося значения:
1) подсчет заданного числа последовательно совпадающих
значений сигнала;
2) временная задержка.
Блок-схемы процедур подавления помех от дребезга контактов
при вводе сигнала логического 0 показаны на рисунке 4.6.

55
В первом способе число N подбирается экспериментально для
каждого типа используемых датчиков в зависимости от частоты
кварцевого резонатора МК и лежит, как правило, в пределах от 5 до 50.
Устранение дребезга контакта путем введения временной
задержки заключается в следующем. Программа, обнаружив
замыкание контакта, запрещает опрос состояния этого контакта на
время, заведомо большее длительности переходного процесса, после
чего вновь проверяет наличие замыкания. Если замыкание не
подтвердилось, делается вывод о случайной помехе и процесс опроса
повторяется. Временная задержка (в пределах 1–10 мс) подбирается
экспериментально для каждого типа датчиков. Подробное описание
реализации временных задержек приведено в п. 4.3.

а) путем многократного считывания;


б) с использованием временной задержки

Рисунок 4.6 – Блок-схемы процедур подавления дребезга контактов

56
Примеры программ устранения дребезга контактов первым и
вторым способом приведены в листингах 4.6, 4.7 соответственно.

Листинг 4.6 – Программа устранения дребезга контактов путем


многократного считывания
; Пример программного подавления дребезга контакта приводится
; для случая, когда датчик импульсного сигнала подключен к входу
; Р3.4 (Т0), счет «удачных» опросов ведется в регистре RЗ, N=20.
; При замыкании на вход Р3.4 поступает логический 0.
.ORG 0000H ; Адрес начала программы
SETB P3.4 ; Настройка разряда 4
; порта P3 на ввод сигнала
BEGIN: MOV R3, #20 ; Инициализация счетчика
NEXT: JB P3.4, BEGIN ; Если контакт разомкнут,
; (Р3.4=«1»), то переход к
; инициализации счётчика
DJNZ R3, NEXT ; Иначе декремент
; счётчика и проверка его
; на равенство нулю. Если
; R3=0, то выход из цикла,
; иначе – переход на опрос
; разряда порта
… ; Подпрограмма обработки
; нажатия кнопки
JMP BEGIN ;Переход на начало
; программы

Листинг 4.7 – Программа устранения дребезга контактов путем


введения временной задержки
; Программа написана для случая подключения датчика к входу Т0.
; Временная задержка реализуется подпрограммой DELAY.
; Длительность временной задержки определяется числом,
; загружаемым в регистры R1:R0.
; При замыкании на вход Т0 поступает логический 0.
.ORG 0000H ; Адрес начала программы
SETB T0 ; Настройка разряда 4
; порта P3 на ввод сигнала
BEGIN: JB T0, $ ; Ожидание замыкания
; контактов

57
CALL DELAY ; Вызов процедуры,
; реализующей временную
; задержку
JB T0, BEGIN ; Повторная проверка
; замыкания контактов
; после паузы. Если нет
; замыкания, то на начало

… ; Подпрограмма обработки
; нажатия кнопки
JMP BEGIN ; Переход на начало
; программы
; Процедура временной задержки
DELAY: PUSH 0 ; Сохранение в стеке
PUSH 1 ; регистров R0 и R1
MOV R1, #7Fh ; Загрузка старшего байта

WAIT: MOV R0, #FFh ; Загрузка младшего байта


; счетчика R1:R0
DJNZ R0, $ ; Декрементирование
; младшего байта счётчика
; и переход на эту же
; команду, если R00
DJNZ R1, WAIT ; Декрементирование
; старшего байта
счётчика
; и переход на метку WAIT,
POP 1 ; если R10
; Восстановление из стека
POP 0 ; регистра R0
; Восстановление из стека
; регистра R1
RET ; Выход из процедуры

58
4.1.3 Подсчет числа импульсов

4.1.3.1 Подсчет числа импульсов за интервал времени между


двумя событиями

Типовую процедуру подсчёта числа импульсов между двумя


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

Рисунок 4.7 – Схема контроля качества деталей

По окончании выполнения процедуры (листинг 4.8) в


аккумуляторе фиксируется число деталей, представленное в двоично-
десятич-ном коде.

Листинг 4.8 – Программа, реализующая подсчет числа импульсов за


интервал времени между двумя событиями
; Для простоты реализации программы считается, что общее
; количество деталей не превышает 99.
.ORG 0000H ; Адрес начала программы
SETB INT1 ; Инициализация входов
SETB T1 ; INT1 и T1 на ввод сигнала
MOV A, #00h ; Обнуление счётчика
JNB INT1, $ ; Ожидание включения

59
; конвейера
WAIT1: JNB INT1, EXIT ; Проверка работы
; конвейера. Если конвейер
; отключен, то выход из
; процедуры
JNB T1, WAIT1 ; Проверка наличия
; логической «1» на выходе
; фотодатчика
WAIT0: JNB INT1, EXIT ; Проверка работы
; конвейера
JB T1, WAIT0 ; Проверка наличия
; логического «0» на
; выходе фотодатчика
INC A ; Увеличение счётчика
DA A ; Десятичная коррекция
SJMP WAIT1 ; Продолжение счета
EXIT: … ; Завершение
; процедуры

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


если вход T1 рассматривать как вход таймера-счётчика, а вход INT1
как вход контроллера прерываний (листинг 4.9).

Листинг 4.9 – Программа, реализующая подсчет числа импульсов за


интервал времени между двумя событиями с использованием
аппаратных средств микроконтроллера
.ORG 0000h ; Адрес начала программы
JMP BEGIN ; Переход к основной части
; программы
.ORG 0013h ; Адрес обработчика
; прерываний по входу INT1
JMP STOP ; Переход на процедуру
; обработки прерывания
BEGIN: SETB INT1 ; Инициализация входов
SETB T1 INT1
CLR 20h.0 ; и T1 на ввод сигнала
; Очистка флага
состояния
; конвейера (флаг
переходит ; в состояние
MOV IE, #00h логической

60
MOV TCON, #04h ; единицы при остановке
; конвейера)
; Запрет всех прерываний
; Настройка режима
; прерывания (по спаду
MOV TMOD, #E0h ; сигнала на входе INT1)

; Настройка таймера T/C1


MOV TL1, #00h ; на счёт внешних событий
SETB TR1 ; при единичном состоянии
MOV IE, #84h ; входа INT1
; Обнуление счетчика
JNB 20h.0, $ ; Разрешение счета
… ; Разрешение прерываний
по
; входу INT1
; Ожидание запуска и
; последующей остановки
; конвейера
STOP:
CLR TR1 ; Остановка счетчика
MOV IE, #00h ; Запрещение прерываний
SETB 20h.0 ; Установка флага
; состояния конвейера
RETI ; Выход из прерывания

После остановки конвейера в регистре TL1 в двоичном виде


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

4.1.3.2 Подсчет числа импульсов за заданный промежуток


времени

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


двоичный код, а также в ряде других задач может потребоваться
подсчёт числа импульсов N за заданный интервал времени (t1, t2)
(рисунок 4.8).

61
Рисунок 4.8 – Иллюстрация к задаче подсчета числа импульсов
за заданный промежуток времени

Эта процедура может быть реализована четырьмя различными


способами:
 программной реализацией временного интервала и
программным подсчетом числа импульсов на входе МК;
 программной реализацией временного интервала и
аппаратным подсчетом числа импульсов (на внутреннем таймере-
счетчике);
 аппаратной реализацией временного интервала и
программным подсчетом числа импульсов;
 аппаратной реализацией временного интервала с аппаратным
подсчетом числа импульсов.
Первый способ неэффективен и значительно сложнее других, а
потому не рассматривается.
При аппаратной реализации подсчета числа событий импульсный
датчик должен быть подключен ко входу одного из таймеров (в
приведённом примере программы (листинг 4.10) используется вход
T1).

Листинг 4.10 – Программа подсчёта числа импульсов за заданный


промежуток времени с использованием аппаратного счётчика
импульсов
.ORG 0000h ; Адрес начала программы
JMP BEGIN ; Переход к основной части
; программы
BEGIN SETB T1 ; Инициализация входа T1
на
MOV IE, #00h ; ввод сигнала
MOV TMOD, #50h ; Запрет всех прерываний
; Настройка таймера T/C1
MOV TL1, #00h ; на счёт внешних событий

62
MOV TH1, #00h ; Очистка регистров
SETB TR1 ; счётчика
CALL DELAY ; Разрешение счёта
; Вызов процедуры,
; реализующей временную
CLR TR1 ; задержку
… ; Остановка счёта

Подсчет импульсов производится счетчиком событий, а отсчет


заданного временного интервала – процедурой DELAY (см. листинг
4.7). Результат сохраняется в регистровой паре TH1:TH0.
При аппаратной реализации отсчета временного интервала
используется один из таймеров микроконтроллера. Счёт импульсов
реализуется программно (листинг 4.11):

Листинг 4.11 – Программа подсчёта числа импульсов за заданный


промежуток времени с использованием аппаратного счётчика времени
T: .EQU 0.025 ; Требуемый интервал
; времени от
; момента запуска
таймера ; до его
N: .EQU 40 переполнения
; Необходимое количество
; прерываний от таймера
; Величина T*N – время
F: .EQU 24000000 ; счёта
;Частота кварцевого
; резонатора (24 МГц),
; подключаемого к
ST: .EQU 65536-T*F/12 ; микроконтроллеру
; Число, загружаемое в
; регистровую пару
TH0:TL0
.ORG 0000h ; Адрес начала программы
JMP BEGIN ; Переход к основной
; программе
.ORG 000Bh ; Адрес обработчика
; прерываний от таймера
JMP TIMER ; Переход к процедуре
; обработки прерывания

63
BEGIN: MOV IE, #00h ; Запрет всех прерываний

SETB T1 ; Инициализация входа T1


на
MOV R0, #00h ; ввод сигнала
;Обнуление счетчика
MOV A, #N ; импульсов
; Загрузка счетчика
MOV TMOD, #01h ; прерываний от таймера
; Настройка таймера T/C0
; на счёт по модулю 16
MOV TL0, #<ST ; внутренней частоты
MOV TH0, #>ST ; Загрузка таймера
MOV IE, #82h
; Разрешение прерывания,
SETB TR0 ; генерируемого таймером
; Разрешение счёта
C1: JNB TR0, STOP
; Проверка флага
JB T1, C1 ; разрешения счёта
таймера
; Ожидание заднего
INC R0 фронта
; одного из
C2: JNB TR0, STOP подсчитываемых
; импульсов
JNB T1, C2 ; Увеличение счётчика
; импульсов
; Проверка флага
; разрешения счёта
JMP C1 таймера
; Ожидание переднего
… ; фронта одного из
STOP: ; подсчитываемых
; импульсов
; Переход к циклу
ожидания
; следующего импульса
; Выход из процедуры
; После выхода из процедуры результат будет сохранен в
; регистре R0

64
; Обработчик прерываний, генерируемых таймер-счетчиком T/C0
TIMER: MOV TL0, #<ST ; Загрузка таймера
MOV TH0, #>ST
DJNZ A, TEXIT ; Декрементирование
; счётчика прерываний

; и переход на метку
TEXIT,
CLR TR0 ; если A0
; Сброс флага разрешения
TEXIT: MOV IE, #00h ; счета
RETI ; Запрет прерываний
; Выход из прерывания
В приведённой программе время счёта (t2–t1) составляет 1 секунду.
Значения T и N выбирались из следующих соображений: для отсчёта 1 с
необходимо, чтобы произведение Т×N=1. При частоте кварцевого
резонатора 24 МГц таймер ведет счет импульсов внутреннего
генератора, частота которых 2 МГц. Время отсчёта (с) 65536 периодов
внутреннего генератора составляет:
1
65536  0 ,032768 .
2000000
Целого числа, умножение которого на 0,032768 составит 1, не
существует, поэтому из интервала  0,032768 выбирается
максимальное число, умножение которого на целое число составит 1.
Очевидно, что одним из вариантов будет комбинация: T = 0,025, N=40.
Четвертый способ подсчета числа импульсов может быть
реализован двумя способами:
– с использованием двух таймеров-счётчиков (один для
генерации интервала времени, другой – для счёта внешних импульсов);
– с использованием таймера-счётчика (для генерации интервала
времени) и контроллера прерываний (для регистрации импульсов). При
использовании этого способа подсчитываемые импульсы должны
подаваться на один из входов контроллера прерываний, INT0 или
INT1.
Первый способ позволяет полностью «разгрузить» процессор
микроконтроллера. Этот способ является сочетанием двух
предыдущих (листинг 4.10 и 4.11).
Второй способ аппаратной регистрации импульсов представлен
листингом 4.12.

65
Листинг 4.12 – Программа подсчёта импульсов за заданный интервал
времени с использованием внутреннего контроллера прерываний
T: .EQU 0.025 ; Интервал времени от
; момента запуска таймера
; до его переполнения
N: .EQU 40 ; Необходимое количество
; прерываний от таймера
; Величина T*N – время
; счёта
F: .EQU 24000000 ;Частота кварцевого
; резонатора (24 МГц),
; подключаемого к
; микроконтроллеру
ST: .EQU 65536-T*F/12 ; Число, загружаемое в
; регистровую пару TH0:TL0
.ORG 0000h ; Адрес начала программы
JMP BEGIN ; Переход к основной
; программе
.ORG 0003h ; Адрес обработчика
; прерываний по входу INT0
INC DPTR ; Увеличение счётчика
; импульсов
RETI ; Выход из обработчика

.ORG 000Bh ; Адрес обработчика


JMP TIMER ; прерываний от таймера
; Переход к процедуре
; обработки прерывания
BE- MOV IE, #00h ; Запрет всех прерываний
GIN: SETB INT0 ; Инициализация входа INT0
; на ввод сигнала
MOV DPTR, #0000h ;Обнуление счетчика
; импульсов
MOV A, #N ; Загрузка счетчика
; прерываний от таймера
MOV TMOD, #01h ; Настройка таймера T/C0
; на счёт по модулю 16
; внутренней частоты
MOV TL0, #<ST ; Загрузка регистров
MOV TH0, #>ST ; счётчика

66
SETB TR0 ; Разрешение счёта
MOV TCON, #01h ; Настройка контроллера
; прерываний на режим
; срабатывания по спаду
; сигнала на входе INT0

MOV IE, #83h ; Разрешение прерываний,


; генерируемых таймером и
; внешним источником
JB TR0, $ ; Проверка флага
; разрешения счёта таймера
… ; Выход из подпрограммы
; счета
; Обработчик прерываний, генерируемых таймером-счетчиком T/
C0
; приведен в листинге 4.11

В данной программе счетчик внешних импульсов представлен


регистром DPTR. Подсчитываемые импульсы должны подаваться на
вход INT0.

4.1.4 Опрос группы двоичных датчиков

Микроконтроллеры чаще всего имеют дело не с одним датчиком,


как в рассмотренных выше примерах, а с группой двоичных датчиков
(например, рисунок 4.9).

Рисунок 4.9 – Схема подключения группы двоичных датчиков

При этом МК может выполнять процедуру опроса датчиков и


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

67
Можно отметить два наиболее часто встречающихся случая
работы с группой датчиков:
– ожидание заданного кода (листинг 4.13);
– анализ кода с передачей управления одной из подпрограмм в
зависимости от полученного значения (листинг 4.14).
Листинг 4.13 – Программа ожидания заданного кода
; Программа реализована для случая подключения группы из
; восьми взаимосвязанных статических датчиков к входам порта P1.
CODE: .EQU 10101010h ; Ожидаемый код
.ORG 0000h ; Адрес начала программы
MOV P1, #FFh ; Настройка порта P1 на ввод
STOP: MOV A, P1 ; Считывание в аккумулятор
; данных из порта P1
CJNE A, #CODE, STOP ; Переход к следующему
опросу,
; если считанное значение не
… ; совпадает с заданным кодом

Листинг 4.14 – Программа анализа кода с передачей управления одной


из подпрограмм в зависимости от полученного значения
; Программа реализована для случая подключения трех датчиков
; к разрядам 0–2 порта P1. В зависимости от принятого кода
; управление передается одной из подпрограмм PROG0–PROG7.
.ORG 0000h ; Адрес начала программы
MOV SP, #30h ; Переопределение дна стека
MOV DPTR, #TABEL ; В регистр DPTR заносится
; адрес таблицы с адресами
; подпрограмм *
MOV P1, #FFh ; Настройка порта P1 на ввод
MOV A, P1 ; Чтение в аккумулятор
данных ; из порта P1
ANL A, #00000111b ; Принудительное обнуление
; незначащих разрядов
RL A ; Умножение значения на 2 **
PUSH A ; Сохранение в стеке
; содержимого аккумулятора
MOVC A, @A+DPTR ; Чтение из таблицы
старшего
MOV 0, A ; байта адреса подпрограммы
; Сохранение в ячейке 0

68
POP A ; считанного значения
; Восстановление из стека
INC A ; содержимого аккумулятора
; Инкремент аккумулятора
MOVC A, @A+DPTR
; Чтение из таблицы
MOV DPH, 0 младшего
MOV DPL, A ; байта адреса подпрограммы
; Помещение в регистровую
; пару DPH:DPL=DPTR
MOV A, #00h ; младшего и старшего
TABEL: байтов
JMP @A+DPTR ; адреса подпрограммы
; Формирования смещения
.DW PROG1, PROG2 ; подпрограммы
.DW PROG3, PROG4 ; Переход к подпрограмме
.DW PROG5, PROG6
.DW PROG7, PROG8 ; Таблица адресов
PROG1: подпрограмм

PROG8:

; Подпрограммы
; PROG1–PROG8

; * – таблица адресов подпрограмм располагается по адресу,


; которому соответствует метка TABEL. Таблица состоит из
; двухбайтовых адресов подпрограмм. Содержимое таблицы
; представлено следующим образом:
; A A+1 A+2 A+2 A+ А+5 A+6
4

; СБA МБА СБA МБА СБ МБА СБA
1 1 2 2 A 3 4
; где A – адрес таблицы адресов подпрограмм
; СБА1 – старший байт адреса подпрограммы 1
; МБА1 – младший байт адреса подпрограммы 1
; СБА2 – старший байт адреса подпрограммы 2
; МБА2 – младший байт адреса подпрограммы 2

69
; и т.д.
; ** – команда поразрядного сдвига влево равносильна умножению на 2

4.1.5 Ввод информации с матричной клавиатуры

Во многих применениях МК работают автономно по заранее


заданной программе без вмешательства человека. Наряду с этим
существуют микроконтроллерные системы, включающие в контур
управления человека-оператора. Типичным средством ввода
информации в этом случае является клавиатура.
Наиболее широкое распространение получили матричные
клавиатуры. Клавиатуры, построенные данным способом,
представляют
матрицу двоичных переключателей требуемой размерности
(рисунок 4.10).
Линии порта P1 используются для выбора одной из строк
клавиатуры, а линии порта P2 – для опроса состояний клавиш этой
строки. Каждая клавиша в такой матрице имеет свой номер,
соответствующий ее местоположению. Диоды, включенные в данную
схему, обеспечивают защиту от замыкания между собой строк в случае
одновременного нажатия более чем одной клавиши в разных строках и
тем самым снижают нагрузку на активный выход порта Р1.

70
Рисунок 4.10 – Схема построения матричной клавиатуры

Обслуживание матричной клавиатуры состоит из


последовательности процедур:
– сканирования матрицы клавиш;
– устранения дребезга контактов при нажатии клавиши (для
некоторого типа клавиатур может отсутствовать);
– ожидания отпускания клавиши;
– устранения дребезга контактов при отпускании клавиши (для
некоторого типа клавиатур может отсутствовать);
– идентификации кода нажатой клавиши.
Программа обслуживания клавиатуры может быть реализована
следующим образом (листинг 4.15):
Листинг 4.15 – Программа обслуживания клавиатуры
; Назначение регистров в программе:
; R0 – счетчик линий (хранит код, посылаемый в линии
стробирования)
; R1 – код предыдущего нажатия
; R2 – счетчик повторений
; Программа не отслеживает нажатие нескольких клавиш
; одновременно в разных строках матрицы.
.ORG 0000H ; Адрес основной программы
JMP BEGIN ; Переход к основной программе
.ORG 000BH ; Адрес обработчика
прерываний ; от таймера T0
JMP TIMER0 ; Переход к процедуре
; обработчика прерываний
; Начало основной программы
BEGIN:
MOV IE, #00H ; Запрет всех прерываний
MOV TMOD, #02H ; Настройка таймера в режим
; перезагрузки
MOV TL0, #FFH ; Инициализация
MOV TH0, #FFH ; таймера
MOV R0, #11111110B ; Иницализация счетчика линий
MOV P1, R0 ; Активация строки
MOV P2, #FFH ; Настройка порта P2 на ввод
MOV IE, #82H ; Разрешение прерываний от
; таймера
SETB TR0 ; Разрешение счета таймера
; Цикл ожидания нажатия

71
WAIT:
CJNE A, #FFH, OK ; Если клавиша нажата
; (А!=FFh),
; то переход к обработке
; нажатия,
; иначе переход к ожиданию
JMP WAIT
; Обработчик нажатия
; О том, какая комбинация нажата, судится по R0 и A
; соответственно
OK:
MOV A, #FFH
JMP WAIT
; Обработка прерываний от таймера
TIMER0:
MOV A, P2 ; Чтение кода из порта P2
ANL A, #0FH ; Выделение значащих бит 0–3
CJNE A, #0FH, PRESSED ; Если клавиша нажата
; (A!=0Fh),
; то перейти на метку
PRESSED
; иначе осуществляем сдвиг
; сканирующего нуля
MOV A, R0 ; Сдвиг нуля в счетчике
RL A ;линий на одну
MOV R0, A ; позицию
CJNE A, #F7H, NO_INIT ; Проверка предельного
; положения нуля
MOV R0, #FEH
NO_INIT:
MOV A, #FFH ; Клавиша не нажата
RETI ; Возврат в основную программу
; Обработка нажатия клавиши
PRESSED:
MOV R1, A; ; Помещаем в R1 код
предыдущего ; нажатия
; Исключение дребезга
; Если в течение цикла проверки дребезга зафиксирован
; одинаковый код, то он считается истинным
MOV R2, #20 ; Инициализация счетчика
; повторений

72
BNC_DWN:
MOV A, P2 ; Чтение кода из порта P2
ANL A, #0FH ; Выделение значащих бит 0–3
CJNE A, 01, FLS_STRT ; Если считан другой код
;(A!=R1),
; то выходим из обработки
; нажатия
DJNZ R2, BNC_DWN ; Реализация цикла проверки
; дребезга

PUSH A ; Помещение в стек


считанного ; кода
; Ожидание отпускания клавиш с исключением дребезга
; Если в течение цикла ни одна клавиша не нажата,
; то предположение, что все клавиши отпущены, истинно
BNC_UP_ERR:
MOV R2, #20 ; Инициализация счетчика
; повторений
BNC_UP:
MOV A, P2 ; Чтение кода из порта P2
ANL A, #0FH ; Выделение значащих бит 0–3
CJNE A, #0FH, BNC_UP_ERR ; Если клавиша нажата
; (A!=0Fh),
; то снова инициализируем
; счетчик,
; иначе исключаем дребезг
DJNZ R2, BNC_UP ; Реализация цикла проверки
; дребезга
POP A ; Извлечение из стека
; считанного кода
RETI ; Выход из прерывания
; (в А хранится считанный код)
; Выход из обработки нажатия, клавиша не нажата
FLS_STRT:
MOV A, #FFH
RETI

Контрольные вопросы

1. Как настроить порт на ввод данных или отдельный разряд порта?


36. Что подразумевается под событием для микроконтроллера?

73
37. Почему при регистрации импульса целесообразно использовать
разряды 2 и 3 порта P3?
38. Каким образом можно организовать счет импульсов за интервал
времени между двумя событиями?
39. Как организуется счет времени?
40. Чем отличается реальная кнопка от идеальной? Каким образом
возможно подавление дребезга? Какой из этих способов
предпочтительнее?
41. Как организуется регистрация коротких импульсов?
42. Каков алгоритм обработки матричной клавиатуры? Необходима ли при
этом обработка дребезга?

4.2 Вывод управляющих сигналов из микроконтроллера

4.2.1 Формирование статических сигналов

Для управления исполнительным механизмом (ИМ), работающим


по принципу включено/выключено, на соответствующей выходной
линии порта МК необходимо сформировать статический сигнал
логического 0 или логической 1.
Это реализуется командами вывода непосредственного операнда,
содержащего в требуемом бите значение 0 или 1. Рассмотрим для
примера схему на рисунке 4.11. Ниже приведен листинг управляющей
программы для раздельного включения/выключения устройств
(листинг 4.16).

74
Рисунок 4.11 – Пример, иллюстрирующий подключение
исполнительных механизмов к микроконтроллеру

Листинг 4.16 – Программа управления динамиком и лампой


.ORG 0000h ; Адрес начала программы
SETB P1.0 ; Включение динамика
SETB P1.1 ; Выключение лампы

; Выключение динамика
CLR P1.0
; Включение лампы
CLR P1.1

В случае параллельного управления группой автономных


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

75
Листинг 4.17 – Программа управления динамиком и лампой
.ORG 0000h ; Адрес начала программы
MOV P1, #FFh ; Включение динамика и
; выключение лампы
… ; одновременно
MOV P1, #00h ; Выключение динамика и
; включение лампы
; одновременно

Для формирования сложных последовательностей УС удобно


пользоваться табличным способом, при котором все возможные УС
упакованы в таблицу, а программа МК вычисляет адрес требуемого
УС, выбирает его из таблицы и передает в порт вывода (листинг 4.18).

Листинг 4.18 – Программа управления исполнительными


механизмами. (Последовательность управляющих сигналов
представлена в табличной форме.)
; Программа написана для случая, когда все исполнительные
; механизмы подключены к порту P1, а режимы их включения
; определяются разрядами 0–3 порта P3.
.ORG 0000h ; Адрес начала
программы
MOV P1, #00h ; Отключение ИМ
MOV P3, #FFh ; Настройка порта P3 на
; ввод
NEXT: MOV A, P3 ; Считывание значений из
; порта P3
ANL A, #0Fh ; Выделение значащих
бит
MOV DPTR, #TABEL
; Загрузка в DPTR адреса
MOVC A, @A+DPTR ; таблицы УС
MOV P1, A ; Чтение УС
JMP NEXT ; Отправка УС в порт P1
; Переход на опрос порта
TABEL ; P3
: .DB 10, 15, 127, 20, 32, 72, 2,
7 ; Таблица управляющих

76
.DB 3, 1, 0, 23, 255, 26, 34, ; слов
202

4.2.2 Формирование импульсных сигналов

Управляющее воздействие типа «импульс» можно получить


последовательной выдачей сигналов «включить» и «отключить» с
промежуточным вызовом подпрограммы временной задержки
(листинг 4.19).

Листинг 4.19 – Программа формирования импульсного воздействия


; Программа предполагает, что ИМ подключен к разряду 0 порта P1.
.ORG 0000h ; Адрес начала программы
SETB P1.0 ; Включение ИМ
CALL DELAY ; Вызов подпрограммы
; временной задержки
; (см. листинг 4.7)
CLR P1.0 ; Отключение ИМ

4.2.2.1 Генерация меандра

Для генерации меандра (рисунок 4.12) необходимо выдавать на


выход сигналы логической единицы и логического нуля с одинаковой
длительностью (листинг 4.20).

Рисунок 4.12 – Меандр

Листинг 4.20 – Программа, реализующая меандр на выходе Р1.0


.ORG 0000h ; Адрес начала программы
SETB P1.0 ; Выдача логической единицы
CALL DELAY ; Временная задержка

77
CLR P1.0 ; Выдача логического нуля
CALL DELAY ; Временная задержка
JMP 0 ; Переход на начало программы
4.2.2.2 Формирование сигнала с заданной скважностью

Пример импульсного сигнала с произвольной скважностью


показан на рисунке 4.13.

Рисунок 4.13 – Импульсный сигнал с произвольной скважностью

Скважность – это отношение длительности единичного импульса


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

Листинг 4.21 – Программа, формирующая сигнал с заданной


скважностью
.ORG 0000h ; Адрес начала программы
SETB P1.0 ; Выдача логической единицы
CALL DELAY1 ; Временная задержка,
; определяющая длительность
CLR P1.0 ; единицы ( T1 )
CALL DELAY0 ; Выдача логического нуля
; Временная задержка,
JMP 0 ; определяющая длительность
; ноля ( T2 )
; Переход на начало программы

78
4.2.3 Вывод и отображение информации

Многие микроконтроллерные устройства требуют вывода


информации на устройства индикации. Для отображения информации
используют следующие типы индикаторов:
– светодиоды используют в тех случаях, когда требуется
индикация типа ДА/НЕТ (рисунок 4.14);
– семисегментные индикаторы (ССИ) широко используются для
отображения цифровой и буквенной информации (рисунок 4.15).

Рисунок 4.14 – Схема подключения светодиодов

Рисунок 4.15 – Структура и схема подключения семисегментного


индикатора

79
Семь отображающих элементов позволяют высвечивать
десятичные и шестнадцатеричные цифры, некоторые буквы русского и
латинского алфавитов, а также некоторые специальные знаки.
Низкая нагрузочная способность МК не допускает прямого
соединения с ССИ. В качестве промежуточных усилителей тока могут
использоваться интегральные схемы преобразователей кодов для
управления ССИ.
Преобразование двоичных кодов в коды для ССИ может
осуществляться либо программно, либо аппаратно с использованием
дешифраторов для семисегментных индикаторов.
Матричные светодиодные индикаторы (МСИ) используются для
отображения алфавитно-цифровой информации (рисунок 4.16).
Каждый из таких МСИ, выполненный в виде интегральной
микросхемы, представляет собой матрицу светодиодов размерностью
M N , где N – число колонок, M – число строк матрицы.
Для включения одного светодиода матрицы необходимо
обеспечить протекание через него тока 10–15 мА при напряжении 2,0–
2,5 В. Подключение матричного индикатора к МК осуществляется
через управляемые схемы формирования тока колонок и строк (см.
рисунок 4.16) .

Рисунок 4.16 – Структура и схема подключения матричного


светодиодного индикатора

80
Для отображения многосимвольной информации используются
линейные дисплеи. Такие дисплеи представляют собой «линейку»,
смонтированную из отдельных ССИ или МСИ. Число знакомест
дисплея определяется в соответствии с требованиями к
микроконтроллерной системе.
Существует два способа организации интерфейса МК с линейным
дисплеем: статический и динамический.
Первый требует наличия на входах каждого индикатора
специальных буферных регистров для хранения кодов выводимых
символов. Естественно, что с увеличением разрядности дисплея
возрастает число дополнительных микросхем, а следовательно, и
стоимость микроконтроллерной системы.
Второй способ (динамический) основан на инерциальности
человеческого глаза, которому отображаемая на дисплее информация,
если ее обновлять с частотой не менее 20 раз в секунду, представляется
неизменяемой. Динамический способ вывода информации на дисплей
требует значительно меньших аппаратурных затрат, но более сложного
программного обеспечения. Именно этот способ организации вывода
информации получил преимущественное распространение в
микроконтроллерных системах.

4.2.3.1 Динамический вывод информации на дисплей


из семисегментных индикаторов

При использовании внешних схем преобразователей кодов


процедура индикации одного символа на ССИ в статическом режиме
сводится к выдаче двоичного кода символа в соответствующий порт
вывода МК (рисунок 4.17).

81
Рисунок 4.17 – Линейный дисплей на ССИ с динамическим
отображением информации

Процедура вывода данных на линейный дисплей из СИИ включает


следующие шаги.
1. Отключение всех индикаторов. В приведённой схеме (см.
рисунок 4.17) этот шаг предполагает подачу на входы ОК всех
индикаторов логических единиц.
2. Установка кода на информационных входах, предназначенного
для отображения на одном из индикаторов.
3. Включение индикатора, на котором необходимо отобразить
этот код. В привёденной схеме (см. рисунок 4.17) включение
индикатора осуществляется подачей логического нуля на его вход ОК.
4. Организация временной задержки.
5. Выключение индикатора.
6. Переход на шаг 2 (вывод информации на следующий
индикатор) и т.д.
Пример программной реализации данной процедуры приведен в
листинге 4.22.

Листинг 4.22 – Программа вывода информации на четырехразрядный


дисплей, приведенный на схеме, представленной на рисунке 4.17
; Программа реализует подсчет импульсов, подаваемых на разряд 0
; порта P0. Количество импульсов выводится на дисплей в
; десятичном виде. Индикатор HL1 используется для вывода
младшего
; разряда десятичного числа, индикатор HL4 – для старшего.
; Сегменты H (точки) всех индикаторов выключены.
.ORG 0000H ; Адрес начала программы
JMP BEGIN ; Переход к основной
; программе
.ORG 000BH ; Адрес обработчика
; прерываний от таймера
JMP TIMER ; Переход к процедуре
; обработки прерывания

BEGIN: MOV IE, #00H ; Запрет всех прерываний


MOV TMOD, #02H ; Настройка таймера на
; режим с автопрезагрузкой
MOV TL0, #7FH ; Загрузка регистров таймера
MOV TH0, #7FH
MOV DPTR, #0000H ; Обнуление регистра DPTR

82
MOV P1, #00H
MOV P3, #10101010B ; Отключение индикаторов
MOV R0, #FFH ; Загрузка регистра,
; отвечающего за выбор
; индикатора
SETB TR0 ; Разрешение счёта
MOV IE, #82H ; Разрешение прерываний от
; счётчика
SETB P0.0 ; Настройка разряда порта на
; ввод
JB P0.0, $ ; Ожидание импульса
NEXT: JNB P0.0, $

CLR EA ; Запрет всех прерываний

MOV A, DPL ; Инкрементирование


ADD A, #01H ; регистра DPL с десятичной
PUSH PSW ; коррекцией результата
DA A
MOV DPL, A
POP PSW

MOV A, DPH ; Инкрементирование


ADDC A, #00H ; регистра DPH с десятичной
DA A ; коррекцией результата;
MOV DPH, A
SETB EA ; Разрешение прерываний от
; таймера
JMP NEXT ; Переход к следующему
; опросу P0.0
TIMER:
INC R0 ; Инкрементирование регистра,
; отвечающего за выбор
; индикатора
CJNE R0, #00H, I1
I0: MOV P3, #10101010B ; Отключение всех
; индикаторов
MOV P1, DPL ; Вывод кода (единицы)
MOV P3, #10101000B ; Включение индикатора
; HL1
RETI ; Выход из прерывания
CJNE R0, #01H, I2
I1: MOV P3, #10101010B ; Отключение всех

83
; индикаторов
MOV A, DPL
SWAP A ; Вывод кода (десятки)
MOV P1, A
MOV P3, #10100010B ; Включение индикатора
; HL2
RETI ; Выход из прерывания;
I2: CJNE R0, #02H, I3
MOV P3, #10101010 B ; Отключение всех
; индикаторов
MOV P1, DPH ; Вывод кода (сотни)
MOV P3, #10001010 B ; Включение индикатора
; HL3
RETI ; Выход из прерывания;
MOV P3, #10101010 B ; Отключение всех
I3:
; индикаторов
MOV A, DPH ; Вывод кода (тысячи)
SWAP A
MOV P1, A
MOV P3, #00101010B ; Включение индикатора
; HL4
MOV R0, #FFH
RETI ; Выход из прерывания;

Контрольные вопросы
1. Чем отличается статический сигнал от импульсного?
43. Что такое «меандр»?
44. Какие основные средства отображения информации применяются в
микроконтроллерных устройствах?
45. Разработайте алгоритм динамического вывода информации на
матричный дисплей.
46. Разработайте алгоритм вывода информации на семисегментный
дисплей.

4.3 Реализация функций реального времени

Любая система реального времени должна иметь возможность


вести счёт времени. Универсальные микропроцессорные системы, как
правило, включают в свой состав часы реального времени.

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

4.3.1 Программное формирование временной задержки

Программное формирование временной задержки использует


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

85
а)

б)

Рисунок 4.18 – Блок-схемы процедур временных задержек,


формируемых программно
Расчёт числа, загружаемого в рабочий регистр, выполняется на
основе расчета времени выполнения команд, образующих
подпрограмму. В описании команд МК указывается, сколько
машинных циклов (МЦ) исполняется каждая команда. На основании
этих данных определяется суммарное число машинных циклов,
затрачиваемых на выполнение подпрограммы.
При тактовой частоте кварцевого резонатора Fosc каждый
машинный цикл выполняется за 12/Fosc секунд.
Ниже приведён листинг программы, реализующий временную
задержку 100 мкс, при частоте кварцевого резонатора 12 МГц
(листинг 4.23).

86
Листинг 4.23 – Программа временной задержки
.ORG 8000h ; Адрес начала программы
MOV R2, #49 ; Загрузка рабочего регистра
DJNZ R2, $ ; Декремент R2 и цикл, если не ноль
… ; Продолжение программы

Число 49 получено следующим образом: команды MOV и DJNZ


выполняются по 2 МЦ. Команда MOV выполняется 1 раз, DJNZ – 49
раз. При этом суммарное количество МЦ будет составлять
2+249=100. При тактовой частоте кварцевого резонатора 12 МГц
цикл выполняется за 12/12000000100=0,0001 с, т.е. за 100
микросекунд.
В данном примере при загрузке в регистр R2 числа 49 требуемая
временная задержка реализуется точно. Если число, загружаемое в
регистр R2, получается дробным, то временную задержку можно
реализовать лишь приблизительно. Например, для реализации
временной задержки 100 мкс, при частоте кварцевого резонатора 10
МГц R2=40,641.
Минимальная временная задержка, реализуемая подпрограммой,
составляет 48/Fosc секунд (при R2=1). Временную задержку меньшей
длительности программным путем можно реализовать, включая в
программу цепочки команд NOP, выполняющиеся в течение 1 МЦ.
Максимальная длительность задержки, реализуемая
подпрограммой, составляет 6144/Fosc секунд (при R2=255).
Для реализации задержки большей длительности можно
увеличить тело цикла включением дополнительных команд или
использовать метод вложенных циклов (рисунок 4.18б).
4.3.2 Формирование временной задержки с использованием
таймеров
Недостатком программного способа реализации временной
задержки является нерациональное использование ресурсов МК: во
время формирования задержки МК практически простаивает, так как
не может решать никаких задач управления объектом. В то же время
аппаратные средства МК позволяют реализовать временные задержки
на фоне выполнения основной программы.
Временные задержки можно получить при использовании
таймера-счетчика.

87
Если использовать таймер-счётчик в режиме таймера, то
временную задержку можно реализовать следующим образом
(листинг 4.24):

Листинг 4.24 – Программа временной задержки с использованием


таймера-счётчика
F: .EQU 18432000 ; Частота кварцевого
; резонатора
COUNT: .EQU 65535-(F/(1000*12)) ; Число, определяющее
; время счёта таймера от
; момента его загрузки до
; переполнения (1 мс)

.ORG 0000H ; Адрес начала программы


JMP BEGIN ; Переход к основной части

.ORG 000BH ; Адрес обработки


; прерывания таймера
JMP TIME ; Переход на процедуру
; обработки прерывания
BEGIN: MOV SP, #30H ; Переопределение
; вершины стека
MOV IE, #00H ; Запрет прерываний
CLR TR0 ; Запрет счёта
CLR 20H.0 ; Сброс флага конца паузы
MOV R0, #10 ; Загрузка счетчика
; прерываний
MOV TL0, #<COUNT ; Загрузка регистров
MOV TH0, #>COUNT таймера-
; счетчика TC0
MOV TMOD, #01H
SETB TR0 ; Настройка таймера-
JNB 20H.0, $ счетчика
CLR TR0 ; на режим 1
… ; Ожидание конца паузы
; Запрещение работы таймера
; Продолжение программы
; В любом месте программы
; достаточно очистить
флаг

88
; 20h.0, загрузить числа в
; TL0,TL1 и запустить счет,
; чтобы получить требуемую
; задержку
TIME: CLR TR0 ; Запрещение работы таймера

MOV A, TL0 ; Добавление к


ADD A, #13 содержимому
ADD A, #<COUNT ; регистров TL0 TH0
MOV TL0, A ; коэффициента счёта и
MOV A, TH0 ; времени, затраченного на
ADDC A, #>COUNT ; выполнение данного
MOV TH0, A ; суммирования

SETB TR0
DJNZ R0, EXIT ; Разрешение работы таймера
; Декремент счётчика
; прерываний и выход из
; прерывания, если значение
SETB 20H.0 ; счётчика не равно нулю
RETI ; Установка флага конца
паузы
EXIT: ; Выход из прерывания

4.3.3 Измерение временных интервалов


В задачах управления часто возникает необходимость измерения
промежутка времени между двумя событиями. Обычно события в
объекте управления представляются сигналами от двоичных датчиков.
Считая событиями фронт и спад импульса, можно определять
временные характеристики импульсных сигналов: длительность,
период и скважность.
Простейшим способом измерения длительности импульса является
программный.
Для обнаружения событий (фронт и спад импульсного сигнала) в
этом случае используются типовые процедуры (см. п. 1.1), а отсчет
времени ведется программным способом.
Для положительного импульсного сигнала, поступающего на
вход Т0, программа измерения его длительности будет иметь вид,
представленный в листинге 4.25).
После выхода из процедуры содержимое счетчика (DPTR)
пропорционально длительности импульса логической единицы.

89
Листинг 4.25 – Программа измерения длительности положительного
импульсного сигнала
.ORG 0000h ; Адрес начала программы
MOV DPTR, #00h ; Обнуление счётчика времени
JB P3.2, $ ; Ожидание логического нуля
JNB P3.2, $ ; Ожидание логической единицы
NEXT: INC DPTR ; Инкремент счётчика времени
JB P3.2, NEXT ; Ожидание логического нуля

Для измерения длительности сигнала может быть использован


таймер. Особенно эффективно использование для этой цели таймера T/
C0 (T/C1) совместно со входом разрешения счета (альтернативная
функция входа INT0 (INT1)). Измеряемый сигнал можно, например,
подавать на вход INT0. Измерение длительности при этом будет
выполняться в Т/С0. Программа измерения длительности
положительного импульса представлена листингом 4.26.

Листинг 4.26 – Программа измерения длительности


положительного импульсного сигнала с использованием
таймер-счётчика
.ORG 0000h
CLR TR0 ; Запрещение работы таймера
MOV IE, #00h ; Запрет прерываний
MOV TMOD, #09h ; Настройка таймера на режим
MOV TL0, #00h 1
MOV TH0, #00h ; счет при логической единице на
JB INT0, $ ; входе INT0
SETB TR0 ; Ожидание логического нуля
JNB INT0, $ ; Разрешение счёта
JB INT0, $ ; Ожидание логической единицы
CLR TR0 ; Ожидание логического нуля
… ; Запрещение счёта
По завершению программы в Т/С0 будет находиться число,
пропорциональное длительности положительного импульса на входе
INT0.
Контрольные вопросы

90
1. Для чего необходим счет времени в микроконтроллерных
системах?
47. Каковы принципы формирования временной задержки? Какой из них
имеет преимущества и какие?
48. Как организуется измерение интервала времени между двумя
событиями?
4.4 Преобразование кодов
В задачах управления может возникнуть необходимость
преобразования информации из одной формы представления в другую.
Это связано с тем, что обработка данных в МК осуществляется в
параллельном двоичном коде, а поступать в МК и выводиться из него
информация может в иной форме представления.
Наиболее распространены в задачах логического управления
следующие преобразования:
– из унитарного кода в двоичный (при вводе информации с
клавиатуры или от оцифрованных переключателей);
– из двоичного в унитарный;
– из одной системы счисления в другую (при работе со
специальными клавиатурами);
– специальные преобразования (для организации индикации и
при выводе информации на периферийные устройства);
– из последовательного кода в параллельный (при вводе) и из
параллельного в последовательный (при выводе);
– из аналоговой формы представления в цифровую, и наоборот
(для связи с аналоговыми датчиками и исполнительными механизмами).
4.4.1 Преобразование унитарного кода в двоичный
позиционный
Двоичный эквивалент унитарного кода равен номеру бита, в
котором находится единственная единица или ноль. Данное
преобразование осуществляется путем сдвига исходного унитарного
кода в сторону младших бит с одновременным подсчетом числа
сдвигов. При «выдвигании» из младшего бита значения 1 (или 0)
сдвиги прекращаются, а в счетчике сдвигов будет содержаться
двоичный эквивалент унитарного кода (листинг 4.27).
Листинг 4.27 – Программа преобразования унитарного кода
в двоичный позиционный
; Активным сигналом для бита является логическая 1.
.ORG 0000h ; Адрес начала программы
MOV P1, #FFh ; Настройка порта P1 на ввод

91
MOV A, P1 ; Считывание данных из порта P1
MOV R0, #FFh ; Обнуление счётчика циклов
NEXT: JZ EXIT ; Выход из процедуры, если считанное
; значение 0
INC R0 ; Увеличение счетчика циклов
CLR C ; Сброс флага переноса
RRC A ; Сдвиг вправо считанного значения с
; учётом переноса
JMP NEXT ; Переход на начало цикла
EXIT: …

4.4.2 Преобразование двоичного позиционного кода


в унитарный

Необходимость такого преобразования возникает при выборе


одного из исполнительных устройств, подключенных к параллельному
порту контроллера, по номеру этого устройства.
Алгоритм преобразования включает следующие шаги:
– в регистр сдвига (R) загружается число 00000001b;
– если преобразуемый двоичный код (B) не равен нулю, то
выполняется сдвиг содержимого регистра R влево В раз, иначе
программа преобразования завершается.
Листинг 4.28 демонстрирует преобразование трехбитного
двоичного кода, хранящегося в аккумуляторе, в 8-битный унитарный.

Листинг 4.28 – Программа преобразования 3-битного двоичного кода,


хранящегося в аккумуляторе, в 8-битный унитарный
.ORG 0000h ; Адрес начала программы

ANL A, #07H ; Обнуление незначащих бит
MOV R0, A ; Сохранение двоичного кода в
; регистре R0
MOV A, #01H ; Загрузка регистра сдвига
CJNE R0, #00H, GO ; Сравнение преобразуемого
; двоичного кода с нулём
GO: JMP EXIT ; Выход из подпрограммы,
NEXT: если
CLR C ; преобразуемый код 000b
RLC A ; Сброс флага переноса
; Сдвиг влево содержимого
DJNZ R0, NEXT ; аккумулятора

92
; Проверка условия выхода из
EXIT: … ; цикла
; Выход из подпрограммы

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


аккумуляторе.
4.4.3 Преобразование кодов из одной системы счисления
в другую

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


другую осуществляется делением исходного числа на основание новой
системы счисления. При этом деление должно выполняться по
правилам исходной системы счисления. Например, для преобразования
двоичного числа в двоично-десятичное исходное двоичное число
должно быть поделено на 10. Деление должно осуществляться по
правилам двоичной арифметики.
Пусть требуется выполнить преобразования 8-битного двоичного
числа в двоично-десятичное. Исходный двоичный код хранится в
аккумуляторе. Результат преобразования состоит из 12 бит: младшие
4 бита – единицы, представляют собой остаток от деления исходного
числа на 10; следующее 4 бита – десятки, представляют собой остаток
от деления на 10 полученного частного; старшие 4 бита – сотни,
являются частным от второго деления. Листинг 4.29 содержит
программу преобразования однобайтового двоичного кода в двоично-
десятичный.

Листинг 4.29 – Программа преобразования однобайтового двоичного


кода в двоично-десятичный
.ORG 0000h ; Адрес начала программы
MOV A, #255 ; Загрузка в аккумулятор
; преобразуемого числа (255)
MOV B, #10 ; Загрузка в регистр B
; делителя
DIV AB ; Деление A на B
MOV DPL, B ; Сохранение остатка от
; деления (единиц) в регистре
; DPL. Регистр A содержит
; частное от первого деления
MOV B, #10 ; Загрузка в регистр B
; делителя
DIV AB ; Деление A на B

93
MOV DPH, A ; Сохранение частного от
; второго деления в DPH
MOV A, B ; Сохранение остатка от
SWAP A ; второго деления в старшей
ORL A, DPL ; тетраде регистра DPL
MOV DPL, A
...

Результат выполнения программы сохраняется в регистре DPTR.


Формат результата приведен на рисунке 4.19.

DPTR
DPH DPL
1 1 1 1 1 1
9 8 7 6 5 4 3 2 1 0
5 4 3 2 1 0
Незначащие Сотни Десятки Единицы

Рисунок 4.19 – Формат результата преобразования

Обратное преобразование (из двоично-десятичного кода в


двоичный) заключается в расчёте суммы:
«единицы» + «десятки» × 10 + «сотни» × 100…
Программа преобразования двухзначного двоично-десятичного
кода в двоичный приведена в листинге 4.30.
В приведённой программе исходное значение хранится в
младших двенадцати битах регистра DPTR. Результат сохраняется в
аккумулятор.

Листинг 4.30 – Программа преобразования двухзначного


двоично-десятичного кода в двоичный
.ORG 0000H ; Адрес начала программы

MOV A, DPL
SWAP A ; Выделение десятков
ANL A, #0FH
MOV B, #10 ; Умножение десятков на 10
MUL AB

PUSH A ; Сохранение в стек


; результата умножения
MOV A, DPL

94
ANL A, #0FH ; Выделение единиц
MOV DPL, A

POP A ; Восстановление из стека

ADD A, DPL ; Сложение единиц и


; результата умножения
MOV DPL, A
MOV A, DPH ; Выделение сотен
ANL A, #0FH

MOV B, #100 ; Умножение сотен на 100


MUL AB
ADD A, DPL ; Сложение результата умножения
; с числом «единицы»+«десятки»×10

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


системы счисления в другую, можно воспользоваться более
медленным, но зато и более простым способом «двух счетчиков». При
этом способе из исходного кода вычитается, а к новому коду
прибавляется по единице до обнуления исходного кода, причем
вычитание осуществляется «в старой», а прибавление – в «новой»
системе счисления. Пример программы преобразования двоичного
числа в двоично-десятичное методом двух счетчиков приводится ниже
(листинг 4.31).
В приведенной программе исходный двоичный код должен находиться
в аккумуляторе, двоично-десятичный код – в регистре DPTR.

Листинг 4.31 – Программа преобразования двоичного числа


в двоично-десятичное методом двух счетчиков
.ORG 0000h ; Адрес начала программы
MOV A, #200 ; в A преобразуемое число
MOV DPTR, #0000H ; Обнуление регистра DPTR

JZ EXIT ; Выход из подпрограммы


; преобразования, если
; преобразуемое число 0
NEXT: MOV R0, A ; В регистр-счётчик (R0)
; преобразуемое число
MOV A, DPL ; Увеличение регистра DPL

95
ADD A, #01H ; на единицу и его
DA A ; двоично-десятичная
MOV DPL, A ; коррекция

MOV A, DPH ; Увеличение регистра DPH


ADDC A, #00H ; на единицу, если возник
DA A ; перенос при увеличении
MOV DPH, A ; регистра DPL и
; двоично-десятичная коррекция
; результата
DJNZ R0, NEXT ; Уменьшение счетчика циклов
; (R0) и переход на начало цикла,
; если R0 не равно 0
EXIT: …

4.4.4 Преобразование данных из параллельного кода


в последовательный и обратно

Наиболее распространенным применением процедур


преобразования параллельной формы в последовательную и обратно
является связь с удаленными датчиками, исполнительными
механизмами и другими МК по однопроводным и двухпроводным
линиям передачи информации.
Для этих целей удобно использовать аппаратные средства
микроконтроллера – последовательный порт (см. п. 1.3.4). Порт может
работать в двух режимах: в режиме сдвигающего регистра и режиме
универсального асинхронного приёмопередатчика.
Работа последовательного порта в режиме сдвигающего регистра
предполагает синхронную выдачу и приём битов информации
(рисунок 4.20).
Внешнее устройство, принимающее информацию, должно
«защёлкивать» биты по переднему фронту сигнала на выходе TXD,
выдающее – устанавливать данные по заднему фронту.
Выдача информации в этом режиме может быть реализована
следующим образом (листинг 4.32).

96
Рисунок 4.20 – Организация последовательного синхронного обмена
между микроконтроллером и периферийным устройством

Листинг 4.32 – Программа выдачи информации микроконтроллером


.ORG 0000H ; Адрес начала программы
MOV IE, #00H ; Запрет всех прерываний
MOV SCON, ; Настройка последовательного
#00H ; порта контроллера на режим
; синхронной передачи
; Настройка порта P0 на ввод
NEXT: MOV P0, #FFH ; Чтение данных из порта P0
MOV A, P0 ; Разрешение внешнему
SETB P1.0 ; устройству приёма данных
; Запись данных в регистр SBUF
MOV SBUF, A ; (при этом автоматически
; начинается выдача данных)
; Ожидание завершения передачи
JNB TI, $ ; Запрет внешнему устройству
CLR P1.0 ; приёма данных
; Сброс флага конца передачи
CLR TI ; Переход на начало цикла
JMP NEXT

Процедура приёма данных аналогична процедуре выдачи


(листинг 4.33).

Листинг 4.33 – Программа приёма информации микроконтроллером


.ORG 0000H ; Адрес начала программы
MOV IE, #00H ; Запрет всех прерываний
MOV SCON, #10H ; Настройка последовательного
; порта контроллера на режим

97
; синхронного приёма
SETB P1.0 ; Разрешение внешнему
; устройству на передачу данных
NEXT: JNB RI, $ ; Ожидание завершения приёма
MOV A, SBUF ; Чтение данных из регистра SBUF
MOV P0, A ; и их выдача в P0
CLR P1.0 ; Запрет внешнему устройству
; передачи данных
CLR RI ; Сброс флага конца приёма
JMP NEXT ; Переход на начало цикла

Режим универсального приёмопередатчика удобно использовать


для асинхронной выдачи и асинхронного приёма информации по
последовательному каналу связи (например, по интерфейсу RS-232).
Описание работы последовательного порта в режиме универсального
приёмопередатчика приведено в п. 1.3.4.
Программа, реализующая прием байта данных, его
инвертирование и выдачу обратно (подобная процедура часто
используется для тестирования физических линий связи), реализована
следующим образом (листинг 4.34).

Листинг 4.34 – Программа, демонстрирующая асинхронный обмен


информации через последовательный порт
FOSC: .EQU 18432000 ; Частота кварцевого
; резонатора
BR: .EQU 9600 ; Скорость обмена (бод)
COUNT: .EQU 256-(FOSC/(BR*192)) ; Число, загружаемое в
; таймер-счетчик T/C2
.ORG 0000H ; Адрес начала программы
MOV TMOD, #20H ; Настройка T/C2 в
режим
MOV SCON, #50H ; с автоперезагрузкой
; Настройка
ORL PCON, #80H ; последовательного порта
; Установка бита 7
; регистра PCON (бит
; влияет на скорость
MOV TH1, #COUNT ; передачи)

98
MOV TL1, TH1 ; Загрузка регистров
CLR TI T/C2
; Сброс флага
готовности
; передатчика
CICLE: CALL READ ; Сброс флага
CPL A готовности
; приёмника
CALL SEND ; Вызов процедуры приёма
JMP CICLE ; Инвертирование
; полученного байта
; Вызов процедуры выдачи
; Переход на начало цикла
; ПОДПРОГРАММЫ
; Подпрограмма асинхронного приёма
READ: JNB RI, $ ; Ожидание установки
; флага готовности
; приёмника
; (устанавливается при
; получении символа)
MOV A, SBUF ; Считывание в
; аккумулятор
принятого
CLR RI ; байта
; Сброс флага
RET готовности
; приёмника
; Выход из
подпрограммы
; Подпрограмма асинхронной выдачи
SEND: MOV SBUF, A ; Загрузка в регистр
; SBUF Отправляемого
; значения
JNB TI, $ ; Ожидание установки

99
; флага готовности
; передатчика
CLR TI ; Сброс флага
готовности
RET ; передатчика
; Выход из
подпрограммы

4.4.5 Цифро-аналоговое преобразование

Преобразование информации из цифровой формы в аналоговую


осуществляется путем подключения ЦАП к одному из портов МК.
Выдача аналогового управляющего воздействия в этом случае
сводится к команде пересылки двоичного кода в порт. При этом на
выходе ЦАП появится напряжение (ток), пропорциональное
двоичному коду, загруженному в порт.
Некоторые объекты управления могут требовать непрерывного
воздействия изменяющегося сигнала. Простейшим случаем является
формирование линейно изменяющегося сигнала (рисунок 4.21,
листинг 4.35).

Рисунок 4.21 – Принцип формирования линейно изменяющегося

100
сигнала с помощью ЦАП

Листинг 4.35 – Программа формирования линейно изменяющегося


сигнала
. ORG 0000H ; Адрес начала программы
MOV A, #00H ; Обнуление аккумулятора
NEXT: MOV P1, A ; Пересылка содержимого
; аккумулятора в порт P1
CALL DELAY ; Вызов подпрограммы,
; реализующей задержку
INC A ; Инкремент аккумулятора
JMP NEXT ; Переход на начало цикла

Программа формирования аналогового сигнала, заданного


таблично, приведена в листинге 4.36.

Листинг 4.36 – Программа формирования аналогового сигнала,


заданного таблично
. ORG 8000H ; Адрес начала программы
CYCLE: MOV DPTR, #TABLE ; Загрузка в DPTR базового
; адреса таблицы
NEXT:
MOV A, #00H ; Загрузка в аккумулятор
; смещения относительно
; базового адреса (00)
MOVC A, @A+DPTR ; Чтение байта из
MOV P1, A таблицы
; Пересылка считанного
CALL DELAY ; байта в порт
; Вызов подпрограммы,
INC DPTR ; реализующей задержку
; Увеличение адреса
MOV A, DPH ; обращения к таблице
CJNE A, #<END, NEXT
MOV A, DPL ; Проверка вхождения в
CJNE A, #>END, NEXT ; пределы таблицы
JMP CYCLE
; Переход на начало
; программы, если считано
; последнее значение из

101
; таблицы
TABLE:
.DB 00, 01, 02, 02, 02, 03 ; Таблица значений
.DB 03… ; реализуемой функции
END:

4.4.6 Аналого-цифровое преобразование

Преобразование аналогового сигнала от датчика в цифровой код,


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

4.4.6.1 Метод последовательного приближения

При использовании данного способа преобразования аналогового


сигнала в код, из дополнительной аппаратуры в микроконтроллерном
устройстве используются ЦАП и сравнивающий компаратор. Схема
включения приведена на рисунке 4.22.

102
Микроконтроллер через порт Р1, работающий в режиме вывода,
передает двоичные коды в ЦАП, выход которого соединяется с одним
из входов компаратора. На второй вход компаратора подаётся
преобразуемое напряжение. Сигнал с выхода компаратора подаётся на
вход микроконтроллера.
На выходе компаратора формируется логический 0, если
напряжение на выходе ЦАП (U цап) меньше преобразуемого напряжения
(Ux). Если Uцап>Ux, на выходе компаратора формируется логическая
единица.
Программа аналого-цифрового преобразования (листинг 4.37)
работает следующим образом: МК выдает через порт P1 байт данных,
преобразуемый ЦАП в аналоговый сигнал U цап и сравниваемый с
входным аналоговым сигналом Ux, а затем анализирует результат
сравнения. В зависимости от значения сигнала на входе INT0 МК
или оставляет старший бит выводимого байта в 1, если U цап<Ux, или
сбрасывает его в 0, если Uцап>Ux. Затем аналогичным образом в
порядке убывания весовых значений проверяется каждый бит
выводимого байта.

Рисунок 4.22 – Структурная схема аналого-цифрового преобразования


по методу последовательного приближения
Листинг 4.37 – Программа аналого-цифрового преобразования
методом последовательного приближения
.ORG 0000H ; Адрес начала программы
MOV R0,#08H ; Инициализация счётчика
MOV R1, #01H битов
MOV R2, #00H ; Инициализация регистра
сдвига
NEXT: ; Инициализация регистра
MOV A, R1 ; результата
RR A
MOV R1, A

103
ORL A, R2 ; Ротация регистра сдвига

; Логическое сложение регистра


; сдвига и регистра результата
MOV P1, A ; (Результат сохраняется в
; аккумуляторе)
JB INT0, ENOUGH ; Выдача в порт результата
; сложения
; Проверка результата сравнения
MOV R2, A ; Если на выходе компаратора 1,
; то регистр результата не
ENOUGH: DJNZ R0, NEXT ; изменяется (переход),
; иначе результат логического
; сложения сохраняется в R2
; Переход на начало цикла

4.4.6.2 Метод двойного интегрирования

Схема подключения к МК дополнительной аппаратуры показана


на рисунке 4.23, временные диаграммы, поясняющие принцип метода
двойного интегрирования, приведены на рисунке 4.24.

Рисунок 4.23 – Структурная схема аналого-цифрового преобразования


по методу двойного интегрирования

104
Рисунок 4.24 – Временные диаграммы, поясняющие принцип метода
двойного интегрирования

Первоначально на вход интегратора подается отрицательное


напряжение Eоп. При этом на выходе интегратора через некоторое
время установится отрицательный уровень, а на выходе компаратора
будет сформирован сигнал логического 0.
Процесс преобразования состоит из двух этапов. Сначала
производится интегрирование входного аналогового сигнала в течение
строго определенного времени Т1. Отсчет интервала Т1 производится
от момента t0 перехода напряжения на выходе интегратора через нуль.
Входной преобразуемый сигнал (для данной схемы) должен быть
положительным. Затем в момент времени t 1 на вход интегратора
подается опорное отрицательное напряжение E оп и измеряется время
интегрирования Т2, которое и будет пропорционально входному
напряжению (Uвх).
Время Т1 выбирается так, чтобы при максимальном входном
напряжении интегратор не вошел в насыщение.
Листинг 4.38 содержит программу аналого-цифрового
преобразования методом двойного интегрирования. После выполнения
программы результат сохраняется в регистрах TH0:TL0.

Листинг 4.38 – Программа аналого-цифрового преобразования


методом двойного интегрирования
TIME: .EQU #7FFFH ; Время интегрирования

.ORG 0000H ; Адрес начала программы


CLR EA ; Запрет всех прерываний
MOV TMOD,#01H ; Настройка таймера-счётчика Т/С0
MOV TL0, #<TIME ; Загрузка Т/С0
MOV TH0, #>TIME
SETB P1.1 ; Настройка Р1.1 на ввод
SETB P1.0 ; Подача Еоп на вход интегратора
JB P1.1, $ ; Ожидание появления на выходе
; интегратора отрицательного
; уровня
CLR P1.0 ; Подача Uвх на вход интегратора
JNB P1.1, $ ; ожидание момента Т0
SETB TR0 ; Запуск Т/С0
JNB TF0,$ ; Ожидание момента Т1

105
; НАЧАЛО ОБРАТНОГО ИНТЕГРИРОВАНИЯ
SETB P1.0 ; Подача Еоп на вход интегратора
MOV TL0, #00H ; Загрузка Т/С0
MOV TH0, #00H
JNB P1.1, $ ; Ожидание появления на выходе
; интегратора отрицательного
; уровня
CLR TR0 ; Остановка счётчика Т/С0

Контрольные вопросы

1. Для чего необходимо преобразование кодов в


микроконтроллерных устройствах?
49. Преобразование каких кодов наиболее часто выполняется
микроконтроллером?
50. Для чего необходим двоично-десятичный код?
51. Как организуется преобразование из двоичного кода в двоично-
десятичный и обратно?
52. Для чего необходимо преобразование последовательного кода в
параллельный и обратно?
53. Что такое цифро-аналоговое преобразование и для чего оно нужно?
54. Опишите методы аналого-цифрового преобразования, применяемые в
микроконтроллерных устройствах.

4.5 Операции с памятью

В состав микроконтроллерных устройств нередко включают


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

106
накапливаемой в процессе измерения и т.д. Так же, как и в ПЗУ, в ОЗУ
могут располагаться таблицы и, в редких случаях, код программы.
На рисунке 4.25 приведена схема подключения ОЗУ и ПЗУ к
микроконтроллеру.
Для повышения надёжности микропроцессорного устройства
предусматривается возможность его самотестирования. Это
предполагает выдачу информации о реакции отдельных блоков
микропроцессорного устройства на заданное воздействие.
ЗУ также могут быть протестированы. Следует отметить, что
существует множество алгоритмов тестирования ЗУ, причём эти
алгоритмы различны для ОЗУ и ПЗУ.

107
108
Рисунок 4.25 – Схема подключения ОЗУ и ПЗУ к микроконтроллеру

103
4.5.1 Тестирование ОЗУ
Один из алгоритмов тестирования ОЗУ предполагает заполнение
памяти тестовой информацией (в простейшем случае в ячейку памяти
записывается младший байт её адреса, просуммированный с некоторой
константой).
Листинг 4.39 содержит текст программы тестирования ОЗУ
ёмкостью 8 кБ.

Листинг 4.39 – Программа тестирования ОЗУ


.ORG 0000H ; Адрес начала программы
MOV R0, #00H ; Загрузка в R0 числа,
; прибавляемого к тестовой
; информации (контрольного
; байта)
TEST:
CALL WRITE ; Вызов подпрограммы записи
; тестовой информации в ОЗУ
CALL READ ; Вызов подпрограммы чтения
; тестовой информации из ОЗУ с
; проверкой правильности
записи
CJNE A, 00H, STOP ; Проверка результата
; тестирования. При
; обнаружении ошибки останов
; программы
DJNZ R0, TEST ; Иначе переход к следующему
; циклу тестирования
JMP BEGIN ; Переход к основной программе в
; случае успешного
тестирования
STOP: JMP $ ; Останов программы при
; обнаружении ошибки ОЗУ
; Основная программа
BEGIN: …
; Подпрограмма записи тестовой информации в ОЗУ
WRITE:
MOV DPTR, #0000H ; В DPTR заносится адрес, по
; которому необходимо
; сохранить байт
; тестовой информации

109
NEXTW: MOV A, DPL ; В аккумулятор помещается
ADD A, R0 ; младший байт адреса и
; прибавляется число из
; регистра R0
MOVX @DPTR, A ; Запись тестовой информации
в
INC DPTR ; ОЗУ
; Инкрементирование адреса
MOV A, DPH
CJNE A, #20H, ; Проверка предела заполнения
NEXTW ; памяти и переход на начало
; цикла записи, если память
; заполнена не полностью
RET ; Выход из подпрограммы
; Подпрограмма чтения тестовой информации из ОЗУ с проверкой
; правильности записи
READ:
MOV DPTR, #0000H ; В DPTR заносится адрес, с
; которого необходимо
; считать байт
; тестовой информации
NEXTR:
MOVX A, @DPTR ; Чтение байта из ОЗУ
CLR C ; Вычитание из считанного
SUBB A, R0 ;значения контрольного байта
CJNE A, DPL, ERR ; Проверка правильности
; записи данных
INC DPTR ; Инкрементирование адреса

MOV A, DPH ; Проверка предела чтения


CJNE A, #20H, ; памяти и переход на начало
NEXTR ; цикла чтения, если память
; считана не полностью
MOV A, R0 ; Загрузка в аккумулятор байта
; из регистра R0
RET ; Выход из подпрограммы
ERR:
MOV A, R0 ; Загрузка в аккумулятор байта
CPL A ; из регистра R0 и
; его инвертирование
RET ; Выход из подпрограммы

110
4.5.2 Программа тестирования ПЗУ

Алгоритм тестирования ПЗУ отличен от алгоритма тестирования


ОЗУ, поскольку внутрисистемная запись тестовой информации в
постоянное запоминающее устройство, как правило, невозможна.
Для тестирования ПЗУ выполняют подсчёт контрольной суммы и
сравнивают полученное значение с известным значением. Контрольная
сумма – это сумма содержимого каждой из ячеек памяти без учёта
переполнения. Контрольная сумма может быть однобайтной,
двухбайтной и т.д.
Например, если ёмкость восьмиразрядного ПЗУ 4 байта и в нем
хранится код 0СH, FFH, 16H, 20H, то однобайтное значение
контрольной суммы будет рассчитано следующим образом:
0СH+ FFH=10BH Промежуточное значение контрольной суммы
0BH
0BH+16H=21H Промежуточное значение контрольной суммы
21H
21H+20H=41H Итоговое значение контрольной суммы 41H

Листинг 4.40 содержит текст программы тестирования ПЗУ


ёмкостью 2 кБ.

Листинг 4.40 – Текст программы тестирования ПЗУ


CTRL: .EQU 34H ; Известная контрольная сумма
SUM: .REG R0 ; Регистр контрольной суммы
.ORG 0000H ; Адрес начала программы

MOV SUM, #00H ; Обнуление регистра


; контрольной суммы
MOV DPTR, #0000H ; В DPTR заносится адрес, с
; которого необходимо
; начать считать
NEXTR: ; контрольную сумму
MOV A, #00h
MOVС A, @A+DPTR ; Чтение байта из ПЗУ

ADD A, SUM ; Прибавление считанного байта


MOV SUM, A ; к содержимому регистра
; контрольной суммы
INC DPTR ; Инкрементирование адреса

111
MOV A, DPH ; Проверка предела чтения
CJNE A, #08H, ; памяти и переход на начало
NEXTR ; цикла чтения, если память
; считана не полностью
; Сравнение контрольных сумм
CJNE SUM, #CTRL, ; и останов программы, если
ERR ; подсчитанная контрольная
; сумма не совпадает с
; заданной
BEGIN: … ; Основная программа
ERR: JMP $ ; Останов при обнаружении
; ошибки

Контрольные вопросы
1. Какие типы ЗУ применяются в микроконтроллерных
устройствах?
55. Для чего необходимо тестирование ЗУ?
56. Почему метод тестирования ОЗУ не всегда приемлем для тестирования
ПЗУ?
57. Опишите один из алгоритмов тестирования ОЗУ.

4.6 Обмен данными по шине I2С

4.6.1 Общие положения и введение в логику работы шины I2С

Разработанная фирмой Philips шина I2С (Inter-Integrated Circuit) –


это двунаправленная асинхронная шина с последовательной передачей
данных и возможностью адресации до 128 устройств. Физически шина
содержит две сигнальные линии, одна из которых (SCL) предназначена
для передачи тактового сигнала, вторая (SDA) для обмена данными.
Для управления линиями применяются выходные каскады с открытым
коллектором, поэтому линии шины должны быть подключены к
источнику питания +5 В через резисторы сопротивлением 1–10 кОм, в
зависимости от физической длины линий и скорости передачи данных.
Длина соединительных линий в стандартном режиме может достигать
2 метров, скорость передачи – до 100 кбит/с.
Все абоненты шины делятся на два класса – «Master» и «Slave».
Устройство «Master» генерирует тактовый сигнал (SCL) и, как
следствие, является ведущим. Оно может самостоятельно выходить на
шину и адресовать любое «Slave»-устройство с целью передачи или

112
приёма информации. Все «Slave»-устройства «слушают» шину на
предмет обнаружения собственного адреса и, распознав его,
выполняют предписываемую операцию.
В начальный момент времени – в режиме ожидания – обе линии
SCL и SDA находятся в состоянии логической единицы. В режиме
передачи (рисунок 4.26) бит данных SDA стробируется
положительным импульсом SCL. Смена информации на линии SDA
производится при нулевом состоянии линии SCL. «Slave»-устройство
может «придерживать» линию SCL в нулевом состоянии, например, на
время обработки очередного принятого байта, при этом «Master»-
устройство обязано дождаться освобождения линии SCL, прежде чем
продолжить передачу информации.

Рисунок 4.26 – Диаграмма процесса передачи данных по шине I2C

Для синхронизации пакетов шины I2C различают два условия –


«Start» и «Stop», ограничивающие начало и конец информационного
пакета (рисунок 4.27).

Рисунок 4.27 – Диаграмма «Start»/«Stop» условия шины I2C

Для кодирования этих условий используется изменение состояния


линии SDA при единичном состоянии линии SCL, что недопустимо при
передаче данных. «Start»-условие образуется при отрицательном
перепаде линии SDA, когда линия SCL находится в единичном
состоянии, и наоборот, «Stop»-условие образуется при положительном
перепаде линии SDA при единичном состоянии линии SCL.

113
Передача данных начинается по первому положительному
импульсу на линии SCL (рисунок 4.28), которым стробируется
старший бит первого информационного байта. Каждый
информационный байт (8 битов) содержит 9 тактовых периодов линии
SCL.

Рисунок 4.28 – Диаграмма подтверждения приёма байта по шине I2C


В девятом такте устройство-получатель выдаёт подтверждение (
ACK ) – отрицательный импульс, свидетельствующий о
«взаимопонимании» передатчика и получателя. Любой абонент шины,
как «Master», так и «Slave», может в разные моменты времени быть как
передатчиком, так и получателем и в соответствии с режимом обязан
либо принимать, либо выдавать сигнал ACK , отсутствие которого
интерпретируется как ошибка.
Временная диаграмма сигналов SCL и SDA шины I2С приведена
на рисунке 4.29. Здесь S обозначает «Start»-условие, Р – «Stop»-
условие.

Рисунок 4.29 – Временная диаграмма работы шины I2C

4.6.2 Пример обмена данными по шине I2C


Рассмотрим обмен данными по протоколу I2C на конкретном
примере – между микроконтроллером и микросхемой памяти с

114
электрическим стиранием 24С16 ёмкостью 2048 B. Схема включения
приведена на рисунке 4.30.

Рисунок 4.30 – Схема подключения микросхемы 24С16


к микроконтроллеру

Назначение входов SCL и SDA приведено выше. Вход WP – вход


защиты от записи. Информация может быть записана в микросхему
только при логическом 0 на этом входе.
На рисунке 4.31 приведена диаграмма записи байта в память.

Рисунок 4.31 – Диаграмма записи байта в память

DEVICE ADDRES (адрес устройства) – это 8-битное слово,


имеющее следующий формат:
1 0 1 0 A10 A9 A8 R/W
где А8–А10 – старшая часть адреса, по которому будет записан байт
данных (DATA);
R / W – бит, определяющий тип операции (0 – запись, 1 –
чтение).
После того как микросхеме передаётся «Stop»-условие, она
выполняет внутренний цикл записи принятых данных по указанному
адресу. При этом она не реагирует на внешние сигналы. Поэтому
необходимо дождаться завершения этого процесса. Для этого

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

Рисунок 4.32 – Диаграмма чтения байта из памяти

Листинг 4.41 содержит текст программы, реализующей


тестирование микросхемы. В микросхему записывается тестовая
информация. После этого выполняется её чтение и проверка
правильности. Один байт тестовой информации – это адрес
тестируемой ячейки, увеличенный на 2.

Листинг 4.41 – Программа тестирования микросхемы 24С16


SDA: .REG P1.0 ; Линия SDA
SCL: .REG P1.5 ; Линия SCL
WP: .REG P1.4 ; Линия «Защита от записи»

.ORG 0000H ; Адрес начала программы

CLR WP ; Разрешение записи


SETB SDA
CLR SCL
MOV DPTR, #0000H ; В DPTR заносится адрес,
; по которому будут
; записаны данные
NEXTW
:
MOV A, DPL ; В аккумулятор заносится
; младшая часть адреса
INC A ; Увеличение содержимого
INC A ; аккумулятора на 2
CALL WRITE ; Вызов подпрограммы
; записи в память
; по протоколу I2C

116
INC DPTR ; Увеличение адреса
MOV A, DPH ; Проверка предела
CJNE A, #08H, NEXTW заполнения
; памяти и переход на начало
; цикла записи, если память
; заполнена не полностью
MOV DPTR, #0000H ; В DPTR заносится адрес,
; из которого будут
; считаны данные
NEXTR:
CALL READ ; Вызов подпрограммы
; чтения из памяти
; по протоколу I2C
DEC A ; Уменьшение считанного
DEC A ; значения на 2
CJNE A, DPL, ERROR ; Проверка правильности
; записанных данных
; Переход на подпрограмму
; ERROR, если данные
; записаны неправильно
INC DPTR ; Увеличение адреса
MOV A, DPH ; Проверка предела чтения
CJNE A, #08H, ; памяти и переход на начало
NEXTR ; цикла чтения, если память
; считана не полностью
MOV A, #55H ; В аккумулятор заносится
; 55H, если тест памяти
; пройден
JMP BEGIN ; Переход к основной
; программе

ERROR:
MOV A, #AAH ; В аккумулятор заносится
; ААh, если обнаружена
ошибка
BEGIN: ; Основная программа

; Подпрограмма записи байта информации в память по
протоколу I2C
WRITE:
MOV 10H, A ; В ячейке 10H сохраняются

117
; записываемые данные

; Формирование адреса устройства (режим записи)


MOV A, DPH ; В аккумулятор заносится
; старшая часть адреса
RL A ; Выполняется сдвиг влево
ANL A, #0EH ; Обнуление битов 0, 4, 5, 6 и
7
ORL A, #A0H ; Установка битов 5 и 7
MOV 11H, A ; Сохранение адреса
; устройства в ячейке 11H

LCALL START ; Вызов процедуры,


; генерирующей «Start»-
; условие
MOV A,11H ; Запись адреса устройства
LCALL BYTE
MOV A,DPL ; Запись младшего байта
LCALL BYTE ; адреса
MOV A,10H ; Запись байта информации
LCALL BYTE
LCALL STOP ; Вызов процедуры,
; генерирующей «Start»-
; условие

MOV 1DH,#00H ; Цикл ожидания


W3: ; подтверждения
DJNZ 1DH,W1 ; В цикле 256 раз выполняется
LJMP W2 ; подача «Start»-условия,
W1: ; запись адреса устройства,
LCALL START ; проверка подтверждения
MOV A,11H ; (логический 0
; на линии SDA) и подача
LCALL BYTE ; «Stop»-условия
JC W3 ; Как только приходит
; подтверждение, в
LCALL STOP ; аккумулятор
MOV A,10H ; помещается байт
RET ; информации
W2: ; и выполняется выход из
LCALL STOP ; подпрограммы

118
MOV A,10H ; Если подтверждение не
CPL A ; формируется, в
RET аккумулятор
; помещается инверсное
; значение байта информации
; и выполняется выход из
; подпрограммы
; Подпрограмма, генерирующая «Start»-условие
START:
SETB SCL
CLR SDA
CLR SCL
SETB SDA
RET

; Подпрограмма выдачи байта в последовательной форме


; (Передаётся содержимое аккумулятора)
BYTE:
MOV 1CH, #08H ; В ячейку 1CH
помещается
; количество передаваемых
; бит
WBIT:
RLC A ; Сдвиг содержимого
; аккумулятора влево
; (Старший бит
; помещается во
; флаг переноса)
MOV SDA,C ; Выдача «выдвинутого»
бита
; в линию SDA
SETB SCL ; Формирование
CLR SCL тактового
; импульса на линии SCL
DJNZ 1CH, WBIT ; Проверка условия выхода
из ; цикла
SETB SDA ; Установка логической 1
на
; линии SDA
SETB SCL ; Установка логической 1
на

119
; линии SCL
MOV C, SDA ; Считывание сигнала
; подтверждения
CLR SCL ; Установка логического 0
на
; линии SCL
RET ; Выход из подпрограммы
; Подпрограмма, генерирующая «Stop»-условие
STOP:
CLR SDA
SETB SCL
SETB SDA
CLR SCL
RET

; Подпрограмма чтения байта информации из памяти


по протоколу I2C
READ:
; Формирование адреса устройства (режим записи)
MOV A, DPH
RL A
ANL A, #0EH
ORL A, #A0H
MOV 11H, A

LCALL START ; Вызов процедуры


; генерирующей «Start»-
; условие

MOV A, 11H ; Запись адреса


LCALL BYTE устройства
MOV A, DPL ; Запись младшего байта
LCALL BYTE ; адреса

LCALL START ; Вызов процедуры


; генерирующей «Start»-
; условие

; Формирование адреса устройства (режим чтения)


MOV A, 11H
SETB ACC.0
LCALL BYTE ; Запись адреса

120
устройства
; Подпрограмма приёма байта в последовательной форме
; (Результат сохраняется в аккумуляторе)
MOV R0, #08H ; В регистр R0
помещается
; количество принимаемых
; бит
RBIT:
SETB SCL ; Установка логической 1
на
; линии SCL
MOV C, SDA ; Сохранение состояния
; линии SDA (бит
информации)
RLC A ; Сдвиг содержимого
; аккумулятора влево
; («вдвигается» принятый
бит)
CLR SCL ; Установка логического 0
на
; линии SCL
DJNZ R0, RBIT ; Проверка условия выхода
из
; цикла
SETB SDA ; Установка логической 1
на
; линии SDA

SETB SCL ; Установка логической 1


на
; линии SCL
CLR SCL ; Установка логического 0
на
; линии SCL
CALL STOP ; Вызов процедуры
; генерирующей «Stop»-
; условие
RET ; Выход из подпрограммы

Контрольные вопросы
1. Что такое шина I2C?

121
58. Чем отличается «Master» от «Slave» устройства?
59. Каковы этапы приема байта информации от «Slave» устройства по
шине I2C?
60. Какое устройство на шине I2C выдает сигнал ACK и в каком случае?
61. Для чего нужны «Start»- и «Stop»-условия?

4.7 Приём данных по протоколу Centronics

Основным назначением интерфейса Centronics является


подключение к компьютеру принтеров. Поэтому распределение
контактов разъёма, назначение сигналов, программные средства
управления интерфейсом ориентированы именно на это
использование. В то же время с помощью данного интерфейса можно
подключать к компьютеру специально разработанные устройства
сопряжения.
В таблице 4.1 перечислены все сигналы интерфейса Centronics и
их назначение. Однако в минимальном варианте при передаче данных
можно использовать только одиннадцать линий:
Data[0:7], Strobe#, Busy, Ack#.

Таблица 4.1 – Сигналы интерфейса Centronics


Контак
Сигнал I/O Назначение
т
1 2 3 4
Строб данных. Данные фиксируются по
Strobe# I 1
низкому уровню сигнала
Data Линии данных. Data 0 (контакт 2) –
I 2–9
[0:7] младший бит
Acknowledge – импульс подтверждения
приема байта (запрос на прием сле-
Ack# О 10
дующего). Может использоваться для
формирования запроса прерывания
Занято. Прием данных возможен только при
Busy О 11
низком уровне сигнала
Pa- Высокий уровень сигнализирует о конце
О 12
perEnd бумаги

122
Сигнализирует о включении принтера
Select О 13 (обычно в принтере соединяется резистором
с цепью +5 В)
Автоматический перевод строки. При
низком уровне принтер, получив символ CR
Auto
I 14 (Carriage Return – возврат каретки),
LF#
автоматически выполняет и функцию LF
(Line Feed – перевод строки)
Ошибка: конец бумаги, состояние OFF-Line
Error# О 32 или внутренняя ошибка принтера
Инициализация (сброс в режим параметров
Init# I 31
умолчания, возврат к началу строки)
Выбор принтера (низким уровнем). При
Slct In# I 36 высоком уровне принтер не воспринимает
остальные сигналы интерфейса
19–30, Общий провод интерфейса
GND –
33

Временные диаграммы цикла передачи данных приведены на


рисунке 4.33.
I/O задает направление (вход/выход) применительно к внешнему
устройству.
Перед началом цикла передачи данных компьютер должен
убедиться, что сняты сигналы Busy и Ack#. После этого выставляются
данные, формируется сигнал стробирования на линии Strobe#.

Рисунок 4.33 – Временные диаграммы цикла передачи данных

При получении строба, устройство сопряжения формирует сигнал


Busy, а после окончания обработки данных выставляет сигнал Ack#,
снимает Busy и снимает Ack#. Затем цикл повторяется.

123
На рисунке 4.34 приведён вариант подключения
микропроцессорного устройств к LPT порту.

Рисунок 4.34 – Подключение микропроцессорного устройства


к LPT порту

Листинг 4.42 содержит текст программы, выполняющей прием


данных по протоколу Centronics и их сохранение в ОЗУ.

Листинг 4.42 – Прием данных по протоколу Centronics


STRB: .REG P3.2 ; Строб
BUSY: .REG P3.3 ; Готовность
ACK: .REG P3.4 ; Подтверждение/запрос
DATA: .REG P1 ; Данные
.ORG 0000H ; Адрес начала программы
MOV DPTR, #0000H ; В DPTR заносится адрес, по
; которому необходимо
; записать байт
NEXT:
CALL READ ; Вызов подпрограммы
чтения
JC NODATA ; байта с LPT порта
; Проверка получения данных
INC DPTR ; Инкрементирование
; адреса
MOV A, DPH ; Проверка предела записи
CJNE A, #08H, ; памяти и переход на начало
NEXT ; цикла, если память
заполнена

124
; не полностью
READ: SETB DATA ; Настройка порта P1 на
SETB STRB ввод
; Настройка разряда 2 порта
CLR BUSY P3
SETB ACK ; на ввод
; Разрешение передачи
данных
; Установка линии
; подтверждения в исходное
; состояние
MOV R0, #07F
LAB0: MOV R1, #FFH
LAB1: MOV R2, #FFH ; Цикл ожидания строба
LAB2: ; Если строб не приходит,
т.е.
JNB STRB, RADY ; данные не посылаются,
DJNZ R2, LAB2 ; выполняется установка
DJNZ R1, LAB1 флага
DJNZ R0, LAB0 ;переноса и выход из
SETB C ; подпрограммы;
RET
RADY:
MOV A, DATA ; Чтение данных из порта
SETB BUSY ; При приходе строба
; устанавливается сигнал
;«Занято»
MOVX @DPTR, A ; Запись байта в ОЗУ
CLR BUSY ; Сброс сигнала «Занято»
JNB STRB, $ ; Ожидание логической
единицы
; на линии стробирования
CLR ACK ; Формирование
SETB ACK подтверждения
; приёма байта
CLR C ; Сброс флага переноса
RET ; Выход из подпрограммы
NODATA
: …
Контрольные вопросы

125
1. Каким образом может быть использован интерфейс Centronics в
микроконтроллерных устройствах?
62. Какие сигналы интерфейса являются входными для
микроконтроллерного устройства, подключенного к ПК?
63. Опишите временные диаграммы цикла передачи по интерфейсу Cen-
tronics.

126
ЛИТЕРАТУРА

1. 80C51 family hardware description. – Philips Semiconductors,


1995.
2. 80C51 family programmer’s guide and instructions set. – Philips
Semiconductors, 1995.
3. Бирюков, С.А. Применение цифровых микросхем серий ТТЛ и
КМОП / С.А. Бирюков. – М.: ДМК, 1999. – 240 с.: ил.
4. Гребнев, В.В. Однокристальные микроЭВМ семейства AT89
фирмы Atmel / В.В. Гребнев. – СПб.: FineStreet, 1998.
5. Гук, М. Аппаратные интерфейсы ПК. Энциклопедия /
М. Гук. – СПб.: Питер, 2002. – 528 с.: ил.
6. Гук, М. Аппаратные средства PC. Энциклопедия / М. Гук. –
СПб.: Питер Ком, 1998. – 816 с.: ил.
7. Измерения в электронике: справочник / В.А. Кузнецов [и др.];
под ред. В.А. Кузнецова. – М.: Энергоатомиздат, 1987. – 512 с.: ил.
8. Полупроводниковые приборы. Диоды высокочастотные,
импульсные, оптоэлектронные приборы: справочник / А.Б. Гитцевич
[и др.]; под ред. А.В. Голомедова. – 2-е изд., стереотип. – М.: КУбК-а,
1997. – 592 с.: ил.
9. Шило, В.Л. Популярные цифровые микросхемы: справочник /
В.Л. Шило. – М.: Радио и связь, 1987. – 352 с.: ил.

127
Учебное издание

Сыпин Евгений Викторович


Повернов Евгений Сергеевич
Павлов Андрей Николаевич

МИКРОКОНТРОЛЛЕР АТ89С51 СЕМЕЙСТВА АТ89


ФИРМЫ ATMEL. ОПИСАНИЕ И ПРОГРАММИРОВАНИЕ

3-е издание, переработанное и дополненное

Учебное пособие

Редактор Соловьева С.В.

Подписано в печать 21.10.2011. Формат 6084 1/16


Усл. п. л.  7,1. Уч.-изд. л.  7,6
Печать  ризография, множительно-копировальный
аппарат «RISO EZ300»

Тираж 35 экз. Заказ 2011122


Издательство Алтайского государственного
технического университета
656038, г. Барнаул, пр-т Ленина, 46

Оригинал-макет подготовлен ИИО БТИ АлтГТУ


Отпечатано в ИИО БТИ АлтГТУ
659305, г. Бийск, ул. Трофимова, 27

128

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