Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
kursovaya-rabota--3-.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.47 Mб
Скачать

2.2 Алгоритм работы программы

Данный алгоритм моделирует работу системы управления освещением «Умный дом» (рис 2.2).

Рисунок 2.2 — Блок-схема системы управления освещением

Вот здесь может и не обязательно, но я думаю, что лучше описать весь этот алгоритм словами.

2.3 Текст программы

Исходный код программы разрабатывался в CodeVisionAVR C Compiler

/*******************************************************

This program was created by the

CodeVisionAVR

Chip type : ATmega32

Program type : Application

AVR Core Clock frequency: 1,000000 MHz

*******************************************************/

#include <mega32.h>

#include <delay.h>

volatile unsigned int sec; // Время активности освещения

volatile unsigned char d1; // Время активности датчика 1

volatile unsigned char d2; // Время активности датчика 2

// Прерывания таймера, происходящие каждую секунду.

// Timer1 output compare A interrupt service routine

interrupt [TIM1_COMPA] void timer1_compa_isr(void)

{

if (sec)sec--;

if(d1)d1--;

if(d2)d2--;

PORTD.4=~PORTD.4;

}

void main(void)

{

// Переменная с подсчитанным количеством людей в помещении

unsigned char N=0;

// Настраиваем линии на ввод либо вывод в зависимости от функционального назначения

// Port A initialization

// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In

DDRA=(0<<DDA7) | (0<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) | (0<<DDA2) | (0<<DDA1) | (0<<DDA0);

// State: Bit7=P Bit6=P Bit5=P Bit4=P Bit3=P Bit2=P Bit1=P Bit0=P

PORTA=(1<<PORTA7) | (1<<PORTA6) | (1<<PORTA5) | (1<<PORTA4) | (1<<PORTA3) | (1<<PORTA2) | (1<<PORTA1) | (1<<PORTA0);

// Port B initialization

// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In

DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0);

// State: Bit7=P Bit6=P Bit5=P Bit4=P Bit3=P Bit2=P Bit1=P Bit0=P

PORTB=(1<<PORTB7) | (1<<PORTB6) | (1<<PORTB5) | (1<<PORTB4) | (1<<PORTB3) | (1<<PORTB2) | (1<<PORTB1) | (1<<PORTB0);

// Port C initialization

// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In

DDRC=(0<<DDC7) | (0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (0<<DDC3) | (0<<DDC2) | (0<<DDC1) | (0<<DDC0);

// State: Bit7=P Bit6=P Bit5=P Bit4=P Bit3=P Bit2=P Bit1=P Bit0=P

PORTC=(1<<PORTC7) | (1<<PORTC6) | (1<<PORTC5) | (1<<PORTC4) | (1<<PORTC3) | (1<<PORTC2) | (1<<PORTC1) | (1<<PORTC0);

// Port D initialization

// Function: Bit7=In Bit6=In Bit5=Out Bit4=Out Bit3=In Bit2=In Bit1=In Bit0=In

DDRD=(0<<DDD7) | (0<<DDD6) | (1<<DDD5) | (1<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);

// State: Bit7=P Bit6=P Bit5=0 Bit4=0 Bit3=P Bit2=P Bit1=P Bit0=P

PORTD=(1<<PORTD7) | (1<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (1<<PORTD3) | (1<<PORTD2) | (1<<PORTD1) | (1<<PORTD0);

// Настраиваем таймер 1 на прерывания раз в секунду

// Timer/Counter 1 initialization

// Clock source: System Clock

// Clock value: 15,625 kHz

// Mode: CTC top=OCR1A

// OC1A output: Disconnected

// OC1B output: Disconnected

// Noise Canceler: Off

// Input Capture on Falling Edge

// Timer Period: 1 s

// Timer1 Overflow Interrupt: Off

// Input Capture Interrupt: Off

// Compare A Match Interrupt: On

// Compare B Match Interrupt: Off

TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);

TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (1<<WGM12) | (0<<CS12) | (1<<CS11) | (1<<CS10);

TCNT1H=0x00;

TCNT1L=0x00;

ICR1H=0x00;

ICR1L=0x00;

OCR1AH=0x3D;

OCR1AL=0x08;

OCR1BH=0x00;

OCR1BL=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization

TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (1<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<OCIE0) | (0<<TOIE0);

delay_ms(3000); // Пауза3 секунды для стабилизации процессов датчиков

#asm("sei") // Разрешаем глобальные прерывания

// Бесконечный основной цикл программы

while (1)

{

// Если сработал датчик движения, а человек в комнате по расчетам 0- то включим свет на время и у нас в комнате 1 человек

if ((PINB.2==1)&&(N==0))

{

N++;

delay_ms(300);

sec=40; // 40 секунд без активности датчиков свет есть

PORTD.5=1; // Включили свет

}

if(sec==0) // Если нет сигналов от датчиков в течении 2 минут - обнуляем число людей в помещении и выключаем свет

{

N=0;

PORTD.5=0; // Выключили свет

}

if (PINB.0==0){

d1=2; // Датчик 1 активен 2 секунды

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