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

     Кафедра

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

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

     на  тему:

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

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

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

     Москва 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

     MINUS_VIVOD_CIFRA2:

     call VIVOD_SECOND_NUM

     call WAIT_TI

     call SLEEP

     clr C

     UMNOJ:

     ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  ******************  ;;;;;;;;;;;;;;;;;;;

     cjne A, #2ah, GO_DIV

     jmp GO_UMNOJ

     GO_DIV:

     jmp DIVDIV

     GO_UMNOJ:

     mov SBUF, A

     call WAIT_TI

     call SLEEP

     clr RI

     mov SBUF, #'='

     call WAIT_TI

     call SLEEP

     mov A, R3

     mov B, R4

     mul AB

     ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;BBBBBBBBBBBB

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

     mov R3, A

     mov R4, B

     mov A, B

     mov R0, A

     anl A, #11110000b

     swap A

     subb A,#0ah

     mov A, R0

     jc UMNOJ_VIVOD_CIFRA1_A

     call VIVOD_FIRST_HEX

     call WAIT_TI

     call SLEEP

     jmp UMNOJ_VTORAYA_CIFRA_A

     UMNOJ_VIVOD_CIFRA1_A:

     call VIVOD_FIRST_NUM

     call WAIT_TI

     call SLEEP

     clr C

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

     UMNOJ_VTORAYA_CIFRA_A:

     mov R0, A

     anl A, #00001111b

     subb A,#0ah

     mov A, R0

     jc UMNOJ_VIVOD_CIFRA2_A

     call VIVOD_SECOND_HEX

     call WAIT_TI

     call SLEEP

     jmp VIVOD_A

     UMNOJ_VIVOD_CIFRA2_A:

     call VIVOD_SECOND_NUM

     call WAIT_TI

     call SLEEP

     VIVOD_A:

     mov A, R3

     ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAAAAAAAAAA

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

     mov R0, A

     anl A, #11110000b

     swap A

     subb A,#0ah

     mov A, R0

     jc UMNOJ_VIVOD_CIFRA1

     call VIVOD_FIRST_HEX

     call WAIT_TI

     call SLEEP

     jmp UMNOJ_VTORAYA_CIFRA

     UMNOJ_VIVOD_CIFRA1:

     call VIVOD_FIRST_NUM

     call WAIT_TI

     call SLEEP

     clr C

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

     UMNOJ_VTORAYA_CIFRA:

     mov R0, A

     anl A, #00001111b

     subb A,#0ah

     mov A, R0

     jc UMNOJ_VIVOD_CIFRA2

     call VIVOD_SECOND_HEX

     call WAIT_TI

     call SLEEP

     jmp END_LST_KBD_PC

     UMNOJ_VIVOD_CIFRA2:

     call VIVOD_SECOND_NUM

     call WAIT_TI

     call SLEEP

     DIVDIV:

     ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  ///////////////////////  ;;;;;;;;;;;;;;;;;;;

     cjne A, #2fh, NULL

     mov SBUF, A

     call WAIT_TI

     call SLEEP

     clr RI

     mov SBUF, #'='

     call WAIT_TI

     call SLEEP

     mov A, R3

     mov B, R4

     div AB

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

     mov R0, A

     anl A, #11110000b

     swap A

     subb A,#0ah

     mov A, R0

     jc DIV_VIVOD_CIFRA1

     call VIVOD_FIRST_HEX

     call WAIT_TI

     call SLEEP

     jmp DIV_VTORAYA_CIFRA

     DIV_VIVOD_CIFRA1:

     call VIVOD_FIRST_NUM

     call WAIT_TI

     call SLEEP

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

     DIV_VTORAYA_CIFRA:

     mov R0, A

     anl A, #00001111b

     subb A,#0ah

     mov A, R0

     jc DIV_VIVOD_CIFRA2

     call VIVOD_SECOND_HEX

     call WAIT_TI

     call SLEEP

     jmp END_LST_KBD_PC

     DIV_VIVOD_CIFRA2:

     call VIVOD_SECOND_NUM

     call WAIT_TI

     call SLEEP

     NULL:

     ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  СБРОС  ;;;;;;;;;;;;;;;;;;;

     cjne A, #39h, END_LST_KBD_PC

     mov SBUF, #0dh

     call WAIT_TI

     call SLEEP

     mov SBUF, #0dh

     call WAIT_TI

     call SLEEP

     mov SBUF, #0ah

     call WAIT_TI

     call SLEEP

     mov SBUF, #'>'

     call WAIT_TI

     call SLEEP

     mov R3, #00000000b

     mov R4, #00000000b

     mov R5, #00000000b

     clr TI

     clr RI; ***

     END_LST_KBD_PC:

     reti ; ****

 

      7. Программа прерывания от матричной клавиатуры 

     ;;;;;;;;;;;;;;;;IDENTIFYCATION SERIES KEYS;;;;;;;;;;;;;;;;;;;; LITTLE COMPLITE

     HNDL_P1:

     mov  TM2IR, #00h

     jnb P1.0, P1_0

     jnb P1.1, P1_1

     jb P1.2, ref1

     ljmp P1_2

     ref1:

     jb P1.3, ref2

     ljmp P1_3

     ref2:

     ljmp END_HNDL

     P1_0:

     mov P1, #11111110b

     jnb P1.4,  P1_0_4

     jnb P1.5,  P1_0_5

     jnb P1.6,  P1_0_6

     jnb P1.7,  P1_0_7

     jmp END_HNDL

     P1_0_4:

     call key5

     clr TI

     jmp END_HNDL

     P1_0_5:

     call key2

     clr TI

     jmp END_HNDL

     P1_0_6:

     call keyF

     clr TI

     jmp END_HNDL

     P1_0_7:

     call key8

     clr TI

     jmp END_HNDL

     P1_1:

     mov P1, #11111101b

     jnb P1.4,  P1_1_4

     jnb P1.5,  P1_1_5

     jnb P1.6,  P1_1_6

     jnb P1.7,  P1_1_7

     jmp END_HNDL

     P1_1_4:

     call key4

     clr TI

     jmp END_HNDL

     P1_1_5:

     call key1

     clr TI

     jmp END_HNDL

     P1_1_6:

     call key0

     clr TI

     jmp END_HNDL

     P1_1_7:

     call key7

     clr TI

     jmp END_HNDL

     P1_2:

     mov P1, #11111011b

     jnb P1.4,  P1_2_4

     jnb P1.5,  P1_2_5

     jnb P1.6,  P1_2_6

     jnb P1.7,  P1_2_7

     jmp END_HNDL

     P1_2_4:

     call keyB

     clr TI

     jmp END_HNDL

     P1_2_5:

     call keyA

     clr TI

     jmp END_HNDL

     P1_2_6:

     call keyD

     clr TI

     jmp END_HNDL

     P1_2_7:

     call keyC

     clr TI

     jmp END_HNDL

     P1_3:

     mov P1, #11110111b

     jnb P1.4,  P1_3_4

     jnb P1.5,  P1_3_5

     jnb P1.6,  P1_3_6

     jnb P1.7,  P1_3_7

     jmp END_HNDL

     P1_3_4:

     call key6

     clr TI

     jmp END_HNDL

     P1_3_5:

     call key3

     clr TI

     jmp END_HNDL

     P1_3_6:

     call keyE

     clr TI

     jmp END_HNDL

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