Автор работы: Пользователь скрыл имя, 18 Января 2013 в 13:42, лабораторная работа
В системе автоматизированного проектирования ‘Proteus’ были реализованы схема и программа, имитирующие работу электронных часов. Эти электронные часы имеют два режима работы – режим реального времени и ускоренный счёт. Визуализация значений на индикаторах основана на динамической индикации.
НОВОУРАЛЬСКИЙ ТЕХНОЛОГИЧЕСКИЙ УНИВЕРСИТЕТ
НИЯУ МИФИ
кафедра автоматизации и управления
ОТЧЁТ
по лабораторной работе №5
по теме “Программирование часов под микроконтроллер семейства 51х”
Выполнил: ст.гр. АУ-49Д
Кудряшов Д.А
Проверил:
________ Сардин А.Р.
Новоуральск 2012
Задание
В системе автоматизированного проектирования ‘Proteus’ разработать схему электронных часов на базе микроконтроллера семейства 51х. Необходимо использовать 6 семисегментных индикаторов для визуализации секунд, минут и часов. Также предусмотреть ручную регулировку индикаторов, отображающих часы и минуты. Написанная программа и построенная схема должны иметь возможность работы в двух режимах: первый режим – режим реального времени, то есть программа должна эмулировать работу реальных часов; второй режим – режим ускоренного счёта, в этом режиме программа должна эмулировать работу часов в несколько десятков раз быстрее.
Алгоритм
Эмуляция часов
Ускоренный счёт
Выбран режим реального времени?
Выбрано оба режима?
Динамическая индикация
Выбран ли режим работы?
Инициализация индикаторных переменных и предустановка таймеров
Начало
Остановка таймеров
Часы регулируют?
Регулировка
Конец
Переключиться на следующий индикатор
Погасить i-ый индикатор
Программная задержка
Посылка на i-ый индикатор соответствующую ему индикаторную переменную, в которой хранится выводимое значение
Погасить i-ый индикатор
i = 1 . . . 6
Динамическая индикация
Регулировка
Конец
Уменьшение минут на единицу
Установка на минутных индикаторах значения ‘59’
Достигнут min*?
Уменьшают минуты?
Конец
Увеличение минут на единицу
Обнуление минутных индикаторов
Достигнут max*?
Увеличивают минуты?
Конец
Уменьшение часов на единицу
Установка на часовых индикаторах значения ‘23’
Достигнут min**?
Увеличение часов на единицу
Достигнут max**?
Обнуление часовых индикаторов
Увеличивают часы?
Для минутных индикаторов:
min* - минимальное значение равно ‘00’
max* - максимальное значение равно ‘59’
Для часовых индикаторов:
min** - минимальное значение равно ‘00’
max** - максимальное значение равно ‘23’
Запуск таймера 1
Запуск таймера 0
Конец
Таймер 1 запущен?
Ускоренный счёт
Эмуляция часов
Таймер 0 запущен?
Конец
Увеличение минут на единицу
Достигнут минутный max*?
Обнуление секундных индикаторов
Увеличение секунд на единицу
Достигнут секундный max***?
S = 1000000 + S
Выход из прерывания
S < 0
S = S* - 4700
Обработчик прерывания таймера 0
Выход из прерывания
Обнуление часовых индикаторов
Увеличение часов на единицу
Достигнут часовой max**?
Обнуление минутных индикаторов
Для секундных индикаторов:
max*** - максимальное значение равно ‘59’
Значение S* заранее задано – ‘1000000’
Обнуление минутных индикаторов
Выход из прерывания
Увеличение минут на единицу
Обнуление секундных индикаторов
Достигнут минутный max*?
Увеличение секунд на единицу
Достигнут секундный max***?
Обработчик прерывания таймера 1
Выход из прерывания
Обнуление часовых индикаторов
Увеличение часов на единицу
Достигнут часовой max**?
Тестирование программы
1) Запустим программу на некоторое время, после чего приостановим выполнение и сравним результаты системного секундомера со значениями на индикаторах. Выбран режим реального времени.
Как видно из результатов – показания секундных индикаторов совпали со значением системного секундомера.
2) Выбран режим ускоренного счёта.
Как видно из результатов – за 11.2 секунды реального времени часы отсчитали 3 минуты 43 секунды.
Выводы
В системе автоматизированного проектирования ‘Proteus’ были реализованы схема и программа, имитирующие работу электронных часов. Эти электронные часы имеют два режима работы – режим реального времени и ускоренный счёт. Визуализация значений на индикаторах основана на динамической индикации.
На микроконтроллер поступают сигналы от внешнего тактового генератора с частотой 12МГц.
В данной программе используются 2 таймера-счётчика, каждый из которых отвечает только за соответствующий режим работы часов: таймер 0 – отвечает за режим реального времени, таймер 1 – за ускоренный счёт.
Режим ускоренного счёта основан на изменении значений индикаторов с высокой частотой (~120Гц – то есть каждый индикатор обновляется с данной частотой, таким образом, в сумме на 6 индикаторов приходится порядка 720Гц).
Режим реального времени – за данный режим отвечает таймер 0, который при каждом прерывании работает по алгоритму Брезенхама (описан в пункте ‘Алгоритм’ – ‘Обработчик прерывания таймера 0’).
В режиме реального времени по истечению некоторого времени – порядка двух минут, начинает явно проявляться погрешность – то есть значения на индикаторах не будут совпадать со значениями системного секундомера (значения на индикаторах будут спешить). Это объясняется тем, что с внешнего тактового генератора поступают сигналы не соответствующие заявленной частоте 12МГц – сигналы приходят с меньшей частотой.
Реализованная программа может работать одновременно только в одном из двух режимах – при зажатии одновременно двух клавиш программа будет находиться в режиме ожидания. Аналогичная ситуация, если ни один из режимов не будет выбран.
В написанной программе реализована ручная регулировка часов и минут.
Часы имеют 24-часовой формат.
ПРИЛОЖЕНИЕ А
(код программы)
$mod51
org 00h
jmp start
;-----------------------------
org 0bh
mov TL0,#017h
mov TH0,#02h
jmp real_Timer
;reti
;-----------------------------
org 01bh
mov TL1,#0afh
mov TH1,#03ch
push 0e0h
jmp boost_Timer
;reti
;-----------------------------
;--------------------------
org 030h
_DELAY: mov R0,#064h
djnz R0,$
ret
;-----------------------------
;-----------------------------
org 040h
_INDICATORS: clr P2.5
mov P0,R6
call _DELAY
setb P2.5
clr P2.2
mov P0,R5
call _DELAY
setb P2.2
clr P2.4
mov P0,R4
call _DELAY
setb P2.4
clr P2.1
mov P0,R3
call _DELAY
setb P2.1
clr P2.3
mov P0,R2
call _DELAY
setb P2.3
clr P2.0
mov P0,R1
call _DELAY
setb P2.0
ret
;-----------------------------
;-----------------------------
org 100h
_FINDINGDEC: cjne A,#06h,not1
mov A,#03fh
ret
not1: cjne A,#05bh,not2
mov A,#06h
ret
not2: cjne A,#04fh,not3
mov A,#05bh
ret
not3: cjne A,#066h,not4
mov A,#04fh
ret
not4: cjne A,#06dh,not5
mov A,#066h
ret
not5: cjne A,#07dh,not6
mov A,#06dh
ret
not6: cjne A,#07h,not7
mov A,#07dh
ret
not7: cjne A,#07fh,not8
mov A,#07h
ret
not8: mov A,#07fh
ret
;-----------------------------
;-----------------------------
org 240h
_FINDINGINC: cjne A,#03fh,not00
mov A,#06h
ret
not00: cjne A,#06h,not11
mov A,#05bh
ret
not11: cjne A,#05bh,not22
mov A,#04fh
ret
not22: cjne A,#04fh,not33
mov A,#066h
ret
not33: cjne A,#066h,not44
mov A,#06dh
ret
not44: cjne A,#06dh,not55
mov A,#07dh
ret
not55: cjne A,#07dh,not66
mov A,#07h
ret
not66: cjne A,#07h,not77
mov A,#07fh
ret
not77: mov A,#06fh
ret
;-----------------------------
;-----------------------------
org 290h
_BCD: cjne R0,#04h,not_hours_minus
hoursdec: cjne R2,#03fh,minus_hours2
cjne R1,#03fh,minus_hours1
mov R2,#04fh
mov R1,#05bh
ret
minus_hours1: mov R2,#06fh
mov A,R1
call _FINDINGDEC
mov R1,A
ret
minus_hours2: mov A,R2
call _FINDINGDEC
mov R2,A
ret
not_hours_minus: cjne R0,#03h,not_hours_plus
hoursinc: cjne R1,#05bh,plus_hours1
cjne R2,#04fh,plus_hours2
mov R1,#03fh
mov R2,#03fh
ret
plus_hours1: cjne R2,#06fh,plus_hours12
mov R2,#03fh
mov A,R1
call _FINDINGINC
mov R1,A
ret
plus_hours12: mov A,R2
call _FINDINGINC
mov R2,A
ret
plus_hours2: jmp plus_hours12
not_hours_plus: cjne R0,#02h,not_minutes_minus
cjne R4,#03fh,minus_minutes2
cjne R3,#03fh,minus_minutes1
mov R4,#06fh
mov R3,#06dh
jmp hoursdec
minus_minutes1: mov R4,#06fh
mov A,R3
call _FINDINGDEC
mov R3,A
ret
minus_minutes2: mov A,R4
call _FINDINGDEC
mov R4,A
ret
not_minutes_minus: cjne R3,#06dh,plus_minutes1
cjne R4,#06fh,plus_minutes2
mov R3,#03fh
mov R4,#03fh
jmp hoursinc
plus_minutes2: mov A,R4
call _FINDINGINC
mov R4,A
ret
plus_minutes1: cjne R4,#06fh,plus_minutes12
mov R4,#03fh
mov A,R3
call _FINDINGINC
mov R3,A
ret
plus_minutes12: jmp plus_minutes2
;-----------------------------
;-----------------------------
org 390h
_IZMEN: setb C
mov R0,#04h
shift: rrc A
jnc hours_and_minutes
dec R0
jmp shift
hours_and_minutes: call _BCD
ind: mov R7,P1
cjne R7,#0ffh,ind1
ret
ind1: call _INDICATORS
jmp ind
;-----------------------------
;-----------------------------
org 440h
start: mov P0,#0ffh
mov P1,#0ffh
mov P2,#0ffh
mov P3,#0ffh
mov R1,#03fh
mov R2,#03fh
mov R3,#03fh
mov R4,#03fh
mov R5,#03fh
mov R6,#03fh
mov 038h,#00h
mov 039h,#00h
mov 03ah,#0fh
mov 03bh,#041h
mov 03ch,#078h
mov TL0,#017h
mov TH0,#02h
mov TL1,#0afh
mov TH1,#03ch
mov TMOD,#011h
mov IP,#00h
setb EA
setb ET0
setb ET1
Trash: call _INDICATORS
mov A,P3
cjne A,#0ffh,not_stop
stop: clr TR0
clr TR1
mov 038h,#00h
mov 039h,#00h
jmp pass
not_stop: cjne A,#0fch,not_stop1
jmp stop
not_stop1: cjne A,#0feh,boost
mov A,038h
jnz pass
mov 039h,#00h
clr TR1
setb TR0
mov 038h,#01h
pass: mov A,P1
cjne A,#0ffh,Izmen
jmp Trash
boost: mov A,039h
jnz pass
mov 038h,#00h
clr TR0
setb TR1
mov 039h,#01h
jmp pass
Izmen: call _Izmen
jmp Trash
;-----------------------------
;-----------------------------
Информация о работе Программирование часов под микроконтроллер семейства 51х