- •1. Спеціальна частина 6
- •2. Конструкторсько-технологічна частина 60
- •3. Охорона праці 78
- •4. Техніко-економічна частина 84
- •1. Спеціальна частина
- •1.1. Огляд літератури та постановка завдання по заданому напрямку проектування
- •1.2. Розробка та обґрунтування алгоритму функціонування та структурної схеми пристрою
- •1.3. Розробка схеми електричної функціональної охоронного пристрою
- •1.4.1. Вибір елементної бази
- •1.4. Розробка та розрахунок схеми електричної принципової охоронного пристрою по блокам
- •1.4.2. Вхідний блок
- •1.4.3. Блок індикації активності датчиків
- •1.4.4. Блок пасивного режиму охорони
- •1.4.5. Блок активного режиму охорони
- •1.4.6. Блок узгодження модулів кодового доступу
- •1.4.7. Модуль кодового доступу
- •1.4.9. Блок пожежної охорони
- •1.4.10. Блок живлення охоронного пристрою
- •2. Конструкторсько-технологічна частина
- •2.1. Розробка конструкції блока пристрою
- •2.2. Розрахунок надійності проектованого пристрою
- •3. Охорона праці
- •3.1. Заходи по забезпеченню охорони праці при виготовленні охоронного пристрою
- •3.2. Заходи по забезпеченню охорони праці при експлуатації охоронного пристрою
- •4. Техніко-економічна частина
- •4.1. Керування та організація промислового підприємства
- •4.2. Розрахунок економічного ефекту проектованого пристрою
- •Висновки
- •Список використаних джерел
- •Додатки
- •Лістинг програми мікроконтролера pic16f84-041/p
- •Перелік елементів
Додатки
Додаток А
Лістинг програми мікроконтролера pic16f84-041/p
;****************************************************************** ;********* ОПРЕДЕЛЕНИЕ ПЕРЕМЕННЫХ ***************************
w_temp EQU 0x0C ; variable used for context saving
status_temp EQU 0x0D ; variable used for context saving
cblock 0x0E
cnt0, cnt1, cnt2 ; счетчики для программируемой задержки
key_tmp,scan ; для хранения кода нажатой клавиши
cnt_body0,cnt_body1 ; счетчики числа проходов
cnt_adc ; счетчик измерения АЦП
flags ; внутренние флаги (см ниже)
cod0,cod1,cod2,cod3 ; вводимый код
tmp_snd,tmp_snd1 ; хранение признака тона
cnt10 ; при вводе кода с клавиатуры
endc
razr equ 0 ; флаг разряда батареи (1-разряжена) flags
sost equ 1 ; состояние замка (1-закрыт)
; ******************************************************************
;*********** РАСПРЕДЕЛЕНИЕ ПАМЯТИ ЕЕ *************************
addr_cod equ 0 ; начало кода открывания
addr_razr equ 0x10 ; граница напряжения разряда
; ******************************************************************
;*********** РАСПРЕДЕЛЕНИЕ ПОРТОВ ****************************
psnd equ PORTA ; выход звукового сигнала
snd equ 4
prele equ PORTA ; управления реле
rele0 equ 0
rele1 equ 1
padc equ PORTA ; псевдоАЦП
adc equ 2
tris_adc equ TRISA
pkey equ PORTB ; порт клавиатуры
clop equ 7 ; кнопка на внутренней стороне ОТКР/ЗАКР
line0 equ 0 ; линия сканирования 0
line1 equ 1 ; линия сканирования 1
line2 equ 2 ; линия сканирования 2
line3 equ 3 ; линия сканирования 3
otkl0 equ 4 ; линия отклика 0
otkl1 equ 5 ; линия отклика 1
otkl2 equ 6 ; линия отклика 2
;****************************************************************************** ПОДПРОГРАММА ОБРАБОТКИ ПРЕРЫВАНИЙ ***********
;******************************************************************
ORG 0x000 ; processor reset vector
goto main ; go to beginning of program
ORG 0x004 ; interrupt vector location
movwf w_temp ; save off current W register contents
movf STATUS,w ; move status register into W register
movwf status_temp ; save off contents of STATUS register
; isr code can go here or be located as a call subroutine elsewhere
movf status_temp,w ; retrieve copy of STATUS register
movwf STATUS ; restore pre-isr STATUS register contents
swapf w_temp,f
swapf w_temp,w ; restore pre-isr W register contents
retfie ; return from interrupt
;***************************************************************************** МЕСТО РАСПОЛОЖЕНИЯ ПОДПРОГРАММ ***************
;******************************************************************
; П/П ПРОГРАММИРУЕМОЙ ЗАДЕРЖКИ ----------------------------------------
; задержка в милисекундах во wreg
; Входные: WREG - задержка в десяткал милисекунд
; 1 во WREG соответствует 10 мс
delay
movwf cnt0
delay1 movlw .12
movwf cnt1
delay3 movlw .207
movwf cnt2
delay2 clrwdt
decfsz cnt2,f
goto delay2
decfsz cnt1,f
goto delay3
decfsz cnt0,f
goto delay1
return
; ЗВУКОВОЙ ПИСК -------------------------------------------------------
; сигнал хитрой формы длительностью порядка 0,15 секунды
; WREG - параметр изменения тона. Должен быть в пределах: 1......10
; И это ОБЯЗАТЕЛЬНО!
; 1000 Гц => 500 мкс + 500 мкс
; За 0.15 секунды пройдет 150 периодов
pisk
movwf tmp_snd ; сохраним
bcf STATUS,C
rlf tmp_snd,f ; умножим на 2
movf tmp_snd,w
movwf tmp_snd1
movlw .100
movwf cnt2 ; для определения длительности импульса
movlw .100 ; определение длительности сигнала
movwf cnt0 ; ПЕРВАЯ треть сигнала
pisk2
snd_on
call pisks
snd_off
call pisks
movf tmp_snd,f ; проверка на 0
btfsc STATUS,Z
goto pisk3
decf tmp_snd,f
incf cnt2,f
pisk3 decfsz cnt0,f
goto pisk2
movlw .50
movwf cnt0
pisk4
snd_on
call pisks
snd_off
call pisks
movf tmp_snd1,f ; проверка на 0
btfsc STATUS,Z
goto pisk5
decf tmp_snd1
decf cnt2,f
pisk5 decfsz cnt0,f
goto pisk4
return
pisks ; п\п задержки
movf cnt2,w
movwf cnt1
pisks1 clrwdt
nop
decfsz cnt1,f
goto pisks1
return
;******************************************************************
;*********** НАЧАЛО ОСНОВНОГО КОДА ПРОГРАММЫ ************
;******************************************************************
main
; инициализация порта А
; 1 - вход
PORTA_NAPR EQU B'00001000'
PORTB_NAPR EQU B'11110000'
BANKSEL PORTA
CLRF PORTA
BANKSEL TRISA
MOVLW PORTA_NAPR
MOVWF TRISA
BANKSEL PORTA
CLRF PORTA
; инициализация порта В
CLRF PORTB
BANKSEL TRISB
MOVLW PORTB_NAPR
MOVWF TRISB
BANKSEL PORTB
CLRF PORTB
; общие
CLRWDT
BANKSEL OPTION_REG
MOVLW B'01011111' ; предделитель перед WDT c коэф 1:128
MOVWF OPTION_REG ; подтягивающие резисторы включены
BANKSEL TMR0
clrf TMR0
; начальные установки
clrf cnt_body0
clrf cnt_body1
clrf flags
snd_off
rele_off
adc_off
clrf EEADR
movlw 0xFF
movwf pkey
; начальный писк
movlw .10
call pisk
movlw .25
call delay
movlw .5
call pisk
movlw .25
call delay
movlw 1
call pisk
movlw 1
call pisk
movlw 1
call pisk
;******************************************************************
;******************** ТЕЛО РАБОЧЕГО ЦИКЛА *********************
;******************************************************************
body
banksel cnt_body0 ; счетчик количества проходов
incfsz cnt_body0,f ; счетчик двухбайтный
goto body1
incf cnt_body1,f
body1 btfss cnt_body1,5 ; проверка на достижение заданного
goto body3 ; интервала времени (bit3)
clrf cnt_body0
clrf cnt_body1
btfss flags,razr ; установлен флаг разряда аккумулятора
goto body2 ; если 1, то акк. разряжен
movlw .3 ; звуковой сигнал разряженных батарей
call pisk
movlw .25
call delay
movlw .3
call pisk
goto body3
body2
clrf pkey ; подготовка ко сну
bcf INTCON,RBIF
bcf INTCON,GIE
bsf INTCON,RBIF
sleep
nop
body3 ; проверка флага состояния (1-закрыто)
btfsc flags,sost ; проверка действия при нажати кнопки
goto body4
call keyboard ; считаем, что замок БЫЛ ОТКРЫТ
movwf key_tmp ; любая кнопка - закрыть!
incfsz key_tmp,f ; проверка нажатия основной клавиатуры
goto body5
btfsc pkey,clop ; проверка нажатия внутренней кнопки
goto body10 ; ничто не нажато
body5 call close ; процедура закрывания
bsf flags,sost
movlw .30
call delay
goto body10
body4 ; считаем, что замок БЫЛ ЗАКРЫТ
btfss pkey,clop ; проверка внутренней кнопки
goto body18
movlw .40
movwf cnt10 ; счетчик сремени опроса
body6 call keyboard ; первая цифра кода
addlw 1
btfss STATUS,Z
goto body7
decfsz cnt10,f
goto body6
body8 movlw 1
call pisk ; отказ от дальнейшего ввода
movlw .15
call delay
movlw 6
call pisk ; отказ от дальнейшего ввода
movlw .15
call delay
movlw 1
call pisk ; отказ от дальнейшего ввода
movlw .15
call delay
goto body10
body7 movf key_tmp,w
movwf cod0
movlw .40
movwf cnt10
body9 call keyboard ; вторая цифра
addlw 1
btfss STATUS,Z
goto body11
decfsz cnt10,f
goto body9
goto body8
body11 movf key_tmp,w
movwf cod1
movlw .40
movwf cnt10
body13 call keyboard ; третья цифра
addlw 1
btfss STATUS,Z
goto body12
decfsz cnt10,f
goto body13
goto body8
body12 movf key_tmp,w
movwf cod2
movlw .40
movwf cnt10
body15 call keyboard ; четвертая цифра
addlw 1
btfss STATUS,Z
goto body14
decfsz cnt10,f
goto body15
goto body8
body14 movf key_tmp,w
movwf cod3
movlw .4 ; проверка на код в ЕЕ
movwf cnt10
movlw cod0
movwf FSR
movlw addr_cod
movwf EEADR
body16
call read_ee
movf INDF,w
subwf EEDATA,w
btfss STATUS,Z
goto body17 ; переход к проверке на другой код.
incf FSR,f
incf EEADR,f
decfsz cnt10,f
goto body16
body18
movlw .5
call pisk
movlw .5
call pisk
movlw .5
call pisk
call open ; процедура ОТКРЫВАНИЯ
bcf flags,sost
movlw .30
call delay
goto body10
Додаток Б
Розроблений код програми мікроконтролера MSP430F2234:
#include "msp430x22x4.h"
unsigned int RxByteCtr;
unsigned int RxWord;
unsigned int OPTOPARA;
unsigned int OPTO;
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Останавлеваем WDT
P1DIR |= 0x01; // P1.0 на выход
P3SEL |= 0x06; // Назначаем I2C порты на USCI_B0
UCB0CTL1 |= UCSWRST; // Активируем SW сброс
UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C Master, синхронный режим
UCB0CTL1 = UCSSEL_2 + UCSWRST; // Используем SMCLK, keep SW reset
UCB0BR0 = 12; // fSCL = SMCLK/12 = ~100kHz
UCB0BR1 = 0;
UCB0I2CSA = 0x4e; // Устанавливаем slave адрес
UCB0CTL1 &= ~UCSWRST; // Убераем SW сброс, возвр.операц.
IE2 |= UCB0RXIE; // Активируем RX прерывание
TACTL = TASSEL_2 + MC_2; // SMCLK, contmode
OPTOPARA = P4IN;
while (1)
{
RxByteCtr = 2; // Загружаем RX счетчик битов
UCB0CTL1 |= UCTXSTT; // Запускаем I2C
__bis_SR_register(CPUOFF + GIE); // Enter LPM0, активируем прерывания
// Сохраняем в LPM0 до получения
// всех данных RX'd
// if(P4IN &= ~0x01)
if (OPTOPARA &= ~0x01)
{
if (RxWord < 0x1900) // >25?
P1OUT &= ~0x01; // No, P1.0 = 0
else
P1OUT |= 0x01; // Yes, P1.0 = 1
__disable_interrupt();
TACCTL0 |= CCIE; // TACCR0 активируем прерывания
__bis_SR_register(CPUOFF + GIE); // Enter LPM0, активируем прерывание
// Remain in LPM0 until TACCR0
// interrupt occurs
TACCTL0 &= ~CCIE; // TACCR0 отключаем прерывание
}
}
}
#pragma vector = TIMERA0_VECTOR
__interrupt void TA0_ISR(void)
{
__bic_SR_register_on_exit(CPUOFF); // Exit LPM0
}
// The USCIAB0TX_ISR is structured such that it can be used to receive any
// 2+ number of bytes by pre-loading RxByteCtr with the byte count.
#pragma vector = USCIAB0TX_VECTOR
__interrupt void USCIAB0TX_ISR(void)
{
RxByteCtr--; // Декрементируем счетчик
if (RxByteCtr)
{
RxWord = (unsigned int)UCB0RXBUF << 8; // Получаем переданный бит
if (RxByteCtr == 1) // Проверка на бит слева
UCB0CTL1 |= UCTXSTP; // Сгенирировать остановку I2C
}
else
{
RxWord |= UCB0RXBUF; // Получаем последний переданный бит
// Комбинируем MSB и LSB
__bic_SR_register_on_exit(CPUOFF); // Выход LPM0
}
}
