Применение однокристальной микроЭВМ семейства МК51 для реализации алгоритма работы электронных часов

Разработка программы микроконтроллера на базе МП Intel 8051, реализующей функциональность электронных часов. Программа поддерживает режим счёта и режим установки времени. Реализация логики построения программы, исходного текста программы с комментариями.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 15.08.2009
Размер файла 213,6 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Список использованных источников

курсовая_работа | 14

Пояснительная записка к курсовой работе

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

тема_курсовой_работы:

«Применение однокристальной микроЭВМ семейства МК51 для реализации алгоритма работы электронных часов»

МОСКВА 2006

Оглавление:

  • Техническое задание 3
  • Выполнение 4
    • 1) Логика построения программы 4
    • 2) Устройства ввода 4
    • 3) Исходный текст программы с комментариями 6
  • Список использованных источников 18

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

Разработать программу для микроконтроллера на базе МП Intel 8051, реализующую функциональность электронных часов и имеющую следующие особенности:

поддержка двух режимов работы программы: а) режим счёта; б) режим установки времени;

в режиме счёта на дисплей терминала выводится текущее время в формате hh:mm:ss, где , , ;

в режиме установки времени выполняется последовательный ввод значений двузначных регистров, начиная с ss, причём в каждом регистре сначала задаётся значение десятков, а затем единиц. На этапе ввода значений регистров должна производиться проверка корректности задаваемых чисел и, в случае их выхода за пределы допустимого для регистра диапазона значений, -- коррекция до верных значений.

Ввод необходимо осуществлять с помощью стандартной шестнадцатикнопочной терминальной клавиатуры.

Переход в режим установки времени необходимо осуществлять нажатием клавиши '9'. Выход из режима установки времени должен происходить автоматически по окончании ввода значений всех регистров, т.е. сразу после задания числа единиц регистра hh.

Выполнение

Логика построения программы

Исходя из ТЗ сформируем следующую блок-схему работы основной программы:

Устройства ввода

Для ввода данных используется стандартная шестнадцатикнопочная клавиатура, подключаемая к параллельному порту (P1). Она имеет следующий вид:

Чтобы определить, нажата или нет какая-либо клавиша-ключ, сначала нужно выставить на линии регистра-защёлки P1, которые соединяет клавиша, разные логические значения. Затем необходимо считать из регистра значения этих линий: если оба бита стали равными «0», то значит, проверяемая клавиша была нажата.

Для сокращения процедуры опроса клавиатуры будем делать опрос по «строкам»:

Клавиша

Слово, выставленное на P1

Ожидаемое на P1 слово

7

6

5

4

3

2

1

0

7

6

5

4

3

2

1

0

`1'

1

1

0

1

1

1

1

1

1

1

0

1

1

1

0

1

`2'

1

1

0

1

1

1

1

1

1

1

0

1

1

1

1

0

`3'

1

1

0

1

1

1

1

1

1

1

0

1

0

1

1

1

`4'

1

1

1

0

1

1

1

1

1

1

1

0

1

1

0

1

`5'

1

1

1

0

1

1

1

1

1

1

1

0

1

1

1

0

`6'

1

1

1

0

1

1

1

1

1

1

1

0

0

1

1

1

`7'

0

1

1

1

1

1

1

1

0

1

1

1

1

1

0

1

`8'

0

1

1

1

1

1

1

1

0

1

1

1

1

1

1

0

`9'

0

1

1

1

1

1

1

1

0

1

1

1

0

1

1

1

`0'

1

0

1

1

1

1

1

1

1

0

1

1

1

1

0

1

Чтобы просто зафиксировать факт нажатия любой из цифровых клавиш, достаточно выставить в регистр P1 слово #00001111b и ожидать на P1 значение #0000x1xxb, где x{0;1}.

Особенностью данной клавиатуры, которую надо учитывать при программировании, является наличие переходного процесса (дребезга) с длительностью в несколько раз большей, чем время машинного цикла ОМЭВМ МК8051:

Исходный текст программы с комментариями

1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

2. ;; Лабораторная работа по курсу "Микропроцессорные системы".

3. ;; (С) Ким В., Пиленко Ю., Седрединов А., Шапцов В.

4. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

5. ;;;; ОПИСАНИЕ ПЕРЕМЕННЫХ: ;;;;

