Применение однокристальной микроЭВМ семейства МК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