Язык C - универсальный язык программирования, который обеспечивает эффективность кода, элементы структурного программирования и имеет богатый набор операторов. Универсальность, отсутствие ограничений реализации делают язык C удобным и эффективным средством программирования для широкого разнообразия задач. Множество прикладных программ может быть написано легче и эффективнее на языке C, чем на других более специализированных языках.
C51 - полная реализация стандарта ANSI (Американского национального института стандартов), насколько это возможно для архитектуры Intel 8051. C51 генерирует код для всего семейства микроконтроллеров Intel 8051. Транслятор сочетает гибкость программирования на языке C с эффективностью кода и быстродействием ассемблера.
Использование языка высокого уровня C имеет следующие преимущества над программированием на ассемблере:
· не требуется глубокого знания системы команд процессора, элементарное знание архитектуры Intel 8051 желательно, но не необходимо;
· распределение регистров и способы адресации управляются полностью транслятором;
· обеспечивается лучшая читаемость программы, т.к. используются ключевые слова и функции, которые более свойственны человеческой мысли;
· сокращается время разработки и отладки программ в сравнении с программированием на ассемблере;
· наличие библиотечных файлов со стандартными подпрограммами, которые могут быть включены в прикладную программу;
· существующие программы могут многократно использоваться в новых программах, используя модульные методы программирования.
Ассемблер A51 совместим с ASM51 Intel для всего семейства микроконтроллеров Intel 8051. Ассемблер транслирует символическую мнемонику в перемещаемый объектный код, имеющий высокое быстродействие и малый размер. Макросредства ускоряют разработку и экономят время, поскольку общие последовательности могут быть разработаны только один раз. Ассемблер поддерживает символический доступ ко всем элементам микроконтроллера и перестраивает конфигурацию для каждой разновидности Intel 8051.
A51 транслирует исходный файл ассемблера в перемещаемый объектный модуль. При отладке или при включенной опции “Includedebugginginformation” этот объектный файл будет содержать полную символическую информацию для отладчика/имитатора или внутрисхемного эмулятора.
Компоновщик объединяет один или несколько объектных модулей в одну исполняемую программу. Компоновщик размещает внешние и общие ссылки, назначает абсолютные адреса перемещаемым сегментам программ. Он может обрабатывать объектные модули, созданные транслятором C51, ассемблером A51, транслятором PL/M-51 Intel и ассемблером ASM51 Intel.
Компоновщик автоматически выбирает соответствующие библиотеки поддержки и связывает только требуемые модули из библиотек. Установки по умолчанию для L51 выбраны так, чтобы они подходили для большинства прикладных программ, но можно определить и заказные установки.
Отладчик/симулятор используется с транслятором C51, ассемблером A51, транслятором PL/M-51 Intel и ассемблером ASM51 Intel. Отладчик/симулятор позволяет моделировать большинство особенностей Intel 8051 без наличия аппаратных средств. Можно использовать его для проверки и отладки прикладной программы прежде, чем будут изготовлены аппаратные средства. При этом моделируется широкое разнообразие периферийных устройств, включая последовательный порт, внешний ввод - вывод и таймеры [6].
Внешний вид главного окна программы представлен на рисунке 5.1.
Рисунок 5.1 – Внешний вид главного окна ProView
В данной работе была осуществлена разработка электронного кодового замка, предназначенного для установки на наружную дверь жилого дома.
В ходе выполнения работы был проведён анализ задачи, на основе которого были сформулированы требования к конечной системе. На основе требований была построена структурная схема. На основании структурной схемы были подобраны соответствующие устройства для реализации функций, возложенных на элементы системы. Исходя из экономических и эксплуатационных соображений, для данного устройства был выбран микроконтроллер AT89S51 фирмы Atmel. Особенностью данного замка является наличие звуковой сигнализации, оповещающей владельца о попытке подбора кода. Далее, с использованием выбранных устройств была построена функциональная схема. Разработка завершилась составлением блок-схемы алгоритма и написанием исходного кода программы для микроконтроллера.
1. Описания электронных компонентов в каталоге товаров оптовой базы комплектации электронных компонентов и приборов “ПЛАТАН”:
http://www.platan.ru/
2. Описание электромеханического замка ПОЛИС-13:
http://dialog-universal.ru/product_info.php?cPath=109&products_id=173
3. Описание клавиатуры AK-207 на сайте компании Accord: http://www.accordia.com.tw/html/general.htm
4. Описание микроконтроллера AT89S51 на сайте компании Atmel: http://www.atmel.com/dyn/resources/prod_documents/doc2487.pdf
5. Описание микроконтроллера AT89S51: http://www.gaw.ru/html.cgi/txt/ic/Atmel/micros/mcs51/at89s51.htm
6. В.Б. Бродин. Микроконтроллеры: архитектура, программирование, интерфейс: – М.: ЭКОМ, 1999.
7. П. Хоровиц, У. Хилл. Искусство схемотехники М. Мир, 2003.
dseg
door_codeequr0 ;массив введённых значений
attemptsequ 38h ;переменная – число попыток ввода
cseg
org 00h
ajmp main
org 0bh
ajmp timer0
org 100h
main:
anlp2,#1h ;выключение светодиода и динамика
movie,#82h ;разрешаем прерывания от таймера
movtmod,#1h ;задаём режим таймера – 16 бит
movdoor_code,#30h ;задание адреса для вводимых цифр кода
movattempts,#3h ;количество попыток
sjmpent1 ;переход к началу главного цикла
enter_digit: ;обработка введённого значения
mov @door_code,a ;запоминаем цифру
incdoor_code ;переходим к след. адресу
mov a,door_code
call delay2
cjnea,#36h,ent1 ;проверяем,все ли цифры введены (из 6)
ajmpcompare ;переход к сравнению кодов
ent0: ;ввод 0
mov p0,#0f7h
jb p0.5,ent1
call delay2
mov a,#0h
wait0:
jnb p0.5,wait0
ajmp enter_digit
ent9: ;ввод 9
jb p0.6,ent0
call delay2
mov a,#9h
wait9:
jnb p0.6,wait9
ajmp enter_digit
ent1: ;ввод 1
movp0,#0feh ;устанавливаем 0 на выходе P0.0
jbp0.4,ent2 ;если не нажата кнопка, к след. кнопке
calldelay2 ;ждём, пока пройдёт дребезг контактов
mova,#1h ;запоминаем введённую цифру
wait1:
jnbp0.4,wait1 ; ждём, пока отпустят кнопку
ajmpenter_digit ;переход к обраб. введённого значения
ent2: ;ввод 2
jb p0.5,ent3
call delay2
mov a,#2h
wait2:
jnb p0.5,wait2
ajmp enter_digit
ent3: ;ввод 3
jb p0.6,ent4
call delay2
mov a,#3h
wait3:
jnb p0.6,wait3
ajmp enter_digit
ent4: ;ввод 4
mov p0,#0fdh
jb p0.4,ent5
call delay2
mov a,#4h
wait4:
jnb p0.4,wait4
ajmp enter_digit
ent5: ;ввод 5
jb p0.5,ent6
call delay2
mov a,#5h
wait5:
jnb p0.5,wait5
ajmp enter_digit
ent6: ;ввод 6
jb p0.6,ent7
call delay2
mov a,#6h
wait6:
jnb p0.6,wait6
ajmp enter_digit
ent7: ;ввод 7
mov p0,#0fbh
jb p0.4,ent8
call delay2
mov a,#7h
wait7:
jnb p0.4,wait7
ajmp enter_digit
ent8: ;ввод 8
jb p0.5,ent9
call delay2
mov a,#8h
wait8:
jnb p0.5,wait8
ajmp enter_digit
code_wrong: ;обработка неверного кода
movdoor_code,#30h ;возвращаемся к началу массива
djnzattempts,ent1 ;если есть ещё попытки, в гл. цикл
setbp2.1 ;включение звукового сигнала
calldelay ;задержка 1 с
clrp2.1 ;выключение звукового сигнала
movattempts,#4h ;восстан. число попыток
jmp code_wrong
compare: ;сравнениекодов
decdoor_code ;переходим к предыдущей цифре
cjne @door_code,#6h,code_wrong;проверяем 6-ю цифру и далее все
decdoor_code ;цифры по порядку
cjne @door_code,#5h,code_wrong
dec door_code
cjne @door_code,#4h,code_wrong
dec door_code
cjne @door_code,#3h,code_wrong
dec door_code
cjne @door_code,#2h,code_wrong
dec door_code
cjne @door_code,#1h,code_wrong
clrp2.0 ;открыть замок
setbp2.2 ;включить светодиод
movattempts,#3h ;восстан. кол-во попыток
wait_open:
jnbp0.7,wait_open ;ждём, пока откроется дверь
call delay2
wait_close:
jb p0.7,wait_close ;ждём, показакроетсядверь
setbp2.0 ;закрыть замок
clrp2.2 ;выключить светодиод
ajmpent1 ;переход в гл. цикл
timer0: ;обработка прерывания от T0
clrtcon.4
clr tcon.5
reti
delay: ;задержка 1 с
movr1,#1fh
loop1:
mov th0,#0h
mov tl0,#0h
setb tcon.4
loop2:
jb tcon.4,loop2
djnz r1,loop1
ret
delay2: задержка 5 мс
mov r3,#13h
loop4:
mov r2,#0ffh
loop3:
djnz r2,loop3
djnz r3,loop4
ret
end