Калькулятор на основе микропроцессора

Автор работы: Пользователь скрыл имя, 09 Сентября 2011 в 08:05, курсовая работа

Описание

В курсовой работе разрабатывается калькулятор на выполнение арифметических функций («+», «-», «*», «/») в 16-ой системе. В работе использовались прерывания от последовательного порта и таймера. Работа выполняется на системе “прототип” на основе микроконтроллера 51 семейства.

Содержание

1. Техническое задание
2. Анализ технического задания
3. Алгоритм основной программы
4. Алгоритмы обработчиков прерываний
4.1 Алгоритм обработчика com порта
4.2 Алгоритм обработчика прерываний от таймера T2
5. Основная программа
6. Программа прерывания от клавиатуры ПК
7. Программа прерывания от матричной клавиатуры
8. Заключение
9. Литература

Работа состоит из  1 файл

Калькулятор на основе микропроцессора.doc

— 102.50 Кб (Скачать документ)

     Кафедра

     «Информационно-коммуникационные технологии» 
 
 
 

     Курсовая  работа 

     на  тему:

     «Калькулятор  на основе микропроцессора» 

     по  дисциплине:

     «Микропроцессорные  системы» 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

     Москва 2008 г.

 

      Аннотация 

     В курсовой работе разрабатывается калькулятор на выполнение арифметических функций («+», «-», «*», «/») в 16-ой системе. В работе использовались прерывания от последовательного порта и таймера. Работа выполняется на системе “прототип” на основе микроконтроллера 51 семейства. 

 

      Содержание

 

      1. Техническое задание 

     Написать  программу для микропроцессора семейства 51, имеющую следующие функции:

  1. Ввод чисел с последовательного порта
  2. Ввод с клавиатуры арифметических операций(«+», «-», «*», «/») и сброс
  3. Вывод результата арифметических операций на монитор компьютера

 

      2. Анализ технического задания 

     В соответствии с техническим заданием устройство должно выполнять арифметические операции над введенными числами. Поэтому выделим два регистра ОЗУ для хранения введенных чисел:

  • N1 – для хранения первого числа
  • N2 – для хранения второго числа

     Основная  программа инициализирует прерывания с последовательного порта и  таймера, после чего переходит в  режим «холостого хода», ожидая следующие  события:

  • Ввод символов с порта P1
  • Ввод символов с порта SBUF

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

 

      3. Алгоритм основной программы 

     

 

      4. Алгоритмы  обработчиков прерываний

     4.1 Алгоритм обработчика  com порта

 

     

 

      4.2 Алгоритм  обработчика прерываний  от таймера T2

 

     

 

      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. Программа прерывания от клавиатуры ПК 

     ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KEYBOARD-PC COMPLITE

     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:

     ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;PERVAYA_CIFRA

     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

     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:

     ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;PERVAYA_CIFRA

     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

     ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;VTORAYA_CIFRA

     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

Информация о работе Калькулятор на основе микропроцессора