6. ;R0 - итерация для режима установки времени; для удобства

7. ;R1 - адрес для косвенно-регистровой адресации, указывающий на регистры R2-R4

8. ;регистры R2 - секунды (ss) in [0..3Bh]

9. ;регистры R3 - минуты (mm) in [0..3Bh]

10. ;регистры R4 - часы (hh) in [0..17h]

11. ;регистры R5,R6 - для разных промежуточных значений

12. ;регистр R7 - буфер для хранения значения нажатой клавиши [#0..#9] или значения #FFh, если клавиша не нажата

13. CR equ 0Dh; "возврат каретки"

14. LF equ 0Ah; "перевод строки"

15. ESC equ 1Bh; "конец сообщения"

16. TimerRepeat equ 30h; число полных циклов таймера, через которое нужно обрабатывать прерывание по переполнению

17. fMode equ 20h.0; текущий режим:

18. ; "0" - режим счёта

19. ; "1" - режим установки времени

20. ; ************************************************************

21. ; ************************************************************

22. ; ОПИСАНИЕ ТОЧЕК ВХОДА ОСНОВНОЙ ПРОГРАММЫ и ПОДПРОГРАММ ПРЕРЫВАНИЙ

23. ; !Внимание! В i8051 точки прерываний предопределены (фиксированы)

24. ; для того или иного прерывания! Т.е. не могут назначаться произвольно!

25. ORG 8000h; - точка входа в основную программу

26. jmp lbMain

27. ORG 800Bh; - прерывание по переполнению таймера (по биту TF0)

28. jmp intTF0

29. ;;Далее по каждому биту назначаем одно прерывание и по фронту, и по срезу:

30. ORG 8033h; - прерывание по биту P1.0 (по любому фронту)

31. jmp intP1

32. ORG 803Bh; - прерывание по биту P1.1 (по любому фронту)

33. jmp intP1

34. ORG 804Bh; - прерывание по биту P1.3 (по любому фронту)

35. jmp intP1

36. ; ************************************************************

37. ; ************************************************************

38. ; ОСНОВНАЯ ПРОГРАММА

39. lbMain:

40. ; конфигурируем таймер T0:

41. anl TMOD, #0F0h; обнуляем младшую тетраду

42. orl TMOD, #01h; младшую тетраду приводим к виду "0001"

43. ;mov TMOD, #00100001b; - то же самое

44. clr TR0; остановка таймера T0 (таймер - не считает)

45. ; настраиваем систему прерываний:

46. mov IP, #00000010b; (IP0) все прерывания (пока) - с одинаковым низким уровнем приоритета

47. mov 0F8h, #00000000b; (IP1)

48. mov IE, #10000010b; IEN0: выставили биты EA(7),ES(4),ET0(1)

49. mov 0E8h, #00001011b; IEN1: выставили биты 0,1,3

50. mov P1, #00001111b

51. mov 0EBh,#11111111b; (CTCON) разрешаем прерывания по битам P1 по фронту и срезу

52. ; CTCON - см. стр. 22 в "publab2.pdf"

53. ;задаём начальное время:

54. mov R2, #55; секунды

55. mov R3, #59; минуты

56. mov R4, #11; часы

57. clr fMode; изначально - в режим счёта

58. ;I. РЕЖИМ СЧЁТА:

59. lbCountMode:

60. clr IE.7

61. mov DPTR, #msgShowTimeMode

62. call prShowMessage; вывод сообщения msgShowTimeMode

63. ; настраиваем таймер T0:

64. mov TH0, #0

65. mov TL0, #0

66. mov TimerRepeat, #13

67. mov P1, #00001111b

68. setb IE.7

69. setb TR0; запускаем таймер (таймер - считает). Пошло инкрементирование T0

70. lbCountMode_Loop:

71. ; проверяем бит режима, и выполняем соответствующий переход:

72. jb fMode, lbSetTimeMode

73. jmp lbCountMode_Loop

74. ;II. РЕЖИМ УСТАНОВКИ ВРЕМЕНИ:

75. lbSetTimeMode:

76. clr IE.7

77. clr TR0; остановка таймера T0 (таймер - не считает)

78. mov DPTR, #msgSetTimeMode

79. call prShowMessage; вывод сообщения msgSetTimeMode

80. mov R0, #04h; задаём начальное значение; всего будет семь итераций

81. mov P1, #00001111b

82. setb IE.7

83. lbSetTimeMode_Loop:

84. ;проверяем бит режима, и выполняем соответствующий переход:

85. jnb fMode, lbCountMode

86. jmp lbSetTimeMode_Loop

87. ; ************************************************************

88. ; ************************************************************

89. ; ПОДПРОГРАММЫ_ОСНОВНЫЕ

90. ;; процедура intTF0:

91. intTF0:

92. clr TF0; сбрасываем бит переполнения ВРУЧНУЮ!

93. djnz TimerRepeat, lbTF0_End;

94. ; реализация собственно "хода" часов:

95. inc R2

96. cjne R2, #60, lbTF0_Next1

97. mov R2, #0

98. inc R3

99. cjne R3, #60, lbTF0_Next1

100. mov R3, #0

101. inc R4

102. cjne R4, #24, lbTF0_Next1

103. mov R4, #0

104. lbTF0_Next1: mov TimerRepeat, #13

105. lbTF0_End: call prDisplay

106. reti

107. ;; процедура prDisplay:

108. lbDrawSeparator:

109. call prWaitFor_TI

110. mov SBUF, #3Ah

111. ;; переводим значение из A в кодировку ACSII и выводим на экран:

112. lbDrawElement:

113. mov B, #10

114. div AB

115. add A, #30h

116. call prWaitFor_TI

117. mov SBUF, A

118. mov A, B

119. add A, #30h

120. call prWaitFor_TI

121. mov SBUF, A

122. ret

123. prDisplay:

124. ;[начало вывода 9 символов]

125. call prWaitFor_TI

126. mov SBUF, #CR; переводим курсор в начало строки:

127. mov A, R4

128. call lbDrawElement

129. mov A, R3

130. call lbDrawSeparator

131. mov A, R2

132. call lbDrawSeparator

133. call prWaitFor_TI; для выравнивания подождём передачи последнего символа

134. setb TI; иначе - программа "зависнет"

135. ;[конец вывода 9 символов]

136. ret

137. ;; обработчик прерывания intP1:

138. ;; проверяет, нажата ли клавиша входа в режим установки времени.

139. ;; Такой клавишей явл. '0' на маленькой клавиатуре

140. intP1:

141. ; Запрещаем прерывания на время выполнения:

142. clr 0C8h.0

143. clr 0C8h.1

144. clr 0C8h.2

145. clr 0C8h.3

146. jnb fMode, lbP1_CountMode

147. ;;I. ПРЕРЫВАНИЕ ИЗ РЕЖИМА УСТАНОВКИ ВРЕМЕНИ:

148. call prSmartDelay

149. call prCheckNumKeys

150. cjne R7, #0FFh, lbP1_CountMode_KeyPressed

151. jmp lbP1_SetTimeMode_Finalize

152. lbP1_CountMode_KeyPressed:

153. call prSetTimeMode_Iteration

154. lbP1_SetTimeMode_Finalize:

155. jmp lbP1_End

156. ;;II. ПРЕРЫВАНИЕ ИЗ РЕЖИМА СЧЁТА:

157. lbP1_CountMode:

158. call prSmartDelay

159. call prCheckNumKeys

160. cjne R7, #9, lbP1_End

161. setb fMode

162. lbP1_End:

163. call prSmartDelay

164. mov P1, #00001111b

165. reti

166. prSetTimeMode_Iteration:

167. mov A, R0

168. mov B, #2

169. div AB; в А - целая часть, в В - остаток

170. mov R1, A

171. mov A, B

172. cjne A, #0, lbSetTimeMode_Iteration_LO

173. ;;Загружаем десятки в регистр:

174. mov A, R7

175. mov B, #10

176. mul AB

177. mov @R1, A

178. jmp lbSetTimeMode_Iteration_Finalize

179. lbSetTimeMode_Iteration_LO: ;;Загружаем единицы в этот же регистр:

180. mov A, @R1

181. add A, R7

182. mov @R1, A

183. call prCorrect_SS; корректируем секунды (R2)

184. call prCorrect_MM; корректируем минуты (R3)

185. call prCorrect_HH; корректируем часы (R4)

186. lbSetTimeMode_Iteration_Finalize:

187. call prDisplay; выводим вводимое время на экран

188. inc R0; увеличили указатель на регистры

189. cjne R0, #10, lbSetTimeMode_Iteration_End

190. clr fMode; - устанавливаем режим счёта

191. lbSetTimeMode_Iteration_End: ret

192. ;; процедура prShowMessage:

193. ;; выводит на экран текстовое сообщение; символ ESC - признак конца сообщения

194. prShowMessage:

195. clr A

196. movc A, @A + DPTR

197. lbNextSymbol:

198. call prWaitFor_TI

199. mov SBUF, A

200. inc DPTR

201. clr A

202. movc A, @A + DPTR

203. cjne A, #ESC, lbNextSymbol

204. ret

205. ; ************************************************************

206. ; ************************************************************

207. ; ПОДПРОГРАММЫ_ВСПОМОГАТЕЛЬНЫЕ

208. ;; процедуры prCorrect_SS, prCorrect_MM, prCorrect_HH:

209. ;; проверяют соответствующие регистры на корректность значений в них большие значения уменьшаются до ближайших верных

210. prCorrect_SS:

211. cjne R2, #59, lbR2_not_59

212. ret

213. lbR2_not_59:

214. jnc lbR2_more_59

215. ret

216. lbR2_more_59:

217. mov R2, #59

218. ret

219. prCorrect_MM:

220. cjne R3, #59, lbR3_not_59

221. ret

222. lbR3_not_59:

223. jnc lbR3_more_59

224. ret

225. lbR3_more_59:

226. mov R3, #59

227. ret

228. prCorrect_HH:

229. cjne R4, #23, lbR4_not_23

230. ret

231. lbR4_not_23:

232. jnc lbR4_more_23

233. ret

234. lbR4_more_23:

235. mov R4, #23

236. ret

237. ;; процедура prSmartDelay:

238. ;; небольшая задержка, за время которой на клавиатуре успевает завершиться "переходной процесс"

239. prSmartDelay:

240. mov B, #0

241. mov A, #0

242. lbSmartDelay_Loop:

243. djnz ACC, $

244. djnz B, lbSmartDelay_Loop

245. ret

246. ;; процедура prWaitFor_TI:

247. ;; ожидание "готовности передачи" по последовательному порту

248. prWaitFor_TI:

249. jnb TI, $; зациклить, пока TI=0

250. clr TI ; устанавливаем "неготовность передачи"

251. ret

252. ;; процедура prCheckNumKeys:

253. ;; опрос цифровых клавиш.

254. ;; Процедура помещает в регистр R7 номер нажатой клавиши '0'..'9' или

255. ;; #0ffh, если ничего не нажато

256. prCheckNumKeys:

257. mov R7, #0FFh; допустим, что ничего не будет нажато

258. ;опрос первого столбца клавиш:

259. lbKey_1:

260. mov P1, #00DFh

261. mov A, P1

262. cjne A, #00DDh, lbKey_2

263. mov R7, #1

264. ret

265. lbKey_2:

266. cjne A, #00DEh, lbKey_3

267. mov R7, #2

268. ret

269. lbKey_3:

270. cjne A, #00D7h, lbKey_4

271. mov R7, #3

272. ret

273. ;опрос второго столбца клавиш:

274. lbKey_4:

275. mov P1, #00EFh

276. mov A, P1

277. cjne A, #00EDh, lbKey_5

278. mov R7, #4

279. ret

280. lbKey_5:

281. cjne A, #00EEh, lbKey_6

282. mov R7, #5

283. ret

284. lbKey_6:

285. cjne A, #00E7h, lbKey_7

286. mov R7, #6

287. ret

288. ;опрос третьего столбца клавиш:

289. lbKey_7:

290. mov P1, #007Fh

291. mov A, P1

292. cjne A, #007Dh, lbKey_8

293. mov R7, #7

294. ret

295. lbKey_8:

296. cjne A, #007Eh, lbKey_9

297. mov R7, #8

298. ret

299. lbKey_9:

300. cjne A, #0077h, lbKey_0

301. mov R7, #9

302. ret

303. ;опрос четвёртого столбца клавиш:

304. lbKey_0:

305. mov P1, #00BFh

306. mov A, P1

307. cjne A, #00BDh, lbEnd_Exam_NumKeys

308. mov R7, #0

309. lbEnd_Exam_NumKeys: ret

310. ; ************************************************************

311. ; ************************************************************

312. ; ОПИСАНИЕ ТЕКСТОВЫХ СООБЩЕНИЙ:

313. msgSetTimeMode: db LF,LF,CR, '-= Time Set Mode: =-', CR, LF, ESC

314. msgShowTimeMode: db LF,LF,CR, '-= Current Time: =-', CR, LF, ESC

315. END;;;; КОНЕЦ ПРОГРАММЫ

Список использованных источников

1. Курс лекций по дисциплине «Микропроцессорные системы».

2. [ http://donntu.edu.ua/library_web/resurs/mikro ] Однокристалльные МикроЭВМ. Справочник. Под ред. Боборыкина, Липовецкого и др.

3. Ю.Н. Евланов, В.А. Новиков, А.А. Шатохин. ОДНОКРИСТАЛЬНЫЙ МИКРОКОНТРОЛЛЕР 80C552. Методическое пособие по курсу «Схемотехника и программное обеспечение электронных средств измерений» для студентов, обучающихся по направлению «Информатика и вычислительная техника». М.: Издательство МЭИ, 2001.

4. Микроконтроллеры семейства MCS_51 и др. материалы и пособия кафедры.


Подобные документы

  • Особенности проектирования часов со звуковым сигналом с использованием однокристального микроконтроллера семейства МК51. Разработка функциональной схемы устройства. Функции, выполняемые клавиатурой. Разработка алгоритма работы и управляющей программы.

    курсовая работа [460,5 K], добавлен 16.05.2013

  • Разработка микропроцессорной системы на базе однокристальной микроЭВМ, также программного обеспечения, реализующего заданный набор функций. Структура и схема микроконтроллера PIC16. Разработка программы на языке ассемблер в среде MPLAB IDE v8.84.

    курсовая работа [515,3 K], добавлен 11.07.2012

  • Программа по созданию стрелочных часов. Минимальные требования к составу и параметрам технических средств программы. Выбор и обоснование системы программирования Microsoft Visual Studio. Общее описание алгоритма. Руководство пользователя и программиста.

    контрольная работа [1017,1 K], добавлен 11.12.2012

  • Принцип действия устройства сбора информации на базе микроконтроллера МК51: индикация, "рабочий режим" и передача данных персонального компьютера. Алгоритм начального опроса датчиков. Электрическая принципиальная схема устройства, текст программы.

    курсовая работа [102,5 K], добавлен 21.10.2012

  • Осуществление работы разрабатываемой программы на основе алгоритма, использующего Z-буфер. Аналитическое описание программной реализации. Алгоритмы основных функций программы. Содержание руководства пользователя. Файлы программы, пункты главного меню.

    курсовая работа [1,7 M], добавлен 15.04.2015

  • Разработка программы "Калькулятор" для работы с вещественными числами. Алгоритм работы программы. Набор тестов и варианты исполнения программы. Порядок ввода текста, стандартные ошибки в работе программы. Программная документация, текст программы.

    курсовая работа [225,9 K], добавлен 13.10.2013

  • Программа для расчета полинома. Описание и схема алгоритма, распределение памяти под код программы, под данные и стек. Схема хранения операций ввода-вывода и их подключение. Изменения стека во время прогона программы. Листинг программы с комментариями.

    курсовая работа [59,0 K], добавлен 02.12.2009

  • Разработка алгоритма синтеза пленочного резистора по заданным параметрам исходного резистора, программы реализации данного алгоритма на языке С++. Отладка и тестирование программы, составление документации и инструкции пользователя данной программой.

    курсовая работа [1,7 M], добавлен 08.06.2009

  • Преобразование матрицы по заданным правилам. Методика работы с массивами, основанная на классических алгоритмах. Разработка и описание блок-схемы алгоритма. Листинг программы, экраны работы и отладки программы. Инструкция для пользователей программы.

    контрольная работа [338,4 K], добавлен 29.01.2013

  • Графическая схема алгоритма выполнения программы определения запасов сырья. Решение задачи с помощью программы MS Excel. Разработка макроса для построения диаграммы. Использование интерфейса программы для работы с таблицей. Разработка базы данных.

    курсовая работа [1,2 M], добавлен 24.04.2014

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.