Типовые задачи программирования

Типовые задачи программирования

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

Арифметические и логические операции

Система команд содержит следующие арифметические и логические операции:

ADD - сложение двух операндов, один из которых в А, и помещение результата а А,

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

SUBB - вычитание двух чисел с учетом переноса.

ANL - операция "логическое И" операнда в А с маской. Побитная операция. В результате обнуляются те биты числа, в которых в маске был 0. Остальные биты не меняются. Результат - в А.

ORL - операция "логическое ИЛИ" операнда в А с маской. Побитная операция. В результате устанавливаются в 1 те биты числа, в которых в маске была 1. Остальные биты не меняются. Результат - в А.

XRL - операция "ИСКЛЮЧАЮЩЕЕ ИЛИ" операнда в А с маской. Побитная операция. В результате устанавливаются в 1 те биты числа, в которых в маске и в числе были разные биты, и устанавливаются в 0 те биты числа, в которых в маске и в числе были одинаковые биты.

Сложить содержимое ячейки внутренней памяти OPER1 и регистра R0, сумму поместить в ячейку внутренней памяти SUM.

Распределение ресурсов: можно использовать прямую адресацию ячеек в операциях суммирования и пересылки. Для суммирования задействован регистр А.

Name SUM

Beg: mov a,OPER1 ; перекопирование первого операнда в А

add a,R0 ; операция суммирования с R0, результат обратно в А

mov SUM,a ; перекопирование результата в ячейку SUM

END

Сложить содержимое регистра R0 и регистра R1, сумму поместить в ячейку внутренней памяти SUM.

Распределение ресурсов: можно использовать прямую адресацию ячеек в операциях суммирования и пересылки. Для суммирования задействован регистр А.

Name SUM1

Beg: mov a,R0 ; перекопирование первого операнда в А

Add a,R1 ; операция суммирования с R0, результат обратно в А

mov SUM,a ; перекопирование результата в ячейку SUM

END

Перейти к метке DEST, если содержимое ячейки внутренней памяти с адресом OPER1 меньше содержимого ячейки внутренней памяти с адресом OPER2.

Распределение ресурсов: Для использования операций перехода необходимо использовать команду, которая бы формировала соответствующие флажки в результате операции. Наиболее подходящая для этого команда SUBB - вычитания второго операнда из первого, расположенного в А. Если результат отрицательный, то устанавливается флажок переноса С=1, в противном случае он очищается. Кроме того, перед оператором вычитания надо загрузить первый операнд в А. В системе команд существуют 2 операции, проверяющие состояние флажка С: JC ADR и JNC ADR. Первая осуществляет переход, когда С=1, вторая - когда С=0. Так как нам надо проверять условие С=1, то надо использовать первую команду.

NAME SUBTR

Beg: mov a,OPER1 ;пересылка содержимого ячейки памяти в А

subba,OPER2 ;вычитание из А содержимого второй ячейки памяти.

jcDEST ;переход на метку, если С=1

END

Перейти к метке DEST, если содержимое ячейки внутренней памяти с адресом OPER1 больше содержимого ячейки внутренней памяти с адресом OPER2.

Распределение ресурсов: Задача аналогична задаче 2.2.1, за исключением того, что теперь переход осуществляется при С=0, поэтому должна использоваться команда JNC.

NAME SUBTR1

Beg: mov a,OPER1 ;пересылка содержимого ячейки памяти в А

subba,OPER2 ;вычитание из А содержимого второй ячейки памяти.

jnc DEST ;переход на метку, если С=0

END

Перейти к метке DEST, если содержимое регистра R3 меньше содержимого ячейки внутренней памяти с адресом OPER2.

Распределение ресурсов: Задача почти полностью аналогична задаче 2.2.1, за исключением того, что теперь надо загружать первый операнд из регистра.

NAME SUBTR1

Beg: mov a,R3 ;пересылка содержимого ячейки памяти в А

subba,OPER2 ;вычитание из А содержимого второй ячейки памяти.

jnc DEST ;переход на метку, если С=0

END

Пересылки отдельных байтов

Операции подсчета

Работа с элементами таблицы

В табл.2.6 отражены две команды, предназначенные для чтения табличных данных, размещенных в программной памяти.

Таблица 2.6.

Команды для работы с таблицами.

Мнемоника Операция

MOVC A, @A+DPTR Чтение ПК по адресу (A+DPTR)

MOVC A, @A+PC Чтение ПК по адресу (A+PC)

С помощью этих команд, осуществляющих доступ исключительно к памяти программ, возможно только чтение таблиц, но не их изменение, мнемонически эти команды выглядят как MOVC ("move constant"). Если таблица расположена во внешней программной памяти, то чтение байта из нее сопровождается стробом (Program Store Enable).

