Jnz alarm
Опрос датчиков
удара (вибрации):
mov al,Y
and al,01110000B
cmp al,00110000B
Jg alarm
Опрос
датчика объёма и датчика осадков: проверяем
датчик осадков:
mov
al,Z and
al,00000001B jnz
DAT2
1-я зона датчика объема:
mov al,Z
and al,00011100B
cmp al,00010100B
jg ALARM
2-я зона датчика объема:
DAT2:
mov al,Z
and al,11100000B
cmp al,01000000B
jg ALARM
Рисунок 6 – Порядок опроса датчиков
Д ля опроса датчиков накладываем маски на регистры, в которые поступают данные от датчиков, и сравниваем их с необходимым признаком (срабатывание какого-либо датчика или превышение порога чувствительности), в случае совпадения с заданным признаком система переходит в режим тревоги. Причем 1-я зона датчика объема (внешняя) отключается в случае срабатывания датчика осадков.
6. Разработка специального программного обеспечения
.386
.model flat, stdcall
option casemap: none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc ; здесь объявление MessageBox
include \masm32\include\masm32.inc
include \masm32\include\debug.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\debug.lib
includelib \masm32\lib\user32.lib ; здесь API-функция MessageBox
.data
X byte 0 ; 8-пиновый разъём 1
Y byte 0 ; 8-пиновый разъём 2
Z byte 0 ; 8-пиновый разъём 3
R byte 1 ; кнопки брелка (сброс-1,охрана-2)
OutHandle DWORD 0 ; дескриптор стандартного устройства вывода
InHandle DWORD 0 ; дескриптор стандартного устройства ввода
BytesWritten DWORD ? ; число выведенных байтов
BytesRead DWORD ? ; число введённых байтов
InBuffer BYTE ? ; однобайтовый буфер ввода
Mode DWORD ? ; режим работы клавиатуры
M byte ?
L byte "SBROS "
D byte "Protect"
G byte "ALARM "
d wFreq DWORD 100h ;частота звука в герцах (от 25h до 7FFFh )
dwDuration DWORD 3E8h ;продолжительность звука в миллисекундах (1 сек. = 3E8h)
.code
start:
;-------------- Определение дескрипторов ------------
INVOKE GetStdHandle, STD_OUTPUT_HANDLE
mov OutHandle ,eax
INVOKE GetStdHandle, STD_INPUT_HANDLE
mov InHandle,eax
;--Вывод на экран начального состония при запуске ---
BEGIN:
mov eax,000C0027h
INVOKE SetConsoleCursorPosition, OutHandle, eax ; установка курсора
INVOKE WriteConsole, OutHandle, offset L, lengthof L, offset BytesWritten,0
invoke Beep, 900h, 3E8h/6
invoke Beep, 24h, 3E8h/32
invoke Beep, 950h, 3E8h/6
invoke Beep, 24h, 3E8h/32
invoke Beep, 530h, 3E8h/6
invoke Beep, 24h, 3E8h/8
invoke Beep, 100h, 3E8h/6
invoke Beep, 24h, 3E8h/32
invoke Beep, 200h, 3E8h/6
invoke Beep, 24h, 3E8h/32
invoke Beep, 400h, 3E8h/6
invoke Beep, 24h, 3E8h/32
;---------------- Управляющий алгоритм --------------
Opros:
Call ReadSensors
;-------------Вывод на экран слова "Сброс"-----------
;------------Проверка нажата ли клавиша "О"----------
cmp R,1
jne PROTECT
;----------------------------------------------------
mov eax,000C0027h
I NVOKE SetConsoleCursorPosition, OutHandle, eax ; установка курсора
INVOKE WriteConsole, OutHandle, offset L, lengthof L, offset BytesWritten,0
mov X,0
mov Y,0
mov Z,0
invoke Beep, 930h, 3E8h/6
invoke Beep, 24h, 3E8h/16
invoke Beep, 950h, 3E8h/6
jmp Opros
;------------Вывод на экран слова "Protect"----------
PROTECT:
mov eax,000C0027h
INVOKE SetConsoleCursorPosition, OutHandle, eax ; установка курсора
INVOKE WriteConsole, OutHandle, offset D, lengthof D, offset BytesWritten,0
invoke Beep, 130h, 3E8h/6
invoke Beep, 24h, 3E8h/32
invoke Beep, 150h, 3E8h/6
invoke Beep, 24h, 3E8h/32
invoke Beep, 70h, 3E8h/6
;invoke Beep, 24h, 3E8h/8
;invoke Beep, 250h, 3E8h/6
;invoke Beep, 24h, 3E8h/32
;invoke Beep, 300h, 3E8h/6
;invoke Beep, 24h, 3E8h/32
;invoke Beep, 200h, 3E8h/6
;invoke Beep, 24h, 3E8h/32
;------------------- ОПРОС ДАТЧИКОВ------------------
Oprosd:
;проверка датчиков передних дверей, капота и багажника
mov al,X
and al,00111110B
jnz ALARM
; проверка датчика удара P>3
mov al,Y
and al,01110000B
cmp al,00110000B
jg ALARM
; проверяем датчик осадков
mov al,Z
and al,00000001B
jnz DAT2
;проверка датчиков объёма первого уровня P>5
mov al,Z
and al,00011100B
cmp al,00010100B
jg ALARM
;проверка датчиков объёма второго уровня P>2
DAT2:
mov al,Z
and al,11100000B
cmp al,01000000B
jg ALARM
jmp Opros
ALARM:
mov eax,000C0027h
INVOKE SetConsoleCursorPosition, OutHandle, eax ; установка курсора
INVOKE WriteConsole, OutHandle, offset G, lengthof G, offset BytesWritten,0
;------------------------ СИГНАЛ----------------------
mov ecx,0
mov ecx,2h
Met:
invoke Beep, 900h , 3E8h/8
invoke Beep, 910h , 3E8h/16
invoke Beep, 920h , 3E8h/32
invoke Beep, 930h , 3E8h/64
invoke Beep, 940h , 3E8h/128
i nvoke Beep, 950h , 3E8h/264
invoke Beep, 960h , 3E8h/32
invoke Beep, 970h , 3E8h/32
invoke Beep, 980h , 3E8h/32
invoke Beep, 990h , 3E8h/32
invoke Beep, 1000h , 3E8h/32
invoke Beep, 1010h , 3E8h/32
invoke Beep, 1020h , 3E8h/32
invoke Beep, 1030h , 3E8h/32
invoke Beep, 1040h , 3E8h/32
invoke Beep, 1050h , 3E8h/32
invoke Beep, 1060h , 3E8h/32
invoke Beep, 1070h , 3E8h/32
invoke Beep, 1080h , 3E8h/32
invoke Beep, 1090h , 3E8h/32
invoke Beep, 1100h , 3E8h/32
invoke Beep, 900h , 3E8h/8
invoke Beep, 910h , 3E8h/16
invoke Beep, 920h , 3E8h/32
invoke Beep, 930h , 3E8h/64
invoke Beep, 940h , 3E8h/128
invoke Beep, 950h , 3E8h/264
invoke Beep, 960h , 3E8h/32
invoke Beep, 970h , 3E8h/32
invoke Beep, 980h , 3E8h/32
invoke Beep, 990h , 3E8h/32
invoke Beep, 1000h , 3E8h/32
invoke Beep, 1010h , 3E8h/32
invoke Beep, 1020h , 3E8h/32
invoke Beep, 1030h , 3E8h/32
invoke Beep, 1040h , 3E8h/32
invoke Beep, 1050h , 3E8h/32
invoke Beep, 1060h , 3E8h/32
invoke Beep, 1070h , 3E8h/32
invoke Beep, 1080h , 3E8h/32
invoke Beep, 1090h , 3E8h/32
invoke Beep, 1100h , 3E8h/32
invoke Beep, 900h , 3E8h/8
invoke Beep, 910h , 3E8h/16
invoke Beep, 920h , 3E8h/32
invoke Beep, 930h , 3E8h/64
i nvoke Beep, 940h , 3E8h/128
invoke Beep, 950h , 3E8h/264
invoke Beep, 960h , 3E8h/32
invoke Beep, 970h , 3E8h/32
invoke Beep, 980h , 3E8h/32
invoke Beep, 990h , 3E8h/32
invoke Beep, 1000h , 3E8h/32
invoke Beep, 1010h , 3E8h/32
invoke Beep, 1020h , 3E8h/32
invoke Beep, 1030h , 3E8h/32
invoke Beep, 1040h , 3E8h/32
invoke Beep, 1050h , 3E8h/32
invoke Beep, 1060h , 3E8h/32
invoke Beep, 1070h , 3E8h/32
invoke Beep, 1080h , 3E8h/32
invoke Beep, 1090h , 3E8h/32
invoke Beep, 1100h , 3E8h/32
invoke Beep, 900h , 3E8h/8
invoke Beep, 910h , 3E8h/16
invoke Beep, 920h , 3E8h/32
invoke Beep, 930h , 3E8h/64
invoke Beep, 940h , 3E8h/128
invoke Beep, 950h , 3E8h/264
invoke Beep, 960h , 3E8h/32
invoke Beep, 970h , 3E8h/32
invoke Beep, 980h , 3E8h/32
invoke Beep, 990h , 3E8h/32
invoke Beep, 1000h , 3E8h/32
invoke Beep, 1010h , 3E8h/32
invoke Beep, 1020h , 3E8h/32
invoke Beep, 1030h , 3E8h/32
invoke Beep, 1040h , 3E8h/32
invoke Beep, 1050h , 3E8h/32
invoke Beep, 1060h , 3E8h/32
invoke Beep, 1070h , 3E8h/32
invoke Beep, 1080h , 3E8h/32
invoke Beep, 1090h , 3E8h/32
invoke Beep, 1100h , 3E8h/32
invoke Beep, 900h , 3E8h/8
invoke Beep, 910h , 3E8h/16
invoke Beep, 920h , 3E8h/32
i nvoke Beep, 930h , 3E8h/64
invoke Beep, 940h , 3E8h/128
invoke Beep, 950h , 3E8h/264
invoke Beep, 960h , 3E8h/32
invoke Beep, 970h , 3E8h/32
invoke Beep, 980h , 3E8h/32
invoke Beep, 990h , 3E8h/32
invoke Beep, 1000h , 3E8h/32
invoke Beep, 1010h , 3E8h/32
invoke Beep, 1020h , 3E8h/32
invoke Beep, 1030h , 3E8h/32
invoke Beep, 1040h , 3E8h/32
invoke Beep, 1050h , 3E8h/32
invoke Beep, 1060h , 3E8h/32
invoke Beep, 1070h , 3E8h/32
invoke Beep, 1080h , 3E8h/32
invoke Beep, 1090h , 3E8h/32
invoke Beep, 1100h , 3E8h/32
mov R,0
jmp Opros
;------------- Ввод одного символа без эха ----------
InputChar:
INVOKE GetConsoleMode, InHandle, offset Mode ; сохранение флагов
INVOKE SetConsoleMode, InHandle, 0 ; отмена режима эхо-вывода
INVOKE ReadConsole, InHandle, offset InBuffer , 1, offset BytesRead, 0
INVOKE SetConsoleMode, InHandle, Mode ; восстановление режима
ret
;------------------- Эмулятор датчиков --------------
ReadSensors:
Call InputChar
;--------- Контактные датчики ---------
cmp InBuffer,'A'
jnz X1
o r X,00000001b
ret
X1: cmp InBuffer,'S'
jnz X2
or X,00000010b
ret
X2: cmp InBuffer,'D'
jnz X3
or X,00000100b
ret
X3: cmp InBuffer,'F'
jnz X4
or X,00001000b
ret
X4: cmp InBuffer,'G'
jnz X5
or X,00010000b
ret
X5: cmp InBuffer,'H'
jnz X6
or X,00100000b
ret
;--------- Датчики битого стекла ---------
X6: cmp InBuffer,'Z'
jnz X7
or X,01000000b
ret
X7: cmp InBuffer,'X'
jnz Y0
or X,10000000b
ret
Y0: cmp InBuffer,'C'
jnz Y1
or Y,00000001b
ret
Y1: cmp InBuffer,'V'
jnz Y2
or Y,00000010b
ret
Y2: cmp InBuffer,'B'
jnz Y3
or Y,00000100b
ret
Y 3: cmp InBuffer,'N'
jnz Y4
or Y,00001000b
ret
;--------- Датчик удара ---------
Y4: cmp InBuffer,'Q'
jnz Y5
and Y,10001111b ; Удар = 0
ret
Y5: cmp InBuffer,'W'
jnz Y6
and Y,10001111b
or Y,00010000b ; Удар = 1
ret
Y6: cmp InBuffer,'E'
jnz Y7
and Y,10001111b
or Y,00100000b ; Удар = 2
ret
Y7: cmp InBuffer,'R'
jnz Y8
and Y,10001111b
or Y,00110000b ; Удар = 3
ret
Y8: cmp InBuffer,'T'
jnz Y9
and Y,10001111b
or Y,01000000b ; Удар = 4
ret
Y9: cmp InBuffer,'Y'
jnz Y10
and Y,10001111b
or Y,01010000b ; Удар = 5
ret
Y10: cmp InBuffer,'U'
jnz Y11
and Y,10001111b
or Y,01100000b ; Удар = 6
ret
Y11: cmp InBuffer,'I'
jnz Y12
or Y,01110000b ; Удар = 7
ret
; --------- Датчик обрыва питания ---------
Y12: cmp InBuffer,'J'
jnz Z0
or Y,10000000b
ret
;--------- Датчик осадков ---------
Z0: cmp InBuffer,'K'
jnz Z1
or Z,00000001b
ret
;--------- Датчик движения ---------
Z1: cmp InBuffer,'L'
jnz Z2
or Z,00000010b
ret
;--------- Внешняя зона датчика объёма ---------
Z2: cmp InBuffer,'q'
jnz Z3
and Z,11100011b ; Уровень = 0
ret
Z3: cmp InBuffer,'w'
jnz Z4
and Z,11100011b
or Z,00000100b ; Уровень = 1
ret
Z4: cmp InBuffer,'e'
jnz Z5
and Z,11100011b
or Z,00001000b ; Уровень = 2
ret
Z5: cmp InBuffer,'r'
jnz Z6
and Z,11100011b
or Z,00001100b ; Уровень = 3
ret
Z6: cmp InBuffer,'t'
jnz Z7
and Z,11100011b
or Z,00010000b ; Уровень = 4
ret
Z7: cmp InBuffer,'y'
jnz Z8
and Z,11100011b
o r Z,00010100b ; Уровень = 5
ret
Z8: cmp InBuffer,'u'
jnz Z9
and Z,11100011b
or Z,00011000b ; Уровень = 6
ret
Z9: cmp InBuffer,'i'
jnz Z10
or Z,00011100b ; Уровень = 7
ret
;--------- Внутренняя зона датчика объёма ---------
Z10: cmp InBuffer,'1'
jnz Z11
and Z,00011111b ; Уровень = 0
ret
Z11: cmp InBuffer,'2'
jnz Z12
and Z,00011111b
or Z,00100000b ; Уровень = 1
ret
Z12: cmp InBuffer,'3'
jnz Z13
and Z,00011111b
or Z,01000000b ; Уровень = 2
ret
Z13: cmp InBuffer,'4'
jnz Z14
and Z,00011111b
or Z,01100000b ; Уровень = 3
ret
Z14: cmp InBuffer,'5'
jnz Z15
and Z,00011111b
or Z,10000000b ; Уровень = 4
ret
Z15: cmp InBuffer,'6'
jnz Z16
and Z,00011111b
or Z,10100000b ; Уровень = 5
ret
Z16: cmp InBuffer,'7'
jnz Z17
a nd Z,00011111b
or Z,11000000b ; Уровень = 6
ret
Z17: cmp InBuffer,'8'
jnz R1
or Z,11100000b ; Уровень = 7
ret
;--------- Кнопки брелка ---------
R1: cmp InBuffer,'O'
jnz R2
mov R,1 ; Откл.
ret
R2: cmp InBuffer,'P'
jnz EndSensors
mov R,2 ; Охрана.
EndSensors:
ret
end start