Разработка таймера прямого хода

Дипломная работа - Компьютеры, программирование

Другие дипломы по предмету Компьютеры, программирование



?ы INIТ.

Листинг программы приведен в приложении В.

3.2 Подпрограмма начальной инициализации (INIT)

Рисунок 3.2 - Блок-схема подпрограммы, выполняющая инициализацию портов и задание первоначальных значений переменных

В данной подпрограмме выполняется инициализация портов, присвоение первоначальных значений переменных и инициализация вектора однобайтовых чисел IND в оперативной памяти микроконтроллера (для хранения данных, выводимых на индикатор).

3.3 Подпрограмма обработки прерывания (TIMER_0_OVERFLOW)

Рисунок 3.3 - Блок-схема подпрограммы обработки прерываний.

Данная подпрограмма будет вызываться в основной программе каждые 5 мс. Для этого в самом начале в регистр TCNT0 записывается число $64 (100), исходя из следующих соображений: частота тактирования CK/256, где СК - частота тактового генератора равная 8 МГц, период переполнения равен 8.192 мс.

Тпереп = 256 (256-N) =256 (256-100) 5 мс.

В ней определяется, с каким знакоместом и соответственно с какой строкой клавиатуры в текущий момент идёт работа программы и выдаётся соответствующая комбинация в порт D. Также идет приращение и анализ переменной COUNTER, исходя из её значения, определяется флаг, управляющий миганием точки второго разряда (POINT) и проверяется равенство 200, т.е. прошла ли 1 секунда. Для того, чтобы осуществить индикацию текущего времени, необходимо по очереди каждые 5 мс зажигать каждую цифру. Для этого часы имеют четыре транзисторных ключа. Ключи управляются микроконтроллером, причем соответствующий ключ открыт, если на выводе контроллера присутствует логический ноль. Т.е. подавая на один из этих выходов логический 0 сканируется клавиатура и одновременно зажигается нужный индикатор.

Далее вызываются подпрограммы: INDICATION - вывод символов на индикаторы, и SCAN - сканирование клавиатуры. Затем, если программа находится в режиме счёта времени (REGIM=0), производится проверка факта нажатия *". При подтверждении нажатия, программа переходит в режим установки времени: последовательно устанавливаются часы и минуты, при этом значение регистра REGIM изменяется от 1 до 4. При завершении установки времени, программа снова переходит в режим счёта времени. Если же * не была нажата, то через каждую секунду проверяется условие остановки таймера. Если таймер не был остановлен, то вызывается подпрограммы TIME_CONTROL (управляющая корректной инкрементацией времени) и TIMER (управляющая сравнением текущего времени с заданным и установкой флага остановки таймера). В конце происходит вызов подпрограммы UPDATE, которая обновляет информацию на индикаторах с периодом в 20 мс.

3.4 Подпрограмма счёта времени (TIME_CONTROL)

Рисунок 3.4 - Блок-схема подпрограммы счёта времени

Данная программа вызывается каждую секунду в режиме счёта времени. В начале подпрограмма проверяем факт установки флага обнуления значений часов, минут и секунд, т.е. таймер работает от нуля. Далее мы инкрементируем счётчик секунд SEC и сравниваем его с числом $3С (60), проверяя, прошла ли одна минута. Каждую минуту производится циклическая инкрементация счётчиков часов (HOUR_1, HOUR_2) и счётчиков минут (MIN_1, MIN_2), с проверками на корректность.

3.5 Подпрограмма остановки таймера (TIMER)

Рисунок 3.5 - Блок-схема подпрограммы остановки таймера

Данная подпрограмма вызывается каждую секунду после подпрограммы TIME_CONTROL. В этой подпрограмме производиться сравнение текущего времени с заданным. Если текущее время совпадает с заданным временем, то вырабатывается флаг остановки таймера.

3.6 Подпрограммы индикации (INDICATION, UPDATE)

Рисунок 3.6 - Блок-схема подпрограммы индикации

Подпрограмма INDICATION вызывается в подпрограмме обработки по прерываний таймеру. Адрес нулевой ячейки вектора IND заносится в регистр X. После чего прибавляется смещение, определяемое текущим знакоместом MESTO, и значение выводится в порт A. Также идёт обеспечение мигания светодиодов при режиме прямого хода таймера, выводящих на табло букву "С" а также обеспечивается мигания разряда, в который в данный момент должно вводиться значение, при одном из режимов ввода времени.

Каждый семисегментный светодиодный знаковый индикатор (ССЗИ) имеет семь излучающих сегментов A - G и точку Н (рисунок 3.5).

Рисунок 3.7 - Сегменты ССЗИ

Светящимся сегментам соответствуют биты установленные в 0, погашенным - 1. Коды для цифр "0"-"9" приведены в таблице 3.1.

Таблица 3.1 - Коды для ССЗИ

ABCDEFGHкод110011111$F9200100101$A4300001101$B0410011001$99501001001$92601000001$82700011111$F8800000001$80900001001$90000000011$C0

Задание кодов цифр, выводимых на индикацию, осуществляется с помощью массива Code_table:

Рисунок 3.8 - Массив кодов цифр

$C0, $F9, тАж - элементы массива (числа в шестнадцатеричном формате, соответствующие цифрам 0, 1, тАж).

Рисунок 3.9 - Блок-схема подпрограммы обновления информации на индикаторах

Подпрограмма UPDATE предназначена для обновления информации на индикаторах. Адрес нулевой ячейки вектора IND заносится в регистр X. Затем, в зависимости от знакоместа и значения, которое на него выводится, формируется кодовая последовательность, формирующая нужное число на индикаторе. Для этого в регистр Z заносится начальный адрес массива CODE_TABLE, умноженный на 2. Далее к этому регистру прибавляется номер нужного значения (HOUR_1тАжMIN_2 -