Программирование часов под микроконтроллер семейства 51х

Автор работы: Пользователь скрыл имя, 18 Января 2013 в 13:42, лабораторная работа

Краткое описание

В системе автоматизированного проектирования ‘Proteus’ были реализованы схема и программа, имитирующие работу электронных часов. Эти электронные часы имеют два режима работы – режим реального времени и ускоренный счёт. Визуализация значений на индикаторах основана на динамической индикации.

Содержимое работы - 1 файл

НОВОУРАЛЬСКИЙ ТЕХНОЛОГИЧЕСКИЙ УНИВЕРСИТЕТ.docx

— 437.23 Кб (Скачать файл)

НОВОУРАЛЬСКИЙ ТЕХНОЛОГИЧЕСКИЙ  УНИВЕРСИТЕТ

НИЯУ МИФИ

 

 

 

 

кафедра автоматизации и  управления

 

 

 

 

 

 

 

 

 

 

ОТЧЁТ

по лабораторной работе №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х