Описание структурной схемы устройства
В предыдущем разделе уже оговаривались блоки необходимые для реализации проектируемого устройства. На основании анализа технического задания можно изобразить структурную схему устройства (рисунок 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 Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|