Первая команда MOVC предназначена для обращения к таблице с максимальным числом входов - до 256 (от 0 до 255). Номер требуемого входа в таблицу загружается в аккумулятор, а регистр DPTR устанавливается на точку начала таблицы. Вторая команда MOVC работает аналогичным образом за исключением того, что в качестве указателя базы используется счетчик команд - РС и обращение к таблице производится из подпрограммы. Вначале номер требуемой точки входа загружается в аккумулятор, затем вызывается подпрограмма:

MOV A, Entry Number

CALL Table

Подпрограмма "Table" будет выглядеть следующим образом:

Table: MOVC A, @A+PC

RET

Таблица должна находится в памяти программ непосредственно за инструкцией RET, причем такая таблица может иметь до 255 точек входа (от 1 до 256). Номер 0 не может быть использован, потому что во время выполнения инструкции MOVC A, @A+PC счетчик команд содержит адрес инструкции RET, и значением точки входа "0" будет сам код этой инструкции.

2.6.1. Загрузить элемент из таблицы во внешней памяти программ - в А. Базовый адрес таблицы (её начало) содержится в ячейках внутренней памяти BАSE, BАSE+1 а номер выбираемого элемента -в А.

Распределение ресурсов: Это классический случай расположения таблицы в памяти команд. Поэтому надо использовать команду MOVC. В приведенной ниже программе в качестве базового используется регистр DPTR.

NAME TABL1

Beg: mov dptr, #BASE ;загрузка базового адреса таблицы в DPTR

movc a, @a+dptr ;пересылка байта из таблицы в А

END

2.6.2. Загрузить элемент в таблицу во внешней памяти данных - из регистра R5. Базовый адрес таблицы (её начало) содержится в ячейках внутренней памяти BАSE, BАSE+1, а номер в ячейке NUMB.

Распределение ресурсов: Этот случай похож на задачу 2.6.1, но направление передачи меняется на обратное. Так как это память данных, то запись в ячейки возможна. Однако проблема состоит в том, чтобы установить в DPTR правильный адрес элемента таблицы. Для определения текущего адреса вставки надо просуммировать содержимое DPTR и номера строки в таблице.

NAME TABL1

Beg: mov dptr, #BASE ;загрузка базового адреса

mov a,NUMB ;загрузка номера строки в таблице

add a, dpl ;сложение базового адреса с номером для получения относительного адреса

mov a,dph ;учет возникновения переноса из мл. байта

addc a, #0 ;сложение возможного переноса со старшим байтом указателя

mov dph,a ;

mov a, r5 ;загрузка в А значения для таблицы

movx @dptr,a ;заполнение ячейки таблицы значением

END

Битовые операции

Микросхемы MCS-51 содержат в своем составе "булевый" процессор, который можно рассматривать как независимый процессор побитовой обработки, имеющий свое побитово-адресуемое ОЗУ, свой ввод-вывод и выполняющий свой набор команд. Внутреннее ОЗУ имеет 128 прямоадресуемых бит, пространство регистров SFR также поддерживает до 128 битовых полей. Побитно-адресуемыми являются все порты ввода-вывода, каждая линия которых может рассматриваться как однобитовый порт.

Набор булевых инструкций перечислен в табл. 2.7.

Каждый из отдельно адресуемых бит может быть установлен в "1", сброшен в "0", инвертирован, передан в разряд "Carry" или принят из него. Между любым прямоадресуемым битом и флагом переноса могут быть произведены логические операции "И" и "ИЛИ". Кроме того, по результату анализа состояния адресуемого бита возможно осуществление короткого (Short) условного перехода в соответствии с байтом смещения (relative).

Таблица 2.7.

Команды побитовой обработки.

Мнемоника Операция

ANL C, bit C=C.AND.bit

ANL C, /bit C=C.AND.(.NOT.bit)

ORL C, bit C=C.OR.bit

ORL C, /bit C=C.OR.(.NOT.bit)

MOV C, bit C=bit

MOV bit, C bit=C

CLR C C=0

CLR bit bit=0

SETB C C=1

SETB bit bit=1

CPL C C=.NOT.C

CPL bit bit=.NOT.bit

JC rel Переход, если C=1

JNC rel Переход, если C=0

JB bit, rel Переход, если bit=1

JNB bit, rel Переход, если bit=0

JBC bit, rel Переход, если bit=1; и обнуление bit

2.8. Работа с операндами увеличенной длины

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

2.8.1.Увеличить содержимое регистров R4, R5 (16-ти разрядное число) на 3 (с проверкой возможного переполнения младшего разряда 16-ти разрядного числа).

Распределение ресурсов: Для операции увеличения 16-разрядного числа на не очень большую цифру можно использовать операцию инкремента регистра DPTR. При этом не надо проверять перенос из младшего байта в старший, так для DPTR он происходит автоматически.

NAME INCR1

