Программирование микроконтроллеров MCS-51

         

 ТЕХНОЛОГИЯ РАЗРАБОТКИ ПРИКЛАДНОГО ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ


 МИКРОКОНТРОЛЛЕРОВ MCS-51

         3.1. Этапы проектирования ППО

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

         После того как требования к прикладному программному обеспечению изделия (микроконтроллера) определены, разработка прикладной МК-программы разбивается на два существенно различных этапа:

- "от постановки задачи к исходной МК-программе";

- "от исходной МК-программы к загрузочному модулю".

         В ходе выполнения этапа "от постановки задачи к исходной МК-программе" разрабатываются общая блок-схема алгоритма (БСА) работы микроконтроллера и детализированные БСА отдельных процедур. После чего на основе полученных БСА формируется исходный текст МК-программы.

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


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



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

         Структурное программирование есть процесс построения прикладной МК-программы из строгого набора программных модулей, каждый из которых реализует определенную процедуру обработки данных. Программные модули должны иметь одну точку входа и одну точку выхода. Только в этом случае отдельные модули можно разрабатывать и отлаживать независимо, а затем объединять в законченную МК-программу с минимальными проблемами их взаимосвязей. Источником подавляющего большинства ошибок программирования является использование модулей, имеющих один вход и несколько выходов. При необходимости организации множественных ветвлений в МК-программе декомпозицию задачи выполняют таким образом, чтобы каждый функциональный модуль имел только один вход и один выход. Для этого имеющие два выхода операторы (условные операторы) либо включают внутрь модуля, объединяя их с операторами обработки, либо выносят в систему межмодульных связей, формируя тем самым БСА более высокого ранга.



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

         1. Определить, что должен делать модуль. Указанное уже было сделано при разработке общей БСА, но теперь разработчик имеет дело с фрагментом, а не с целой МК-программой, и, следовательно, может потребоваться доопределение и уточнение целевого назначения процедуры.

         2. Определить способы получения модулем исходных данных (от датчиков через порты ввода, либо из таблиц в памяти программ, через регистры или др.). Для реализации ввода исходных данных в модуль в его БСА надо включить соответствующие операторы.

         3. Определить необходимость какой-либо предварительной обработки введенных исходных данных (маскирование, сдвиг, масштабирование, перекодировка). Если до использования исходных данных требуется их предобработка, то в БСА включаются соответствующие операторы.

         4. Определить способ преобразования входных данных в требуемые выходные. Используя операторы процедур и условные операторы принятия решения, отобразить в виде БСА выбранный метод содержательной обработки исходных данных.

         5. Определить способы выдачи из модуля обработанных данных (передать в память, в порты вывода или др.). Необходимые действия отобразить в БСА.

         6. Определить необходимость какой-либо постобработки выводимых данных (изменение формата, перекодирование, масштабирование, маскирование или др.). При необходимости ввести в БСА соответствующие операторы.

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



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

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

         10. Провести мысленный эксперимент по определению работоспособности алгоритма в реальной среде функционирования микроконтроллера.

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

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

         3.2. Кросс-ассемблер X8051

 

         Кросс-ассемблер X8051 работает в среде операционной системы MSDOS (версия не ниже 3.30) и дает пользователю возможность преобразовывать исходные модули МК-программ, написанные на языке АСМ51 и содержащие не более 30000 строк, в эквивалентные объектные модули, которые впоследствии могут быть скомпонованы с другими объектными модулями и настроены на определенное адресное пространство памяти программ МК кросс-редактором связей Link.



         Основные функции кросс-ассемблера X8051:

- синтаксический и семантический контроль исходного модуля

МК-программы;

- преобразование (трансляция) исходного текста в объектный код;

- формирование листинга трансляции.

         Работа кросс-ассемблера начинается с запуска файла x8051.exe и ведется в диалоговом режиме. Сразу после запуска указанного файла на экран выдается заголовок, а затем запрос на вывод листинга с указанием ключей:

Listing Destination (N, T, D, E, L, P, <CR>=N):

где

N - не выводить;

