МІНІСТЕРСТВО ОСВІТИ УКРАЇНИ
ДЕРЖАВНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
Побудова охоронних систем з GSM-сигналізацією на
AVR-мікроконтролерах
Лабораторна робота № 4
З курсу «Мікропроцесорні пристрої»
Львів 2010
Мета роботи – ознайомитись з принципами побудови охоронних систем з GSM-сигналізацією та їх програмно-апаратною реалізацією на AVR мікроконтролерах.
ЗАВДАННЯ
Домашня підготовка до роботи
1.Вивчити теоретичний матеріал.
2.Вивчити основні властивості МК необхідні для виконання лабораторної роботи.
3.Підготувати програму функціонування охоронної системи
Виконати в лабораторії
1.Створити проект в CodeVisionAVR, ввести свою програму, провести її компілювання.
2.В режимі покрокової відладки переконатися в правильності роботи програми.
3.Відкрити файл-схему у програмі Proteus, підключити до МК hex-файл.
4.Запустити режим симуляції схеми та перевірити правильність функціонування охоронної системи у всіх режимах роботи.
ТЕКСТ ПРОГРАМИ
#include <90S2313.h>
#include <delay.h>
#include <stdio.h>
#include <string.h>
// Мигання світлодіода під час охорони об'єкта
const unsigned int tBlick = 1000/1.5/50;
// Мигання світлодіода під час тривоги
const unsigned int tAlarm = 1000/20;
unsigned char D_Type1; // тип 1 давача 0 - не викор., 1 - НРЗ, 2 - НЗ
unsigned char D_Type2; // тип 2 давача 0 - не викор., 1 - НРЗ, 2 - НЗ
unsigned char z1_Time;
unsigned char z2_Time;
unsigned char buf[40]; // Буфер для читання та запису АТ-команд у модем
unsigned char pos; // Позиція кінця рядка в буфері
unsigned char admin_no[17]; // номер адміністратора безпеки
unsigned char NoError; // не рівне 0 якщо АТ команда повернула "OK"
// поступив новий байт даних через UART
interrupt[UART_RXC] void UART_Read()
{
// Ознака успішного виконання АТ команди
char *OK="OK";
buf[pos]=UDR, buf[++pos]=0;
NoError = *strstr(buf, OK);
}
void AT_Write(flash char *fStr)
{
register unsigned char i = 0;
SREG.7 = 0; // заборона переривань
putchar('A'), putchar('T'); // початок АТ команди
if(fStr) strcpyf(buf, fStr); // скопіювати команду в ОП
while(buf[i]) putchar(buf[i++]); // команда
putchar(0x0D); // завершення команди
buf[pos=0]=0; // обнулити буфер прийому
SREG.7 = 1; // дозвіл переривань
delay_ms(50); // затримка перед отриманням результату
}
// копіює входження символів, що мають визначений початок і кінець
void ExtractStr(char *to, char begin, char end, char *from)
{
*to=0; // обнуляємо вихідний рядок
// шукаємо початок
while(from && *from!=begin && *from) ++from;
++from;
// копіюємо до кінцевого символу
while(*from && *from!=end) *to++=*from++;
*to=0; // ознака закінчення рядка
}
// налаштування входів, передавача UART та
// зчитування загальних налаштувань з GSM модема
void Init()
{
SREG.7 = 1; // загальний дозвіл переривань
// налаштування входу кнопки
DDRB.0=0, PORTB.0=1;
// дозвіл перерив. чит., прийому передачі через UART
UCR.7 = UCR.3 = UCR.4 = 1;
// швидкість передачі 9600 бод
UBRR = 45;
// налаштування входів давачів
DDRD.4=0, PORTD.4=1; // вхід 1 НЗ
DDRB.1=0, PORTB.1=1; // вхід 2 НЗ
// налаштування виходу світлодіода
DDRB.3=1, PORTB.3=1;
}
// Ініціалізація модему та запит налаштувань
void InitGSM_Modem()
{
char tmp[10];
char first_sim[4];
// спробуємо завантажити налаштування з першої комірки сім катрки
// відключити режим "ехо"
AT_Write("E0");
// активна тел. книжка - сім картка
AT_Write("+CPBS=\"SM\"");
// вивести інформацію про тел. книжку
AT_Write("+CPBR=?");
// якщо помилка використовуємо відповідь по замовчуванню
if(!NoError) strcpyf(buf, "\r\n+CPBR: (501-700),40,14\r");
// скопіювати номер першої комірки в tmp
ExtractStr(first_sim, '(', '-', buf);
// запит на виведення першої комірки сім-картки
strcpyf(buf, "+CPBR="), strcat(buf, first_sim);
// вивести вміст першої комірки (містить налаштування)
AT_Write(0);
if(!NoError)// по замвч. всі давачі НЗ (2), і затримка по 20 сек.(1)
strcpyf(buf, "+CPBR: 501,\"2211\",145,\"STATUS\"");
ExtractStr(tmp, '\"', '\"', buf);
// визначаємо типи давачів
D_Type1 = tmp[0] - '0';
D_Type2 = tmp[1] - '0';
// визначаємо затримку
z1_Time = tmp[2] - '0' + 1;
z2_Time = tmp[3] - '0' + 1;
// множимо на 10 кожне значення
z1_Time = (z1_Time<<3) + (z1_Time<<1);
z2_Time = (z2_Time<<3) + (z2_Time<<1);
// читаємо номер адміністратора з другої комірки
++first_sim[2];
strcpyf(buf, "+CPBR="), strcat(buf, first_sim);
AT_Write(0);
if(!NoError)// якщо невдало - значення по замовчуванню
strcpyf(buf, "+CPBR: 501,\"+308966129563\",145,\"Admin\"");
ExtractStr(admin_no, ',', ',', buf);
// задаємо текстовий режим відправки sms
AT_Write("+CMGF=1");
}
unsigned char Check()
{
unsigned char ret = 0, tmp;
// опитуємо давачі
if(D_Type1) // якщо підключений
{
// перевіряємо на спрацювання
ret|=(D_Type1 & 0x0f)-PIND.4==1 && !(D_Type1&0xf0) ? 1 : 0;
if((tmp = 0xf0 & D_Type1)==0) tmp=1<<7;
D_Type1=D_Type1&0x0f|(((D_Type1 & 0x0f)-PIND.4==1) ? tmp : 0);
}
if(D_Type2) // якщо підключений
{
// перевіряємо на спрацювання
ret|=(D_Type2 & 0x0f)-PINB.1==1 && !(D_Type2&0xf0) ? 1 : 0;
D_Type2=D_Type2&0x0f|(((D_Type2 & 0x0f)-PINB.1==1) ? 1<<7 : 0);
}
return ret;
}
void main(void)
{
unsigned char ret=0,i,k;
Init();
InitGSM_Modem();
turn_on:
while(PINB.0); /*очікуємо натискання кнопки*/
delay_ms(z1_Time*1000); /*затримка перед ввімкненням охорони*/
D_Type1=D_Type1&0x0f;
D_Type2=D_Type2&0x0f;
// формуємо SMS про ввімкнення охорони
strcpyf(buf, "+CMGS="), strcat(buf, admin_no);
strcatf(buf, "\rSecurity ON\0x1a");
AT_Write(0); // відсилаємо sms
while(1)
{
for(i=0;i<50;i++)
{
if((ret=Check())!=0) break;
delay_ms(tBlick);
}
if(!ret) {PORTB.3 = !PINB.3; continue;}
// цикл очікування натиску кнопки скиду сигналізації
for(k=0; k<250 && ret; k++)
{
delay_ms(tAlarm);
if((ret = !PINB.0)==0)
{
PORTB.3 = 0;
// формуємо SMS про вимкнення охорони
strcpyf(buf, "+CMGS="), strcat(buf, admin_no);
strcatf(buf, "\rSecurity OFF\0x1a");
AT_Write(0); // відсилаємо sms
delay_ms(2500), PORTB.3 = 1;
goto turn_on;
}
PORTB.3 = !PINB.3;
}
// якщо ми тут значить секретну кнопку не натиснули - тривога
// відправляємо тривожне смс
strcpyf(buf, "+CMGS="), strcat(buf, admin_no);
strcatf(buf, "\rAlarm. Shleif # ");
if(D_Type1&(1<<7))
D_Type1=(D_Type1&0x0f)|(1<<6),strcatf(buf, "1\0x1a");
else strcatf(buf, "2\0x1a");
AT_Write(0); // відсилаємо sms
}
}
СХЕМА
ВИСНОВОК
На даній лаболаторній роботі я ознайомився з принципами побудови охоронних систем з GSM-сигналізацією та їх програмно-апаратною реалізацією на AVR мікроконтролерах.