Разработка контроллера управления цифровым кодовым замком

Автор работы: Пользователь скрыл имя, 16 Января 2014 в 15:33, курсовая работа

Краткое описание

Необходимо разработать контроллер, выполняющий функцию расширенной авторизации с использованием внешнего электронного ключа и ввода цифрового пароля на клавиатуре.
Интерфейс обеспечивается за счет простейшей индикации состояния системы включением или отключением светодиода. Ввод данных - кодов пароля на 12 разрядной цифровой клавиатуре:
1) 10 первых клавиш которые соответствуют цифрам от 0 до 9.
2) Две оставшиеся используются как управляющие, одна из которых подтверждение ввода, а другая отмена ввода.

Вложенные файлы: 1 файл

власмп.doc

— 469.50 Кб (Скачать файл)

После выдачи presence iButton ожидает получения команды. Любая команда записывается в iButton с помощью последовательности тайм-слотов, передающих биты 1 и 0. Такая последовательность создает полный байт команды.

Для передачи данных в  обратном направлении (чтение iButton) используются те же самые правила для представления 0 или 1 Поскольку iButton разработано как slave-устройство, оно оставляет master- устройству право определять начало каждого тайм-слота.

 

Рис. 10 - Стартовая инициализация

 

Чтобы произвести чтение iButton, master для чтения одного бита данных просто генерирует тайм-слот записи лог. 1 (именно тайм-слот записи, а не чтения). Если бит, который должен послать iButton, равен 1, то iButton просто ожидает появления следующего тайм-слота, пропуская текущий. При этом с линии данных master считывает 1. Если бит, который посылает iButton, равен 0, то iButton удерживает линию данных в состоянии низкого уровня определенное время и master считывает с линии данных 0.

Запрограммированная лазерным лучом ROM-секция (ПЗУ) содержит 6-байт-ное уникальное для каждого устройства iButton число - серийный номер. Кроме того, во всех iButton записаны код типа устройства (family code) и проверочный байт CRC. Младшие 7 бит family code указывают на тип устройства. Старший бит family code используется в качестве флага в версиях, редназначенных для особых покупателей. Таким образом можно закодировать 128 разновидностей устройств.

48-битный (6-байтный) серийный  номер может представить любое  десятичное число до 2,81 1014. Если выпускать в год 1000 биллионов (1012) устройств одного и того же типа, то этого числа хватит на 281 год. Кроме того, можно выпускать 128 типов различных устройств. Если старший бит family code установлен в 1, то устройство функционирует так же, как и стандартное, однако серийный номер устанавливается по специальным правилам - часть серийного номера резервируется для обозначения конкретного покупателя (заказчика).

На рис. 11 показано, как организованы данные для DS1990A.

 

Рис. 11

 

Первый байт, передаваемый из ПЗУ, является кодом типа устройства - family code. После него идет уникальный серийный номер (6 байт), у которого наименее значащий байт передается первым. Последний байт несет информацию Cyclic Redundancy Check (CRC), что означает проверочный циклический избыточный код. CRC специальным образом вычисляется на основе первых семи байт. Это позволяет быстро проверить правильность передачи информации - если CRC, вычисленный устройством master от первых 7 байт, совпадает с принятым от iButton, то чтение было полностью верным. Этот метод - одна из причин, по которой iButton не требует стабильного электрического контакта со считывающим устройством.

 iButton делает выборку данных на линии посередине тайм-слота. По определению активная часть 1-Wire тайм-слота (tsLcrr) составляет 60 мкс. В нормальном состоянии iButton будет делать выборку сигнала с линии после 30 мкс относительно спада сигнала.

Внутренняя величина базового времени iButton может отличаться от стандартной, следовательно, может  меняться время выборки сигнала. Допустимый диапазон изменения составляет от 15 до 60 мкс. Это означает, что реальное чтение линии slave-устройством может произойти в любом месте относительно старта тайм-слота между 15 и 60 мкс, т. е. может изменяться в соотношении 1 к 4. Во время этого окна времени напряжение на линии должно оставаться либо ниже VILMAX(максимально допустимое напряжение низкого уровня), либо больше VIHMAX (минимально допустимое напряжение высокого уровня).

 

2.3 Описание  принципиальной схемы

 

На входе для сопряжения с СОМ портом стоит микросхема преобразователя управления Блок сопряжения с последовательным портом преобразователь+-12 для RS 232 последовательного микроконтроллера.Она генерирует необходимое напряжение из напряжения 5в использует внешнее подключение емкостей С1,С4.Чашка считывателя представляет собой механический контакт R fip радио ключ. Для защиты используется стабилизатор VD1 ограниченно и питание резистором IButton. Резистор Р2 является подтягивающим к +5в линию обмена. Схема подключения стандартная, используется С6,С7.

 

3. Разработка программы  управления

 

3.1 Принцип  функционирования

программа управление электронный ключ

