Бийск
Издательство Алтайского государственного технического
университета им. И.И. Ползунова
2011
УДК 681.326 (031)
С95
Сыпин, Е.В.
С95 Микроконтроллер AT89C51 семейства AT89 фирмы ATMEL.
Описание и программирование: учебное пособие / Е.В. Сыпин,
Е.С. Повернов, А.Н. Павлов; Алт. гос. техн. ун-т, БТИ. – 3-е изд.,
перераб. и доп. – Бийск: Изд-во Алт. гос. техн. ун-та, 2011. –
122 с.
ISBN 978-5-9257-0220-8
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
ВВЕДЕНИЕ
6
1 СТРУКТУРА МИКРОКОНТРОЛЛЕРА
7
К микроконтроллеру могут быть подключены внешнее
постоянное запоминающее устройство (EROM) и внешнее оперативное
запоминающее устройство (ERAM).
Обозначение
Описание
8
9
Рисунок 1.2 – Упрощенная структурная схема микроконтроллера
10
восьмиразрядный регистр - указатель стека (SP), восьмиразрядный
регистр управления (PCON) и арифметико-логическое устройство
(ALU).
Генератор тактового сигнала формирует последовательность
тактовых импульсов. Период следования тактовых импульсов, равный
длительности такта работы микроконтроллера, определяется
резонансной частотой подключённого к микроконтроллеру кварцевого
резонатора (рисунок 1.3). При использовании внешнего
синхрогенератора сигнал подается на вход XTAL1, а выход XTAL2
остается неподключенным.
Контрольные вопросы
1. На какие выводы микроконтроллера подается питание?
2. Каким уровнем организуется сброс микроконтроллера?
3. Что означает термин «статическая структура»?
4. Какие устройства входят в состав микроконтроллера?
5. Каков состав и назначение регистров процессора микроконтроллера?
11
1.2 Адресное пространство микроконтроллера
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)
****Дно стека при сбросе микроконтроллера
13
7 6 5 4 3 2 1 0
CY AC F0 RS1 RS0 OV – P
14
Рисунок 1.6 – Чтение байта из EROM
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
Контрольные вопросы
16
12. К чему приведут загрузка в указатель стека числа 7FH и дальнейшее
использование стека?
13. Для чего необходим регистр RG на рисунке 1.5? Возможно ли
программно записать данные в этот регистр, не нарушив обращение к
внешней памяти? Почему?
14. Чем отличается подключение внешних памяти программ и памяти
данных?
15. Возможно ли одновременное подключение ОЗУ и ПЗУ, емкость каждой
из которых 64 кБ?
16. Какая часть адреса удерживается в течение всего цикла обращения к
памяти?
17
Выводы порта Р3.4 и Р3.5 используются для приема внешних
сигналов Т0 и Т1, поступающих в таймеры-счетчики Т/С0 и Т/С1
соответственно при работе в режиме счета внешних событий.
Выводы Р3.6 и Р3.7 при подключении к микроконтроллеру
внешней памяти данных (ERAM) используются для выдачи сигналов
записи (WR) и чтения (RD) соответственно (см. п. 1.2.1).
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
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
20
Таймер-счетчик Т/С1 используется в качестве генератора
синхросигнала при работе последовательного порта (Serial). Частота
прерываний в таймере-счетчике Т/С1 определяет скорость передачи и
приема битов в последовательном порте. При работе в качестве
генератора синхросигнала таймер-счетчик Т/С1 должен находиться в
режиме 2 (счет по модулю 2 с автоперезагрузкой). Скорость передачи
определяется числом, которое записано в регистр ТН1.
При работе таймера-счетчика Т/С0 в режиме 3 разряды регистров
TCON.6=TR1 и TCON.7=TF1 используются в таймере-счетчике Т/С0.
Таймер-счетчик Т/С1 в этом случае может использоваться в качестве
генератора синхросигнала для последовательного порта.
7 6 5 4 3 2 1 0
SM0 SM1 SM2 REN TB8 RB8 TI RI
21
Рисунок 1.11 – Временные диаграммы сигналов на выводах TXD
и RXD в режиме 0
22
а)
б)
а) режим 1; б) режимы 2, 3
23
Значение контрольного бита в принятом кадре переписывается в
разряд регистра SCON.2=RB8.
Скорость передачи и приема (BR) в режиме 2 зависит только от
значения бита SMOD и тактовой частоты работы микроконтроллера и
определяется по формуле
SMOD
BR 2
(2
Fosc .
64 )
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
в)
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Н
Контрольные вопросы
27
12. Что необходимо для разрешения и запрещения прерываний?
13. Что означает понятие «приоритет»? Перечислите в порядке возрастания
приоритетов источники, если в регистр IP загружено число 13H.
14. Каким образом временно запретить обработку всех прерываний?
15. Что означает понятие «вектор прерывания»?
28
2 СИСТЕМА КОМАНД МИКРОКОНТРОЛЛЕРА
29
– группа команд ветвления, которая включает в себя команды
условных и безусловных переходов, команды вызова подпрограмм и
возврата из них, а также команды организации циклов (таблица 2.6).
Таблица 2.7 содержит список инструкций, воздействующих на
флаги состояния микроконтроллера.
генератораЧисло периодов
Длина, байт
Мнемоника Описание
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
учетом флага переноса
31
DA A Выполняет десятичную коррекцию
12
аккумулятора
генератораЧисло периодов
Длина, байт
Мнемоника Описание
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
33
XRL direct, A Выполняет логическое ИСКЛЮЧА-
ЮЩЕЕ ИЛИ содержимого ячейки
внутренней памяти данных direct и
аккумулятора. Результат в ячейке
памяти
XRL direct, #data Выполняет логическое ИСКЛЮЧАЮ-
ЩЕЕ ИЛИ содержимого ячейки
внутренней памяти данных direct и 3 24
восьмиразрядного числа #data.
Результат в ячейке памяти
Мнемоника Описание
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 в регистр
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
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
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
Контрольные вопросы
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?
41
Язык Ассемблер для микроконтроллеров стандарта MCS-51
является достаточно типичным для микроконтроллеров такого класса.
Программный пакет для программирования на языке Ассемблер
микроконтроллеров стандарта MCS51 фирмы 2500 A.D. состоит из
программы компилятора, программы линковщика и программы
библиотекаря. Все эти программы запускаются из командной строки
DOS и используют большое количество параметров. Для повышения
удобства работы с пакетом применяется интегрированная среда
АsmEdit, запускаемая под WINDOWS ХР.
Ниже рассматривается синтаксис языка Ассемблер и некоторые
наиболее употребимые директивы.
42
.radix h – система исчисления по умолчанию –
шестнадцатеричная.
6fh – число написано в шестнадцатеричной системе счисления.
3.1.3 Комментарии
3.1.5 Метки
3.1.6 Директивы
43
.DB SYMBOL-10 – ищет в таблице символов метку SYMBOL,
вычитает из нее 10 и запоминает результат в резервируемых ячейках
памяти.
.DB 'HELLO' – размещает в памяти ASCII эквивалент символов
слова HELLO.
.DB 'OK',0DH – то же, что и предыдущее, но добавляет в конце
байт 0DH.
.DB 'IT''S' – размещает в памяти ASCII эквивалент символов
слова IT’S.
3.1.7 Макроопределения
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
(Пропущена метка.)
Значение: в данной команде требуется присутствие метки.
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 ; Команда выхода из
; прерывания
48
Контрольные вопросы
1. Какая система счисления по умолчанию предполагается
компилятором?
29. Является ли компилятор регистрозависимым?
30. Допускается ли писать текст программы, начиная с первой колонки?
31. Как оформляются комментарии?
32. Обязательно ли ставить точку перед именем директивы?
33. Что такое макроопределения?
34. Для чего при инициализации микроконтроллера рекомендуется
настраивать все вектора прерываний?
35. Почему рекомендуется выполнять переопределение указателя стека и
очистку внутреннего ОЗУ?
49
4 ТИПИЧНЫЕ ПРИМЕНЕНИЯ МИКРОКОНТРОЛЛЕРОВ
50
Листинг 4.1 – Регистрации события
.ORG 0000H ; Адрес начала программы
SETB P1.3 ; Настройка разряда 3 порта
; P1 на ввод сигнала
MAIN:
JNB P1.3, $ ; Ожидание размыкания
; контакта датчика
… ; Подпрограмма обработки
; размыкания
JB P1.3,$ ; Ожидание замыкания
; контакта датчика
… ; Подпрограмма обработки
; размыкания
JMP MAIN ; Переход на регистрацию
; размыкания контакта
При подключении датчика к входу INT0, в режиме прерывания
возможно отслеживание только замыкания контакта. Программа,
реализующая регистрацию замыкания контакта, имеет следующий вид
(листинг 4.2):
51
JMP $ ; Остановка основной
; программы («команда
; перехода на саму себя»)
; для ожидания прерывания
EXT0:
… ; Подпрограмма обработки
; замыкания контакта
RETI ; Выход из процедуры
; обработки прерывания
52
Последовательность
объединения процедур
ожидания нуля и единицы
зависит от формы импульса.
Для отрицательного импульса
(рисунок 4.2) процедура
ожидания замыкания контакта
а) отрицательный; предшествует процедуре
б) положительный ожидания размыкания, для
положительного импульса –
Рисунок 4.2 – Формы импульса следует за ней.
Ниже приведены примеры
программной реализации процедуры ожидания «отрицательного»
импульсного сигнала при подключении датчика к разряду 3 порта P1
(листинг 4.3):
Листинг 4.3 – Программа регистрации отрицательного импульса
.ORG 0000H ; Адрес начала программы
SETB P1.3 ; Настройка разряда 3
; порта P1 на ввод сигнала
MAIN: JB P1.3, $ ; Ожидание логического «0»
53
Программная реализация цикла ожидания накладывает
ограничения на длительность импульса: импульсы длительностью
меньше времени выполнения цикла ожидания могут быть «не
замечены» МК. Минимально допустимые длительности импульсов
определяются тактовой частотой процессора. Гарантирована
регистрация событий, частота которых не превышает 1/24
частоты процессора.
Для обнаружения кратковременных импульсов можно
использовать способ фиксации импульса на внешнем триггере флага
(рисунок 4.3).
54
; сигнала
BEGIN: CLR P2.0 ; Сброс триггера флага
SETB P2.0
JNB P1.3, $ ; Ожидание логической «1»
… ; Подпрограмма обработки
; импульса
JMP BEGIN ; Переход на начало
; программы
При работе МК с
датчиками, имеющими
механические или
электромеханические
Рисунок 4.4 – Переходные процессы контакты (кнопки, клавиши,
при дребезге контактов реле и т.п.), возникает
явление, называемое
дребезгом контактов (рисунок
4.4). Это явление заключается
в том, что при замыкании
контактов возможно
появление отскока контактов,
которое приводит к
переходному процессу. При
этом сигнал с контакта может
быть прочитан МК как
Рисунок 4.5 – Схема подавления случайная последовательность
дребезга контактов нулей и единиц. Подавить это
нежелательное явление можно схемотехническими средствами с
использованием буферного триггера (рисунок 4.5), но чаще это
делается программным путем.
Наибольшее распространение получили два программных
способа ожидания установившегося значения:
1) подсчет заданного числа последовательно совпадающих
значений сигнала;
2) временная задержка.
Блок-схемы процедур подавления помех от дребезга контактов
при вводе сигнала логического 0 показаны на рисунке 4.6.
55
В первом способе число N подбирается экспериментально для
каждого типа используемых датчиков в зависимости от частоты
кварцевого резонатора МК и лежит, как правило, в пределах от 5 до 50.
Устранение дребезга контакта путем введения временной
задержки заключается в следующем. Программа, обнаружив
замыкание контакта, запрещает опрос состояния этого контакта на
время, заведомо большее длительности переходного процесса, после
чего вновь проверяет наличие замыкания. Если замыкание не
подтвердилось, делается вывод о случайной помехе и процесс опроса
повторяется. Временная задержка (в пределах 1–10 мс) подбирается
экспериментально для каждого типа датчиков. Подробное описание
реализации временных задержек приведено в п. 4.3.
56
Примеры программ устранения дребезга контактов первым и
вторым способом приведены в листингах 4.6, 4.7 соответственно.
57
CALL DELAY ; Вызов процедуры,
; реализующей временную
; задержку
JB T0, BEGIN ; Повторная проверка
; замыкания контактов
; после паузы. Если нет
; замыкания, то на начало
… ; Подпрограмма обработки
; нажатия кнопки
JMP BEGIN ; Переход на начало
; программы
; Процедура временной задержки
DELAY: PUSH 0 ; Сохранение в стеке
PUSH 1 ; регистров R0 и R1
MOV R1, #7Fh ; Загрузка старшего байта
58
4.1.3 Подсчет числа импульсов
59
; конвейера
WAIT1: JNB INT1, EXIT ; Проверка работы
; конвейера. Если конвейер
; отключен, то выход из
; процедуры
JNB T1, WAIT1 ; Проверка наличия
; логической «1» на выходе
; фотодатчика
WAIT0: JNB INT1, EXIT ; Проверка работы
; конвейера
JB T1, WAIT0 ; Проверка наличия
; логического «0» на
; выходе фотодатчика
INC A ; Увеличение счётчика
DA A ; Десятичная коррекция
SJMP WAIT1 ; Продолжение счета
EXIT: … ; Завершение
; процедуры
60
MOV TCON, #04h ; единицы при остановке
; конвейера)
; Запрет всех прерываний
; Настройка режима
; прерывания (по спаду
MOV TMOD, #E0h ; сигнала на входе INT1)
61
Рисунок 4.8 – Иллюстрация к задаче подсчета числа импульсов
за заданный промежуток времени
62
MOV TH1, #00h ; Очистка регистров
SETB TR1 ; счётчика
CALL DELAY ; Разрешение счёта
; Вызов процедуры,
; реализующей временную
CLR TR1 ; задержку
… ; Остановка счёта
63
BEGIN: MOV IE, #00h ; Запрет всех прерываний
64
; Обработчик прерываний, генерируемых таймер-счетчиком T/C0
TIMER: MOV TL0, #<ST ; Загрузка таймера
MOV TH0, #>ST
DJNZ A, TEXIT ; Декрементирование
; счётчика прерываний
; и переход на метку
TEXIT,
CLR TR0 ; если A0
; Сброс флага разрешения
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 ; Выход из обработчика
66
SETB TR0 ; Разрешение счёта
MOV TCON, #01h ; Настройка контроллера
; прерываний на режим
; срабатывания по спаду
; сигнала на входе INT0
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 ; Переход к следующему
опросу,
; если считанное значение не
… ; совпадает с заданным кодом
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
69
; и т.д.
; ** – команда поразрядного сдвига влево равносильна умножению на 2
70
Рисунок 4.10 – Схема построения матричной клавиатуры
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 ; Реализация цикла проверки
; дребезга
Контрольные вопросы
73
37. Почему при регистрации импульса целесообразно использовать
разряды 2 и 3 порта P3?
38. Каким образом можно организовать счет импульсов за интервал
времени между двумя событиями?
39. Как организуется счет времени?
40. Чем отличается реальная кнопка от идеальной? Каким образом
возможно подавление дребезга? Какой из этих способов
предпочтительнее?
41. Как организуется регистрация коротких импульсов?
42. Каков алгоритм обработки матричной клавиатуры? Необходима ли при
этом обработка дребезга?
74
Рисунок 4.11 – Пример, иллюстрирующий подключение
исполнительных механизмов к микроконтроллеру
75
Листинг 4.17 – Программа управления динамиком и лампой
.ORG 0000h ; Адрес начала программы
MOV P1, #FFh ; Включение динамика и
; выключение лампы
… ; одновременно
MOV P1, #00h ; Выключение динамика и
; включение лампы
; одновременно
76
.DB 3, 1, 0, 23, 255, 26, 34, ; слов
202
77
CLR P1.0 ; Выдача логического нуля
CALL DELAY ; Временная задержка
JMP 0 ; Переход на начало программы
4.2.2.2 Формирование сигнала с заданной скважностью
78
4.2.3 Вывод и отображение информации
79
Семь отображающих элементов позволяют высвечивать
десятичные и шестнадцатеричные цифры, некоторые буквы русского и
латинского алфавитов, а также некоторые специальные знаки.
Низкая нагрузочная способность МК не допускает прямого
соединения с ССИ. В качестве промежуточных усилителей тока могут
использоваться интегральные схемы преобразователей кодов для
управления ССИ.
Преобразование двоичных кодов в коды для ССИ может
осуществляться либо программно, либо аппаратно с использованием
дешифраторов для семисегментных индикаторов.
Матричные светодиодные индикаторы (МСИ) используются для
отображения алфавитно-цифровой информации (рисунок 4.16).
Каждый из таких МСИ, выполненный в виде интегральной
микросхемы, представляет собой матрицу светодиодов размерностью
M N , где N – число колонок, M – число строк матрицы.
Для включения одного светодиода матрицы необходимо
обеспечить протекание через него тока 10–15 мА при напряжении 2,0–
2,5 В. Подключение матричного индикатора к МК осуществляется
через управляемые схемы формирования тока колонок и строк (см.
рисунок 4.16) .
80
Для отображения многосимвольной информации используются
линейные дисплеи. Такие дисплеи представляют собой «линейку»,
смонтированную из отдельных ССИ или МСИ. Число знакомест
дисплея определяется в соответствии с требованиями к
микроконтроллерной системе.
Существует два способа организации интерфейса МК с линейным
дисплеем: статический и динамический.
Первый требует наличия на входах каждого индикатора
специальных буферных регистров для хранения кодов выводимых
символов. Естественно, что с увеличением разрядности дисплея
возрастает число дополнительных микросхем, а следовательно, и
стоимость микроконтроллерной системы.
Второй способ (динамический) основан на инерциальности
человеческого глаза, которому отображаемая на дисплее информация,
если ее обновлять с частотой не менее 20 раз в секунду, представляется
неизменяемой. Динамический способ вывода информации на дисплей
требует значительно меньших аппаратурных затрат, но более сложного
программного обеспечения. Именно этот способ организации вывода
информации получил преимущественное распространение в
микроконтроллерных системах.
81
Рисунок 4.17 – Линейный дисплей на ССИ с динамическим
отображением информации
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, $
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. Разработайте алгоритм вывода информации на семисегментный
дисплей.
84
В микроконтроллер встроены таймеры-счетчики, которые
позволяют отсчитывать временные интервалы. Кроме того, возможно
формирование временных задержек путём организации циклов (как
одиночных, так и вложенных). Оба способа имеют как преимущества,
так и недостатки.
85
а)
б)
86
Листинг 4.23 – Программа временной задержки
.ORG 8000h ; Адрес начала программы
MOV R2, #49 ; Загрузка рабочего регистра
DJNZ R2, $ ; Декремент R2 и цикл, если не ноль
… ; Продолжение программы
87
Если использовать таймер-счётчик в режиме таймера, то
временную задержку можно реализовать следующим образом
(листинг 4.24):
88
; 20h.0, загрузить числа в
; TL0,TL1 и запустить счет,
; чтобы получить требуемую
; задержку
TIME: CLR TR0 ; Запрещение работы таймера
SETB TR0
DJNZ R0, EXIT ; Разрешение работы таймера
; Декремент счётчика
; прерываний и выход из
; прерывания, если значение
SETB 20H.0 ; счётчика не равно нулю
RETI ; Установка флага конца
паузы
EXIT: ; Выход из прерывания
89
Листинг 4.25 – Программа измерения длительности положительного
импульсного сигнала
.ORG 0000h ; Адрес начала программы
MOV DPTR, #00h ; Обнуление счётчика времени
JB P3.2, $ ; Ожидание логического нуля
JNB P3.2, $ ; Ожидание логической единицы
NEXT: INC DPTR ; Инкремент счётчика времени
JB P3.2, NEXT ; Ожидание логического нуля
…
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: …
92
; Проверка условия выхода из
EXIT: … ; цикла
; Выход из подпрограммы
93
MOV DPH, A ; Сохранение частного от
; второго деления в DPH
MOV A, B ; Сохранение остатка от
SWAP A ; второго деления в старшей
ORL A, DPL ; тетраде регистра DPL
MOV DPL, A
...
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
Незначащие Сотни Десятки Единицы
94
ANL A, #0FH ; Выделение единиц
MOV DPL, A
95
ADD A, #01H ; на единицу и его
DA A ; двоично-десятичная
MOV DPL, A ; коррекция
96
Рисунок 4.20 – Организация последовательного синхронного обмена
между микроконтроллером и периферийным устройством
97
; синхронного приёма
SETB P1.0 ; Разрешение внешнему
; устройству на передачу данных
NEXT: JNB RI, $ ; Ожидание завершения приёма
MOV A, SBUF ; Чтение данных из регистра SBUF
MOV P0, A ; и их выдача в P0
CLR P1.0 ; Запрет внешнему устройству
; передачи данных
CLR RI ; Сброс флага конца приёма
JMP NEXT ; Переход на начало цикла
…
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 ; передатчика
; Выход из
подпрограммы
100
сигнала с помощью ЦАП
101
; таблицы
TABLE:
.DB 00, 01, 02, 02, 02, 03 ; Таблица значений
.DB 03… ; реализуемой функции
END:
102
Микроконтроллер через порт Р1, работающий в режиме вывода,
передает двоичные коды в ЦАП, выход которого соединяется с одним
из входов компаратора. На второй вход компаратора подаётся
преобразуемое напряжение. Сигнал с выхода компаратора подаётся на
вход микроконтроллера.
На выходе компаратора формируется логический 0, если
напряжение на выходе ЦАП (U цап) меньше преобразуемого напряжения
(Ux). Если Uцап>Ux, на выходе компаратора формируется логическая
единица.
Программа аналого-цифрового преобразования (листинг 4.37)
работает следующим образом: МК выдает через порт P1 байт данных,
преобразуемый ЦАП в аналоговый сигнал U цап и сравниваемый с
входным аналоговым сигналом Ux, а затем анализирует результат
сравнения. В зависимости от значения сигнала на входе INT0 МК
или оставляет старший бит выводимого байта в 1, если U цап<Ux, или
сбрасывает его в 0, если Uцап>Ux. Затем аналогичным образом в
порядке убывания весовых значений проверяется каждый бит
выводимого байта.
103
ORL A, R2 ; Ротация регистра сдвига
104
Рисунок 4.24 – Временные диаграммы, поясняющие принцип метода
двойного интегрирования
105
; НАЧАЛО ОБРАТНОГО ИНТЕГРИРОВАНИЯ
SETB P1.0 ; Подача Еоп на вход интегратора
MOV TL0, #00H ; Загрузка Т/С0
MOV TH0, #00H
JNB P1.1, $ ; Ожидание появления на выходе
; интегратора отрицательного
; уровня
CLR TR0 ; Остановка счётчика Т/С0
…
Контрольные вопросы
106
накапливаемой в процессе измерения и т.д. Так же, как и в ПЗУ, в ОЗУ
могут располагаться таблицы и, в редких случаях, код программы.
На рисунке 4.25 приведена схема подключения ОЗУ и ПЗУ к
микроконтроллеру.
Для повышения надёжности микропроцессорного устройства
предусматривается возможность его самотестирования. Это
предполагает выдачу информации о реакции отдельных блоков
микропроцессорного устройства на заданное воздействие.
ЗУ также могут быть протестированы. Следует отметить, что
существует множество алгоритмов тестирования ЗУ, причём эти
алгоритмы различны для ОЗУ и ПЗУ.
107
108
Рисунок 4.25 – Схема подключения ОЗУ и ПЗУ к микроконтроллеру
103
4.5.1 Тестирование ОЗУ
Один из алгоритмов тестирования ОЗУ предполагает заполнение
памяти тестовой информацией (в простейшем случае в ячейку памяти
записывается младший байт её адреса, просуммированный с некоторой
константой).
Листинг 4.39 содержит текст программы тестирования ОЗУ
ёмкостью 8 кБ.
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 ; Инкрементирование адреса
110
4.5.2 Программа тестирования ПЗУ
111
MOV A, DPH ; Проверка предела чтения
CJNE A, #08H, ; памяти и переход на начало
NEXTR ; цикла чтения, если память
; считана не полностью
; Сравнение контрольных сумм
CJNE SUM, #CTRL, ; и останов программы, если
ERR ; подсчитанная контрольная
; сумма не совпадает с
; заданной
BEGIN: … ; Основная программа
ERR: JMP $ ; Останов при обнаружении
; ошибки
Контрольные вопросы
1. Какие типы ЗУ применяются в микроконтроллерных
устройствах?
55. Для чего необходимо тестирование ЗУ?
56. Почему метод тестирования ОЗУ не всегда приемлем для тестирования
ПЗУ?
57. Опишите один из алгоритмов тестирования ОЗУ.
112
приёма информации. Все «Slave»-устройства «слушают» шину на
предмет обнаружения собственного адреса и, распознав его,
выполняют предписываемую операцию.
В начальный момент времени – в режиме ожидания – обе линии
SCL и SDA находятся в состоянии логической единицы. В режиме
передачи (рисунок 4.26) бит данных SDA стробируется
положительным импульсом SCL. Смена информации на линии SDA
производится при нулевом состоянии линии SCL. «Slave»-устройство
может «придерживать» линию SCL в нулевом состоянии, например, на
время обработки очередного принятого байта, при этом «Master»-
устройство обязано дождаться освобождения линии SCL, прежде чем
продолжить передачу информации.
113
Передача данных начинается по первому положительному
импульсу на линии SCL (рисунок 4.28), которым стробируется
старший бит первого информационного байта. Каждый
информационный байт (8 битов) содержит 9 тактовых периодов линии
SCL.
114
электрическим стиранием 24С16 ёмкостью 2048 B. Схема включения
приведена на рисунке 4.30.
115
выполняется попытка записи в микросхему адреса устройства. Приход
сигнала подтверждения свидетельствует о завершении внутреннего
цикла записи.
На рисунке 4.32 приведена диаграмма чтения байта из памяти.
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
; записываемые данные
118
MOV A,10H ; Если подтверждение не
CPL A ; формируется, в
RET аккумулятор
; помещается инверсное
; значение байта информации
; и выполняется выход из
; подпрограммы
; Подпрограмма, генерирующая «Start»-условие
START:
SETB SCL
CLR SDA
CLR SCL
SETB SDA
RET
119
; линии SCL
MOV C, SDA ; Считывание сигнала
; подтверждения
CLR SCL ; Установка логического 0
на
; линии SCL
RET ; Выход из подпрограммы
; Подпрограмма, генерирующая «Stop»-условие
STOP:
CLR SDA
SETB SCL
SETB SDA
CLR SCL
RET
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
Контрольные вопросы
1. Что такое шина I2C?
121
58. Чем отличается «Master» от «Slave» устройства?
59. Каковы этапы приема байта информации от «Slave» устройства по
шине I2C?
60. Какое устройство на шине I2C выдает сигнал ACK и в каком случае?
61. Для чего нужны «Start»- и «Stop»-условия?
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
123
На рисунке 4.34 приведён вариант подключения
микропроцессорного устройств к LPT порту.
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
ЛИТЕРАТУРА
127
Учебное издание
Учебное пособие
128