Однокристальные микроконтроллеры семейства MCS-51. Разработка и отладка многомодульных программ. Алгоритм программы работы МК, страница 7

Указание.  При накоплении входных кодов из порта P0 возможно переполнение аккумулятора, поэтому результат суммирования следует хранить в двух смежных ячейках памяти данных. При вычислении среднего значения для деления на 5 используйте подпрограмму D16_8.

; ***************************************************************

; --------------------------------- D16_8 -----------------------------------------------------

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

; формата 16:8=(8,8).

; Входные параметры: (R4,R3) – СтБ, МлБ делимого, (R2) – делитель.

; Выходные параметры: (R3) – частное, (R4)  остаток.

; ***************************************************************

D16_8:

MOV   В, #8

;

; Счетчик циклов

; Сдвиг влево остатка и частного в R4,R3

CYCLE:

MOV   A, R3

ADD   A, R3

MOV   R3, A

MOV   A, R4

ADDC   A, R4

;

; В  (А) – СтБ остатка

JC   PER1

;

; Если переполнение остатка

; Вычитание делителя из остатка

SUBB   A,R2

JNC   PER2

;

; Если разность > 0

; Разность < 0, восстановление остатка

ADD   A, R2

;

MOV   R4, А

JMP   PER3

; Переполнение остатка, разряд частного = 1

PER1:   

CLR   C

SUBB   A, R2

PER2:   

MOV   R4, A

INC   R3

;

;  +1 в частное

PER3:   

DJNZ   В, CYCLE

;

;  Зацикливание

RET

Суммирование и вычисление среднего значения удобно реализовать в обработчике ISR0. Для подсчета количества нажатий кнопки используйте любой регистр. После последнего нажатия кнопки прерывания должны быть запрещены.

Программу назовите INTER1 и занесите в файл inter1.asm. Проверьте правильность работы программы с помощью симулятора/отладчика AVSIM51.

                                        4. Содержание отчета

Наименование и цель работы. Функциональная схема исследуемого микроконтроллера. Блок-схемы алгоритмов и тексты программ IN_OUT1, INTER1 к заданиям для самостоятельной работы. Тексты программ DISPL и CROSSCOD. Файлы in_out1.hex и inter1.hex для демонстрации работы программ.

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

1. Для какой цели используются директивы Ассемблера  PUBLIC  и EXTERN?

2. Как выполняется компоновка многомодульной программы?

3. Как можно определить начальные и конечные адреса модулей в программе?

4. Как можно разрешить и запретить прерывания по INT1?

5. Как можно определить среднее значение результата ввода 10 данных из порта P1?