Сам контролер функционирует  по циклической программе в начале предварительно настраивает параметры  микропроцессора, устанавливает частоту переполнения таймера, настраиваются входные прерывания и внутренние переменные. Основная часть действующей программы выполняется по переполнению прерывания таймера, при этом в каждом такте выполняется подсчет времени, так же выводится по кругу очередная индицируемая цифра.

При обнаружении нажатия, какой либо клавиши выполняется  переход к подпрограмме установке  выбранного параметра, но запуск к программе  выполняется из основного тела программы  зацикленного в бесконечном цикле, при этом обработчик прерывания продолжает работать, сканировать клавиатуру и выводить на ЖКИ необходимую информацию.

 

3.2 Описание  алгоритма работы программы

 

В начале программы происходит инициализация всех используемых переменных, которые используются нашим микроконтроллером. Заполняются массивы данных отображаемые на ЖКИ и массив кодов. Устанавливаем биты микроконтроллера.

Потом идут процедуры  обработки нажатых кнопок. Описывается  обработчик прерывания таймера, обработчик вывода данных через UART.

В главном цикле программы заполняются все регистры для выполнения обработчиков прерывания. В бесконечном цикле происходит постоянная проверка идет ли обмен по протоколу 1-ware и далее уже в зависимости от нажатых клавиш проходят различные проверки и выполняются операторы согласно алгоритма работы микроконтроллера.

 

3.3 Описание функционирования  программы

 

Рабочая программа реализуется  в двух основных частях. Обработчик прерывания таймера. В котором ведется  постоянное определение ключом и  выполняется отображение на ЖКИ. При подключении ключа int 0 и в обработчике прерываний запускается процедура обмена.

Еще образуется прерывание последовательного порта позволяя отправлять информацию о ключах и  получать информацию о командах. Для  реализации сравнений ключа после  приема а также вывода основных сообщений в массив ЖКИ. Используется основная часть программы. Рассматривая подробнее работу обработчика внешнего прерывания. Как только возникает подключение ключа, он закорачивается на время (60 мксек). Закорачивая сигнальную линию выраженного прерывания поэтому необходимость дожидаться завершения этого импульса. Далее идет обработка с формированием стартового импульса для начала обмена. Стартовый импульс 500 мсек., что обеспечивает требования 480 мксек. Необходимое для организации сброса. Дожидаемся сигнала ответа через 70 мксек после чего выдерживается пауза для восстановления линии, и подзарядки ключа (300 мксек.). Следующий шаг это передача команды 33 – считать код. Считывание кода начинается сразу после передачи команды сразу после паузы 50 мксек. Считываем 8 байт кода и производим сравнение его с имеющимися в памяти кодами. Если код совпал пользователю предлагается ввести пароль для пароля зарезервировано 10 позиций. Ввод последней цифры может быть отменен клавишей 11 (del). Завершение ввода не меньше символов выполняется клавишей 12 в основном теле программы. Если введенный цифры совпали то дверь открывается, если не совпали то дверь остается заблокирована.

Код нажатия клавиш определяет в процедуре обработчика таймера путем перемещения по битно по разрядам нулевого значения. Если на порту P3.3, P3.4 возникает нулевое значение то мы определяем какая клавиша нажата. Если сохраняется единичное значение то все клавиши. Если ноль А текущая то клавиша нажата. Если отличная от нуля то ввода цифры не происходит. Самый 1 ключ администратора который позволяет просматривать установленное время определяя значение часов.

 

Заключение

 

Поставленная задача была реализована, разработана функциональная схема. После анализа функциональной схемы рассмотрение множества разработок и отдельных электронных узлов была разработана схема контроллера управления системой кодового замка, которая реализует поставленную задачу на аппаратном уровне. При схемотехнической реализации блока был произведен выбор наиболее оптимального контроллера для решения задачи.

Вторым этапом реализации проекта стало написание программной  части, которая обеспечивает управление оборудованием по заданному алгоритму. Также было выполнено описание программы  и представлен её код.

Результат проекта представлен в виде отчета имеющего два приложения: листинг программы и принципиальная схема.

 

Приложение 1

 

Схема устройства

 

 

Приложение

 

Листинг программы

 

#include<reg51.h>

#include<stdlib.h>

char xdata out _at_ 0x10; /* xdata 0x10 */

unsigned char seksotl,sekth,regim; //shethiki vremeni

unsigned char hourbh,hourbl,minbh,minbl; //shethiki budilnik

unsigned char zvuk; //dlit zvuka

unsigned char hourh,hourl,minh,minl,sekh,sekl; //shethiki

unsigned char poz,nkey; //otobragaem segment

unsigned int interruptcnt;

sbit iware=P3^2;

bit fok;

unsigned char lcd1[]={0xDD,0x05,0xEC,0xAD,0x35,0xb9,0xF9,0x0D,0xFD,0xBD,0x02}; //lcd 1 str

unsigned char lcd2[]={0,0,0,0,0,0,0,0,0,0,0}; //lcd 1 str

unsigned char dat[]= {0,0,0,0,0,0}; //klav

char iw;

