Микропроцессорный контроллер кодового замка
СОДЕРЖАНИЕ
1.
Техническое задание
.
Краткое описание микроконтроллера
.1
Общее описание микроконтроллера
.2
Порты ввода-вывода
.3
Разработка структурно-функциональной схемы
.
Функциональная схема устройства
.1
Выбор элементной базы
.2
Описание алгоритма программы
.3
Используемые процедуры
.4
Листинг программной части
1. Техническое задание
Целью данной курсовой работы является разработка
схемы устройства - «Микропроцессорный контроллер кодового замка» с
использованием микроконтроллера.
Разрабатываемое устройство будет иметь следующие
возможности:
в дежурном режиме устройство работает как часы,
отображая текущее время.
в режиме замка устройство позволяет по паролю
осуществлять открытие дверей, если введенный пароль верен для соответствующей
двери. Если введенный пароль не верный, то на ЖКИ выдается сообщение: ошибка.
Если неправильный пароль вводится 3 раза, срабатывает сигнализация.
режим программирования: при вводе мастер-пароля
можно 1) редактировать пароли; 2) просмотреть информацию о последних введенных
паролях и времени ввода пароля; 3) устанавливать новое время.
2. Краткое описание микроконтроллера
.1
Описание микроконтроллера
Восьмиразрядный высокопроизводительный
однокристальный микроЭВМ КР1816ВЕ51 выполнен по высококачественной n-МОП технологии.
Содержит масочно-программирумое в процессе изготовления кристалла ПЗУ памяти
программ емкостью 4096 байт и рассчитан на применение в массовой продукции.
ОМЭВМ содержат следующие узлы:
центральный восьмиразрядный процессор;
память программ объемом 4 Кбайт;
память данных объемом 128 байт;
четыре восьмиразрядных програмируемых канала
ввода-вывода;
два 16-битовых многореиных таймера-счетчика;
систему прерываний с пятью векторами и двумя
уровнями;
последовательный интерфейс;
тактовый генератор.
Название
|
Вывод
|
Тип
|
Назначение
|
Р1.0-Р1.7
|
1-8
|
Вход/
выход
|
8-разрядный
двунаправленный порт Р1. Вход адреса А0-А7 при проверке внутреннего ПЗУ
(РПЗУ).
|
RST
|
9
|
вход
|
Сигнал
общего сброса. Вывод резервного питания ОЗУ от внешнего источника.
|
Р3.0-Р3.7
Р3.0 Р3.1 Р3.2 Р3.3 Р3.4 Р3.5 Р3.6 Р3.7
|
10-17
|
Вход/
Выход Вход Выход Вход Вход Вход Вход Выход Выход
|
8-ми
разрядный двунаправленный порт Р3 с дополнительными функциями.
Последовательные данные приемника - RxD. Последовательные данные передатчика
- TxD. Вход внешнего прерывания 0 - INT0. Вход внешнего прерывания 1 - INT1.
Вход таймера/счетчика 0 - Т0. Вход таймера/счетчика 1 - Т1. Выход
стробирующего сигнала при записи во внешнюю память данных - WR. Выход
стробирующего сигнала при чтении из внешней памяти данных - RD.
|
BQ2
|
18
|
Выход
|
Выводы
для подключения кварцевого резонатора.
|
BQ1
|
19
|
Вход
|
|
0
В
|
20
|
|
Общий
выход
|
Р2.0-Р2.7
|
21-28
|
Вход/
выход
|
8-разрядный
двунаправленный порт Р2. Выход адреса А8-А15 в режиме работы с внешней
памятью. В режиме проверки внутреннего ПЗУ выводы Р2.0-Р2.6 используются как
вход адреса А8-А14. Вывод Р2.7 - разрешение чтения ПЗУ - Е.
|
PME
|
29
|
Выход
|
Разрешение
программной памяти.
|
ALE
|
30
|
Вход/
выход
|
Выходной
сигнал разрешения фиксации адрса. При программировании РПЗУ сигнал - PROG.
|
DEMA
|
31
|
Вход/
выход
|
Р0.7-Р0.0
|
32-39
|
Вход/
выход
|
8-разрядный
двунаправленный порт Р0. Шина адреса / данных при работе с внешней памятью.
Выход данных D7-D0 в режиме проверки внутреннего ПЗУ (РПЗУ).
|
Ucc
|
40
|
|
Вывод
питания от источника напряжения +5В
|
Организация памяти.
Память данных предназначена для приема, хранения
и выдачи информации, используемой в процессе выполнения программы. Память
данных, расположенная на кристалле ОМЭВМ, состоит из регистра адреса ОЗУ,
дешифратора, ОЗУ и указателя стека.
Регистр адреса ОЗУ предназначен для приема и
хранения адреса выбираемой с помощью дешифратора ячейки памяти, которая может
содержать как бит, так и байт информации.
ОЗУ представляет собой 128 восьмиразрядных
регистров, предназначенных для приема, хранения и выдачи различной информации.
Указатель стека представляет собой регистр,
предназначенный для приема и хранения адреса ячейки стека, к которой было
последнее обращение.
В ОМЭВМ предусмотрена возможность расширения
памяти данных путем подключения внешних устройств емкостью до 64 Кбайт.
Память программ предназначена для хранения
программ и имеет отдельное от памяти данных адресное пространство объемом до 64
Кбайт, причем часть памяти программ с адресами 0000h-0fffh расположена на
кристалле ОМЭВМ. Память программ, расположенная на кристалле, состоит из
12-разрядного дешифратора и ПЗУ емкости 4К*8 бит. Запись программ в ПЗУ
происходит во время изготовления кристаллов.
контроллер программа процедура
2.2 Устройства ввода-вывода
Порты Р1-Р3 имеют идентичные характеристики.
Данные, записанные в них, статически фиксируются и не изменяются до перезаписи.
В режиме работы с внешней памятью программ порт
Р2 служит для выдачи сигналов старших разрядов адреса и статически фиксирует их
до момента изменения.
Для перевода любой линии портов Р1-Р3 на прием
входной информации необходимо в соответствующий фиксатор-защелку порта записать
«1» с помощью команд выдачи данных. Сигнал RST устанавливает все порты на прием
входной информации.
Порт Р0 - восьмиразрядный двунаправленный порт с
тремя состояниями. Информация, выдаваемая портом Р0 с помощью команд выдачи
сопровождается строб-импульсом WR.
При записи информации в порт Р0 с помощью команд
приема вырабатывается строб-импульс RD.
Кроме операция ввода-вывода информации
предусмотрена возможность выполнения логических операция И, ИЛИ и исключающее
ИЛИ непосредственно на фиксаторах портов Р0-Р3.
В режиме работы с внешней памятью программ порт
Р0 служит для выдачи младших разрядов адреса памяти программ и приема кодов
команд. В режиме работы с внешним ОЗУ данных порт Р0 служит для выдачи адреса
внешнего ОЗУ данных и приема-выдачи данных при обмене с внешним ОЗУ.
При работе с последовательным портом ОМЭВМ линии
Р3.0 и Р3.1 используются, соответственно, как вход и выход последовательного
канала.
.3 Разработка структурно-функциональной схемы
Устройство состоит из следующих функциональных
блоков:
Блок микроконтроллера
Осуществляет функционирование микроконтроллера.
Состоит из следующих элементов:
схема тактового генератора. Осуществляет
выработку внешнего сигнала тактирования микроконтроллера частотой 12МГц.
схема первоначального сброса микроконтроллера.
Обеспечивает корректный запуск.
сам микроконтроллер.
Блок клавиатуры
Осуществляет подключение матрицы из 12 кнопок к
7 выводам микроконтроллера. Код строки матрицы выдается в младших трех битах
порта P2, код столбца матрицы выдается в старших четырех битах порта Р2. В
узлах полученной матрицы из 3 строк по 4 столбца расположены кнопки. На 3
младших бита порта подается логическая «1». На старшие 4 бита подается 0. Как
только нажата клавиша (происходит переключение), состояние бита строки,
соответствующей столбцу, перейдет в «0».
Блок индикации набора пароля.
Осуществляет подключение LCD-панели к порту Р0 и
порту Р3 (биты Р3.0, Р3.1, Р3.2) микроконтроллера.. Отображает дополнительную
информацию на LCD-экране.
Блок электронного ключа замка.
Состоит из транзисторной пары и открывает или
закрывает двери посредством реле или электромагнита вдвигающего язычок.
3. Функциональная схема устройства
3.1 Выбор элементной базы
При разработке устройства были использованы
следующие электронные компоненты:
Микроконтроллер КР1816ВЕ51. Этот микроконтроллер
был выбран по причине хорошего соответствия поставленной задаче и низкой
стоимости.Hitachi HD44870. Данный контроллер фактически является промышленным
стандартом и широко применяется при производстве алфавитно-цифровых
ЖКИ-модулей. АЦ ЖКИ-модули представляют собой недорогое и удобное решение,
позволяющее сэкономить время и ресурсы при разработке новых изделий, при этом
обеспечивают отображение большого объема информации при хорошей различимости и
низком энергопотреблении.
Электронный стабилизатор КР145ЕН5А
.2 Описание алгоритма программы
) Дежурный режим.
|
|
|
|
|
В
|
Р
|
Е
|
М
|
Я
|
|
|
|
|
|
|
|
|
|
1
|
2
|
:
|
2
|
2
|
:
|
4
|
0
|
|
|
|
В дежурном режиме (пока не нажата клавиша)
работы устройства на ЖКИ отображается текущее время.
) Режим ввода пароля.
В
|
В
|
Е
|
Д
|
И
|
Т
|
Е
|
|
П
|
А
|
О
|
Л
|
Ь
|
|
*
|
*
|
*
|
*
|
*
|
*
|
|
|
|
|
|
|
|
|
|
В этот режим работы устройство автоматически,
если нажата управляющая клавиша ВВОД. Далее осуществляется вывод строки
«Введите пароль» на ЖКИ и ожидается нажатие клавиши. Далее вводим клавиши и
подтверждаем ввод кнопкой ВВОД. Если такой пароль существует, открывается
дверь. Если пароль не совпадает с зарегистрированными, то выдается сообщение об
ошибке. Если ввод неправильного пароля повторяется 3 раза, после третьего раза
выдается сообщение об ошибке и подается звуковой сигнал.
В
|
В
|
Е
|
Д
|
И
|
Т
|
Е
|
|
П
|
А
|
Р
|
О
|
Л
|
Ь
|
|
*
|
*
|
*
|
*
|
*
|
*
|
*
|
|
|
О
|
Ш
|
И
|
Б
|
К
|
А
|
Если введен мастер-пароль, можно редактировать
старые пароли или установить новое время. Выдается строка «Введите №». Дальше
ожидается нажатие клавиши.
Если нажата клавиша ОК, осуществляется установка
нового времени. Выводится сообщение «Введите время». После этого ждем нажатия
клавиш. Вводятся цифры нового времени, которые затем выводятся на ЖКИ с
символом «:»;
Если нажата одна из цифровых клавиш, начинается
процедура ввода нового пароля. Сначала выводится сообщение «Введите пароль» и
ожидается нажатие клавиш. Вводятся цифры нового пароля, которые затем
отображаются на ЖКИ.
ВВЕДИТЕПАРОЛЬ
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1
|
2
|
9
|
8
|
7
|
5
|
|
|
|
|
|
|
|
|
|
.3 Описание используемых процедур
Процедура-обработчик прерываний таймера.
В ней осуществляется проверка нажатия клавиши,
особенно контролируется нажатие управляющих клавиш ПАРОЛЬ и ОК, а также
осуществляем подсчет секунд, минут и часов.
Процедуры вывода сообщений: выводят сообщения на
ЖКИ ВВЕДИТЕ, НОВЫЙ, ПАРОЛЬ, ВРЕМЯ, ОШИБКА, ПОВТОРИТЕ.
Процедура вывода времени на ЖКИ: выводит текущее
время на ЖКИ.
Процедура вывода номера пароля и времени ввода
на ЖКИ. Процедура выводит на ЖКИ номер и время введенного ранее пароля.
Доступна, если набран мастер-пароль.
Процедура вывода на ЖКИ. Осуществляет вывод
данных, помещаемых в буфер на ЖКИ.
Процедура поиска пароля. Ищет пароль среди
известных 10 паролей. Одновременно проверяет введенный пароль на мастер пароль.
Если введен мастер-пароль, происходит переход в процедуру программирования.
Процедура программирования. Работает, если
введен мастер-пароль.
Позволяет редактировать уже введенные пароли,
устанавливать время, просматривать номера и время введенных ранее паролей.
После начала работы процедуры выводится
сообщение: введите номер. В зависимости от нажатой клавиши, будет выбран тот
или иной режим работы процедуры.
Если нажата клавиша ОК - осуществляется
установка нового времени.
Если нажата клавиша ПАРОЛЬ - мы может
просмотреть 10 ранее введенных паролей и время ввода.
Если нажата одна из цифровых клавиш - начитает
работать режим редактирования одного из ранее запрограммированных паролей.
Процедура инициализации.
В ней устанавливаются режимы работы таймерф,
инициализируется ЖКИ, показания часов устанавливаются в 00:00:00.
: procedure; /*пpоцедуpа
инициализации*/=00000001b;/*пеpвый pежим для 0 о таймеpа */=1;/*пpеpывание по
фpонту сигнала пеpеполнения*/,tl0=0;tr0=1; /*обнуляем счетчики и pазpешаем
pаботу 0 таймеpa*/=0;/*запускаем таймеp 0 и 1*/=1;/*pазpешаем пpеpывания Т0
T1*/=1;/*pазpешаем все пpеpывания*/=00111111b; st=0;/* скан 1 столбца*/
n_key=0; k_old=0;fl_ind=1;fl_p=1;=0;fl_r1=0;fl_r2=0;fl_r3=0;fl_r4=0;
flN=0;
/*инициализация ЖКИ*/
do
I=0 to
3;
rs=0;rw=1b;e=1b; call time(10);while
(p0 and 80h)<>0; end;=0; rs=0; rw=0; call time(10);=LCD_Ini(i);;
/*устаналиваем значения по умолчанию*/
chas=0;min=0;sek=0;
out_ind;init;
Листинг программы.:
do;
$include(reg812.dcl)
declare
/* объявление основных переменных и флагов
*/_vvedite(*) byte (42h,0b3h,65h,0e3h,0b8h,0bfh,65h,20h),/*стр Введите*/
str_time(*) byte
(0b3h,70h,65h,0bch,0c7h,20h),/*стр
время*/_nov(*)
byte(0bdh,6fh,0b3h,0c3h,0b9h,20h),/*стр
новый*/_parol(*)
byte(0a8h,61h,70h,6fh,0BBh,0c4h,20h),/*стр
пароль*/_ohibka(*)
byte (4fh,0c1h,0b8h,0b2h,0bah,61h,20h),/*стр
ошибка*/_povtor(*)
byte (0beh,0b3h,0bfh,0bfh,06fh,070h,0b8h,0bfh,65h,20h), /*стр
повторите*/_pasvord(10)byte
constant(1,9,4,6,2,0,2,4,3,8),/*пароль
программирования*/
pasv_buf(10),/*буфер введенного пароля*/(100)
byte,/* массив добавляемых паролей*/(75) byte, /*массив последних 10 введ
паролей*/ _Ini (*) byte constant(08h,02h,0fh,01h), /*команды инициализации
ЖКИ*/(56) bute ,/* содержимое индикатора */
(i,ip,jp,per,s,np,st,timN,nreg,pl) byte,/*
переменные для работы */
(flag,fl_p,flH,fl_key,fl_pasv,fl_ok,fl_ind)
byte,/*флаги определения режима работы */_key byte, /*номер нажатой клавиши */
(k1_old) byte,/*номер последней нажатой клавиши
*/
(sek,min,chas) word;/*секунды,минуты и часы*/
/*пеpеименование pазpядов поpта */rs literally
'P3.0',/* RS линия связи с LCD*/
rw literally 'P3.1',/*RW линия
связи
с
LCD*/literally ‘P3.2’;_int: procedure interrupt 1; /*---Обработчик
прерывания
таймера---------------*/
if st=0 then P2=10111111; /*установка
сканируемого столбца*/
if st=1 then P2=11011111;st=2 then
P2=11101111;st=3 then P2=11110111;st=4 then do; /*если
нет
нажат
клавиш
сброс
флага
нажатия
иначе
утанавливаем
*/n_key=0 then do; fl_key=0;key_old=0;end
else key_old=n_key;/*предшеств
кл
*/ =0; n_key=0;; st=st+1;
/*блок
проверки
нажатия
клавиш*/(p2.0=0b)
then do n_key=st*3+1; fl_key=1; end;(p2.1=0b) then do n_key=st*3+2; fl_key=1;
end;(p2.2=0b) then do n_key=st*3+3; fl_key=1; end;
if fl_key=1 then do/*обработка нажатий на
определенныке клавиши*/
if
(n_key=11)and(n_key<>key_old) then fl_pasv=1;/*флаг
ввода
пароля
на
вход*/(n_key=12)and(n_key<>key_old)
then fl_ok=1;/*флаг установки
подтверждения*/
end; =per+1; /* увеличиваем счетчик переполнений
*/
if per>=15 then do; /*отсчет
времени*/
per=0;sek=sek+1;/*отсчет секунд*/
if sek>=60 then do;
min=min+1;sek=0;/*минут*/min=60
then do; chas=chas+1; if chas=24 then chas=0;end;end;/*часов*/
flag=1;/*флаг необходимости обновления
изображения индикатора*/;=0; /* сброс флага переполнения */
end timer_int;_ind:procedure; /* вывод
Введите*/=0;j=1;
do while str_vvedite(i)<>20h; ind(j)=str_vvedite(i);=i+1;j=j+1;end;
ind(j)=20h;j=j+1;vvod_ind;_ind:procedure; /* вывод
новый*/=0;
do while str_nov(i)<>20h; ind(j)=str_nov(i);=i+1;j=j+1;end;
ind(j)=20h;j=j+1;nov_ind;_ind:procedure; /* вывод
пароль*/=0;do
while str_parol (i)<>20h;
ind(j)=str_parol(i);=i+1;j=j+1;end;ind(j)=20h;j=j+1;parol_ind;_ind:procedure;
/* вывод
Ошибка*/=0;
do while str_ohibka(i)<>20h;ind(j)=str_ochibka
(i);=i+1;j=j+1;end;ind(j)=20h;j=j+1;ohibka_ind;_ind:procedure; /* вывод
Ошибка*/=0;
do while
str_povtor(i)<>20h;ind(j)=str_povtor(i);=i+1;j=j+1;end;ind(j)=20h;j=j+1;povtor_ind;:procedure;/*вывод
ВРЕМЯ*/=0;
do while
str_time(i)<>20h;ind(j)=str_time(i);=i+1;j=j+1;end;ind(j)=20h;j=44;time
;_ind:procedure; /* вывод времени*/=5;
call time;(j)=(chas/10)+30h;ind(j+1)=(chas mod 10)+30h;
ind(j+2)=0d0h;(j+3)=(min/10)+30h;ind(j+4)=(min mod 10)+30h; ind(j+5)=0d0h;(j+6)=(sek/10)+30h;ind(j+7)=(sek
mod 10)+30h;j=j+7; out_ind;time_ind;
timep_ind:procedure;/*выводим номер и время
введенного пароля*/
ind(j)=pl+30h;ind(j+1)=2dh;(j+2)=(reg(pl+1)/10)+30h;ind(j+3)=(reg(pl+1)
mod 10)+30h; ind(j+4)=0d0h;(j+5)=(min/10)+30h;ind(j+6)=(min mod 10)+30h;
out_ind;timep_ind;_ind: procedure; /*вывод
буфера
на
жки*/time(20);rs,rw=0;
P0=1;/*очистка
ЖКИ*/I=0
to 55; =0;rw=1;e=1b;P0=0ffhwhile (P0 and 80h)<>0; end;=1; rw=0;call
time(20);=Ind(i); e=0;call time(20); end; I=0 to 55; ind(i)=20h;end;/*очистка
буфера
индикатора*/
end out_ind;
/*процедурa поиска введенногo
пароля*/_pasv:procedure;_p=0;Ip=0;/*флаг перехода в режим программирования*/
do while (Ip<=9) and
(pasv_buf(ip)=master_pasvord(ip));
ip=ip+1;end;Ip=9 then call progr;/*введен пароль
программирования, вызов процедуры */
/*программирования*/ =0;jp=0;np=12;nr=0;nr=0 to
9;/*проверяем весь массив паролейip=0 to 9;/*сравниваем введенный пароль с
установленными*/
do while (Ip<=9) and
(pasv_buf(ip)=pasv(ip));
ip=ip+1;end;Ip=9 then np=nr;/*введеный пароль
совпадает с записанным по номеру nr*/
end;;poisk_pasv;
progr:procedure;/*программирование нового
пароля*/
call vvod_ind;ind(j)=4eh;call
out_ind;/*Выводим строку
Ведите№*/
do while n_key<>0;end;/*ждем отпускания
клавиши*/
do while n_key=0;end; /*ждем
нажатия
клавиши*/
if (n_key=12) then do;/*установка параметров
времени*/
call vvod_ind; call time;j=44;call
out_ind; /*выводим строку
введите
время*/ip=0
to 5;while n_key<>0;end;/*ждем
отпускания
клавиши*/while
n_key=0;end;n_key=10 then n_key=0;_buf(ip)=n_key;ind(j+ip)=n_key+30h;call
out_ind;/* ввод инф
и
выв
на
индикатор*/;=
rol(pasv_buf(0),4)+ pasv_buf(1);/*устанавливаем
часы*/
min= rol(pasv_buf(2),4)+
pasv_buf(3);/*устанавливаем минуты секунды*/= rol(pasv_buf(4),4)+
pasv_buf(5);/*устанавливаем часы*/
end;progr;(n_key=11) then do;/*просмотр
лога
введенных
паролей*/
do while n_key<>12;/*пока не нажат ОК
можем просматривать лог*/
call vvod_int; ind(j)=4eh;j=41; call
out_ind; /*выводим строку
введите
N*/
do while n_key<>0;end;/*ждем отпускания
клавиши*/
do while n_key=0;end;n_key=10 then
do; pl=n_key; call timep; end;;progr;
n_key<11 then do;/*ввод
пароля*/=0;vvod_ind;call
parol_ind; out_ind;/* выводим
строку
введите
пароль*/while
(ip<10)and(n_key<>12);/*цикл
ввода
пароля*/
do while n_key<>0;end;/*ждем отпускания
клавиши*/ while n_key=0;end;/*ждем нажатия следующей клавиши*/
if n_key=10 then
n_key=0;_buf(ip)=n_key;ind(j+ip)=n_key+30h;call out_ind;/* ввод
инф
и
выв
на
индикатор*/;;progr;:
procedure; /*пpоцедуpа
инициализации*/
tmod=00010001b;/*пеpвый pежим для 0 и 1 го
таймеpа */=1;/*пpеpывание по фpонту сигнала пеpеполнения*/,tl0=0;tr0=1;
/*обнуляем счетчики и pазpешаем pаботу 0 таймеpa*/=0;/*запускаем таймеp 0 и
1*/=1;/*pазpешаем пpеpывания Т0 T1*/=1;/*pазpешаем все пpеpывания*/=00111111b;
st=0;/* скан 1 столбца*/
n_key=0;
k_old=0;fl_ind=1;fl_p=1;=0;fl_r1=0;fl_r2=0;fl_r3=0;fl_r4=0; flN=0;
/*инициализация ЖКИ*/
do
I=0 to
3;
rs=0;rw=1b;e=1b; call time(10);while
(M and 80h)<>0; end;=0; rs=0; rw=0; call time(10);=LCD_Ini(i);;
/*устаналиваем значения по умолчанию*/
chas=0;min=0;sek=0;
out_ind;init;
/*Tело
основной
программы
*/init;while 1;=0; while flag=0; end;/*ждем
пока
не
пройдет
секунда*/time_ind;
/*Строка
Время
12:19:33 */n_key=11 then do; ip=0;vvod_ind;call parol_ind; out_ind;/* выводим
строку
введите
пароль*/while
(ip<10)and(n_key<>12);/*цикл
ввода
пароля*/
do while n_key<>0;end;/*ждем отпускания
клавиши*/ while n_key=0;end;/*ждем нажатия следующей клавиши*/
if n_key=10 then
n_key=0;_buf(ip)=n_key;ind(j+ip)=23h;/* ввод
инф
и
выв
на
индикатор
#####*/;out_ind;poisk_pasv;/*проверяем
пароль
*/
if np<11 then p3.3=1 /*открываем замок */
else do;j=0;call ohibka;call
povtor;call out_ind;end;/*сообщаем
об
ошибке*/
n=n+3;if n>29 then n=0;/*увеличиваем и
проверяем указатель лога*/
End;
;start;