Beg: mov dph,r4 ;пересылка содержимого старшего байта числа в старший регистр DPTR

mov dpl,r5 ;пересылка содержимого младшего байта числа в младший регистр DPTR

inc dptr ;увеличение числа на 3

inc dptr ;

inc dptr ;

mov r4,dph ;обратная пересылка полученного числа в R4, R5

mov r5,dpl ;

END

Суммирование массивов

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

2.11.1. Подсчитать сумму чисел в однобайтном массиве во внутренней памяти данных. Массив начинается с ячейки BEG, количество элементов указано в R5, сумма должна быть помещена в пару ячеек с адресами SUM и SUM +1.

Распределение ресурсов: Так как теоретически сумма однобайтовых чисел может превышать 255, то для хранения суммы отводится 2 ячейки.

NAME SUM10

Beg1: mov r0, #BEG ;загрузка адреса начала массива

mov r1, #SUM ;загрузка адреса ячейки суммы

mov @r1, #0 ;обнуление младшего байта суммы

inc r1 ;увеличение адреса на 1 для указания на старший байт суммы

mov @r1, #0 ;обнуление старшего байта суммы

dec r1 ;установка указателя снова на младший байт суммы

m1: mov a, @r1 ;передача младшего байта суммы в А

add a, @r0 ;суммирование числа с младшим байтом суммы

mov @r1, a ;сохранение младшего байта суммы

inc r1 ;установка указателя на старший байт суммы

mov a, @r1 ;передача старшего байта суммы в А

addc a, #0 ;суммирование со старшим байтом суммы возможного переноса

mov @r1, a ;сохранение старшего байта суммы

dec r1 ;установка указателя снова на младший байт суммы

inc r0 ;увеличение указателя на число на 1

djnz r5, m1 ;уменьшение счетчика числа байтов на 1, проверка на 0 и зацикливание, если не 0

END

Найти максимальный элемент в таблице, содержащей байтовые числа. Таблица содержится в памяти программ, начиная с адреса TABL. Количество элементов в ней указано в R6. Максимальный элемент разместить в R7, а адрес этого элемента - в R4, R5.

Распределение ресурсов: Так как числа находятся в памяти программ, то необходимо использовать команду MOVC для пересылки числа в А.

NAME MAXX

Beg: mov dptr, #TABL ;записать в указатель адреса первого числа в ПК

mov a, #0 ;обнуление АСС, чтобы "не мешал" при вычисления адреса

movc a, @a+dptr ;пересылка числа из ПК в АСС

mov r7,a ;запись в регистр первого числа как временно наибольшего

mov r4, dph ;запись в R4 и R5 временно адреса первого числа

mov r5, dpl ;

inc dptr ;установка указателя на второе число

dec r6 ;уменьшение счетчика чисел на 1

m1: mov a, #0 ;начало цикла.обнуление АСС, чтобы "не мешал" при вычисления адреса

movc a, @a+dptr ;пересылка числа из ПК в АСС

subb a, r7 ;выичитание текущего числа из временно максимального

jc m2 ;переход, если есть перенос, т.е. число меньше, чем в R7

mov r7,a ;сохранение числа, как нового максимального

mov r4,dph ;сохранение его адреса в регистрах

mov r5, dpl ;

m2: inc dptr ;увеличение адреса числа на 1

djnz r6, m1 ;проверка на 0 счетчика чисел и зацикливание

END

Найти минимальный элемент в таблице, содержащей байтовые числа. Таблица содержится в памяти данных, начиная с адреса TABL. Количество элементов в ней указано в R6. Минимальный элемент разместить в R6, а адрес этого элемента - в R2, R3.

Распределение ресурсов: Задача почти аналогична задаче 2.12.1.. Только числа находятся в памяти данных, поэтому необходимо использовать команду MOVХ для пересылки числа в А. И необходимо найти минимальный элемент.

NAME MINX

Beg: mov dptr, #TABL ;записать в указатель адреса первого числа в ПК

movx a, @dptr ;пересылка числа из ПД в АСС

mov r6,a ;запись в регистр первого числа как временно наибольшего

mov r2, dph ;запись в R2 и R3 временно адреса первого числа

mov r3, dpl ;

inc dptr ;установка указателя на второе число

dec r5 ;уменьшение счетчика чисел на 1

m1: movx a, @dptr ;пересылка числа из ПД в АСС

subb a, r6 ;вычитание текущего числа из временно максимального

jnc m2 ;переход, если нет переноса, т.е. число больше, чем в R6

mov r6,a ;сохранение числа, как нового максимального

mov r2,dph ;сохранение его адреса в регистрах

mov r3, dpl ;

m2: inc dptr ;увеличение адреса числа на 1

djnz r5, m1 ;проверка на 0 счетчика чисел и зацикливание

END

Типовые задачи программирования

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

Наши рекомендации