Партнерка на США и Канаду по недвижимости, выплаты в крипто

  • 30% recurring commission
  • Выплаты в USDT
  • Вывод каждую неделю
  • Комиссия до 5 лет за каждого referral

Московский государственный институт электроники и математики

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

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

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

Выполнили: студентки группы С-85

Проверил:

Москва 2008

Аннотация.

В курсовой работе разрабатывается программа перевода десятичных чисел стандартной клавиатуры в BIN и HEX код по команде с матричной клавиатуры. Работа выполняется на учебном стенде с использованием системы-прототип на основе микроконтроллера 51 семейства.

Оглавление.

Аннотация...................................................................................................................................... 2

Оглавление..................................................................................................................................... 3

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

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

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

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

Алгоритм обработчика от таймера............................................................................................... 5

Алгоритм обработки прерывания от COM порта......................................................................... 6

...................................................................................................................................................... 6

Листинг.......................................................................................................................................... 6

Выводы......................................................................................................................................... 20

Список литературы..................................................................................................................... 21

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

Реализовать программу с использованием системы прерываний, отвечающую следующим требованиям:

1.  Ввод с клавиатуры символов 0…9.

2.  Ввод с матричной клавиатуры команды перевода символа.

3.  Перевод символа.

4.  Вывод переведенного символа.

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

В соответствии с техническим заданием программа должна выполнять:

1.  Прием символа от матричной клавиатуры.

2.  Прием символа от стандартной клавиатуры.

3.  Перевод символа, принятого от матричной клавиатуры, в BIN или HEX код.

4.  Вывод BIN или HEX кодов символа.

Прием символа от матричной клавиатуры реализуется с помощью определения нажатой клавиши в обработчике данных прерываний. Ввод символа от компьютерной клавиатуры реализуется с помощью прерываний от СOM порта (бит RI). Вывод символа реализуется с помощью прерываний от COM порта (бит TI). Основная программа инициализирует прерывания от COM порта и таймера T0, после чего ожидает любого из перечисленных прерываний.

Соответствие битов порта P1 и контактов матричной клавиатуры:

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

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

Алгоритм обработчика от таймера.

Алгоритм обработки прерывания от COM порта.

Листинг.

ORG 8000H

jmp start

org 800BH

jmp preryv_timer

org 8023H

jmp preryv_port

start:

thconst equ 24 ;251

tlconst equ 0

MOV SP,#70H

setb EA

setb ET0 ;

setb ES ;

clr EX0

clr EX1

setb PS ;

clr PT0

clr EX0

clr EX1

clr PS

setb PT0

setb TR0 ;

CLK_KHZ equ 11000

eqiv equ 41h

eq_count equ 42h

ROMD equ 40h

hexconv equ 20h

keybit equ 21h.0

keycode equ 22h

in1 equ P1.4

in2 equ P1.5

in3 equ P1.6

in4 equ P1.7

out1 equ P1.0

out2 equ P1.1

out3 equ P1.2

out4 equ P1.3

keyb equ P1

MOV R0,#ROMD

MOV R1,#0

clr keybit

cycle:

jmp cycle

preryv_timer:

push ACC

push PSW

clr TR0

clr TF0

mov TH0, #thconst

mov TL0, #tlconst

setb TR0

call opros

polnendt0:

pop PSW

pop ACC

reti

opros:

clr ea

mov keyb, #255

clr ti

call oproskey

mov a, keycode

mov R6, #255

oprosdreb:

cjne A, keycode, nokey

call oproskey

djnz R6, oprosdreb

mov A, R5

cjne A, keycode, newkey

jmp nokey

newkey: mov R5,keycode

jb keycode.0, bin

jb keycode.1, decim

jb keycode.2, hex

jb keycode.3, ascii

jmp nokey

bin:

mov sbuf, #'B'

jnb ti, $

clr ti

jnb keybit, frombincall

call tobin

jmp binend

frombincall: call frombin

binend: jmp endopros

decim:

mov sbuf, #'D'

jnb ti, $

clr ti

jnb keybit, fromdeccall

call todec

jmp decend

fromdeccall: call fromdec

decend: jmp endopros

hex:

mov sbuf, #'H'

jnb ti, $

clr ti

jnb keybit, fromhexcall

call tohex

jmp hexend

fromhexcall: call fromhex

hexend: jmp endopros

ascii:

mov sbuf, #'A'

jnb ti, $

clr ti

jnb keybit, fromasciicall

НЕ нашли? Не то? Что вы ищете?

call toascii

jmp asciiend

fromasciicall: mov R7, ROMD

asciiend: jmp endopros

jmp endopros

endopros:

cpl keybit

nokey:

setb ea

ret

;--обработка прерывания от последовательного порта-

preryv_port:

push ACC

clr TI;

jnb RI, vihoduart

clr RI

mov A, sbuf

mov @R0, A

mov A, @R0

mov SBUF, A ;вывод вводимово обратно на экран

cjne A, #08, not_backspace ; символ бекспейса

dec R1

dec R0

cjne R1, #255, not_backspace ; если первым нажали backspace

dec R1

dec R0

not_backspace:

INC R1

INC R0 ;увеличиваем адрес

vihoduart:

pop ACC

reti

; конец обработки прерывания от последовательного порта--

;----функция хексконвертации аргумент кодсимвола в аккумуляторе выход код в аккумуляторе

hexconvert:

mov hexconv, A

jb hexconv.6, hexcon21

