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

Додатки

Додаток А

Лістинг програми мікроконтролера 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

}

}

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