T - выводить на терминал;

D - выводить на диск;

E - выводить только ошибки;

L - выводить листинг (вкл./выкл.);

P - выводить на принтер;

<CR> - равносильно "N".

         Если ответить "D" или "P", то задается вопрос - выводить ли таблицу перекрестных ссылок:

Generate Cross Reference ? (Y/N <CR>=N):

где Y - да, N - нет.

         Если ответить "L" (вывод листинга контролируется директивами LIST, NLIST языка АСМ51), то выводится дополнительное сообщение:

LIST ON/OFF Listing Destination (T, D, P, <CR>=T):

где значение ключей остается прежним.

         Если ответить "E" (в листинг будут выводиться только ошибки), то выводится дополнительное сообщение:

Error Only Listing Destination (T, D, P, <CR>=T):

где значение ключей остается прежним.

         Затем запрашиваются имена входного и выходного файлов:

Input Filename:

Output Filename:

Если расширение входного файла (исходного модуля МК-программы) не указано, то оно по умолчанию принимается равным .asm. Расширение выходного файла (объектного модуля МК-программы) по умолчанию равно .obj. Если не указано имя выходного файла, то ему присваивается имя входного файла с расширением .obj. Файл листинга трансляции имеет расширение .lst. Таблица перекрестных ссылок, в случае ее вывода, заносится в файл листинга.

         Кросс-ассемблер обрабатывает исходный модуль МК-программы за два прохода.


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

         Пример листинга трансляции (файл prim.lst):

2500 A.D. 8051 Macro Assembler - Version 4.02a

Input  Filename: prim.asm

Output Filename: prim.obj

1   0000   75 F0 64   BINBCD  MOV B,#100

2   0003   84                 DIV AB

3   0004   F9                 MOV R1,A

4   0005   74 0A              MOV A,#10

5   0007   C5 F0              XCH A,B

6   0009   84                 DIV AB

7   000A   C4                 SWAP A

8   000B   25 F0              ADD A,B

9   000D   F8                 MOV R0,A

10  000E   22                 RET

Lines Assembled: 10     Assembly Errors: 0

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

         3.3. Кросс-редактор связей Link

         Кросс-редактор связей Link работает в среде операционной системы MSDOS (версия не ниже 3.30) и дает пользователю возможность объединять до 20 сформированных кросс-ассемблером X8051 объектных модулей, настраивая их на выполнение с определенного адреса. При этом создается загрузочный модуль МК-программы.

         Основные функции кросс-редактора связей Link:

- настройка объектных модулей на заданное адресное пространство памяти программ микроконтроллера 8051;

- разрешение внешних ссылок;

- формирование в различных форматах загрузочного модуля и таблицы символических имен;

- выявление ошибок редактирования;

- формирование листинга редактирования в виде карты загрузки.

         Работа кросс-редактора связей начинается с запуска файла link.exe и ведется в диалоговом режиме. Сразу после запуска указанного файла на экран выдается заголовок, а затем запрашивается имя входного файла и значение смещения объектного модуля, входящего в этот файл:



Input Filename:

Enter Offset For 'Code':

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

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

Output Filename:

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

         После нажатия клавиши "Enter" на экране появится запрос имени файла библиотеки:

Library Filename:

Ответ из нажатия клавиши "Enter" завершает ввод имен библиотечных файлов, расширение которых по умолчанию принимается равным .lib.

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

Options (D, S, A, M, Z, X, H, E, T, 1, 2, 3, <CR>=Default):

где

D - вывод на диск выходного файла в шестнадцатеричном формате INTEL с расширением .hex (по умолчанию) и файла с расширением .map, содержащего ошибки редактирования, таблицу общих символических имен в алфавитном порядке, карту загрузки;

S - вывод на диск выходного файла в шестнадцатеричном формате INTEL с расширением .hex (по умолчанию) и файла с расширением .sym, содержащего таблицу общих символических имен (длина имени 32 знака);

A - вывод на диск выходного файла в шестнадцатеричном формате INTEL с расширением .hex (по умолчанию) и файла с расширением .sym, содержащего таблицу общих символических имен (длина имени 10 знаков);

