Автор работы: Пользователь скрыл имя, 09 Сентября 2011 в 08:05, курсовая работа
В курсовой работе разрабатывается калькулятор на выполнение арифметических функций («+», «-», «*», «/») в 16-ой системе. В работе использовались прерывания от последовательного порта и таймера. Работа выполняется на системе “прототип” на основе микроконтроллера 51 семейства.
1. Техническое задание
2. Анализ технического задания
3. Алгоритм основной программы
4. Алгоритмы обработчиков прерываний
4.1 Алгоритм обработчика com порта
4.2 Алгоритм обработчика прерываний от таймера T2
5. Основная программа
6. Программа прерывания от клавиатуры ПК
7. Программа прерывания от матричной клавиатуры
8. Заключение
9. Литература
Кафедра
«Информационно-
Курсовая
работа
на тему:
«Калькулятор
на основе микропроцессора»
по дисциплине:
«Микропроцессорные
системы»
Москва 2008 г.
Аннотация
В
курсовой работе разрабатывается калькулятор
на выполнение арифметических функций
(«+», «-», «*», «/») в 16-ой системе. В работе
использовались прерывания от последовательного
порта и таймера. Работа выполняется на
системе “прототип” на основе микроконтроллера
51 семейства.
Содержание
1. Техническое задание
Написать программу для микропроцессора семейства 51, имеющую следующие функции:
2. Анализ технического
задания
В соответствии с техническим заданием устройство должно выполнять арифметические операции над введенными числами. Поэтому выделим два регистра ОЗУ для хранения введенных чисел:
Основная программа инициализирует прерывания с последовательного порта и таймера, после чего переходит в режим «холостого хода», ожидая следующие события:
Предусмотрены прерывания с последовательного порта P1, которые опрашивают матричную клавиатуру. При каждом прерывании соответствующее число записывается в регистры, выделенные для хранения этих чисел. Также предусмотрены прерывания с порта SBUF. При каждом прерывании выполняется соответствующая арифметическая операция над числами, хранящимися в регистрах, или происходит обнуление всех регистров и перевод каретки.
3. Алгоритм
основной программы
5. Основная программа
org 8000h
ljmp MAIN
org 8023h ;handler for COM-port **********
ljmp COM_PORT_HANDLER ; установка обработчика
org 8033h; P1.0
ljmp HNDL_P1
org 803Bh; P1.1
ljmp HNDL_P1
org 8043h; P1.2
ljmp HNDL_P1
org 804Bh; P1.3
ljmp HNDL_P1
MAIN:
clr TI
clr RI
TM2IR equ 0C8h;interrupt flag register
IEN1 equ 0E8h;T2 interrupt enable register;
TM2CON equ 0EAh;T2 config register;
IP1 equ 0F8h ;interrupt priority
CTCON equ 0EBh; capture control
mov IEN1, #0Fh
mov CTCON, #10101010b ;falling 0-3 bits in P1 if interupt occured
;mov TM2IR, #00Fh;enable T2 capture register (for P1)
mov TM2CON, #00000011b; Timer T2 mode select ;;;;;?
mov IP1, #00h
mov P1, #0Fh
mov 08H, #00H
setb IE.7;enable interrupt; checking разрешаем прерывания
setb IE.4;enable interrupt from COM - port
LOOP:
nop
jmp LOOP
ret
SLEEP:
mov R2, #100d
FOR1:
mov R1, #255d
FOR2:
djnz R1, FOR2
djnz R2, FOR1
ret
WAIT_TI:
WAITTI:
jnb TI, WAITTI
ret
VIVOD_FIRST_NUM:
mov R7, A
anl A, #11110000b
cjne A, #00000000b, VFN
jmp END_VFN
VFN:
swap A
add A, #30h
mov SBUF, A
call WAIT_TI
call SLEEP
END_VFN:
mov A, R7
ret
VIVOD_SECOND_NUM:
mov R7, A
anl A, #00001111b
add A, #30h
mov SBUF, A
call WAIT_TI
call SLEEP
mov A, R7
ret
VIVOD_FIRST_HEX:
mov R7, A
anl A, #11110000b
cjne A, #00000000b, VFH
jmp END_VFH
VFH:
swap A
add A, #37h
mov SBUF, A
call WAIT_TI
call SLEEP
END_VFH:
mov A, R7
ret
VIVOD_SECOND_HEX:
mov R7, A
anl A, #00001111b
add A, #37h
mov SBUF, A
call WAIT_TI
call SLEEP
mov A, R7
ret
end
6. Программа
прерывания от клавиатуры
ПК
;;;;;;;;;;;;;;;;;;;;;;;;;
COM_PORT_HANDLER: ; ****
jnb RI, OUT
GO:
jmp GO_
OUT:
jmp END_LST_KBD_PC
GO_:
mov A, SBUF
;;;;;;;;;;;;;;;;;;;;;;;;;
cjne A, #2bh, MINUS
mov SBUF, A
call WAIT_TI
call SLEEP
clr RI
mov SBUF, #'='
call WAIT_TI
call SLEEP
mov A, R3
clr C
addc A, R4
jnc NON_VIVOD_C
mov SBUF, #'1'
call WAIT_TI
call SLEEP
NON_VIVOD_C:
;;;;;;;;;;;;;;;;;;;;;;;;;
mov R0, A
anl A, #11110000b
swap A
subb A,#0ah
mov A, R0
jc VIVOD_CIFRA1
call VIVOD_FIRST_HEX
call WAIT_TI
call SLEEP
jmp VTORAYA_CIFRA
VIVOD_CIFRA1:
call VIVOD_FIRST_NUM
call WAIT_TI
call SLEEP
clr C
;;;;;;;;;;;;;;;;;;;;;;;;;
VTORAYA_CIFRA:
mov R0, A
anl A, #00001111b
subb A,#0ah
mov A, R0
jc VIVOD_CIFRA2
call VIVOD_SECOND_HEX
call WAIT_TI
call SLEEP
jmp END_LST_KBD_PC
VIVOD_CIFRA2:
call VIVOD_SECOND_NUM
call WAIT_TI
call SLEEP
clr C
MINUS:
;;;;;;;;;;;;;;;;;;;;;;;;;
cjne A, #2dh, UMNOJ
mov SBUF, A
call WAIT_TI
call SLEEP
clr RI
mov SBUF, #'='
call WAIT_TI
call SLEEP
mov A, R3
clr C
subb A, R4
jnc MINUS_NON_VIVOD_C
MINUS_NON_VIVOD_C:
;;;;;;;;;;;;;;;;;;;;;;;;;
mov R0, A
anl A, #11110000b
swap A
subb A,#0ah
mov A, R0
jc MINUS_VIVOD_CIFRA1
call VIVOD_FIRST_HEX
call WAIT_TI
call SLEEP
jmp MINUS_VTORAYA_CIFRA
MINUS_VIVOD_CIFRA1:
call VIVOD_FIRST_NUM
call WAIT_TI
call SLEEP
clr C
;;;;;;;;;;;;;;;;;;;;;;;;;
MINUS_VTORAYA_CIFRA:
mov R0, A
anl A, #00001111b
subb A,#0ah
mov A, R0
jc MINUS_VIVOD_CIFRA2
call VIVOD_SECOND_HEX
call WAIT_TI
call SLEEP
jmp END_LST_KBD_PC