subb A, #'0'

jmp hexcon22

hexcon21:

subb A, #55 ; В случае если символ A-F

hexcon22:

ret

;из хекс

fromhex:

clr A

cjne R1, #0, fromhex2

mov R7, #0 ; 0 цифр результат 0

fromhex2: cjne R1, #1, fromhex3

mov A, ROMD

call hexconvert

mov R7, A

fromhex3: cjne R1, #2, fromhex4

mov A, ROMD; 2 цифры результат

call hexconvert

swap A ; обмен тетрадами

mov R7, A

mov A, ROMD+1; вторая тетрада

call hexconvert

orl A, R7 ; логическое или для объедин тетрад в один байт

mov R7, A

fromhex4:

ret

;из двоичной

frombin:

MOV R0,#ROMD ;начальный адрес куда класть информацию

clr A

cjne R1, #0, frombin2

mov R7, #0 ; 0 цифр результат 0

jmp frombinend

frombin2: ;здесь работаем над введеними байтами

cjne @R0, #'0', frombin1

clr C

jmp frombin3

frombin1: setb C

frombin3:

RLc A

inc R0 ;увеличиваем адрес

DJNZ R1, frombin2 ;цикл

mov R7,A

frombinend:

ret

;из десятичной

fromdec:

MOV R0,#ROMD ;начальный адрес куда класть информацию

clr A

clr C

cjne R1, #0, fromdec2

mov R7, #0 ; 0 цифр результат 0

fromdec2: cjne R1, #1, fromdec3

mov A, ROMD ; одна цифра результат ее код - код нуля

subb A, #'0'

mov R7, A

fromdec3: cjne R1, #2, fromdec4

mov A, ROMD; 2 цифры результат

subb A, #'0'

mov B, #10

mul ab

mov R7, a

mov A, ROMD+1; сложение с единицами

subb A, #'0'

add A, R7

mov R7, a

fromdec4: cjne R1, #3, fromdec5

mov A, ROMD; 3цифры сотни

subb A, #'0'

mov B, #100

mul ab

mov R7, a

mov A, ROMD+1; десятки

subb A, #'0'

mov B, #10

mul ab

add A, R7

mov R7, a

mov A, ROMD+2; сложение с единицами

subb A, #'0'

add A, R7

mov R7, a

fromdec5:

ret

;в десятичную

todec:

mov A, R7

mov B, #100

div ab

add A, #'0'

mov ROMD, A

mov A, B

mov b, #10

div Ab

add A, #'0'

mov ROMD+1, A

mov a, b

add A, #'0'

mov ROMD+2, A

mov r1, #3

call vivod

ret

;в двоичную

tobin:

mov A, R7

mov r1, #8

mov r0, #ROMD

tobin2: ;здесь работаем над байтами

rlc A

jc tobin1

mov @R0, #'0'

jmp tobin3

tobin1: mov @R0, #'1'

tobin3: inc r0

DJNZ R1, tobin2 ;цикл

mov r1, #8

call vivod

ret

;в хекс

; коды цифр коды A-F 65-70

tohex:

mov A, R7

anl A, #15

clr C

subb A,#10

jnc tohexAF1

add A, #58; прибавляем 10 которые вычли и код 0 итого 48+10=58

jmp tohex11

tohexAF1: add A, #65 ;прибавляем код A

tohex11:

mov ROMD+1, A

mov A, R7

anl A, #240

swap A

clr C

subb A,#10

jnc tohexAF2

add A, #58; прибавляем 10 которые вычли и код 0 итого 48+10=58

jmp tohex21

tohexAF2: add A, #65 ;прибавляем код A

tohex21:

mov ROMD, A

mov r1, #2

mov r0, #ROMD

call vivod

ret

;----в ASCII

toascii:

mov ROMD, R7

mov R0, #ROMD

mov R1, #1

call vivod

ret

;вывод

vivod:

PUSH ACC

clr EA

clr ti; ;процедура вывода

MOV R0,#ROMD ;начальный адрес куда класть информацию

RDMORE2:

mov A, @R0

mov sbuf, A ;

jnb ti, $

clr ti

inc R0 ;увеличиваем адрес

DJNZ R1,RDMORE2 ;цикл

clr ti;

mov sbuf, #13;CR

jnb ti, $

clr ti

mov sbuf, #10 ;LF

jnb ti, $

clr ti

; сброс указалей адреса и количста символов

mov R1,#0

mov R0, #ROMD

setb EA

POP ACC

RET

; -------опрос кнопок клавы

oproskey:

mov keyb, #255

mov keycode, #0

clr in1

jb out2, oproskey2

setb keycode.0 ; нажата клавиша 1

oproskey2:

jb out3,oproskey3

setb keycode.1 ; нажата клавиша 2

oproskey3:

jb out4,oproskey4

setb keycode.2 ; нажата клавиша 3

oproskey4:

setb in1

clr in2

jb out2,oproskey5

setb keycode.3 ; нажата клавиша 4

oproskey5:

ret

END

Выводы.

В курсовой работе запрограммирован микроконтроллер 51 серии на ввод символов от матричной и стандартной клавиатуры ПК, вывод введенных символов и перевод символов в BIN и HEX. Программа использует прерывания от СOM порта и таймера T0.

Список литературы.

- Конспект лекций и семинаров по дисциплине “Микропроцессорные системы”. Документация и описание команд 8051. , - Программирование микропроцессорных систем на языке ASM-51.