Таймер на 51-м микроконтроллере.
Добавлено: Пт дек 24, 2010 20:05:20
Доброго времени суток! Недавно начал изучать микроконтроллеры, решил начинать с семейства х51. Первое устройство, которое решил сделать - это обычный кухонный таймер. От 1 до 99 минут, в конце отсчета пищит зуммер. 3 кнопки: "+1 минута", "+10 минут" и "Старт". Динамическая индикация на 2-х семисегментных индикаторах с общим анодом. (Сегменты управляются нулем). Кнопки замыкаются на землю. Решил что для моих целей вполне подойдет микроконтроллер AT89S2051.
Нарисовал схемку, номиналы резисторов (и транзисторов) пока не знаю, подберу их уже после того как куплю индикаторы.

Порт P1 используется для управления сегментами, P3.0 и P3.1 для управления первым и вторым индикатором соответственно. Кнопки "+1", "+10", "Старт" цепляются к выводам порта Р3.2, Р3.3, Р3.4. Зуммер к Р3.5. Программу счета времени я написал, а вот как осуществить вывод на экран не знаю. Про динамическую индикацию читал, но код написать не получается( Не понимаю, как написать цикл, который динамически выводил бы на каждый индикатор свое число.
Вот подпрограмма счета времени, вызывается каждый раз при срабатывании таймера 0, который настроен на секундную задержку. R1 - количество секунд, R2 - количество единиц минут, R3 - количество десятков минут.
Частоту обновления каждого индикатора я планирую 100 Гц, соответственно 2-х индикаторов 200 Гц. Выводить цифры на сегмент я планирую так: создать таблицу с константами для каждого числа, а потом в выбирать из таблицы значение и выдавать в порт. Понимаю что нужно нужно использовать таймер 1 настроенный на прерывание 200 раз в секунду, но как при этом выводить сначала минуты на один индикатор, а десятки минут на другой? Отображать буду только минуты, вместо секунд будет точка мигать наверно.
Вот алгоритмы счета времени и опроса кнопок:

Буду рад, если кто-то напишет небольшой пример динамической индикации с подробными комментариями. Ну и любым замечаниям и предложениям тоже буду рад)
Нарисовал схемку, номиналы резисторов (и транзисторов) пока не знаю, подберу их уже после того как куплю индикаторы.

Порт P1 используется для управления сегментами, P3.0 и P3.1 для управления первым и вторым индикатором соответственно. Кнопки "+1", "+10", "Старт" цепляются к выводам порта Р3.2, Р3.3, Р3.4. Зуммер к Р3.5. Программу счета времени я написал, а вот как осуществить вывод на экран не знаю. Про динамическую индикацию читал, но код написать не получается( Не понимаю, как написать цикл, который динамически выводил бы на каждый индикатор свое число.
Вот подпрограмма счета времени, вызывается каждый раз при срабатывании таймера 0, который настроен на секундную задержку. R1 - количество секунд, R2 - количество единиц минут, R3 - количество десятков минут.
Код: Выделить всё
;##################################################################
;Подпрограмма счета времени. Вызывается по прерыванию от таймера 0.
;##################################################################
CHECK_SEC: ;Проверяем равно ли количество секунд нулю
MOV A, R1
JZ CHECK_MIN ;Если равно, то переходим к проверке ед. минут
DEC R1 ;Если не равно, уменьшаем кол-во секунд на 1
CHECK_MIN: ;Проверяем равно ли количество единиц минут нулю
MOV A, R2
JZ CHECK_T_MIN ;Если равно, то переходим к проверке дес. минут
DEC R2 ;Если не равно, то уменьшаем кол-во ед. минут на 1
MOV R1, #59 ;и устанавливаем количество секунд равным 59
CHECK_T_MIN: ;Проверяем равно ли количество дес. минут нулю
MOV A, R3
JZ BEEP ;Если равно - то время истекло, включаем зуммер
DEC R3 ;Если нет, уменьшаем кол-во дес. минут на 1
MOV R2, #9 ;устанавливаем количество ед. минут равным 9
MOV R1, #59 ;Устанавливаем количество секунд равным 59
BEEP: ;Включение зуммера
SETB P3.5Код: Выделить всё
Symbols: ;a b c d e f g DP
DB 00000011b ;0
DB 10011111b ;1
DB 00100101b ;2
DB 00001101b ;3
DB 10011001b ;4
DB 01001001b ;5
DB 01000001b ;6
DB 00011111b ;7
DB 00000001b ;8
DB 00001001b ;9
Зажигание индикатора:
MOV A, R2 ;Заносим в аккумулятор нужное значение
MOV DPTR, #Symbols ;Уст. указ. на таблицу
MOVC A,@A+DPTR ;Выбираем из таблицы значение для вывода на индикатор
MOV P1, A ;Выдаем в порт

Буду рад, если кто-то напишет небольшой пример динамической индикации с подробными комментариями. Ну и любым замечаниям и предложениям тоже буду рад)