Пример 1. В качестве одного из примеров, иллюстрирующих технику программирования микроконтроллера 1816ВЕ51, рассмотрим формирование текста программы для последовательности прямоугольных импульсов (рис.1).
![]() |
Рис. 1. Последовательность прямоугольных импульсов
Текст программы для этой последовательности может выглядеть следующим образом:
| ORG 2000 H | ;определение начального адреса ОЗУ | ||
| SJMP | NATH | ||
| ORG 2030 H | ;определение начального адреса программы ;в ОЗУ | ||
| NATH: | MOV | R 1, #80 H | ;загрузка в регистр R 1 длительности высокого;уровня "1" (t И) |
| MOV | R 2, #60 H | ;загрузка в регистр R 2 длительности низкого;уровня "0" (t П) | |
| MOV | P 1, #80 H | ;загрузка в порт P 1 значения уровня "1" (UMAX) | |
| LOOP 1: | DJNZ | R 1, LOOP 1 | ;декремент R 1 и цикл, если не 0 |
| MOV | P 1, #20 H | ;загрузка в порт P 1 значения уровня "0" (UMIN) | |
| LOOP 2: | DJNZ | R 2, LOOP 2 | ;декремент R 2 и цикл, если не 0 |
| SJMP | NATH | ;возврат в начало программы | |
| END | ;конец программы |
Первые три строки программы и последняя являются обязательными, так как формируют необходимое адресное пространство для выполнения программы и завершают ее. Псевдооперация ORG осуществляет принудительную установку адреса следующей команды. Начальные адреса в ОЗУ определяются его объемом и свободным пространством для размещения пользовательских программ.
Оператор " SJMP rel " организует короткий относительный переход внутри страницы к программе формирования последовательности импульсов с меткой " NATH ", где rel - метка в диапазоне [-128..+127] байт относительно адреса следующей команды.
Операторы группы передачи данных " MOV Rn, #data 8" выполняют загрузку в регистр восьми битной константы в десятичной или шестнадцатеричной системе счисления. Оператор " MOV Pn, #data 8" позволяет передать во все линии порта P 1 (P 1.0- P 1.7) все восемь разрядов восьми битной константы для вывода на ЦАП. Таким же образом может быть произведена предварительная установка уровня сигнала на выходе ЦАП (например, в начале может быть организован вывод низкого уровня сигнала). В данном примере развертка сигнала на осциллографе начинается с высокого уровня.
Оператор " DJNZ Rn, rel " определяет декремент регистра и, если он не нуль, осуществляет переход по меткам " LOOP ". В данном случае фактически осуществляется временная задержка, кратная числу, заданному константой, и времени выполнения операции микроконтроллером. В этой программе таким образом формируются длительности высокого и низкого уровней.
По окончании формирования низкого уровня сигнала производится переход в начало программы для организации циклического вывода сгенерированной последовательности импульсов через ЦАП на измерительные приборы.
Пример 2. В данном примере необходимо сформировать последовательность пилообразных импульсов (рис.2). Задача может быть решена с помощью применения операторов группы команд арифметических операций, позволяющих формировать рост пилообразного сигнала путем циклического вычисления нарастающего фронта сигнала. Точность формирования фронта (дискретность его роста) определяется разрядностью загружаемой константы.
![]() |
Рис. 2. Последовательность пилообразных импульсов
Программа генерации последовательности может быть записана так:
| ORG 2000 H | ;определение начального адреса ОЗУ | ||
| SJMP | NATH | ||
| ORG 2030 H | ;определение начального адреса программы ;в ОЗУ | ||
| NATH: | MOV | R 1, #80 H | ;загрузка длительности "низкого" уровня ;сигнала (t П) |
| MOV | R 2, #1 H | ;загрузка скорости роста "пилы" по амплитуде (D U) | |
| MOV | R 3, #80 H | ;загрузка максимального уровня "пилы" (UMAX) | |
| MOV | P 1, #20 H | ;загрузка "низкого" уровня "пилы" (UMIN) | |
| LOOP: | DJNZ | R 1, LOOP | ;отсчет длительности "низкого" уровня |
| ROST: | MOV | A, P 1 | ;формирование роста "пилы" с учетом |
| ADD | A, R 2 | ;скорости роста | |
| MOV | P 1, A | ||
| MOV | A, R 3 | ||
| SUBB | A, P 1 | ;если "пила" не достигла максимума, то снова | |
| JZ | NATH | ;увеличение "пилы", | |
| SJMP | ROST | ;иначе переход на начало программы | |
| END | ;конец программы |
Работа первых восьми строк этой программы аналогична работе предыдущей программы с идентичными операторами. Далее по метке " ROST " производится формирование линейного нарастания сигнала. Оператором " MOV A, P 1" производится загрузка аккумулятора последним значением числа, выведенным в порт P 1. Это число суммируется с заданной ступенькой роста "пилы" в регистре R 2 (" ADD A, R 2"). Далее полученное число из аккумулятора загружается в порт P 1 (" MOV P 1, A "), а в аккумулятор загружается заданный максимальный уровень "пилы" из регистра R 3 (" MOV A, R 3"). Затем производится вычитание из содержимого аккумулятора последнего числа, выведенного в порт P 1 (" SUBB A, P 1"), и, если аккумулятор не равен нулю, снова осуществляется переход по метке " ROST " для дальнейшего приращения "пилы" (" SJMP ROST "). В противном случае (если содержимое аккумулятора равно нулю) считается, что сигнал достиг своего максимального значения, и происходит переход в начало программы по метке " NATH " (" JZ NATH ") для циклического запуска генерируемого сигнала.
В этой программе нет согласования заданных значений максимальной амплитуды сигнала UMAX и длительности "низкого" уровня с используемым значением скорости роста "пилы" D U. Фактически, скорость роста равна минимальному числу 1H. Более правильно вычислять скорость роста как отношение (UMAX-UMIN)/ t Н. В этом случае сохраняются пропорции для заданных значений параметров, а точность достижения UMAX определяется погрешностью округления результата деления и минимально различимым разрядом числа.
В двух предыдущих примерах были рассмотрены случаи формирования плоской вершины импульса и линейно нарастающего фронта. В следующем примере будет рассмотрен случай формирования линейно спадающего заднего фронта. Таким образом, будут рассмотрены практически все случаи формирования составляющих сложных сигналов, предложенных к решению в вариантах контрольной работы.
Пример 3. Требуется составить программу, позволяющую воспроизводить на выходе программно-управляемого генератора сигнал, представленный на рис.3.
![]() |
Рис. 3. Последовательность пилообразных импульсов
Ниже приведен текст программы, реализующей поставленную задачу.
| ORG 2000 H | ;определение начального адреса ОЗУ | ||
| SJMP | NATH | ||
| ORG 2030 H | ;определение начального адреса программы ;в ОЗУ | ||
| NATH: | MOV | P 1, #10 H | ;загрузка в P 1 начального уровня сигнала (UMIN) |
| MOV | R 1, #10 H | ;загрузка в R 1 низкого уровня сигнала (UMIN) | |
| MOV | R 2, #60 H | ;загрузка длительности низкого уровня сигнала (t П) | |
| MOV | R 3, #5 H | ;загрузка дискретности спада сигнала по ;времени (D t С) | |
| LOOP 1: | DJNZ | R 2, LOOP 1 | ;отсчет длительности низкого уровня сигнала |
| MOV | P 1, #60 H | ;загрузка максимального уровня сигнала (UMAX) | |
| SPAD: | DEC | P 1 | ;формирование спада сигнала |
| MOV | A, P 1 | ;если сигнал достиг низкого уровня, то переход | |
| SUBB | A, R 1 | ;на начало для организации | |
| JZ | NATH | ;последовательности импульсов | |
| LOOP2: | DJNZ | R 3, LOOP2 | |
| SJMP | SPAD | ||
| END | ;конец программы |
Работа этой программы аналогична программе в предыдущем примере. Отличие состоит в том, что в этом примере уменьшение амплитуды на единицу происходит за фиксированный интервал, определяемый временной задержкой D t С. В предыдущем случае фиксированное изменение амплитуды происходило за один такт приращения времени. Указанные в предыдущем примере недостатки присутствуют и этом.
Рассмотренные примеры отражают лишь достаточно простые частные случаи построения программ генерации сигналов. Более полно вопросы формирования функций времени, временных задержек, вопросы масштабирования и работы с портами ввода-вывода при использовании БИС 1816ВЕ51 рассмотрены в специальной литературе [6, 9]. При программировании микроконтроллеров обязательно необходимо использовать только те системы команд, которые соответствуют применяемым в реальных устройствах БИС.


