Курсовая работа по дисциплине «Микропроцессорные системы»




Скачать 78.43 Kb.
НазваниеКурсовая работа по дисциплине «Микропроцессорные системы»
Дата публикации20.06.2013
Размер78.43 Kb.
ТипКурсовая
odtdocs.ru > Информатика > Курсовая
Московский государственный институт электроники и математики

(технический университет)
Кафедра ИКТ

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

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

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

Выполнили:

Студенты групп С-84 и С-85

Климов А.В.

Шурыгин М.А.

Проверил:

Преподаватель

Гудков Ю. И.

Москва 2011 г.

Аннотация


В данной работе реализован десятиразрядный таймер, используюший прерывания по COM-порту и таймеру. Работа выполнена на прототипе.


Оглавление

Аннотация 2

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

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

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

Алгоритм обработчика прерываний по COM-порту 7

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

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

Заключение 10

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

Приложение 12


^

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


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

  1. таймер стартует при нажатии на одну из клавиш на большой клавиатуре;

  2. таймер останавливается при нажатии на клавишу на малой клавиатуре;

  3. результат выводится при нажатии на ту же клавишу на малой клавиатуре;

  4. при нажатии на не соответствующую клавишу выдаётся ошибка;

  5. результат выводится в десятичном виде;
^



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


Для замера промежутка времени будут использованы таймер и регистр расширения. Работа таймера будет производиться в 2 каскада: первый таймер запускает второй. В связи с проявлением дребезга контактов на матричной клавиатуре, потребуется реализовывать задержки для установления состояния при помощи таймера. Ввод с клавиатуры компьютера и вывод на экран будет происходить с последовательного порта. Кроме того по параллельному порту будет подключена вторая клавиатура.
^

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




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






^

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


Таймер №1




Таймер №2





^

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






Заключение


Был реализован десятичный таймер, который осуществляет ввод с параллельного и последовательного порта, используя механизм прерываний. Вывод информации осуществляется через последовательный порт на терминал.
^

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


  1. Описание команд процессора 8051

  2. Материалы статей http://digital.sibsutis.ru/content.htm


Приложение


T2INT EQU 0E8h ;Address of Timer2 interrupt configuration register.

T2EDGE EQU 0EBh ;Address of Timer2 capture(and compare) register configuration.

T2CON EQU 0EAh

CAPFLAG EQU 0C8h

;TH2 EQU 0EDh

TL2 EQU 0ECh

OFFSET EQU 0000h

ORG 00h + OFFSET ;Program start.

JMP start

ORG 0Bh + OFFSET ;Timer0 interrupt.

JMP timer_event

ORG 23h + OFFSET ;Serial port interrupt;

JMP serial_event

ORG 33h + OFFSET ;Timer2 capture. Emulate "baby keyboard" event.

JMP key_event1

ORG 3Bh + OFFSET ;--

JMP key_event2

ORG 43h + OFFSET ;--

JMP key_event3

ORG 4Bh + OFFSET ;--

JMP key_event4

ORG 73h + OFFSET ;Timer2 interrupt.

JMP timer2_event

keymap:

; --- --- --- ---

; |1| |2| |3| |A|

; --- --- --- ---

;

; --- --- --- ---

; |4| |5| |6| |B|

; --- --- --- ---

;

; --- --- --- ---

; |7| |8| |9| |C|

; --- --- --- ---

;

; --- --- --- ---

; |F| |0| |E| |D|

; --- --- --- ---

DB 05h

DB 02h

DB 0Fh

DB 08h

DB 04h

DB 01h

DB 00h

DB 07h

DB 0Bh

DB 0Ah

DB 0Dh

DB 0Ch

DB 06h

DB 03h

DB 0Eh

DB 09h

error_message:

DB 'Wrong key!'

DB 00h

start:

MOV A, TMOD ;Catch Timer0 16-bit overflows.

ORL A, #00000001b ;--

MOV TMOD, A ;--

MOV T2CON, #01000000b ;Catch Timer2 8-bit overflows.

MOV A, T2INT ;Enable Timer2 interrupts.

ORL A, #10000000b ;--

MOV T2INT, A ;--

MOV T2EDGE, #0FFh ;Catch both (back and front) waves from every capture pins.

CALL disable_captures ;Baby keyboard is disabled now.

CALL reset_baby_port

SETB ET0 ;Allow Timer0 interrupts.

SETB ES ;Allow COM interrupts.

SETB REN ;Allow receiving information from COM.

SETB EA ;Enable interrupt system.

JMP $ ;Loop.

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

; T i m e r e v e n t

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

timer_event:

;MOV A, #'1'

;CALL display_char

INC TL2

RETI

timer2_event:

;MOV A, #'2'

;CALL display_char

INC R6 ;Increase 0.1 sec counter.

RETI

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

