Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Описание структурной схемы устройства

 

В предыдущем разделе уже оговаривались блоки необходимые для реализации проектируемого устройства. На основании анализа технического задания можно изобразить структурную схему устройства (рисунок 1).

 

Рисунок 1 – Структурная схема устройства

 

На рисунке 1 изображены основные блоки проектируемого устройства. АЦП служат для преобразования входного напряжения в двоичный код (оцифровывает аналоговый сигнал). Так у нас два информативных аналоговых сигнала, следовательно, потребуется два АЦП. Микроконтроллер выполняет обработку, полученных с портов данных и выдает результат на индикаторы.


Разработка программы

Блок схема программы

 

Рисунок 2 – Блок – схема работы программы


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

 

Алгоритмы блоков

Алгоритм реализации формул

 

Рисунок 3 – Блок – схема части алгоритма реализации формул


Рисунок 4 – Блок – схема части алгоритма реализации формул


Рисунок 5 – Блок – схема части алгоритма реализации формул


Рисунок 6 – Блок – схема окончания алгоритма реализации формул

 


Алгоритм преобразования в десятичную форму записи

 

Рисунок 7 – Блок – схема преобразования в десятичную форму записи

 


Алгоритм вывода результата на индикатор

 

Рисунок 8 – Блок – схема части алгоритма вывода результата на индикаторы


Рисунок 9 – Блок – схема части алгоритма вывода результата на индикаторы

 

Листинг программы

 

ORG 00h; Начало программы.

SJMP TIMER; Переход на установку таймера.

ORG 1Bh; Переход на обработку

JMP SELECTOR; прерывания от таймера.

ORG 30h

TIMER: MOV TMOD, #00010000b; 1-ый режим работы таймера (16 разрядов).

MOV TCON, #01000000b; Включение таймера 1.

MOV IE, #10001000b; Разрешение прерывания от таймера.

MOV TH1, #0FFh; Задаются старшие и младшие

MOV TL1, #0FFh; 8 разрядов таймера 1.

MOV R3, #0h; Значение регистра необходимое для

; перехода к метке START.

V1: SJMP V1; Бесконечный цикл.

; Работа с АЦП

START: CLR P1.2; Сигнал подается на первый АЦП -

SETB P1.2; начало преобразования аналогового

NOP; сигнала в цифровой.

CLR P1.2

NOP; Задержка на время преобразования 4,5мкс.

NOP

NOP

NOP

NOP

NOP

CLR P1.3; Сигналы /CS и /RD

CLR P1.4; (разрешения работы и чтения)

SETB P1.4; служат для передачи данных

SETB P1.3; с АЦП на порт 3.

MOV 53h, P3; Данные с порта (скорость) записываются

; в ячейку памяти.

CLR P1.5; Аналогично, сигнал начала преобразования

SETB P1.5; для второго АЦП.

NOP

CLR P1.5

NOP

NOP

NOP

NOP

NOP

NOP

CLR P1.6; Аналогичные сигналы для передачи

CLR P1.7; данных со второго АЦП на 3-ий порт.

SETB P1.7;

SETB P1.6

MOV 52h, P3; Данные с порта в ячейку (расход топлива).

MOV 50h, #10110100b; Коэффициент 180 в формуле (4).

MOV A, 53h; Проверка скорости на равенство нулю и

JZ NULL; переход в метку NULL при его истинности.

MOV A, 52h; Реализация по формуле (4)

MOV B, 50h

SJMP ALGORITM; Переход к реализации формулы.

NULL: MOV 53h, #64h; Реализация по формуле (6) .

MOV A, 52h

MOV B, #0Eh

; Реализация формул (4) и (6)

ALGORITM: MUL AB; Произведение  или .

MOV 50h, A; Младший байт произведения.

MOV 51h, B; Старший байт произведения.

MOV A, B; Деление старшего байта произведения

MOV B, 53h; на значение скорости или на 100.

DIV AB

MOV 54h, A; Целая часть от деления.

MOV 55h, B; Остаток от деления.

