Московский государственный институт электроники и математики
(технический университет)
Кафедра
«Информационно-коммуникационные технологии»
Курсовая работа
на тему:
«Таймер»
(по дисциплине: «Микропроцессорные системы»)
Выполнили:
Группа: Проверил: |
С – 85
|
Москва 2009 г.
Аннотация
В курсовой работе разрабатывается таймер, выполняющий прямой счет в десятичной форме. В работе использовались прерывания от последовательного порта и таймера, встроенного в контроллер. Работа выполняется на системе “прототип” на основе микроконтроллера 51 семейства.
1. Техническое задание
Написать программу для микропроцессора семейства 51, имеющую следующие функции:
Таймер прямого счета. Ввод трехзначного десятичного числа. Реализовать старт, сброс, пауза.2. Алгоритм программы
1. Настраиваем прерывания
2. В цикле опрашиваем матричную клавиатуру.
2.1. Если нажали кнопку, то записываем значение в регистр R4.
2.2. Для избегания эффекта "залипания" запускаем пустой цикл для задержки.
3. Во время цикла могут поступить два типа прерывания.
3.1. Прерывание от последовательного порта.
3.1.1. Читаем символ из порта и если он один из символов a, s, d, то запускаем соответственно процедуры start, stop, pause.
3.2. Прерывание по таймеру.
3.2.1. Проверяем, установлен таймер в режим счета (R0=0).
3.2.2. Если переведен, то инкрементируем регистр R3.
3.2.3. Проверяем значение регистра счетчика R3 c введенным числом R4.
3.2.4. Если равен, то сообщаем об этом и останавливаем счет и продолжаем выполнение программы.
3.2.5. Если не равен, то продолжаем инкрементировать счетчик.
4. Процедуры start, stop, pause.
4.1. Процедура start.
4.1.1. Выводим слово "start" в последовательный порт.
4.1.2. Переводим счетчик в режим счета (R0 = 1).
4.2. Процедура stop.
4.2.1. Выводим слово "stop" в последовательный порт.
4.2.2. Переводим счетчик в режим простоя (R0 = 0) и обнуляем счетчик (R3).
4.3. Процедура pause.
4.3.1. Выводим слово "pause" в последовательный порт.
4.3.2. Переводим счетчик в режим простоя (R0 = 0).
![]() |
3. Алгоритмы обработчиков прерываний
![]() |
![]() |
5. Исходный код
ORG 8000h
ljmp main
ORG 8003h
reti
ORG 800Bh
call counter
reti
ORG 801Bh
reti
ORG 8023h
call _read
reti
ORG 8030h
counter:
cjne R0, #1, ret_c
djnz R1, ret_c
djnz R2, ret_c
mov R2, #15
inc R3
call out_n
mov A, R3
clr c
subb A, R4
cjne A, #0, ret_c
call boo
call pause
call creset
ret_c: ret
begin: mov B, #10
mov P1, #0FDh ;
jnb P1.4, b4
jnb P1.5, b1
jnb P1.7, b8
jnb P1.6, b0
mov P1, #0FEh
jnb P1.4, b5
jnb P1.5, b2
jnb P1.6, b_start
mov P1, #0F7h
jnb P1.4, b6
jnb P1.5, b3
jnb P1.6, b_stop
mov P1, #0FBh ;
jnb P1.4, b7
jnb P1.5, b9
jnb P1.6, b_reset
jmp begin
b0: call btn_0
call wait
jmp begin
b1: call btn_1
call wait
jmp begin
b2: call btn_2
call wait
jmp begin
b3: call btn_3
call wait
jmp begin
b4: call btn_4
call wait
jmp begin
b5: call btn_5
call wait
jmp begin
b6: call btn_6
call wait
jmp begin
b7: call btn_7
call wait
jmp begin
b8: call btn_8
call wait
jmp begin
b9: call btn_9
call wait
jmp begin
b_start: call start
call wait
jmp begin
b_stop: call pause
call wait
jmp begin
b_reset: call creset
call wait
jmp begin
btn_0: mov A, #'0'
call _out
mov A, R4
mul AB
mov R4, A
call wait
ret
btn_1: mov A, #'1'
call _out
mov A, R4
mul AB
add A, #1
mov R4, A
call wait
ret
btn_2: mov A, #'2'
call _out
mov A, R4
mul AB
add A, #2
mov R4, A
call wait
ret
btn_3: mov A, #'3'
call _out
mov A, R4
mul AB
add A, #3
mov R4, A
call wait
ret
btn_4: mov A, #'4'
call _out
mov A, R4
mul AB
add A, #4
mov R4, A
call wait
ret
btn_5: mov A, #'5'
call _out
mov A, R4
mul AB
add A, #5
mov R4, A
call wait
ret
btn_6: mov A, #'6'
call _out
mov A, R4
mul AB
add A, #6
mov R4, A
call wait
ret
btn_7: mov A, #'7'
call _out
mov A, R4
mul AB
add A, #7
mov R4, A
call wait
ret
btn_8: mov A, #'8'
call _out
mov A, R4
mul AB
add A, #8
mov R4, A
call wait
ret
btn_9: mov A, #'9'
call _out
mov A, R4
mul AB
add A, #9
mov R4, A
call wait
ret
start: mov A, #'S'
call _out
mov A, #'t'
call _out
mov A, #'a'
call _out
mov A, #'r'
call _out
mov A, #'t'
call _out
call draw_enter
mov R0, #1
ret
pause: mov A, #'S'
call _out
mov A, #'t'
call _out
mov A, #'o'
call _out
mov A, #'p'
call _out
call draw_enter
mov R0, #0
ret
creset: mov A, #'R'
call _out
mov A, #'e'
call _out
mov A, #'s'
call _out
mov A, #'e'
call _out
mov A, #'t'
call _out
call draw_enter
mov R3, #0
mov R4, #0
ret
boo: mov A, #'E'
call _out
mov A, #'N'
call _out
mov A, #'D'
call _out
call draw_enter
ret
_out: jnb TI, _out
clr TI
mov sbuf, A
ret
draw_enter: mov A, #0Ah
call _out
mov A, #0Dh
call _out
ret
out_n: mov A, R3
mov B,#100
div AB
add A,#30h
call _out
mov A, B
mov B,#10
div AB
add A,#30h
call _out
mov A, B
add A,#30h
call _out
call draw_enter
ret
_read: jnb RI, _ret_r
clr RI
mov A, SBUF
call _out
cjne A, #'a', re1
call _out
call start
jmp _ret_r
re1: cjne A, #'s', re2
call pause
jmp _ret_r
re2: cjne A, #'d', re3
call creset
jmp _ret_r
re3: mov R7, SBUF
mov A, R7
clr c
subb A, #48
jc _ret_r
mov R7, A
clr c
subb A, #10
jnc _ret_r
mov A, R4
mov B, #10
mul AB
add A, R7
mov R4, A
_ret_r: ret
wait: mov R5, #0
loop1: mov R6, #0
loop2: djnz R6, loop2
djnz R5, loop1
ret
main: mov R0, #0 ; 1 -- schet idet; 0 -- ne idet
mov R1, #0 ; registr dlia zaderzhki
mov R2, #15 ; registr dlia zaderzhki
mov R3, #0 ; schetchik
mov R4, #0 ; vvedennoe chislo
mov IP, #0
mov IE, #b
mov TMOD, #b
mov TCON, #b
mov TH0, #0ffh
jmp begin
ret
end
Заключение
В курсовой работе запрограммирован микроконтроллер 51 серии на ввод/вывод символов от матричной и компьютерной клавиатуры. Использованы прерывания от com порта и таймера T2.





