logo
МУ ЦТ и МК для стенда 2013

7.2 Исходные данные

Задача.В массив записано потребление энергии по месяцам. Требуется определить суммарный расход энергии за указанный период и средний расход энергии в месяц. Блок-схема алгоритма представлена на рисунке7.1.

Рисунок 7.1 – Блок-схема

Фрагменты программы.

Include<p16f877.inc> EL_MAS_0 EQU h'40'; нулевой элемент массива.

EL_MAS_1 EQU h'41'

EL_MAS_2 EQU h'42'

EL_MAS_3 EQU h'43' ; последний элемент массива.

IND_EL_MAS EQU h'50'; индекс прибавляемого элемента массива.

SHAG EQU h'22'; шаг изменения данных.

KOL_EL EQU h'44'; регистр хранения количества элементов массива.

SUM EQU h'51'; регистр хранения суммы.

SREDNEE EQU h'52'; регистр для хранения среднего расхода энергии.

; Стандартные операции настройки МК опущены.

; Заполнение массива

MOVLW D'2'

MOVWF SHAG

MOVLW D'11'

MOVWF EL_MAS_0

ADDWF SHAG, W; W= EL_MAS_0+SHAG

MOVWF EL_MAS_1

ADDWF SHAG, W; W= EL_MAS_1+SHAG

MOVWF EL_MAS_2

ADDWF SHAG, W; W= EL_MAS_2+SHAG

MOVWF EL_MAS_3

CLRF SUM

CLRF IND_EL_MAS

MOVLW D'4'; количество элементов массива.

MOVWF KOL_EL

MOVLW EL_MAS_0; запись в аккумулятор адреса регистра EL_MAS_0.

MOVWF FSR; запись в регистр FSR адреса первого регистра массива.

NEXT_ELEM

MOVF SUM, W

ADDWF INDF, W; сложить W и текущий элемент массива.

MOVWF SUM; запоминаем полученную сумму.

; Подготовка к следующему циклу

INCF FSR, F; переход к адресу следующего регистра массива.

INCF IND_EL_MAS, F; фиксируем индекс следующего элемента.

MOVF KOL_EL, W

XORWF IND_EL_MAS, W; проверяем индекс элемента равен 4?

BTFSS STATUS, Z; проверка – все элементы суммировали (Z=1)?

GOTO NEXT_ELEM; только если Z =0, повторяем цикл.

; Подготовка вычисления среднего значения

MOVF SUM, W; если Z=1, все элементы сложили, запоминаем сумму.

MOVWF SREDNEE; копируем SUM в SREDNEE.

END

Выполните самостоятельно деление на 4 регистра SREDNEEс помощью его сдвигов вправо для определения среднего значения.

Количество повторений в цикле определяется следующим образом. Сначала записывается количество элементов в регистр Kol_El. Затем при каждом повторе цикла, увеличиваем индекс элемента в регистре и проверяем, получен ли ноль командойXORWFIND_EL_MAS,W, (здесьW=Kol_El). Поскольку регистр с индексом 4 будет лишним, выходим из цикла. Блок-схема программы приведена на рисунке 7.1. В ней предполагается, что в массив занесены данные.