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

2.Постановка задачи

2.1.Техническое задание

Работа микроЭВМ по выполнению программы охранной сигнализации начинается и восстанавливается с помощью переключателя.Визуальный сигнал включается при несанкционированном открытии двери или окна, либо в случае возбуждения детектора движения на время не меньше 5 секунд.Звуковой сигнал включается через 60 секунд после включения визуального сигнала, если за этот промежуток времени система не была восстановлена с помощью переключателя. Программа работы микроЭВМ хранится в ПЗУ, реализуемом на микросхемах PIC16F84.

В итого получаем общее число задействованных линий ввода/вывода равное 5. Так как общее число линий в/в выбранной ОМЭВМ равно 15, то ресурсов в/в ЭВМ достаточно и не требует их увеличения.

2 .2.Функциональная схема

Рис1. Функциональная схема.

Схема построена на микроконтроллере PIC16F84. Питание осуществляется от источника напряжения +5 вольт.

Данные о состоянии системы дают ключи S1÷S3. В нормальном состоянии они разомкнуты (логическая единица на входах порта устанавливается через внутренние подтягивающие резисторы). При наступлении какого-либо события, замыкается соответствующий ключ (логический ноль), на что и реагирует микропроцессор.

Индикация срабатывания производится светодиодами, подключенными непосредственно к разрядам RA2 и RA3 порта A. Допустимая нагрузка по току у PIC16F84 через одну ножку порта 25mA. Сирена подключается к питанию +12.Общий сброс системы и приведение в исходное состояние производится ключом S4.

2 .3.Описание работы системы

Исходя из задания, логика работы охранной сигнализации построена следующим образом:

  • После включения питания производятся необходимые установки системных регистров и памяти данных, опрашивается состояние сигнальных ключей. При незамкнутом состоянии ключей процессор переходит в режим пониженного энергопотребления Sleep.

  • Выход их режима Sleep происходит при изменении состояния входов порта B RB4÷RB7. В проекте используются три старших разряда порта B.

  • При срабатывании любого из ключей S1÷S3 PIC16F84 выходит из режима Sleep, определяет, какой ключ сработал, в течение 5 секунд опрашивает состояние сработавшего ключа. Если оно не изменилось по окончании этого периода времени, включает соответствующий светодиод. Далее ожидает еще 60 секунд и включает сирену.

  • В исходное состояние устройство приводится при включении питания или нажатии ключа S4 «Сброс».

3 .Разработка программы работы омэвм

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

НАЧАЛО

Инициализация

T:=60

да

Включение звукового сигнала

КОНЕЦ

3 .2.Программа работы омэвм

2007 3FFB 00001 CONFIG

00000005 00002 Time1 equ D'5' ;Период времени 5 секунд

0000003C 00003 Time2 equ D'60' ;Период времени 60 секунд

0000002D 00004 DividerTMR0 equ D'256'-D'211' ;определитель таймера

00005 include;подключить стандартный файл заголовков

00006

0000000C 00007 countTMR0 ;счетчик прерываний таймера (~1/256Sec)

0000000D 00008 countSec ;шестнадцатиричный счетчик секунд

00009

0000000E 00010 w_temp ;регистр для временного хранения W при прерывании

0000000F 00011 status_temp ;регистр для временного хранения STATUS-регистра

00012

00000010 00013 mode ;флаги режимов

00014

00000011 00015 Keys ;копия порта B при опросе ключей

00016

00000012 00017 temp ;для хранения временных переменных

00018

00019 endc

0000 00020 ORG 0x000 ;с этого адреса процессор начинает выполнение программ

0000 2833 00021 goto main ;переход на начало главной программы

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

0004 00024 ORG 0x004 ;на этот адрес передается управление при прерываниях

0004 008E 00026 movwf w_temp ;сохранить регистр аккумулятор W

0005 0E03 00027 swapf STATUS,W ;регистр статуса переписать в аккумулятор W с обменом

0006 008F 00028 movwf status_temp ;сохранить регистр статуса

00029

0007 190B 00030 btfsc INTCON,T0IF ;прерывание от TMR0?

0008 2014 00031 call INTTMR0 ;да, обработать прерывание от таймера TMR0

00032

0009 180B 00033 btfsc INTCON,RBIF ;прерывание по изменению RB4...RB7?

000A 202E 00034 call INTRB ;да, обработать прерывание от таймера TMR0

00035

000B 30F8 00036 movlw B'11111000' ;сбросить все флаги прерываний

000C 058B 00037 andwf INTCON,F

000D 168B 00038 bsf INTCON,T0IE ;разрешить прерывание по таймеру

000E 158B 00039 bsf INTCON,RBIE ;разрешить прерывание по изменению RB4...RB7

00040

000F 0E0F 00041 swapf status_temp,W ;восстановить значение статуса в W