M - вывод на диск выходного файла в шестнадцатеричном формате INTEL с расширением .hex (по умолчанию) и файла с расширением .sym в формате MICROTEK, содержащего таблицу символических имен. При этом в исходный модуль МК-программы должна быть включена директива SYMBOLS;



Z - вывод на диск выходного файла в шестнадцатеричном формате INTEL с расширением .hex (по умолчанию) и файла с расширением .sym в формате ZAK, содержащего таблицу символических имен. При этом в исходный модуль МК-программы должна быть включена директива SYMBOLS;

X - не используется;

H - вывод на диск выходного файла с расширением .hex (по умолчанию) в шестнадцатеричном формате INTEL;

E - вывод на диск выходного файла с расширением .hex (по умолчанию) в расширенном шестнадцатеричном формате INTEL;

T - вывод на диск выходного файла с расширением .tek (по умолчанию) в шестнадцатеричном формате TEKTRONIX;

1 - вывод на диск выходного файла с расширением .s19 (по умолчанию) в формате MOTOROLA S19;

2 - вывод на диск выходного файла с расширением .s28 (по умолчанию) в формате MOTOROLA S28;

3 - вывод на диск выходного файла с расширением .s37 (по умолчанию) в формате MOTOROLA S37.

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

         Файл в указанном формате состоит из записей (строк), причем каждая строка содержит шесть полей (поле <признак записи>, поле <длина>, поле <адрес загрузки>, поле <тип записи>, поле <данные> и поле <контрольная сумма>).

Поле <признак записи> состоит из одного символа ":" (двоеточие).

         Поле <длина> занимает один байт и содержит число байтов данных в записи. Это число не может превышать значение, заданное из диапазона 01H-0FFH операндом директивы RECSIZE. При отсутствии в исходном модуле МК-программы указанной директивы число в поле <длина> не может превышать 10H. Значение поля <длина> последней записи файла равно нулю.

         Поле <адрес загрузки> состоит из двух байтов и представляет собой шестнадцатеричный адрес загрузки первого в записи байта данных. В последней записи файла это поле содержит нулевой адрес.



         Поле <тип записи> состоит из одного байта, значение которого равно 00H (01H), если запись не последняя (последняя).

         Поле <данные> состоит из фактических данных, байты которых нумеруются слева направо. В последней записи файла данные отсутствуют.

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

         Пример файла в шестнадцатеричном формате INTEL (файл prim.hex):

:0F00000075F06484F9740AC5F084C425F0F82201

:00000001FF

Пример файла с расширением .map (файл prim.map):

Global Symbol Name        Global Value      Global Filename

***********************************************************

*                         LOAD MAP                        *

***********************************************************

* Section Name   Starting  Address   Ending Address  Size *

***********************************************************

* prim.obj                                                *

*   CODE               0000               000E       000F *

***********************************************************

Link Errors: 0         Output Format: Intel Hex

3.4. Примеры микроконтроллерных программ

широкого применения

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

         Преобразование системы счисления. Подпрограмма BINBCD выполняет преобразование целого двоичного 8-разрядного числа без знака, содержащегося в аккумуляторе A (значение в интервале 0-255), в трехзначное двоично-десятичное число, занимающее два байта и размещаемое в регистрах R1 (сотни), R2 (десятки и единицы).



BINBCD  MOV B,#100

        DIV AB      ; разделить на 100 для определения

                    ;числа сотен

        MOV R1,A    ;сохранить число сотен в R1

        MOV A,#10

        XCH A,B     ;поместить остаток в A

        DIV AB      ;разделить на 10 для определения

                    ;числа десятков

        SWAP A      ;число десятков в старшей тетраде A

        ADD A,B     ;число единиц в младшей тетраде A

        MOV R0,A    ;сохранить число десятков и единиц в R0

        RET

Фрагмент МК-программы, предложенный ниже, обеспечивает преобразование двухзначного двоично-десятичного числа, содержащегося в R3, в двоичное 8-разрядное число, размещаемое в регистре DPH.