unsigned char dat1[]={0xDD,0x05,0xEC,0xAD,0x35,0xb9,0,3,6,9,7,1};

unsigned char dat1[]={0xD1,0x05,0xEC,0xAD,0x35,0xb9,0xF9,0x0D,0xFD,0x5D,0x12};

unsigned char dat1[]={0xD2,0x05,0xE2,0xAD,0x35,0xb0,0xF9,0x0D,0xFD,0xBD,0x67};

unsigned char dat1[]={0xDD,0x05,0xEC,0xAD,0x35,0xb9,0xF9,0x0D,0xFD,0xBD,0xDE};

unsigned char dat1[]={0xDA,0x05,0xEC,0xAD,0x35,0xb9,0xF9,0x0D,0xFD,0x2D,0xAA};

unsigned char dat1[]={0xD6,0x05,0xEC,0xA5,0x35,0xb9,0xF1,0x0D,0xFD,0x1D,0x01};

unsigned char dat1[]={0xAA,0x05,0xEC,0xAD,0x35,0xb9,0xF9,0xAA,0xFD,0xBD,0x0F};

unsigned char dat1[]={0xCC,0x05,0xEC,0xAD,0x35,0xb9,0xF9,0x0D,0xFD,0xBD,0x02};

unsigned char dat1[]={0xC1,0x05,0xEC,0xAD,0x35,0xb9,0xF9,0x0D,0xFD,0xBD,0x0A};

unsigned char dat1[]={0xA1,0x05,0xEC,0xAD,0x32,0xb9,0xF9,0x0D,0xAA,0xBD,0x03};

unsigned char dat1[]={0x11,0x05,0xEC,0xAD,0x35,0xb9,0xF9,0x0D,0xFD,0xBD,0x09};

void delay (void char t)

{

unsigned char dd;

for (dd=0;dd<t;dd++)//timeuot na 5*t mks

}

void reset (void)

{

if (!iware) delay(100);//esli linia =0 timeout 500mks

fok=0;

if (iware) //start proc

{iware=0;

delay(100); //timeout 500mks

iware=1;

delay(14);//timeout 70 mks

if (!iware)

{

delay(100); //500mks

if (iware) {fok=1;}

}

}

}

void readiw (void)//read IWare

{

unsigned char pp,nn;

pp=0;

for(nn=0;nn<8;nn++)

{

iware=0; delay (3); //start obmena bit

iware=1; delay(6); //+30mks dla chtenia

CY=iware;pp=pp>1;

delay(14);iware=1;

delay(3);}

iw=pp;//save rezultat

}

void writeiw (void char t)//read IWare

{unsigned char pp,nn;

pp=t;

for(nn=0;nn<8;nn++)

 {

iware=0; delay (3);

pp=pp>1; iware=CY;

delay(20);iware=1;

delay(3);

}

}

void uart (void) interrupt 4 using 2

{

if (RI)

{

if(SBUF==0xff){P3^7=1; for(i=0;i<2000;i++) delay(200);P3^7=0;}//vse sovpalo na 2 sek open door

if (SBUF==0){sec=0; min=0;chas=0;}

if (TI)

{TI=0;

if (++step<12)

}

}

void timer0 (void) interrupt 1 using 2 /*Function interrupt timer0*/

{

TH0=0xd8; /*set timer0=55539*/

TL0=0xf3;

seksot++;

if (seksot==100)

{seksot=0;sec++;

if (60 == sek)

{

sek=0;min++;}

if (60== min)

{

min=0;

{

hour++;

if (24== hour){hour=0;}

}

}

lcd2[0]=n+0x30;

lcd2[6]=hour/10+0x30;

lcd2[7]=hour%10+0x30;

lcd2[8]=min/10+0x30;

lcd2[9]=min%10+0x30;

lcd2[10]=sek/10+0x30;

lcd2[11]=sec%10+0x30;

// send LCD

if(sec<12){e=0; rs=0;P1=lcd1[sec]&0x0f;e=1; delay(255);e=0; rs=0;P1=((lcd1[sec]&0xf0)>>4);e=1;}

else if(sec<40){e=0; rs=0;P1=0;e=1; delay(255);e=0; rs=0;P1=2;e=1;}

else if(sec<52){e=0; rs=0;P1=lcd2[sec]&0x0f;e=1; delay(255);e=0; rs=0;P1=((lcd2[sec]&0xf0)>>4);e=1;}

if(sec==99){e=0; rs=0;P1=1;e=1;} //reset lcd

} /*end Function interrupt timer0*/

void main (void)

{

SCON=0x50;//obmen 8bit takt for timer1

TH1=0xFD;

sekl=0; /*time 1s*/

TH0=0xd8; /*set timer0=55635*/

TL0=0xef;

TMOD=0x21; /*1 regim*/

ET0=1; /*enable interrupt timer0*/

PT0=0; /*priority = 0*/

EA=1; /*enable interrupt*/

Информация о работе Разработка контроллера управления цифровым кодовым замком