Микропроцессорный контроллер кодового замка. Техническое задание. Краткое описание микроконтроллера. 1 Общее описание микроконтроллера
Скачать 84.68 Kb.
|
СОДЕРЖАНИЕ 1. Техническое задание . Краткое описание микроконтроллера .1 Общее описание микроконтроллера .2 Порты ввода-вывода .3 Разработка структурно-функциональной схемы . Функциональная схема устройства .1 Выбор элементной базы .2 Описание алгоритма программы .3 Используемые процедуры .4 Листинг программной части 1. Техническое задание Целью данной курсовой работы является разработка схемы устройства - «Микропроцессорный контроллер кодового замка» с использованием микроконтроллера. Разрабатываемое устройство будет иметь следующие возможности: в дежурном режиме устройство работает как часы, отображая текущее время. в режиме замка устройство позволяет по паролю осуществлять открытие дверей, если введенный пароль верен для соответствующей двери. Если введенный пароль не верный, то на ЖКИ выдается сообщение: ошибка. Если неправильный пароль вводится 3 раза, срабатывает сигнализация. режим программирования: при вводе мастер-пароля можно 1) редактировать пароли; 2) просмотреть информацию о последних введенных паролях и времени ввода пароля; 3) устанавливать новое время. 2. Краткое описание микроконтроллера .1 Описание микроконтроллера Восьмиразрядный высокопроизводительный однокристальный микроЭВМ КР1816ВЕ51 выполнен по высококачественной n-МОП технологии. Содержит масочно-программирумое в процессе изготовления кристалла ПЗУ памяти программ емкостью 4096 байт и рассчитан на применение в массовой продукции. ОМЭВМ содержат следующие узлы: центральный восьмиразрядный процессор; память программ объемом 4 Кбайт; память данных объемом 128 байт; четыре восьмиразрядных програмируемых канала ввода-вывода; два 16-битовых многореиных таймера-счетчика; систему прерываний с пятью векторами и двумя уровнями; последовательный интерфейс; тактовый генератор.
Организация памяти. Память данных предназначена для приема, хранения и выдачи информации, используемой в процессе выполнения программы. Память данных, расположенная на кристалле ОМЭВМ, состоит из регистра адреса ОЗУ, дешифратора, ОЗУ и указателя стека. Регистр адреса ОЗУ предназначен для приема и хранения адреса выбираемой с помощью дешифратора ячейки памяти, которая может содержать как бит, так и байт информации. ОЗУ представляет собой 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 Описание алгоритма программы ) Дежурный режим.
В дежурном режиме (пока не нажата клавиша) работы устройства на ЖКИ отображается текущее время. ) Режим ввода пароля.
В этот режим работы устройство автоматически, если нажата управляющая клавиша ВВОД. Далее осуществляется вывод строки «Введите пароль» на ЖКИ и ожидается нажатие клавиши. Далее вводим клавиши и подтверждаем ввод кнопкой ВВОД. Если такой пароль существует, открывается дверь. Если пароль не совпадает с зарегистрированными, то выдается сообщение об ошибке. Если ввод неправильного пароля повторяется 3 раза, после третьего раза выдается сообщение об ошибке и подается звуковой сигнал.
Если введен мастер-пароль, можно редактировать старые пароли или установить новое время. Выдается строка «Введите №». Дальше ожидается нажатие клавиши.
Если нажата клавиша ОК, осуществляется установка нового времени. Выводится сообщение «Введите время». После этого ждем нажатия клавиш. Вводятся цифры нового времени, которые затем выводятся на ЖКИ с символом «:»;
Если нажата одна из цифровых клавиш, начинается процедура ввода нового пароля. Сначала выводится сообщение «Введите пароль» и ожидается нажатие клавиш. Вводятся цифры нового пароля, которые затем отображаются на ЖКИ.
.3 Описание используемых процедур Процедура-обработчик прерываний таймера. В ней осуществляется проверка нажатия клавиши, особенно контролируется нажатие управляющих клавиш ПАРОЛЬ и ОК, а также осуществляем подсчет секунд, минут и часов. Процедуры вывода сообщений: выводят сообщения на ЖКИ ВВЕДИТЕ, НОВЫЙ, ПАРОЛЬ, ВРЕМЯ, ОШИБКА, ПОВТОРИТЕ. Процедура вывода времени на ЖКИ: выводит текущее время на ЖКИ. Процедура вывода номера пароля и времени ввода на ЖКИ. Процедура выводит на ЖКИ номер и время введенного ранее пароля. Доступна, если набран мастер-пароль. Процедура вывода на ЖКИ. Осуществляет вывод данных, помещаемых в буфер на ЖКИ. Процедура поиска пароля. Ищет пароль среди известных 10 паролей. Одновременно проверяет введенный пароль на мастер пароль. Если введен мастер-пароль, происходит переход в процедуру программирования. Процедура программирования. Работает, если введен мастер-пароль. Позволяет редактировать уже введенные пароли, устанавливать время, просматривать номера и время введенных ранее паролей. После начала работы процедуры выводится сообщение: введите номер. В зависимости от нажатой клавиши, будет выбран тот или иной режим работы процедуры. Если нажата клавиша ОК - осуществляется установка нового времени. Если нажата клавиша ПАРОЛЬ - мы может просмотреть 10 ранее введенных паролей и время ввода. Если нажата одна из цифровых клавиш - начитает работать режим редактирования одного из ранее запрограммированных паролей. Процедура инициализации. В ней устанавливаются режимы работы таймерф, инициализируется ЖКИ, показания часов устанавливаются в 00:00:00. 3.4 Листинг : 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;/*сообщаем об ошибке*/ I=1 to 12; call time(255);end;/*удержание паузы 3 сек*/.3=0;/*закрытие замка (n)=np;reg(n+1)=chas;reg(n+2)=min;/* фиксируем лог N, часы,мин*/ n=n+3;if n>29 then n=0;/*увеличиваем и проверяем указатель лога*/ End; ;start;11>11> |