CONV  MACRO BCD,BIN  ;начало макроопределения с

                     ;формальными параметрами BCD и BIN

      MOV A,BCD

      MOV B,#10H

      DIV AB         ;разделить на 16 для отделения

                     ;старшей и младшей тетрад A

      MOV R1,B

      MOV B,#10

      MUL AB

      ADD A,R1

      MOV BIN,A

      ENDM           ;конец макроопределения

      CONV R3,DPH    ;макрокоманда с фактическими

                     ;параметрами R3 и DPH

Считывание таймера/счетчика в процессе работы. Часто встречаются ситуации, когда необходимо определить текущее состояние работающего T/Cj (jÎ{0,1}). Указанное может быть легко осуществлено последовательным чтением регистров THj и TLj, после которого обязательно следует убедиться в том, что содержимое THj не изменилось (изменение возникает при переполнении TLj). Если изменение все же имело место, то следует повторить процедуру чтения сначала. Изложенный алгоритм реализован в подпрограмме RDT, приведенной ниже.

RDT  MOV A,TH0

     MOV R0,TL0      ;пересылка младшего байта T/C0 в R0

     CJNE A,TH0,RDT  ;контроль старшего байта T/C0

     MOV R1,A        ;пересылка старшего байта T/C0 в R1

     RET

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


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

        LCALL ADDBCD

        DW 1234H        ;BCD-константа

        DB 56H          ;адрес мл. байта BCD-переменной

        DB 78H          ;адрес мл. байта BCD-суммы

        .........

ADDBCD  POP DPH         ;размещение в DPTR

        POP DPL         ;адреса возврата

        MOV A,#2

        MOVC A,@A+DPTR  ;(A)=56H

        MOV R0,A

        MOV A,#3

        MOVC A,@A+DPTR  ;(A)=78H

        MOV R1,A

        MOV A,#1

        MOVC A,@A+DPTR  ;(A)=34H

        ADD A,@R0       ;вычисление младшего байта суммы

        DA A            ;десятичная коррекция

        MOV @R1,A

        INC R0

        INC R1

        CLR A

        MOVC A,@A+DPTR  ;(A)=12H

        ADDC A,@R0      ;вычисление старшего байта суммы

        DA A            ;десятичная коррекция

        MOV @R1,A

        MOV A,#4

        JMP @A+DPTR     ;переход к команде, следующей за

                        ;списком параметров

        Адрес



 




 




 




 




 




 STRT

Рис.3. Схема размещения табличных констант
 в ПП

         Работа с таблицами констант. Существует довольно широкий круг задач, в которых используются большие многомерные таблицы калибровочных констант, нелинейных параметров и т.п. Подпрограмма MATRX осуществляет доступ к байтовым элементам
 двумерной таблицы размерности m´n (m,n£255), размещенной в одномерной памяти программ микроконтроллера 8051 (рис.3), при этом адрес ADR ячейки ПП, содержащей элемент
, определяется по формуле:



,

где
 и
 есть соответственно номер строки и столбца таблицы; STRT есть адрес ячейки ПП, содержащей элемент
.

         Отметим, что адрес ячейки ПП, содержащей элемент
, должен удовлетворять условию
.

;(R0)=i, (R1)=j, (DPTR)=STRT

MATRX  MOV A,R0        ;(A)=i

       DEC A

       MOV B,#n

       MUL AB

       ADD A,DPL

       MOV DPL,A       ;в DPL младший байт STRT+n(i-1)

       MOV A,B

       ADDC A,DPH

       MOV DPH,A       ;в DPH старший байт STRT+n(i-1)

       MOV A,R1        ;(A)=j

       DEC A

       MOVC A,@A+DPTR  ;(A)=aij

       RET

STRT   DB a11,a12,...,a1n

       DB a21,a22,...,a2n

       ..................

       DB am1,am2,...,amn

