Кафедра ИКТ
КУРСОВАЯ РАБОТА
по дисциплине «Микропроцессорные системы»
на тему
«Программа сравнения двух двузначных чисел»
Руководитель:
Выполнили:
Группа С-85
Аннотация
В курсовой работе разработана программа сравнения двух чисел, введенных с клавиатуры контроллера и клавиатуры компьютера, на базе микроконтроллера 51 семейства. Используются прерывания по последовательному порту и по таймеру. Работа выполняется на прототипе.
Оглавление
Аннотация.......................................................................................................................................... 2
Оглавление......................................................................................................................................... 3
Техническое задание.......................................................................................................................... 4
Алгоритм работы............................................................................................................................... 5
Блок-схема алгоритма........................................................................................................................ 6
Список использованной литературы............................................................................................... 8
Листинг кода.................................................................................................................................. 9
Техническое задание
Написать программу для тестового стенда, построенного на базе микропроцессора Intel 8051, позволяющую выполнять следующие функции:
1. Обрабатывать ввод чисел с матричной клавиатуры, подключенной к контроллеру.
2. Обрабатывать ввод чисел с клавиатуры компьютера, в этом случае символы передаются через последовательный порт.
3. Вывод результата операции сравнения между числами на экран компьютера по нажатию клавиши компьютера «Enter».
4. Использовать встроенный в контроллер механизм прерываний.
Программа может работать только с двухзначными положительными целыми числами.
Алгоритм работы
1. Инициализация программы.
1.1. Заполнение нулями регистров R1 — R7 и А.
1.2. Инициализация прерываний.
2. Главный цикл, ожидание прерывания.
2.1. Обработка прерывания от таймера.
2.1.1. Опрашиваем матричную клавиатуру.
2.1.2. Если нажата цифра, то заполняем соответствующий регистр левого числа (R1 или R2).
2.2. Обработка прерывания от последовательного порта.
2.2.1. Считываем символ из последовательного порта.
2.2.2. Если символ — «Enter», то запускаем процедуру сравнения.
2.2.3. Если символ — цифра, то заполняем соответствующий регистр правого числа (R3 или R4).
3. Процедура сравнения.
3.1. Сравниваем первый регистр левого числа и первый регистр правого числа.
3.2. Если значения не равны, то выводим соответствующий результат сравнения.
3.3. Иначе сравниваем второй регистр левого числа и второй регистр правого числа.
3.4. Если значения не равны, то выводим соответствующий результат сравнения.
3.5. Иначе выводим сообщение о равенстве чисел.
3.6. Возвращаемся в главный цикл.
Блок-схема алгоритма


