DevioLab CRYPTO TRADING AUTOMATION
LIVE
AUTOMATED CRYPTO TRADING • BINANCE
Автоматизуйте свій криптопортфель
Торгові боти DevioLab аналізують крипторинок, автоматично відкривають і закривають позиції та керують вашим портфелем на Binance 24/7.
CRYPTO 80 Bots
BINANCE Spot Trading
TRADING 24 / 7
Спробувати DevioLab
deviolab.com

Побудова інфрачервоних детекторів руху на AVR-мікроконтролерах

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Не вказано
Факультет:
Не вказано
Кафедра:
Не вказано

Інформація про роботу

Рік:
2012
Тип роботи:
Звіт
Предмет:
Захист інформації
Група:
ІБ – 44

Частина тексту файла (без зображень, графіків і формул):

Міністерство освіти і науки Україниіі Національний університет „Львівська політехніка” Кафедра «Захисту інформації» Звіт До лабораторної роботи №3 На тему: «Побудова інфрачервоних детекторів руху на AVR-мікроконтролерах» Львів-2010 Мета роботи – ознайомитись з принципами побудови охоронних систем з GSM-сигналізацією і їх програмно-апаратною реалізацією на AVRмікроконтролерах. Отримати навики написання програм для AVR-мікроконтролерів на мові С в середовищі CodeVisionAVR Завдання: Створити проект в CodeVisionAVR, ввести свою програму, провести її компіляцію. Відкрити файл LR_4.dsn в програмі Proteus, внести у схему відповідно до свого індивідуального завдання, підключити до МК отриманий в CodeVisionAVR hex-файл. Запустити режим симуляції схеми та перевірити правильність функціонування GSM-сигналізації у всіх режимах роботи: постановка і зняття з охорони, спрацювання охоронних давачів. № Тактова частота МК, МГц Тз1, с F1, Гц Тз2, с F2, Гц Тип шлейфу 1 Тип шлейфу 2 Вивід для підкл шлейфу 1 Вивід для підкл шлейфу 2 Вивід МК для підкл світлодіода Вивід МК для підкл кнопки  2 4 40 2 40 9 НЗ НР PВ1 PB3 PD3 PD2   Текст програми у CodeVisionAVR: Текст програми GSM.c #include <GSM.h> interrupt [7] void Timer0_Ovf(void) { unsigned char temp; // Прочитати стан секретної кнопки temp = SW_PIN; temp = temp & (1<<SW); if (State == State_Off) // Якщо охорона виключена { if (temp == 0) State = State_On; // Якщо кнопка натиснута - включити охорону } else if(State == State_On) // Якщо охорона включена { if (temp != 0) State = State_Off; // Якщо кнопка ненатиснута - виключити охорону } }; ////////////////////////////////////////////////////////////////// interrupt [5] void Timer1_COMP(void) { unsigned char temp; temp = PORTB ^ 0b00001000; PORTB = temp; }; void Pin_Init(void); void SMS_Send(char* cmd, unsigned char type); void Schleif_Test(unsigned char s1, unsigned char * status, unsigned char number); enum SMS_Type{Security_On, Security_Off, Alarm_Schleif_1, Alarm_Schleif_2}; ////////////////////////////////////////////////////////////////// void main(void) { unsigned char k, m, temp; // Номер індексу першої комірки телефонної книги SIM-карти unsigned char s1, s2, s3; // Масив для відправки АТ-команд unsigned char CMD[25] = {0}; // Масив для прийому відповідей від GSM-модему unsigned char My[30] = {0}; // Час постановки на охорону unsigned char T_1; // Час зняття з охорони unsigned char T_2; // Конфігурація шлейфу 1: 0 - викл., 1 - нормально розімкнений, 2 - нормально замкнутий unsigned char S_1; // Конфігурація шлейфу 2: 0 - викл., 1 - нормально розімкнений, 2 - нормально замкнутий unsigned char S_2; // Налаштування виводів МК Pin_Init(); // Налаштування швидкості передачі 9600 Бод UBRR = xtal/16/Baud_Rate-1; // Дозволити прийом і передачу даних: 8 біт, 1 стоповий, 1 стартовий. UCR = (1<<RXEN) + (1<<TXEN); // Затримка 4 секунди для переходу модему в робочий режим delay_ms(4000); // Послати команду АТЕ0 - відключення еха CMD[0] = 'A'; CMD[1] = 'T'; CMD[2] = 'E', CMD[3] = '0'; CMD[4] = CR; // Відіслати команду puts(CMD); // Прийом відповіді k = 0; while(1) { m = getchar(); // Отримати символ if(m == LF) // Це символ нового рядку? k++; if(k == 2) // Якщо отримано два LF - прийом відповіді завершено break; }; // Послати команду АТ+CPBS="SM" - вибір телефонної книги CMD[0] = 'A'; CMD[1] = 'T'; CMD[2] = '+'; CMD[3] = 'C'; CMD[4] = 'P'; CMD[5] = 'B'; CMD[6] = 'S'; CMD[7] = '='; CMD[8] = '"'; CMD[9] = 'S'; CMD[10] = 'M'; CMD[11] = '"'; CMD[12] = CR; // Відіслати команду puts(CMD); // Прийом відповіді k = 0; while(1) { m = getchar(); // Отримати символ if(m == LF) // Це символ нового рядку? k++; if(k == 2) // Якщо отримано два LF - прийом відповіді завершено break; }; ////////////////////////////////////////////////////////////////////////////////// // Послати команду АТ+CPBR=? - вивести параметри активної телефонної книги CMD[0] = 'A'; CMD[1] = 'T'; CMD[2] = '+'; CMD[3] = 'C'; CMD[4] = 'P'; CMD[5] = 'B'; CMD[6] = 'R'; CMD[7] = '='; CMD[8] = '?'; CMD[9] = CR; CMD[10] = 0; k = 0; m = 0; // Відіслати команду puts(CMD); while(1) { My[m] = getchar(); // Зберегти прийнятий символ в масиві My[] temp = My[m]; m++; // Збільшити лічильник прийнятих символів на 1 if(temp == LF) // Це символ нового рядку? k++; if(m == 29) // Якщо досягнуто кінець масиву My[] – почати запис спочатку m = 0; if(k == 4) // Якщо отримано 4 символи LF - прийом відповіді завершено break; }; s1 = My[10]; // Прочитати номер першої комірки телефонної книги з прийнятої відповіді s2 = My[11]; s3 = My[12]; /////////////////////////////////////////////////////////////////////////////////// // Команда АТ+CPBR=s1s2s3 – зчитати вміст першої комірки телеф. книги (комірка STATUS) CMD[0] = 'A'; CMD[1] = 'T'; CMD[2] = '+'; CMD[3] = 'C'; CMD[4] = 'P'; CMD[5] = 'B'; CMD[6] = 'R'; CMD[7] = '='; CMD[8] = s1; CMD[9] = s2; CMD[10] = s3; CMD[11] = CR; CMD[12] = 0; k = 0; m = 0; temp = 0; // Відіслати команду puts(CMD); while(1) { temp = getchar(); // Прийняти символ if(temp == '"') // Якщо прийнято символ “ прочитати наступні 4 символи { m++; } else if(m > 0 & m < 5) { My[m-1] = temp; // Прочитати 4 цифри, які задають налаштування системи m++; } if(temp == LF) // Якщо отримано 4 символи LF - прийом відповіді завершено k++; if(k == 4) break; }; // Сформувати з прийнятих символів значення часових затримок та типи шлейфів S_1 = My[0] - 0x30; S_2 = My[1] - 0x30; T_1 = (My[2] - 0x30 + 1)*10; T_2 = (My[3] - 0x30 + 1)*10; ///////////////////////////////////////////////////////////////////////// // // Сформувати номер наступної комірки телефонної книжки s3 = s3 + 1; if(s3 == 0x40) { s3 = 0x30; s2 = s2 + 1; if(s2 == 0x40) { s2 = 0x30; s1 = s1 + 1; } } //s1++; // Команда АТ+CPBR=s1s2s3+1 – зчитати вміст другої комірки телеф. книги – // номер телефону адміністратора CMD[0] = 'A'; CMD[1] = 'T'; CMD[2] = '+'; CMD[3] = 'C'; CMD[4] = 'P'; CMD[5] = 'B'; CMD[6] = 'R'; CMD[7] = '='; CMD[8] = s1; // CMD[9] = CR; // CMD[10] = 0; CMD[9] = s2; CMD[10] = s3; CMD[11] = CR; CMD[12] = 0; k = 0; m = 0; temp = 0; // Відіслати команду puts(CMD); while(1) { temp = getchar(); // Прийняти символ if(temp == '"') // Якщо прийнято символ “ прочитати наступні 13 символів { m++; } else if(m > 0 & m < 14) { Number[m-1] = temp; ; // Зберегти номер адміністратора в масиві Number m++; } if(temp == LF) // Якщо отримано 4 символи LF - прийом відповіді завершено k++; if(k == 4) break; }; //////////////////////////////////////////////////////////////////////////// // Команда АТ+CMGF= 1 – задати текстовий режим відправки повідомлень CMD[0] = 'A'; CMD[1] = 'T'; CMD[2] = '+'; CMD[3] = 'C'; CMD[4] = 'M'; CMD[5] = 'G'; CMD[6] = 'F'; CMD[7] = '='; CMD[8] = '1'; CMD[9] = CR; CMD[10] = 0; // Відіслати команду puts(CMD); k = 0; m = 0; while(1) { My[m] = getchar(); m++; if(My[m-1] == LF) // Якщо отримано 2 символи LF - прийом відповіді завершено k++; if(k == 2) break; }; /////////////////////////////////////////////////////////////////////////////// // Дозволити перехід в режим пониженого енергоспоживання sleep_enable(); Lab1: // Стан - охорона виключена State = 0; // Стан шлейфів - не було спрацювань S1_Status = 0; S2_Status = 0; // Опитування секретної кнопки з періодом 0.1 с. // Дозволити переривання від таймера Т0 по переповненню TIMSK = (1<<TOIE0); // Коефіцієнт ділення - 1024. Період опитування = 1024*256/4000000 = 0.06 с. TCCR0 = (1<<CS02) + (1<<CS00); // Дозволити переривання #asm("sei"); /////////////////////////////////////////////////////////////////////////////// while(1) { idle(); // Перейти в режим пониженого енергоспоживання if(State == 1) // Якщо включено охорону – вийти з циклу break; }; /////////////////////////////////////////////////////////////////////////////// // Зупинити таймер Т0 TCCR0 = 0; // Затримка Т1 для виходу з об'єкту for(temp = 0; temp < T_1; temp++) delay_ms(1000); // Відіслати SMS-повідомлення SMS_Send(CMD, Security_On); // Мигати світлодіодом з частотою F1 OCR1 = Timer1_1; //TCCR1A = (1<<COM1A0); TCCR1B = (1<<CS12) + (1<<CTC1); TIMSK = TIMSK + (1<<6); // Опитувати кнопку з частотою 0.06 с TCCR0 = (1<<CS02) + (1<<CS00); /////////////////////////////////////////////////////////////////////////////// while(1) { idle(); if(State == 0) // Якщо охорону виключили { TCCR0 = 0; // Зупинити таймер Т0 SMS_Send(CMD, Security_Off); // Відіслати SMS повідомлення Security_Off TCCR1B = 0; // Зупинити таймер Т1 TCCR1A = 0; LED_PORT.LED = 0; // Включити світлодіод на 3 сек delay_ms(3000); LED_PORT.LED = 1; break; } else // Якщо охорона включена { Schleif_Test(S_1, &S1_Status, 1); // Опитати шлейф 1 Schleif_Test(S_2, &S2_Status, 2); // Опитати шлейф 2 if(S1_Status == 1 || S2_Status == 1) // Якщо є спрацювання шлейфу { OCR1 = Timer1_2; // Мигати світлодіодом TCNT1 = 0; TCCR0 = 0; // Зупинити таймер Т0 //------------------------------------------------------------------------------------ for(temp = 0; temp < T_2; temp++) delay_ms(1000); // Затримка для виключення охорони temp = SW_PIN; // Опитати кнопку temp = temp & (1<<SW); if(temp == 0) Якщо охорону не відключено { if(S1_Status == 1) // Якщо спрацював шлейф 1 { SMS_Send(CMD, Alarm_Schleif_1); // Відіслати SMS повідомлення Alarm_Schleif_1 S1_Status = 2; // Не реагувати на шлейф 1 поки він не вернеться // в неактивний стан } if(S2_Status == 1) // Якщо спрацював шлейф 1 { SMS_Send(CMD, Alarm_Schleif_2); // Відіслати SMS повідомлення Alarm_Schleif_2 S2_Status = 2;// Не реагувати на шлейф 2 поки він не вернеться // в неактивний стан } delay_ms(4000); TCCR0 = (1<<CS02) + (1<<CS00); // Продовжити опитувати кнопку з частотою 0.06 с } else // Якщо охорону встигли відключити { State = 0; TCCR0 = 0; // Зупинити таймер Т0 SMS_Send(CMD, Security_Off); // Відіслати SMS повідомлення Security_Off TCCR1B = 0; // Зупинити таймер Т1 TCCR1A = 0; LED_PORT.LED = 0; // Включити світлодіод на 3 сек delay_ms(3000); LED_PORT.LED = 1; break; } } } }; goto Lab1; // Перейти на мітку Lab1 ///////////////////////////////////////////////////////////////// }; ////////////////////////////////////////////////////////////////// void Pin_Init(void) { S1_PORT.SCH_1 = 0; S1_DDR.SCH_1 = 0; S2_PORT.SCH_2 = 0; S2_DDR.SCH_2 = 0; LED_PORT.LED = 1; LED_DDR.LED = 1; SW_PORT.SW = 1; SW_DDR.SW = 0; }; ////////////////////////////////////////////////////////////////// // Функція відправки SMS-повідомлення // Вхідні параметри: cmd - текстовий рядок для запису команди, type - тип повідомлення void SMS_Send(char* cmd, unsigned char type) { unsigned char m; cmd[0] = 'A'; cmd[1] = 'T'; cmd[2] = '+'; cmd[3] = 'C'; cmd[4] = 'M'; cmd[5] = 'G'; cmd[6] = 'S'; cmd[7] = '='; cmd[8] = '"'; cmd[9] = Number[0]; cmd[10] = Number[1]; cmd[11] = Number[2]; cmd[12] = Number[3]; cmd[13] = Number[4]; cmd[14] = Number[5]; cmd[15] = Number[6]; cmd[16] = Number[7]; cmd[17] = Number[8]; cmd[18] = Number[9]; cmd[19] = Number[10]; cmd[20] = Number[11]; cmd[21] = Number[12]; cmd[22] = '"'; cmd[23] = CR; cmd[24] = 0; puts(cmd); while(1) { m = getchar(); if(m == '>') break; }; m = getchar(); if(type == Alarm_Schleif_1 || type == Alarm_Schleif_2) { cmd[0] = 'S'; cmd[1] = 'l'; cmd[2] = 'e', cmd[3] = 'i'; cmd[4] = 'f'; cmd[5] = ' '; cmd[7] = Ctrl_Z; cmd[8] = CR; cmd[9] = 0; if(type == Alarm_Schleif_1) cmd[6] = '1'; else cmd[6] = '2'; } else if(type == Security_On || type == Security_Off) { cmd[0] = 'S'; cmd[1] = 'e'; cmd[2] = 'c', cmd[3] = 'u'; cmd[4] = 'r'; cmd[5] = 'i'; cmd[6] = 't'; cmd[7] = 'y'; cmd[8] = ' '; cmd[9] = 'O'; if(type == Security_On) { cmd[10] = 'n'; cmd[11] = Ctrl_Z; cmd[12] = CR; cmd[13] = 0; } else { cmd[10] = 'f'; cmd[11] = 'f'; cmd[12] = Ctrl_Z; cmd[13] = CR; cmd[14] = 0; } } puts(cmd); }; ////////////////////////////////////////////////////////////////////////////////////// // Функція перевірки стану шлейфу. // Вхідні параметри: s1 - конфігурація шлейфу, number - номер шлейфу // Вихідні параметри: записує у змінну status стан шлейфу void Schleif_Test(unsigned char s1, unsigned char* status, unsigned char number) { unsigned char temp; if (s1 != 0) { if(number == 1) { temp = S1_PIN; temp = temp & (1<<SCH_1); } else { temp = S2_PIN; temp = temp & (1<<SCH_2); } if ((s1 == 1) & (temp == 0) & (*status != No_Control)) // Якщо НРК і є спрацювання *status = Alarm; else if ((s1 == 1) & (temp != 0) & (*status == No_Control)) // Якщо НРК і немає спрацювання *status = No_Alarm; if ((s1 == 2) & (temp != 0) & (*status != No_Control)) // Якщо НЗК і є спрацювання *status = Alarm; else if ((s1 == 2) & (temp == 0) & (*status == No_Control)) // Якщо НЗК і немає спрацювання *status = No_Alarm; } }; //////////////////////////////////////////////////////////////////////////////////////////////// Текст програми GSM ---------------------- #include <90S2313.h> #include <delay.h> #include <stdio.h> #include <sleep.h> ////////////////////////////////////////////////////////////////// #define CR 0x0D #define LF 0x0A #define Ctrl_Z 0x1A // Тактова частота #define xtal 4000000L // Період мигання світлодіоду з частотою 2 Гц (1 с) DIV = 256 #define Timer1_1 7812 // Період мигання світлодіоду з частотою 9 Гц (0.1 с) DIV = 256 #define Timer1_2 1736 #define Timer0_1 39 //////////////////////////////////////////////////////////////////////// // Швидкість обміну між МК та GSM-модемом #define Baud_Rate 9600 // Регістр USR #define RXC 7 #define TXC 6 #define UDRE 5 #define FE 4 #define OR 3 // Регістр UСR #define RXCIE 7 #define TXCIE 6 #define UDRIE 5 #define RXEN 4 #define TXEN 3 #define CHR9 2 #define RXB8 1 #define TXB8 0 //////////////////////////////////////////////////////////////////////// #define S1_PORT PORTB #define S2_PORT PORTD #define S1_DDR DDRB #define S2_DDR DDRD #define S1_PIN PINB #define S2_PIN PIND #define SCH_1 2 #define SCH_2 3 //////////////////////////////////////////////////////////////////////// #define LED_PORT PORTB #define LED_DDR DDRB #define LED_PIN PINB #define LED 3 //////////////////////////////////////////////////////////////////////// #define SW_PORT PORTD #define SW_DDR DDRD #define SW_PIN PIND #define SW 2 ///////////////////////////////////////////////////////////////////////// // TCCR0 #define CS02 2 #define CS01 1 #define CS00 0 // TCCR1A #define COM1A1 7 #define COM1A0 6 #define PWM11 1 #define PWM10 0 // TCCR1B #define ICNC1 7 #define ICES1 6 #define CTC1 3 #define CS12 2 #define CS11 1 #define CS10 0 // TIMSK #define TOIE1 7 #define OCIE1A 6 #define TICIE 3 #define TOIE0 1 ///////////////////////////////////////////////////////////////////////////////////// // Глобальні змінні // Стан сигналізації: 0 (State_Off) - виключена, 1 (State_On) - включена unsigned char State = 0; #define State_Off 0 #define State_On 1 // Стан шлейфу 1: 0 (No_Alarm)- немає спрацювання, 1 (Alarm) - є спрацювання, 2 (No_Control) - шлейф не контролюється unsigned char S1_Status; #define No_Alarm 0 #define Alarm 1 #define No_Control 2 // Стан шлейфу 2: 0 - немає спрацювання, 1 - є спрацювання, 2 - шлейф не контролюється unsigned char S2_Status; // Номер адміністратора у форматі +38097ххххх94 unsigned char Number[13] = {0}; Номер цифри Призначення Опис  1 Режим входу Intup_1 2-шлейф для НЗ давача  2 Режим входу Intup_2 1-шлейф для НР давача  3 Затримка перед включенням охорони Тз1 3-40 сек.  4 Затримка перед включенням охорони Тз 3-40 сек.   Розрахунки: N1=Ft/(F1*DIV)=400000/(256*2)=7812 N2=Ft/(F2*DIV)=400000/(256*9)= 1736 Схема у Proteus 7  Висновок: В даній лабораторній роботі я ознайомився з принципами побудови охоронних систем з GSM-сигналізацією і їх програмно-апаратною реалізацією на AVR мікроконтролерах, отримав навики написання програм для AVR-мікроконтролерів на мові С в середовищі CodeVisionAVR
Антиботан аватар за замовчуванням

04.01.2012 00:05

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!