Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
150114_Cursovaya.docx
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
1 Мб
Скачать
☆

Разработка программного обеспечения

В соответствии с составленной блок-схемой алгоритма работы кодового замка написано программное обеспечение для микроконтроллера MB90F591G. Разработка программного обеспечения производилась в интегрированной среде разработки SOFTUNE WORKBENCH на языке Ассемблер. Отладка исходного кода и проверка значений регистров в заданных точках работы программы, показала работоспособность и устойчивость алгоритма. Исходный код программы был скомпилирован и собран с использованием среды SOFTUNE WORKBENCH. Полученный исполняемый модуль готов к загрузке в микроконтроллер MB90F591G. Ниже приведён исходный код программы:

// main.asm

// software to control electronic lock based on MB90F591G MCU

.PROGRAM Lock

#include C:\SoftUne\Mb90V590.h

.EXPORT _main

// variables

.SECTION DATA_MAIN, DATA, ALIGN=2

KodZ .RES.W 1 // predefined code

KodV .RES.W 1 // user input code

Nr .RES.B 1 // index of current digit (left to right)

Nn .RES.B 1 // number of times the button was pressed

alarmMode .RES.B 1 // alarm mode flag

isAwake .RES.B 1 // is awake flag, active during the code input

counter .RES.B 1

timerCounter .RES.B 1 // timer 0 interrupt counter

out .RES.B 1

// ----------------------------

// Timer 0 interrupt processing

// ----------------------------

.SECTION INTR, CODE, ALIGN=2

intTmr:

INC timerCounter

// if alarmMode active wait until 10s

BBC alarmMode:0, _skipAlarm

// if 10s, turn of the alarm

MOV A, timerCounter

CMP A, #100

BEQ _turnOffAlarm

RETI

_skipAlarm:

// if 6s, go to the next digit

MOV A, timerCounter

CMP A, #60

BEQ _nextDigit

RETI

_turnOffAlarm

CLRB alarmMode:0

// turn off the LED

SETB PDR8:2

// set base interval of timer 1 to 0.5 s

MOVW TMRLR1, #62500

RETI

_nextDigit:

// turn off the LED

CLRB PDR8:1

// start the timer 1

CLRB TMCSR1:2

SETB TMCSR1:0

// wait for 0.5s

WBTS TMCSR1:2

// reset the timer counter

MOV timerCounter, #0

MOV A, Nr

MOV counter, A

MOVW RW0, #10

MOVW A, Nn

// A = Nn * pow(10, Nr)

powerLoop:

CBNE counter, #0, powerContinue

JMP powerBreak

powerContinue:

MULW A, RW0

DEC counter

JMP powerLoop

powerBreak:

// A = KodV + Nn * pow(10, Nr)

ADDW A, KodV

MOVW KodV, A

// if user entered the whole code, check the code

MOV A, #0

CMP A, Nr

BEQ _checkTheCode

DEC Nr

MOV Nn, #0

RETI

_checkTheCode:

// we are not in code input mode

CLRB isAwake:0

// if KodZ == KodV, open the lock

MOV A, KodZ

CMP A, KodV

BEQ _openTheLock

// if KodZ != KodV, turn on the alarm

CALL _turnOnAlarm

RETI

_openTheLock:

// turn on the magnet

SETB PDR8:0

// start the timer 1

CLRB TMCSR1:2

SETB TMCSR1:0

// wait for 0.5s

WBTS TMCSR1:2

// turn off the magnet

CLRB PDR8:0

// turn off the LED

CLRB PDR8:2

RETI

// ----------------------------

// ----------------------------

// button INT0 interrupt processing

// ----------------------------

.SECTION INTR, CODE, ALIGN=2

intINT0:

// if in code input mode jump to code input

BBS isAwake:0, _pressCounter

SETB isAwake:0

MOV Nr, #2

MOV Nn, #0

MOVW KodV, #0

// turn on the LED

SETB PDR8:2

// reset the timer counter

MOV timerCounter, #0

RETI

_pressCounter:

INC Nn

RETI

// button INT0 interrupt vector setup

.SECTION INTVECTMR0, CONST, LOCATE=H'FFFFCC

.DATA.L intINT0

// Timer 0 interrupt vector setup

.SECTION INTVECINT0, CONST, LOCATE=H'FFFFA0

.DATA.L intTmr

// ----------------------------

// ----------------------------

.SECTION CODE_MAIN, CODE, ALIGN=2

// turn on alarm

_turnOnAlarm:

SETB alarmMode:0

// turn on the LED

SETB PDR8:2

// set base interval of timer 1 to 3.52 ms => 440 Hz

MOVW TMRLR1, #284

RET

// init ports and variables

_init:

MOV DDR2, #0 // set port 2 to input

MOV DDR8, #H'FF // set port 8 to output

MOV PDR8, #0

// set Timer 0 interrupt level t0 4

MOV H'0000B6, #4

// set INT0 interrupt level t0 3

MOV H'0000B0, #3

// set max interrupt level to 7 (all interrupts active)

MOV ILM, #7

// enable interrupts

OR CCR, #B'01000000

// set the predfined code

MOVW KodZ, #566

// set the input code to 0

MOVW KodV, #0

MOV Nr, #2

MOV Nn, #0

MOV alarmMode, #0

MOV isAwake, #0

// set base interval of timer 0 to 0.1 s

MOVW TMRLR0, #12500

// turn on the timer 0 and setup it to F = 1/32 * 4 MHz = 125 kHz

MOVW TMCSR0, #H'81A

// set base interval of timer 1 to 0.5 s

MOVW TMRLR1, #62500

// turn on the timer 1 and setup it to F = 1/32 * 4 MHz = 125 kHz

MOVW TMCSR1, #H'80A

// reset the timer counter

MOV timerCounter, #0

RET

_main:

// setup variables and interrupts

CALL _init

_loop:

BBS alarmMode:0, _alarmLoop

JMP _loop

// play alarm tone

_alarmLoop:

MOV A, PDR8

XOR A, #2

MOV PDR8, A

// start the timer 1

CLRB TMCSR1:2

SETB TMCSR1:0

// wait for 3.25 ms

WBTS TMCSR1:2

BBC alarmMode:0, _loop

JMP _alarmLoop

.END

Выводы

Микроконтроллеры семейства F2MC-16LX предоставляют широкие возможности для создания электронных систем безопасности и ограничения доступа в помещение. Универсальные порты ввода/вывода микроконтроллера обеспечивают возможность управления разнообразными периферийными устройствами. Подключение мощной нагрузки осуществляется путём использования электронных ключей на биполярных и полевых транзисторах. Встроенный механизм прерываний микроконтроллера позволяет сохранить ясную и логичную структуру кода программы при реализации интерфейса взаимодействия с пользователем.

Спроектирован кодовый замок, ограничивающий доступ в помещение, на базе микроконтроллера MB90F591G. Управление замком осуществляется с помощью одной кнопки, подключённой к универсальному порту ввода/вывода микроконтроллера. Для информирования пользователя о текущем состоянии замка используется светодиод. Предусмотрена вывод звукового сигала тревоги через низкоомный динамик, управление которым, осуществляется с помощью биполярного транзистора, работающего в режиме электронного ключа.

Разработана принципиальная схема и рассчитаны параметры её элементов. На основе технического задания создан алгоритм работы кодового замка, обеспечивающий ввод трёхзначного кода и проверку его на соответствие заданному коду. На языке программирования FASM907S написана программа, реализующая разработанный алгоритм. В среде SOFTUNE WORKBENCH произведена сбора и компиляция программы, а также тестирование c помощью отладчика среды разработки. Проверка работы программы с использованием имитации запросов прерывания показало работоспособность и устойчивость алгоритма.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]