Скачать 78.43 Kb.
|
Московский государственный институт электроники и математики (технический университет) Кафедра ИКТ Курсовая работа по дисциплине «Микропроцессорные системы» Выполнили: Студенты групп С-84 и С-85 Климов А.В. Шурыгин М.А. Проверил: Преподаватель Гудков Ю. И. Москва 2011 г. АннотацияВ данной работе реализован десятиразрядный таймер, используюший прерывания по COM-порту и таймеру. Работа выполнена на прототипе. Оглавление Аннотация 2 Техническое задание 4 Анализ технического задания 5 Алгоритм основной программы 6 Алгоритм обработчика прерываний по COM-порту 7 Алгоритм обработчика прерываний по таймеру 8 Алгоритм обработчика прерываний по параллельному порту 9 Заключение 10 Список литературы 11 Приложение 12 ^ Реализовать десятиразрядный таймер, удовлетворяющий следующим требованиям:
Для замера промежутка времени будут использованы таймер и регистр расширения. Работа таймера будет производиться в 2 каскада: первый таймер запускает второй. В связи с проявлением дребезга контактов на матричной клавиатуре, потребуется реализовывать задержки для установления состояния при помощи таймера. Ввод с клавиатуры компьютера и вывод на экран будет происходить с последовательного порта. Кроме того по параллельному порту будет подключена вторая клавиатура. ^ Алгоритм обработчика прерываний по COM-порту![]() ^ Таймер №1 ![]() Таймер №2 ![]() ^ ![]() ЗаключениеБыл реализован десятичный таймер, который осуществляет ввод с параллельного и последовательного порта, используя механизм прерываний. Вывод информации осуществляется через последовательный порт на терминал. ^
Приложение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 семейства, использующая прерывания... |
![]() | Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования | ![]() | Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования |