
- •Технічне завдання
- •Розділ 1. Огляд пристроїв захисту офісу
- •1.1 Аналіз мікропроцесорних охоронних датчиків
- •1.2 Існуючі охоронні датчики
- •1.2.1 Датчики розбиття скла
- •1.2.2 Фотоелектричні датчики
- •Розділ 2. Розробка апаратної частини
- •2.1 Розробка принципової схеми
- •2.2 Вибір типу контролера. Обґрунтування вибору
- •2.3 Наведення технічних характеристик мікроконтролера pic16f628
- •2.4 Підбір елементів схеми
- •2.5 Калькуляція виробу
- •Розділ 3. Розробка програмної частини
- •3.1 Вибір середовища програмування
- •3.2 Вибір мови програмування
- •Висновки
- •Список використаних джерел
- •Додатки Додаток 1. Основні технічні характеристики мікроконтролера pic16f628
- •Додаток 2
- •Додаток 3. Програма для мікроконтролера pic16f628a
Список використаних джерел
1. http://auction.ua/item/1147312. htm
2. http://gsm-c45. narod.ru/PIC16F628A.html
3. http://pro-radio.ru/controllers/3864/
4. http://www.compitech.ru/html. cgi/arhiv/03_04/stat_120. htm
5. http://www.rlocman.ru/shem/search.html? q=PIC16F628A
6. http://www.gsm-storozh.com/1. htm
7. Вовків А. УЗ датчик охоронної сигналізації. - Радіо, 2003 № 5, с.
8. www.itsf.ru/bespr. htm
9. Козаченко В., Хмельовськая Л. Кодовий замок // Радіо. - 1990. - №8
10. Марченко Д.Н. Просте економне охоронне устройство //. - №9.
11. Нечаєв І. ІК-локатор для сліпих. - Радіо, 1989 N10, С.84
12. ("Радіомир" №9/2004, с.38-44.
13. Вілл В. Інфрачервоний сторож. - Радіо, 1996 № 1, с.52-54.
14. Вілл В. Ультразвукий автосторож. - Радіо, 1996 № 4, с.43-49.
15. Виноград Ю. Электронная охрана. - М.: СИМВОЛ-Р|, 1996
16. Радіо, 1998 N7, С.42
17. Магнітометричний пристрій для охоронної сигналізації // Патент РФ № 2075905 від 20.03.96
Додатки Додаток 1. Основні технічні характеристики мікроконтролера pic16f628
Додаток 2
Рис.2.5 Схема розробленого пристрою.
Додаток 3. Програма для мікроконтролера pic16f628a
includep16f628. inc
__config _WDT_ON & _MCLRE_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _LVP_OFF & _BODEN_OFF
; программа для частоты процессора 1 МГц!!!
cblock 0x20
dsdat0
dsdat1
dsdat2
dsdat3
dsdat4
dsdat5
dsdat6
dsdat7
var_01
var_02
var_03
var_04
var_05
var_06
_4del
_ms_del
endc
DQequ4
Bp1equ2
Bp2equ3
; - ------
org 0x00
movlwb'00000111'
movwfCMCON; компараторы не используются
bcfPORTA, 1;!!!!!!!!!!!!!
bcf STATUS, RP1
bsf STATUS, RP0; bank 1
movlwb'11110001'
movwfTRISA
movlwb'00000001'
movwfTRISB
movlwb'01111010'
movwfOPTION_REG
bcfSTATUS, RP0; bank 0
movlwd'50'
movwfvar_01
start_test:
btfscPORTB, 0
gotod_start
movlwd'100'
call _ms_delay
decfszvar_01, f
gotostart_test
call_clean_eeprom; - очистить EEPROM
movlwd'114'
movwfvar_01
movlwd'31'
movwfvar_02
movlwd'2'
movwfvar_03
call_sound
movlwd'67'
call_ms_delay
call_sound
d_start:
; задержка ~72 мс
sleep
; передаём ипульс сброса
bcfPORTA, DQ
bsfSTATUS, RP0; bank 1
bcfTRISA, DQ; DQ - выход
bcfSTATUS, RP0; bank 0
movlwd'124'; задержка 502 мкс
call_4delay
bsfSTATUS, RP0; bank 1
bsfTRISA, DQ; DQ - вход
bcfSTATUS, RP0; bank 0
movlwd'16'; задержка 70 мкс
call _4delay
btfscPORTA, DQ; на DQ низкий уровень?
gotod_start; нет - начать с начала
movlwd'106'; задержка 430 мкс
call_4delay
btfssPORTA, DQ; на DQ высокий уровень?
gotod_start; нет - начать с начала
; передаём команду
movlw0x33; код команды
callsend_byte
movlw dsdat0
movwf FSR
movlwd'8'
movwfvar_03
_next_rc_byte:
callreceive_byte
movwfINDF
incfFSR, f
decfszvar_03, f
goto_next_rc_byte
movfdsdat0, f
btfscSTATUS, Z
goto_error_data
; вычисляем CRC
clrfvar_04
movlwd'7'
movwf var_01
movlw dsdat0
movwf FSR
Next_byte:
movlw 0x08
movwf var_02
movfINDF, w
movwf var_03
DoCRC_Loop:
xorwf var_04, w
movwf var_05
rrf var_05, w
movf var_04, w
btfsc STATUS, C
xorlw b'00011000'
movwf var_05
rrf var_05, w
movwf var_04
bcf STATUS, C
rrf var_03, f
movf var_03, w
decfsz var_02, f
goto DoCRC_Loop
incf FSR, f
decfszvar_01, f
goto Next_byte
; в переменной var_04 - crc первых 7-ми байт
movf var_04, w
xorwf dsdat7, w
btfss STATUS, Z
goto _error_data
clrwdt; сброс watсhdog таймера
callsearch_eeprom
xorlw0x01
btfssSTATUS, Z
gotof_id
ok_idcall_identify_ok
gotod_start
f_idcall_identify_failed
gotod_start
search_eeprom:
; поиск в EEPROM
clrw
bsfSTATUS, RP0; bank 1
movwfEEADR
bsfEECON1, RD
movfEEDATA, w
bcfSTATUS, RP0; bank 0
movwfvar_01; количество ключей
movlw0x01
movwfvar_02; адрес в EEPROM
_next_sr:
movlwd'6'
movwfvar_03; номер проверяемого байта
movlwdsdat1
movwfFSR
_st_cmp:
movfvar_02, w; адрес в W
bsfSTATUS, RP0; bank 1
movwfEEADR; W в регистр адреса
bsfEECON1, RD; начать чтение
movfEEDATA, w; из EEPROM в W
bcfSTATUS, RP0; bank 0
xorwfINDF, w; сравнить прочитанный байт с байтом
btfscSTATUS, Z; равны?
goto_next_cmp; да, сравнить следующий
movfvar_03, w
addwfvar_02, f
decfszvar_01, f; все номера сравнены?
goto_next_sr; нет, сравнить снова
clrw; да, выйти из подпрограммы с W=0
gotoexit_se
_next_cmp:
incfFSR, f; следующий байт
incfvar_02, f; следующий байт EEPROM
decfszvar_03, f; все байты проверены?
goto_st_cmp; нет, проверить следующие
; да - выйти из подпрограммы с W=1
movlw0x01
exit_se:
return
_identify_ok:
; сигнал "пользователь определён"
movlwd'45'; 556 Hz
movwfvar_01
movlwd'37'; 1/15 сек
movwfvar_02
movlwd'2'
movwfvar_03
call_sound
movlwd'40'; 625 Hz
movwfvar_01
movlwd'42'; 1/15 сек
movwfvar_02
call_sound
movlwd'67';
call_ms_delay;
movlwd'30'; 833 Hz
movwfvar_01
movlwd'111'; 1/7 сек
movwfvar_02
call_sound
movlwd'15'
movwfvar_01
movlwd'222'
movwfvar_02
call_sound
btfssPORTB, 0;!!!!!!!
call_write_serial;!!!!!!!
bsfPORTA, 1
movlwd'7'
movwfdsdat0;!!!! используется dsdat0
next_id_sound:
movlwd'14'
movwfvar_01
movlwd'51'
movwfvar_02
movlwd'14'
movwfvar_03
call_sound
movlwd'100'
call_ms_delay
decfszdsdat0, f
gotonext_id_sound
bcfPORTA, 1
return
_identify_failed:
; сигнал "пользователь не определён"
movlwd'45'; 556 Hz
movwfvar_01
movlwd'37'; 1/15 сек
movwfvar_02
movlwd'2'
movwfvar_03
call_sound
movlwd'40'; 625 Hz
movwfvar_01
movlwd'42'; 1/15 сек
movwfvar_02
call_sound
movlwd'67';
call_ms_delay;
movlwd'241'; 104 Hz
movwfvar_01
movlwd'14'; 1/7 сек
movwfvar_02
call_sound
movlwd'67';
call_ms_delay;
call_sound
btfssPORTB, 0
call_write_serial
movlwd'7'
movwfvar_01
movlwd'250'
call_ms_delay
decfszvar_01, f
goto$-3
return
; подпрограмма передачи байта
send_byte:
movwfvar_01
movlwd'8'
movwfvar_02; количество передаваемых бит
next_tr_b:
bcfPORTA, DQ
bsfSTATUS, RP0; bank 1
bcfTRISA, DQ; DQ - выход
bcfSTATUS, RP0; bank 0
nop
nop
rrfvar_01, f
btfscSTATUS, C
goto_set_in
nop
nop
goto_no_set_in
_set_in:
bsf STATUS, RP0; bank 1
bsfTRISA, DQ; DQ - вход
bcfSTATUS, RP0; bank 0
_no_set_in:
movlwd'14'; задержка 62 мкс
call_4delay
bsf STATUS, RP0; bank 1
bsfTRISA, DQ; DQ - вход
bcfSTATUS, RP0; bank 0
nop
nop
nop
nop
decfszvar_02, f
gotonext_tr_b
return
; подпрограмма приёма байта
receive_byte:
movlwd'8'
movwfvar_01
clrfvar_02
next_rc_b:
bcfPORTA, DQ
bsfSTATUS, RP0; bank 1
bcfTRISA, DQ; DQ - выход
bcfSTATUS, RP0; bank 0
nop
nop
nop
nop
nop
nop
bsfSTATUS, RP0; bank 1
bsfTRISA, DQ; DQ - вход
bcfSTATUS, RP0; bank 0
nop
nop
nop
bcf STATUS, C
btfscPORTA, DQ
bsfSTATUS, C
rrfvar_02, f
movlwd'11'; задержка 50 мкс
call_4delay
decfszvar_01, f
gotonext_rc_b
movfvar_02, w
return
; - -----____--------------
_error_data:
movlwd'223'
movwfvar_01
movlwd'9'
movwfvar_02
movlwd'2'
movwfvar_03
call_sound
goto d_start
; подпрограмма задержки ms
_ms_delay:
movwf_ms_del
_1000us:
nop
nop
movlwd'247'
call_4delay
decfsz_ms_del, f
goto_1000us
return
; подпрограмма задержки us
_4delay:
movwf _4del
l4dlclrwdt
decfsz _4del, f
goto l4dl
return
_write_serial:
movlwdsdat1
movwfFSR
bsfSTATUS, RP0; bank 1
clrfEEADR
bsfEECON1, RD
movfEEDATA, w
bcfSTATUS, RP0; bank 0
movwfvar_01
sublwd'20'
btfssSTATUS, C
goto_mem_full
movfvar_01, w
bcfSTATUS, C;
rlfvar_01, f; умножаем var_01 на 6
rlfvar_01, f; - ------ // ---------
addwfvar_01, f; - ----- // ---------
addwfvar_01, f; - ---- // ---------
incfvar_01, w; var_01 +1
bsfSTATUS, RP0; bank 1
bsfEECON1, WREN
movwfEEADR
_next_byte:
movfINDF, w
movwfEEDATA
call_eeprom_write
incfEEADR, f
incfFSR, f
movlwdsdat7
subwfFSR, w
btfssSTATUS, C
goto_next_byte
bcfEECON1, WREN
clrfEEADR
bsfEECON1, RD
movfEEDATA, w
addlw0x01
bsfEECON1, WREN
movwfEEDATA
call_eeprom_write
bcfEECON1, WREN
bcfSTATUS, RP0; bank 0
gotoexit_write_serial
_mem_full:
movlwd'30'
movwfvar_01
movlwd'165'
movwfvar_02
movlwd'2'
movwfvar_03
call_sound
movlwd'67';
call_ms_delay;
movlwd'34'
movwfvar_01
movlwd'105'
movwfvar_02
call_sound
movlwd'67';
call_ms_delay;
movlwd'28'
movwfvar_01
movlwd'178'
movwfvar_02
call_sound
movlwd'67';
call_ms_delay;
movlwd'45'
movwfvar_01
movlwd'79'
movwfvar_02
call_sound
exit_write_serial:
return
_clean_eeprom:
bsfSTATUS, RP0; bank 1
bsf EECON1, WREN; разрешить запись
clrfEEADR
movlw0x00
movwfEEDATA
goto_write_first
_nx_adrmovlw0xFF
movwfEEDATA
_write_first:
call _eeprom_write
incfEEADR, f
movlw0x80
subwfEEADR, w
btfssSTATUS, C
goto_nx_adr
bcfEECON1, WREN; запретить запись
bcfSTATUS, RP0; bank 0
return
_eeprom_write:
; bcf INTCON, GIE; запретить прерывания
clrwdt
movlw 0x55
movwf EECON2
movlw 0xAA
movwf EECON2
bsf EECON1, WR
eewrtsbtfsc EECON1, WR
goto eewrts
return
org 0x2100
DATA 0x00
end
Размещено