
- •Содержание
- •Введение
- •1 Теоретическая часть
- •Постановка задачи
- •1.2 Теоретические сведения
- •2 Практическая часть
- •2.1 Принципиальная схема устройства
- •2.2 Алгоритм работы программы
- •If(d2) // Если при этом не пропала 2-х секундная активность датчика 2 , то человек зашел
- •Delay_ms(300);
- •If(d1) // Если при этом не пропала 2-х секундная активность датчика 1 , то человек вышел
- •Список использованных источников
- •Приложение
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 секунды