Заключение
В курсовой работе запрограммирован микроконтроллер 51 серии на ввод символов от матричной и компьютерной клавиатуры. Также используется вывод символов через последовательный порт и терминал на ПК. Использованы прерывания от последовательного порта и таймера.
Список использованной литературы
Лекции «Микропроцессорные системы», , гг. «Микропроцессорные системы: Учебное пособие для вузов» , – СПб.: Политехника, 2002Приложение
Листинг кода
################################################################################
# #
# Micro Series 8051 Assembler V1.80/MD2 28/May/12 17:24:41 #
# #
# Source = result. s03 #
# List = result. lst #
# Object = result. r03 #
# Options = #
# #
# (c) Copyright IAR Systems 1985 #
################################################################################
1 00FF TIME EQU 255
2 0087 PCON EQU 87H
3 0000 FIRST EQU 20H.0
4 0001 SECOND EQU 20H.1
5
6 0000 ORG 0000h
7 0jmp init
8 ;; обработчик мини-клавиатуры ;;
9 000B ORG 000Bh
10 000B 120027 call small_kbd
11 000E 32 reti
12 ;; обработчик прерывания по порту ;;
13 0023 ORG 0023h
14 0C call _read
15 0reti
16
17 0027 small_kbd:
18 0FE mov P1, #b
19 002A 30942B jnb P1.4, a1
20 002D 309543 jnb P1.5, a4
21 0B jnb P1.6, a7
22
23 0FD mov P1, #b
24 0jnb P1.4, a2
25 0jnb P1.5, a5
26 003C 309658 jnb P1.6, a8
27 003F 30970D jnb P1.7, a0
28
29 0FB mov P1, #b
30 0jnb P1.4, a3
31 0A jnb P1.5, a6
32 004B 309652 jnb P1.6, a9
33 004E 22 ret
34
35 004F a0:
36 004F 12013F call waiting
37 0mov A, #0
38 0A9 call btn_small
39 0ret
40
41 0058 a1:
42 0F call waiting
43 005B 7401 mov A, #1
44 005D 1200A9 call btn_small
45 0ret
46
47 0061 a2:
48 0F call waiting
49 0mov A, #2
50 0A9 call btn_small
51 0ret
52
53 006A a3:
54 006A 12013F call waiting
55 006D 7403 mov A, #3
56 006F 1200A9 call btn_small
57 0ret
58
59 0073 a4:
60 0F call waiting
61 0mov A, #4
62 0A9 call btn_small
63 007B 22 ret
64
65 007C a5:
66 007C 12013F call waiting
67 007F 7405 mov A, #5
68 0A9 call btn_small
69 0ret
70
71 0085 a6:
72 0F call waiting
73 0mov A, #6
74 008A 1200A9 call btn_small
75 008D 22 ret
76
77 008E a7:
78 008E 12013F call waiting
79 0mov A, #7
80 0A9 call btn_small
81 0ret
82
83 0097 a8:
84 0F call waiting
85 009A 7408 mov A, #8
86 009C 1200A9 call btn_small
87 009F 22 ret
88
89 00A0 a9:
90 00A0 12013F call waiting
91 00A3 7409 mov A, #9
92 00A5 1200A9 call btn_small
93 00A8 22 ret
94
95 ;; нажатие на млаленькую клавиатуру
96 00A9 btn_small:
97 00A9 120117 call _out_dec ;вывод числа
98 00AC 200004 jb FIRST, bs1
99 00AF F9 mov R1, A
100 00B0 D200 setb FIRST
101 00B2 22 ret
102
103 ;; Если бит FIRST установлен, вводим вторую цифру числа
104 00B3 bs1:
105 00B3 FA mov R2, A
106 00B4 740A mov A, #0Ah
107 00B6 12010F call _out ;перевод строки
108 00B9 C200 clr FIRST ;очистить флаг заполненности первой цифры
109 00BB 22 ret
110
111 ;; Ввод клавиши с большой клавиатуры
112 00BC btn_big:
113 00BC 120117 call _out_dec ;вывод числа
114 00BF 200104 jb SECOND, bb1
115 00C2 FB mov R3, A
116 00C3 D201 setb SECOND
117 00C5 22 ret
118
119 00C6 bb1:
120 00C6 FC mov R4, A
121 00C7 740A mov A, #0Ah
122 00C9 12010F call _out
123 00CC C201 clr SECOND
124 00CE 22 ret
125
126 ;;сравнение введенных чисел
127 00CF compare:
128 00CF E9 mov A, R1
129 00D0 9B subb A, R3
130 00D1 4010 jc c_lt ;R1 < R3
131 00D3 EB mov A, R3
132 00D4 99 subb A, R1
133 00D5 4011 jc c_gt ;R1 > R3
134
135 00D7 EA mov A, R2
136 00D8 C3 clr c
137 00D9 9C subb A, R4
138 00DA 4007 jc c_lt ;R2 < R4
139 00DC EC mov A, R4
140 00DD 9A subb A, R2
141 00DE 4008 jc c_gt ;R2 > R4
142
143 00E0 0200ED jmp c_eq
144
145 00E3 c_lt:
146 00E3 7F3C mov R7, #'<'
147 00E5 0200F2 jmp c_out
148 00E8 c_gt:
149 00E8 7F3E mov R7, #'>'
150 00EA 0200F2 jmp c_out
151 00ED c_eq:
152 00ED 7F3D mov R7, #'='
153 00EF 0200F2 jmp c_out
154
155 00F2 c_out:
156 00F2 E9 mov A, R1
157 00F3 120117 call _out_dec
158 00F6 EA mov A, R2
159 00F7 120117 call _out_dec
160 00FA EF mov A, R7
161 00FB 12010F call _out
162 00FE EB mov A, R3
163 00FF 120117 call _out_dec
EC mov A, R4
call _out_dec
A mov A, #0Ah
F call _out
B 020149 jmp init
E 22 ret
170
171 ;;вывод содержимого аккумулятора
F _out:
F F599 mov sbuf, A
m_out:
FD jnb TI, m_out
C299 clr TI
ret
178
179 ;;вывод символа - содержимого аакумулятора (с учётом кодов)
_out_dec:
add A, #30h
F599 mov sbuf, A
183
B m_out_dec:
B 3099FD jnb TI, m_out_dec
E C299 clr TI
187
subb A, #30h
ret
190
191 ;;отладочная функция
_out_A:
mov SBUF, #'a'
FD ma: jnb TI, ma
C299 clr TI
B 22 ret
197
198 ;;обработчик прерывание по порту: чтение с клавиатуры
C _read:
C 30980F jnb RI, _ret_r
F C298 clr RI
E599 mov A, SBUF
B40D03 cjne A, #0Dh, re1
CF call compare
ret
206
207 ;;получение цифры и отправка её на обработку
re1:
subb A, #30h
B 11BC call btn_big
D 22 ret
212
E _ret_r:
E 22 ret
215
F waiting:
F 7DC8 mov R5,#200
zad1:
EC8 mov R6,#200
zad2:
nop
DEFD djnz R6,zad2
DDF9 djnz R5,zad1
ret
225
init:
FF mov P0, #255
C 7590FF mov P1, #255
F 75A0FF mov P2, #255
B0FF mov P3, #255
231
mov A, #00h
mov R1, #00h ;Первый разряд первого числа
A00 mov R2, #00h ;Второй разряд первого числа
B 7B00 mov R3, #00h ;Первый разряд второго числа
D 7C00 mov R4, #00h ;Второй разряд второго числа
F C200 clr FIRST ;Флаг введенности первого числа
C201 clr SECOND ;Флаг второго числа
239
F00 mov R7, #00h ;Знак равенства
B800 mov IP, #0 ; Установка приоритета выполнения всех прерываний в 0 (низкий)
A892 mov IE, #b ; Разрешение прерываний от счетчика 0 и последовательного порта
243
B 758921 mov TMOD, #b ; Настройка таймера
E 758850 mov TCON, #b ; Запустить таймер 0
DF5 mov TH1, #245 ; Частота обновления таймера
247
C29F clr SM0
C29D clr SM2
D29E setb SM1
A D29C setb REN
C 438780 orl PCON, #128
253
F main_loop:
F 80FE jmp main_loop
256
end
Errors: None ##########
Bytes: 357 # result #
CRC: E4D6 ##########


