Кафедра ИКТ

КУРСОВАЯ РАБОТА

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

на тему

«Программа сравнения двух двузначных чисел»

Руководитель:

Выполнили:


Группа С-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 ##########