MOV A, 53h; Деление делителя (значение скорости

MOV B, #0Ah; или 100) на 10.

DIV AB

MOV 56h, A; Целая часть от деления делителя на 10.

MOV 57h, B; Остаток от деления делителя на 10.

JZ HELP; Если целая часть от деления делителя на 10

; равна нулю, то переход в метку HELP.

MOV A, 57h

MOV B, #4h; Если остаток от деления делителя на 10 равен

SUBB A, B; 4, то переход в метку B5.

JZ B5

MOV A, 57h

MOV B, #6h; Если остаток от деления делителя на 10 равен

SUBB A, B; 6, то переход в метку B5.

JZ B5

MOV A, #4h; Если остаток от деления делителя на 10

CJNE A, 57h, C1; больше 4, то переход в метку B1.

C1: JC B1

JNC B3; Если меньше 4, то в метку B3.

B1: MOV A, #6h; Если остаток от деления делителя на 10

CJNE A, 57h, C; больше 6, то переход в метку B7.

C2: JC B7

JNC B2; Если равен 5, то в метку B2.

B2: MOV A, 56h; Получено, что остаток от деления делителя

MOV B, #2h; на 10 равен 5, тогда целая часть от деления

MUL AB; делителя на 10 умножается на 2.

MOV 52h, A

INC 52h; Увеличение результата на 1. (новый делитель)

MOV A, 55h; Остаток от деления числителя формул

MOV B, 52h; (4) или (6) делится на новый делитель.

DIV AB

MOV 41h, B; Остаток от деления на новый делитель.

MOV B, #2h; Умножение целой части от деления на

MUL AB; новый делитель на 2.

MOV 57h, A; В результате получены десятые доли

; деления старшего байта произведения.

MOV A, 41h; Умножение остатка от деления на новый

MOV B, #2h; делитель на 2.

MUL AB

MOV B, 52h; Результат этого умножения снова делится

DIV AB; на новый делитель и целая часть этого

ADD A, 57h; деления складывается с десятыми долями

MOV 57h, A; деления старшего байта произведения.

MOV 56h, 52h

MOV 42h, B; Остаток последнего деления фиксируется.

SJMP VPERED; Переход к нахождения сотых долей.

B3: MOV A, #1h; Если остаток от деления делителя на 10

CJNE A, 57h, C3; 0 или 1, то переход в метку HELP_1.

C3: JNC HELP_1

JC B4; Если больше 1, то в метку B4.

B4: MOV A, #2h; Если остаток от деления делителя на 10

CJNE A, 57h, C4; равен 2, то переход в метку B5.

C4: JNC B5

JC B6; Если равен 3, то в метку B6.

HELP: JMP D_0; Переход в метку D_0.

B5: MOV A, 56h; Если остаток от деления делителя на 10

MOV B, #5h; равен 2, 4, 6 или 8, тогда целая часть от

MUL AB; деления делителя на 10 умножается на 5.

MOV 52h, A

MOV A, 57h; Остаток от деления делителя на 10

MOV B, #2h; делится на 2 и складывается с предыдущим

DIV AB; результатом. Получен новый делитель.

ADD A, 52h

MOV 52h, A

MOV A, 55h; Остаток от деления числителя формул

MOV B, 52h; (4) или (6) делится на новый делитель.

DIV AB

MOV 41h, B; Остаток от деления на новый делитель.

MOV B, #5h; Умножение целой части от деления на

MUL AB; новый делитель на 5.

MOV 57h, A; В результате получены десятые доли

; деление старшего байта произведения.

MOV A, 41h; Умножение остатка от деления на новый

MOV B, #5h; делитель на 5.

MUL AB

MOV B, 52h; Результат этого умножения снова делится

DIV AB; на новый делитель и целая часть этого

ADD A, 57h; деления складывается с десятыми долями

MOV 57h, A; деления старшего байта произведения.

MOV 56h, 52h

MOV 42h, B; Остаток последнего деления фиксируется.

JMP VPERED; Переход к нахождения сотых долей.

B7: MOV A, #8h; Если остаток от деления делителя на 10

CJNE A, 57h, C5; равен 9, то переход в метку HELP_1.

C5: JC DALEE

JNC B8; Если меньше или равен 8, то в метку B8.

B8: MOV A, #7h; Если остаток от деления делителя на 10

CJNE A, 57h, C6; равен 8, то переход в метку B5.

C6: JC B5

JNC B6; Если равен 7, то переход в метку B6.

HELP_1: SJMP DALEE; Переход в метку DALEE.

B6: MOV A, 56h; Если остаток от деления делителя на 10

MOV B, #3h; равен 3 или 7, тогда целая часть от

MUL AB; деления делителя на 10 умножается на 3.

MOV 52h, A

MOV A, #5h; Полученный результат в случае, если

CJNE A, 57h, RAZD; остаток от деления делителя на 10 равен 7

RAZD: JC DEL1; увеличивается на 2. А если остаток равен

JNC DEL2; 3, то - на 1. Получен новый делитель.

DEL1: INC 52h

INC 52h

SJMP RETURN; Переход в метку RETURN.

DEL2: INC 52h

RETURN: MOV A, 55h; Остаток от деления числителя формул

MOV B, 52h; (4) или (6) делится на новый делитель.

DIV AB

MOV 41h, B; Остаток от деления на новый делитель.

MOV B, #3h; Умножение целой части от деления на

MUL AB; новый делитель на 3.

MOV 57h, A; В результате получены десятые доли

; деление старшего байта произведения.

MOV A, 41h; Умножение остатка от деления на новый

MOV B, #3h; делитель на 3.

MUL AB

MOV B, 52h; Результат этого умножения снова делится

DIV AB; на новый делитель и целая часть этого

ADD A, 57h; деления складывается с десятыми долями

MOV 57h, A; деления старшего байта произведения.

MOV 56h, 52h

MOV 42h, B; Остаток последнего деления фиксируется.

SJMP VPERED; Переход к нахождения сотых долей.

D_0: MOV A, 55h; Если целая часть от деления делителя на

MOV B, #0Ah; 10 равна нулю, то остаток от деления

MUL AB; числителя формул (4) или (6) умножается

MOV B, 53h; на 10 и делится на значение скорости.

DIV AB

MOV 56h, 53h; Делитель не меняется(значение скорости).

MOV 57h, A; В результате получены десятые доли

; деления старшего байта произведения.

MOV 42h, B; Остаток последнего деления фиксируется.

SJMP VPERED; Переход к нахождения сотых долей.

DALEE: MOV A, #5h; Остаток от деления делителя на 10

CJNE A, 57h, RAZD2; равен 0, 1 или 9. В случае если остаток

RAZD2: JC DEL3; равен 9, то целая часть от деления

SJMP RETURN1; увеличивается на 1. В противном случае

DEL3: INC 56h; она не меняется.

RETURN1: MOV A, 55h; Остаток от деления числителя формул

MOV B, 56h; (4) или (6) делится на новый делитель.

DIV AB

MOV 57h, A; В результате получены десятые доли

; деления старшего байта произведения.

MOV 42h, B; Остаток последнего деления фиксируется.

VPERED: MOV A, #0Ah; Для нахождения сотых долей деления

MOV B, 42h; старшего байта произведения, остаток

MUL AB; предыдущего деления умножается на 10.

MOV 42h, A

MOV A, #0h; Если данное произведение выходит за

CJNE A, B, OSH; рамки одного байта, то в целях

OSH: JC OSH1; уменьшения погрешности конечного

MOV 58h, #0h; результата, этот факт учитывается как

SJMP DALSE; 5 сотых долей.

OSH1: MOV 58h, #5h

DALSE: MOV A, 42h; Полученное произведение делится на

MOV B, 56h; делитель.

DIV AB

ADD A, 58h; Учет 5 сотых (если они есть).

MOV 58h, A; В результате получены сотые доли

; деления старшего байта произведения.

MOV A, #0Ah; Для нахождения тысячных долей деления

MUL AB; старшего байта произведения, остаток

MOV 42h, A; от деления снова умножается на 10.

MOV A, #0h

CJNE A, B, OSH2; Аналогичный способ уменьшения

OSH2: JC OSH4; погрешности в результате.

MOV 58h, #0h

SJMP DALSE2

OSH4: MOV 59h, #5h

DALSE2: MOV A, 42h; Полученное произведение делится на

MOV B, 56h; делитель.

DIV AB

ADD A, 59h; Учет 5 тысячных (если они есть).

MOV 59h, A; В результате получены тысячные доли

; деления старшего байта произведения.

MOV A, 54h; Умножение полученного частного от

; деления старшего байта произведения

MOV B, #0FFh; на 256 (т.к. старший байт).

MUL AB; Сначала умножается, целая часть от

ADD A, 54h; деления старшего байта произведения.

JC PER

SJMP NPER

PER: INC B

NPER: MOV 60h, B; Старший байт конечного результата.

MOV 61h, A; Младший байт конечного результата.

MOV A, 57h; Умножаются десятые доли на 25,6 и

MOV B, #19h; результат суммируется с младшим байтом

MUL AB; конечного результата.

ADD A, 61h

MOV 61h, A

MOV A, 57h

MOV B, #6h

MUL AB

MOV B, #0Ah

DIV AB

ADD A, 61h

MOV 61h, A

MOV A, #4h; Округление результата. Если остаток

CJNE A, B, OKR1; больше 4, то значение увеличивается на 1.

OKR1: JC OKR2

SJMP DALEE1

OKR2: INC 61h

DALEE1: MOV A, 58h; Умножаются сотые доли на 2,6 и

MOV B, #2h; результат суммируется с младшим

MUL AB; байтом конечного результата.

ADD A, 61h

MOV 61h, A

MOV A, 58h

MOV B, #6h

MUL AB

MOV B, #0Ah

DIV AB

ADD A, 61h

MOV 61h, A

MOV A, #4h; Округление результата.

CJNE A, B, OKR3

OKR3: JC OKR4

SJMP DALEE2

OKR4: INC 61h

DALEE2: MOV A, 59h; Умножаются тысячные доли на 0,2 и

MOV B, #3h; результат суммируется с младшим

MUL AB; байтом конечного результата.

MOV B, #0Ah

DIV AB

ADD A, 61h

JC PER1

SJMP NPER1

PER1: INC 60h

NPER1: MOV 61h, A

MOV A, #4h; Округление результата.

CJNE A, B, OKR5

OKR5 JC OKR6

SJMP DALE

OKR6: INC 61h

DALE: MOV A, 50h; Деление младшего байта произведения

MOV B, 53h; на значение скорости или на 100.

DIV AB

ADD A, 61h; Результат суммируется с младшим

; байтом конечного результата.

JC PER2

SJMP NPER2

PER2: INC 60h

NPER2: MOV 61h, A; Для уменьшения погрешности

MOV A, B; конечного результата остаток от

MOV B, #2h; деления младшего байта участвует

MUL AB; в округлении.

MOV B, 53h

DIV AB

MOV B, A

MOV A, #0h

CJNE A, B, OK

OK: JC OK1

SJMP DALEE3

OK1: INC 61h

; Преобразование в десятичную форму записи

DALEE3: MOV A, 61h; Разбиваем наше 16-разрядное значение

CLR ACC.7; на 3 4-разрядных.

CLR ACC.6

CLR ACC.5

CLR ACC.4

MOV 42h, A; Младшее 4-разрядное значение.

MOV A, 61h

CLR ACC.3

CLR ACC.2

CLR ACC.1

CLR ACC.0

SWAP A

MOV 41h, A; Среднее 4-разрядное значение.

MOV 40h, 60h; Старшее 4-разрядное значение.

MOV A, 41h; Среднее 4-разрядное значение

MOV B, #06h; умножается на 6.

MUL AB

MOV B, #0Ah; Затем делится на 10. Целая часть - число

DIV AB; десятков, остаток - число единиц.

MOV 45h, A; Число десятков.

MOV 46h, B; Число единиц.

MOV A, 40h; Старшее 4-разрядное значение

MOV B, #06h; умножается на 6.

MUL AB

ADD A, 46h; Результат складывается с числом единиц.

ADD A, 42h

MOV B, #0Ah; Потом делится на 10.

DIV AB

ADD A, 45h; Целая часть от деления складывается с

MOV 45h, A; числом десятков.

MOV 46h, B; Остаток - окончательное число единиц.

MOV A, 40h; Старшее 4-разрядное значение

MOV B, #5h; умножается на 5.

MUL AB

ADD A, 41h; Результат складывается с числом десятков

ADD A, 45h

MOV B, #0Ah; Потом делится на 10.

DIV AB

MOV 44h, A; Число сотен.

MOV 45h, B; Окончательное число десятков.

MOV A, 40h; Старшее 4-разрядное значение

MOV B, #2h; умножается на 2.

MUL AB

ADD A, 44h; Результат складывается с числом сотен

MOV 44h, A; Окончательное число сотен.

; Вывод результата на трехразрядный семисегментный индикатор

MOV 60h, #11000000b; Цифра 0.

MOV 61h, #11111001b; Цифра 1.

MOV 62h, #10100100b; Цифра 2.

MOV 63h, #10110000b; Цифра 3.

MOV 64h, #10011001b; Цифра 4.

MOV 65h, #10010010b; Цифра 5.

MOV 66h, #10000010b; Цифра 6.

MOV 67h, #11111000b; Цифра 7.

MOV 68h, #10000000b; Цифра 8.

MOV 69h, #10010000b; Цифра 9.

; Определение выводимых на индикатор цифр (т.е. двоичных комбинаций)

MOV R0, #60h; Номер ячейки памяти с цифрой 0.

MOV A, 44h; Число сотен записывается в аккумулятор

OPRED: MOV 5Ah, @R0; Текущая цифра.

JZ OPRED1; Если аккумулятор равен 0, то переход на

; следующий этап с сохранением текущей

; цифры, показывающей число сотен.

DEC A; Уменьшение числа сотен на 1.

INC R0; Изменение текущей цифры (следующая).

SJMP OPRED; Переход в начало (метку OPRED).

OPRED1: MOV R0, #60h; Номер ячейки памяти с цифрой 0.

MOV A, 45h; Число десятков пишется в аккумулятор

OPR: MOV 5Bh, @R0; Текущая цифра.

JZ OPRED2; Если аккумулятор равен 0, то переход на

; следующий этап с сохранением текущей

; цифры, показывающей число десятков.

DEC A; Уменьшение числа десятков на 1.

INC R0; Изменение текущей цифры (следующая).

SJMP OPR; Переход в начало (метку OPR).

OPRED2: MOV R0, #60h; Номер ячейки памяти с цифрой 0.

MOV A, 46h; Число единиц пишется в аккумулятор.

OPR1: MOV 5Ch, @R0; Текущая цифра.

JZ INDIC; Если аккумулятор равен 0, то переход на

; следующий этап с сохранением текущей

; цифры, показывающей число единиц.

DEC A; Уменьшение числа единиц на 1.

INC R0; Изменение текущей цифры (следующая).

SJMP OPR1; Переход в начало (метку OPR1).

; Вывод цифр на индикатор

INDIC: MOV R0, #5Ah; Номер ячейки памяти с нужной цифрой.

MOV R1, #0h; Значение регистра 1 необходимое для

; перехода к нужной метке c выводом.

MOV R2, #32h; Число повторений вывода на индикаторы

; равно 50 (около 120Гц).

MOV R3, #1h; Значение регистра необходимое для

; перехода к метке START.

; Обработчик прерываний

SELECTOR: MOV A, R3; Если R3 равен 0, то переход к метке

JZ ST; ST.

MOV B, R1; Если R1 равен 0, то переход к выводу

MOV A, B; третьего разряда (числа сотен).

JZ VUVOD_1

DEC B; Если R1 равен 1, то переход к выводу

MOV A, B; второго разряда (числа десятков).

JZ VUVOD_2

DEC B; Если R1 равен 2, то переход к выводу

MOV A, B; первого разряда (числа единиц).

JZ VUVOD_3

DEC B; Если R1 равен 3, то переход к метке

MOV A, B; BIG_ZADERG.

JZ BIG_ZADERG

ST: JMP START; Переход к метке START.

VUVOD_1: MOV P2, @R0; Передача цифры на порт 2 (число сотен).

SETB P0.4; Разрешение работы дешифратора.

CLR P0.2; Вывод на первый индикатор.

CLR P0.5

SETB P0.3; Строб записи в регистр.

CLR P0.3

INC R0; Переход к следующей нужной цифре.

INC R1; Увеличение регистра перехода к

; следующей метке вывода.

MOV TH1, #0F8h; Задается значение таймера для задержки

MOV TL1, #02Fh; на 2мс.

RETI; Возврат из прерывания.

VUVOD_2: MOV P2, @R0; Вывод на второй индикатор числа

SETB P0.4; десятков.

SETB P0.2

CLR P0.5

SETB P0.3; Строб записи

CLR P0.3

INC R0; Переход к следующей нужной цифре.

INC R1; Увеличение регистра перехода к

; следующей метке вывода.

MOV TH1, #0F8h; Задается значение таймера для задержки

MOV TL1, #02Fh; на 2мс.

RETI; Возврат из прерывания.

VUVOD_3: MOV P2, @R0; Вывод на третий индикатор числа

SETB P0.4; единиц.

CLR P0.2

SETB P0.5

SETB P0.3; Строб записи.

CLR P0.3

INC R0

INC R1; Увеличение регистра перехода к

; следующей метке вывода.

MOV TH1, #0F8h; Задается значение таймера для задержки

MOV TL1, #02Fh; на 2мс.

RETI; Возврат из прерывания.

BIG_ZADERG: DEC R2; Уменьшение числа повторений вывода

; на индикаторы на 1.

MOV A, #0h; Проверка числа повторений на

MOV B, R2; равенство 0.

CJNE A, B, D1

D1: MOV R0, #5Ah; Возврат регистра 0 к первоначальному

; значению 5А.

MOV R1, #0h; Возврат регистра 1 к первоначальному

; значению 0.

JC D2; Если число повторений не равно 0, то

JNC D3; вывод на индикатор повторяется.

; В противном случае переход в

D2: MOV TH1, #0FFh; бесконечный цикл и ожидание

MOV TL1, #0FFh; прерывания (все повторяется заново).

RETI; Возврат из прерывания.

D3: MOV R3, #0h

MOV TH1, #0FFh

MOV TL1, #0FFh

RETI; Возврат из прерывания.

END


Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...