Организация ветвления на n направлений предполагает выбор одной из n программных процедур в зависимости от выполнения соответствующего условия. Ниже приводится пример подпрограммы, эффективно реализующей указанный выбор. Здесь в зависимости от значения содержимого программно доступного элемента MEMSEL осуществляется переход к одной из команд с адресами MT1-MTn. При использовании подпрограммы JMP_n необходимо учитывать, что количество ячеек памяти программ, отведенное под таблицу адресов перехода и под область программных процедур, ограниченную адресами MT1 и MTn, не должно превышать 256 байт.

;(MEMSEL)Î{0,...,n-1}

MEMSEL  REG R3

JMP_n   MOV A,MEMSEL

        MOV DPTR,#TBL

        MOVC A,@A+DPTR

        JMP @A+DPTR

TBL     DB MT1-TBL,MT2-TBL,...,MTn-TBL

MT1     ..........

        RET

MT2     ..........

        RET

     ..........

MTn     ..........

        RET

Программирование последовательного порта. Последовательный порт микроконтроллера 8051 обеспечивает широкие возможности по организации приема/передачи данных, при этом настройка на заданную скорость приема/передачи и требуемый протокол обмена достигается соответствующей инициализацией регистров PCON (табл.2.2), TMOD (табл.2.4), SCON (табл.2.5). В качестве примера ниже приводятся три подпрограммы, которые совместно обеспечивают работу последовательного порта в режиме 3 со скоростью приема/передачи данных 2400 бод.



;INIT - подпрограмма инициализации

INIT  MOV SCON,#1101xx10B   ;xÎ{0,1}

      MOV TMOD,#0010xxxxB   ;настройка T/C1

      MOV PCON,#0           ;сброс бита SMOD

      MOV TH1,#<.NOT.K+1    ;
, где

                            ;
МГц есть частота синхро-

                            ;низации микроконтроллера

      SETB TR1              ;включить T/C1

      RET

;SP_OUT - подпрограмма передачи данных и контрольного бита

SP_OUT  MOV C,P     ;пересылка контрольного бита из флага

        MOV TB8,C   ;паритета в SCON.3

M1      JNB TI,M1   ;синхронизация передачи

        CLR TI      ;сброс бита SCON.1

        MOV SBUF,A  ;передача контрольного бита и

                    ;содержимого A через посл. порт

        RET

;SP_IN - подпрограмма приема данных и контрольного бита

SP_IN  JNB RI,SP_IN   ;синхронизация приема

       CLR RI         ;сброс бита SCON.0

       MOV A,SBUF     ;загрузка принятого байта данных в A

       MOV C,RB8      ;загрузка девятого принятого бита

                      ;данных (контрольного бита) в C

       RET

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

,

где f есть частота синхронизации микроконтроллера. Если
, то
мкс. Задержку большей длительности при той же частоте синхронизации можно получить вложением циклов, как показано в подпрограмме DELAY2, для которой
 (мкс).

DELAY1  MOV R2,#n

M1      DJNZ R2,M1

        RET

DELAY2  MOV R1,#n

MET2    MOV R2,#m

MET1    DJNZ R2,MET1



        DJNZ R1,MET2

        RET

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

         Список литературы

         1. Сташин В.В. и др. Проектирование цифровых устройств на однокристальных микроконтроллерах/ В.В.Сташин, А.В.Урусов, О.Ф.Мологонцева. М.: Энергоатомиздат, 1990.

         2. Белов А.М. и др. Средства автоматизации программирования микропроцессорных устройств/ А.М.Белов, Е.А.Иванов, Л.Л.Муренко. М.: Энергоатомиздат, 1988.

         3. Программирование микропроцессорных устройств: Сборник лабораторных работ/ Д.В.Андреев. Ульяновск: УлГТУ, 1994.

         4. Андреев Д.В. Применение отладочных программных средств в курсе «Проектирование микропроцессорных устройств»// Сборник тезисов науч.-метод. конф. «Компьютерные технологии в высшем образовании». Ульяновск: УлГТУ, 1999.

         5. Однокристальные микроЭВМ. М.: МИКАП, 1994.

 


Содержание раздела