; S e r i a l e v e n t

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

serial_event:

JBC RI, serial_input ;Handle input character.

JMP serial_unexpected_output;ERROR state.

serial_input:

MOV R2, SBUF ;Save symbol.

CLR ES ;Disable serial interrupts(just in case).

CALL reset_baby_port ;Set baby keyboard power configuration.

CALL clear_capture_flags ;Erase baby keyboard memory.

CALL enable_captures ;Enable baby keyboard.

CALL configure_timers

RETI

serial_unexpected_output:

CLR TI ;Unexpected condition.

RETI

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

; B u t t o n h a n d l e r

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

key_event1:

PUSH ACC ;Save context.

MOV A, #00h ;Set key-column code.

CALL key_event

POP ACC ;Save context.

RETI

key_event2:

PUSH ACC ;Save context.

MOV A, #04h ;Set key-column code.

CALL key_event

POP ACC ;Save context.

RETI

key_event3:

PUSH ACC ;Save context.

MOV A, #08h ;Set key-column code.

CALL key_event

POP ACC ;Save context.

RETI

key_event4:

PUSH ACC ;Save context.

MOV A, #0Ch ;Set key-column code.

CALL key_event

POP ACC ;Save context.

RETI

key_event:

CLR TR0 ;Stop Timer

CALL wait ;Let's wait while transit condition won't be finished.

CALL disable_captures ;Block baby keyboard.

SETB ES ;Enable serial interrupts again.

PUSH B ;Save context.

MOV B, A ;Store row offset here.

MOV A, R0 ;--

PUSH ACC ;--

MOV A, R1 ;--

PUSH ACC ;--

MOV R1, B ;Now store row offset here.

MOV R0, #04h ;Counter = number of columns.

MOV A, #10000000b ;Set start mask.

check_bit:

MOV B, A ;Save her here.

ORL A, #0Fh ;Add "not pressed" part.

MOV P1, A ;Test.

MOV A, P1 ;--

ANL A, #0Fh ;Get "pressed" part.

XRL A, #0Fh ;Compare.

JZ get_key_value

MOV A, B ;Ready to edit.

RR A ;Check next bit.

DJNZ R0, check_bit ;Try again.

JMP skip

get_key_value:

;Offset = 4 * row + (column - 1).

MOV A, R1 ;4 * row.

ADD A, R0 ;Add column.

DEC A

;Now ACC contain offset value.

MOV DPTR, #keymap ;Set base.

MOVC A, @A+DPTR ;Get digit.

CALL display_hex ;Display current symbol.

XRL A, R2 ;Compare keys.

JNZ bad_key ;Success.

MOV A, R6

CALL display_int

JMP key_event_end

bad_key:

CALL display_error_message

;JMP key_event_end

skip:

key_event_end:

POP ACC ;Restore context.

MOV R1, A ;--

POP ACC ;--

MOV R0, A ;--

POP B

RET

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

; O U T P U T B U F F E R

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

display_hex:

;----

; ACC - contains 1 output hex character in low part.

;----

CALL _get_low_part ;Get hex symbol from low part of byte(ACC contains current char).

CALL _cast_to_hex_symbol ;Cast value(from ACC) to corresponding symbol from ASCII.

CALL display_char ;Display symbol(ACC contain current symbol).

RET

display_full_hex:

;----

; ACC - contains 2 output hex characters.

;----

PUSH B ;Save context.

MOV B, R0 ;--

PUSH B ;--

MOV R0, A ;Save current key here.

CALL _get_high_part ;Get hex symbol from high part of byte(ACC contains current char).

CALL _cast_to_hex_symbol ;Cast value(from ACC) to corresponding symbol from ASCII.

CALL display_char ;Display symbol(ACC contain current symbol).

MOV A, R0

CALL _get_low_part ;Get hex symbol from low part of byte(ACC contains current char).

CALL _cast_to_hex_symbol ;Cast value(from ACC) to corresponding symbol from ASCII.

CALL display_char ;Display symbol(ACC contain current symbol).

MOV A, R0 ;Restore ACC too just in case.

POP B ;Restore context.

MOV R0, B ;--

POP B ;--

RET

_get_low_part:

;----

; ACC - contains both half of byte.

;----

ANL A, #0Fh

RET

_get_high_part:

;----

; ACC - contains both half of byte.

;----

ANL A, #0F0h ;Get high part of byte.

;REPT 4 ;Do right shift four times.

RL A

RL A ;--

RL A ;--

RL A ;--

;ENDM

RET

_cast_to_hex_symbol:

;----

; ACC - contains both half of byte.

;----

PUSH B ;Save context.

MOV B, A ;Save current value

CALL _is_demical ;Check whether current symbol is demical. If not, than it's hex.

JNZ _cast_to_demical

;JMP _cast_to_hex