0010 0083 00042 movwf STATUS ;восстановить статус-регистр

0011 0E8E 00043 swapf w_temp,F ;восстановить регистр W

0012 0E0E 00044 swapf w_temp,W ;без изменения статус-регистра

0013 0009 00045 retfie

Процедура обработки прерывания от таймера TMR0

0014 00046 INTTMR0

0014 302D 00047 movlw DividerTMR0 ;загрузить пределитель

0015 0081 00048 movwf TMR0 ;перезапустить таймер

0016 0A8C 00049 incf countTMR0,F ;увеличить счетчик прерываний

0017 1903 00050 btfsc STATUS,Z ;он обнулился? (прошла 256*3,904mS~1Sec)

0018 0A8D 00051 incf countSec,F ;если да, увеличить счетчик секунд

00052

0019 0806 00053 movf PORTB,W ;загрузить порт B

001A 3AE0 00054 xorlw B'11100000' ;проверить три старших разряда

001B 1903 00055 btfsc STATUS,Z ;если все ключи отпущены,

001C 1410 00056 bsf ModeSleep ;установить режим Sleep

00057

001D 080D 00058 movf countSec,W ;загрузить счетчик секунд

001E 3C05 00059 sublw Time1 ;сравнить с первым периодом времени

001F 1803 00060 btfsc STATUS,C ;если не превысило,

0020 0008 00061 return ;выход

00062

0021 1F86 00063 btfss MOVkey ;сработан ключ "Движение"?

0022 1505 00064 bsf MOVpin ;да - зажечь светодиод "Движение"

00065

0023 1F06 00066 btfss WINkey ;сработан ключ "Окно"?

0024 1585 00067 bsf WINpin ;да - зажечь светодиод "Дверь, окно"

00068

0025 1E86 00069 btfss DOORkey ;сработан ключ "Дверь"?

0026 1585 00070 bsf WINpin ;да - зажечь светодиод "Дверь, окно"

00071

0027 080D 00072 movf countSec,W ;загрузить счетчик секунд

0028 3C3C 00073 sublw Time2 ;сравнить со вторым периодом времени

0029 1803 00074 btfsc STATUS,C ;если не превысило,

002A 0008 00075 return ;выход

00076

002B 1405 00077 bsf SIRENpin ;включить сирену

002C 1410 00078 bsf ModeSleep ;установить режим Sleep

00079

002D 0008 00080 return

Обработка прерывания от изменения RB4...RB7

002E 00081 INTRB

002E 1010 00082 bcf ModeSleep ;сбросить режим спячки

0 02F 0806 00083 movf PORTB,W ;загрузить новое состояние ключей

0030 0091 00084 movwf Keys ;и сохранить их

0031 018D 00085 clrf countSec ;сбросить счетчик секунд

00086

0032 0008 00087 return

НАЧАЛО

0033 00088 main

0033 2038 00089 call Initial ;запустить процедуру инициализации

ГЛАВНЫЙ ЦИКЛ

0034 00090 Mloop

0034 1810 00091 btfsc ModeSleep ;установлен энергосберегающий режим?

0035 0063 00092 sleep ;да - заснуть

0036 0000 00093 nop

00094

0037 2834 00095 goto Mloop

00096

Код инициализации

0038 00097 Initial

Инициализировать порты

0038 0185 00098 clrf PORTA ;установить низкий уровень разрядов порта A

00099 ;(выключить все)

0039 0186 00100 clrf PORTB ;сбросить порт B

00101

003A 1683 00102 BANK1 ;переключиться на банк данных 1

003B 30F0 00103 movlw B'11110000' ;четыре младших разряда порта A

003C 0085 00104 movwf TRISA ;включить на вывод

003D 0186 00105 clrf TRISB ;сбросить порт B

003E 0986 00106 comf TRISB,F ;включить его на ввод

003F 1283 00107 BANK0

00108

0040 0190 00109 clrf mode ;сбросить режимы

00110

Разрешить прерывание по таймеру

0041 1683 00111 BANK1

0042 3003 00112 movlw B'00000011'

0043 0081 00113 movwf OPTION_REG ;установить пределитель =16 и включить

0044 1283 00114 BANK0

0045 018B 00115 clrf INTCON ;сбросить регистр прерываний

0046 168B 00116 bsf INTCON,T0IE ;разрешить прерывания от таймера

0047 158B 00117 bsf INTCON,RBIE ;разрешить прерывание от изменения RB4...RB7

0048 302D 00118 movlw DividerTMR0

0049 0081 00119 movwf TMR0 ;загрузить делитель (пуск таймера)

004A 1410 00120 bsf ModeSleep ;установить энергосберегающий режим

004B 0009 00121 retfie ;выход и разрешение прерываний вообще

00122 END ;директива 'конец программы'

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