_cast_to_hex:

MOV A, #37h ;Add ASCII offset for hex digit.

JMP _cast_to_hex_symbol_end

_cast_to_demical:

MOV A, #30h ;Add ASCII offset for demical digit.

;JMP _cast_to_hex_symbol_end

_cast_to_hex_symbol_end:

ADD A, B

POP B ;Restore context.

RET

_is_demical:

;----

; ACC - contains both half of byte.

;----

SUBB A, #3Ah

JB AC, _yes_is_demical

_no_is_demical:

MOV A, #00h

JMP _is_demical_end

_yes_is_demical:

MOV A, #01h

;JMP _is_demical_end

_is_demical_end:

RET

display_char:

;----

; ACC - contains both half of byte.

;----

CLR ES ;Disable serial interrupt. Manual handling TI signal.

MOV SBUF, A ;Transmit byte to serial port.

JNB TI, $ ;wait.

CLR TI ;--

SETB ES ;Enable serial interrupt.

RET

display_int:

;----

; ACC - contains int value.

;----

PUSH ACC

PUSH B

display_int_loop:

MOV B, #10d ;Divide onto 10.

DIV AB ;--

PUSH ACC ;Display modulo.

MOV A, B ;--

CALL display_hex ;--

POP ACC ;--

JNZ display_int_loop ;Repeat while value can be devided by 10.

POP B

POP ACC

RET

display_error_message:

PUSH ACC

PUSH B

MOV DPTR, #error_message

MOV B, #00h

display_error_message_loop:

MOV A, B

MOVC A, @A+DPTR

CALL display_char

INC B

CJNE A, #00h, display_error_message_loop

POP ACC

POP B

RET

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

; S U P P O R T F U N C T I O N S

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

reset_baby_port:

MOV P1, #0Fh

RET

clear_capture_flags:

MOV CAPFLAG, #00h ;Clear captures' flags.

RET

enable_captures:

PUSH ACC

MOV A, T2INT ;Enable capture interrupts(Disable baby keyboard).

ORL A, #00001111b ;--

MOV T2INT, A ;--

POP ACC

RET

disable_captures:

PUSH ACC

MOV A, T2INT ;Disable capture interrupts(Disable baby keyboard).

ANL A, #11110000b ;--

MOV T2INT, A ;--

POP ACC

RET

configure_timers:

MOV TL0, #00h ;With these values T0(16-bit) & T2(8-bit) will be count 0.1 sec.

MOV TH0, #00h ;--

MOV TL2, #71d ;--

SETB TR0 ;Start Timer0.

RET

wait:

PUSH ACC

MOV A, R0

PUSH ACC

MOV A, R1

PUSH ACC

MOV R0, #0FFh

MOV R1, #0FFh

loop:

NOP

NOP

DJNZ R1, loop

DJNZ R0, loop

POP ACC

MOV R1, A

POP ACC

MOV R0, A

POP ACC

RET

END


Добавить документ в свой блог или на сайт

Похожие:

Курсовая работа по дисциплине “Микропроцессорные системы”
Работа выполняется на системе “прототип” на основе микроконтроллера 51 семейства

Курсовая работа по дисциплине «Микропроцессорные системы»
Необходимо разработать программу для микроконтроллера Philips C552 обладающую следующим функционалом

Курсовая работа по дисциплине «Микропроцессорные системы»
В данной работе реализуется десятичный калькулятор, для выполнения 4х базовых арифметические операции, на микропроцессоре Intel 8051,...

Курсовая работа по дисциплине «Микропроцессорные системы» на тему...
В в синусоидальное напряжением 220 в частотой 50 Гц с использованием микроконтроллера Atmega 168 в качестве формирователя синусоидального...

Курсовая работа по дисциплине “Операционные системы” разработка ролевой компьютерной игры
Данная курсовая работа посвящена разработке компьютерной игры на движке «rpg maker xp», включая, в частности, разработку анимаций...

Курсовая работа по дисциплине «Сети ЭВМ и Средства Телекоммуникаций»
Данная курсовая работа посвящена организации потокового вещания видео в браузер средствами html5

Курсовая работа по дисциплине «Сети ЭВМ и Средства Телекоммуникаций»
Данная курсовая работа посвящена организации потокового вещания видео в браузер средствами html5

Курсовая работа по дисциплине «Микпропроцессорные системы»
В данной работе реализована программа счетчика нажатий на мини-клавиатуру для микроконтроллера 51 семейства, использующая прерывания...

Курсовая работа по дисциплине «Корпоративные информационные системы»
Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования

Курсовая работа по дисциплине «Корпоративные информационные системы»
Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования

Вы можете разместить ссылку на наш сайт:
Школьные материалы


При копировании материала укажите ссылку © 2013
контакты
odtdocs.ru
Главная страница