Цифровые часы с будильником на семисегментном индикаторе
Основные характеристики и принцип работы микроконтроллера. Принципиальная схема устройства. Структурная схема цифровых часов с будильником. Разработка алгоритма работы управляющей программы с помощью интегрированной среды разработки MPLAB IDE v7.20.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 23.11.2015 |
Размер файла | 1,8 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Министерство образования Республики Беларусь
Учреждение образования
БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ИНФОРМАТИКИ И РАДИОЭЛЕКТРОНИКИ
Факультет телекоммуникаций
Кафедра защиты информации
Дисциплина: Цифровые и микропроцессорные устройства
ПОЯСНИТЕЛЬНАЯ ЗАПИСКА
к курсовой работе
на тему: «Цифровые часы с будильником на семисегментном индикаторе»
Выполнил:
Студент группы 362101
Хвасько О.Ю.
Минск 2015
Содержание
Введение
1. Описание используемого микроконтроллера
2. Разработка структурной схемы устройства
3. Принципиальная схема устройства
4. Разработка алгоритма работы управляющей программы
5. Разработка управляющей программы
Заключение
Список использованных источников
Приложение
Введение
В последнее время цифровые устройства стали развиваться приличными темпами. Цифровые приборы во многих отраслях науки и техники стали вытеснять аналоговые. Особое место в цифровой технике заняли микроконтроллеры.
Микроконтроллер -- микросхема, предназначенная для управления электронными устройствами. По сути, это однокристальный компьютер, способный выполнять простые задачи. Использование одной микросхемы, вместо целого набора, как в случае обычных процессоров, применяемых в персональных компьютерах, значительно снижает размеры, энергопотребление и стоимость устройств, построенных на базе микроконтроллеров.
Микроконтроллеры являются основой для построения встраиваемых систем, их можно встретить во многих современных приборах, таких, как телефоны, стиральные машины и т. п. Большая часть выпускаемых в мире процессоров -- микроконтроллеры.
При проектировании микроконтроллеров приходится соблюдать баланс между размерами и стоимостью с одной стороны и гибкостью и производительностью с другой. Для разных приложений оптимальное соотношение этих и других параметров может различаться очень сильно. Поэтому существует огромное количество типов микроконтроллеров, отличающихся архитектурой процессорного модуля, размером и типом встроенной памяти, набором периферийных устройств, типом корпуса и т. д.
В данной курсовой работе предлагается реализовать цифровые часы с будильником с семисегментным индикатором на базе микроконтроллера PIC16F628.
1. Выбор и обоснование технических требований к устройству
В соответствии с заданием в данной курсовой работе необходимо разработать цифровые часы с будильником. Рассмотрим принцип работы данного устройства и сформулируем основные технические требования к нему.
Основным элементом устройства является микроконтроллер PIC16F628.
Техническими требованиями к данному проекту являются:
- напряжение питания 5В;
- вывод значения на семисегментный индикатор;
18-выводный FLASH микроконтроллер PIC16F628 входит в состав распространенного семейства PICmicroPIC16CXX. Микроконтроллер этого семейства имеет 8-разрядную, высокопроизводительную и полностью статическую RISC архитектуру.
PIC16F628 имеет 8-уровневый аппаратный стек и большое количество внутренних и внешних прерываний. В гарвардской архитектуре RISC ядра микроконтроллера разделены 14-разрядная память программ и 8-разрядная память данных. Такой подход позволяет выполнять все инструкции за один машинный цикл, кроме команд ветвления, которые выполняются за два машинных цикла. Ядро микроконтроллера поддерживает 35 простых в изучении, но очень эффективных инструкций. Дополнительные регистры управления и архитектурные новшества позволяют создавать высокоэффективные устройства.
Специальные особенности микроконтроллеров PIC16F62X позволяют сократить число внешних компонентов, что в свою очередь снижает стоимость конечного устройства, повышает надежность системы и уменьшает энергопотребление. Дополнительную гибкость в разработках дает широкий выбор режимов работы тактового генератора: ER генератор, наиболее дешевое решение; LP генератор, минимизирует потребляемый ток; XT генератор, для подключения стандартного резонатора; INTRC внутренний RC генератор; HS генератор, для высокоскоростных режимов работы.
Энергосберегающий режим SLEEP, позволяет эффективно использовать микроконтроллеры в устройствах с питанием от батареек или аккумуляторов. Выход из режима SLEEP происходит при возникновении внешних, некоторых внутренних прерываниях и сбросе микроконтроллера. Высоконадежный сторожевой таймер WDT с собственным внутренним RC генератором предотвращает «зависание» программы.
Микроконтроллер PIC16F628 удовлетворяет ряду параметров для его использования от зарядных устройств до удаленных датчиков с малым потреблением электроэнергии. FLASH технология и большое количество периферийных модулей, совместимых с микроконтроллером, позволяет быстро и удобно разрабатывать программное обеспечение. Высокая производительность, малая стоимость, легкость в использовании и гибкость портов ввода/вывода - делают PIC16F628 универсальным микроконтроллером.
В таблице 1.1 представлены основные характеристики микроконтроллера PIC16F628.
Таблица 1.1 -- Основные характеристики микроконтроллера PIC16F628
Быстродействие |
Максимальная тактовая частота (МГц) |
20 |
|
Память |
Flash память программ (слов) |
2048 |
|
Память данных (байт) |
224 |
||
EEPROM память данных (байт) |
128 |
||
Периферия |
Таймеры |
TMR0, TMR1, TMR2 |
|
Компараторов |
2 |
||
Модулей CCP |
1 |
||
Последовательный интерфейс |
USART |
||
Программируемый источник опорного напряжения |
Есть |
||
Дополнительные характеристики |
Число источников прерываний |
10 |
|
Число портов ввода/вывода |
16 |
Характеристика высокопроизводительного RISC ядра: 35 инструкций; Все команды выполняются за один цикл (200нс), кроме инструкций переходов, выполняющихся за два цикла; Тактовая частота: DC - 20МГц, тактовый сигнал. DC - 200нс, один машинный цикл; Система прерываний; 16 специальных аппаратных регистров; 8-уровневый аппаратный стек; Прямой, косвенный и относительный режим адресации
Характеристика периферийных модулей: 15 независимых портов ввода/вывода; Повышенная нагрузочная способность портов ввода/вывода;
Таймер 0: 8-разрядный таймер/счетчик с 8-разрядным программируемым предделителем; Таймер 1: 16-разрядный таймер/счетчик с возможностью подключения внешнего пьезоэлектрического резонатора; Таймер 2: 8-разрядный таймер/счетчик с 8-разрядным программируемым предделителем и выходным делителем; Последовательный синхронно-асинхронный приемопередатчик USART;16 байт памяти данных, доступных из всех банков.
Специальные функции микроконтроллера: Сброс по включению питания (POR); Таймер сброса (PWRT) и таймер ожидания запуска генератора (OST) после включения питания; Детектор пониженного напряжения (BOD); Сторожевой таймер WDT с собственным RC
генератором; Мультиплицируемый вывод -MCLR; Программируемые подтягивающие резисторы на входах PORTB; Программируемая защита памяти программ; Низковольтный режим программирования; Режим энергосбережения SLEEP; Программирование в готовом устройстве (используется два вывода микроконтроллера); Программируемые пользователем биты ID;
Выбор параметров тактового генератора:
- FLASH биты выбора параметров тактового генератора
- ER генератор 4.3067 0 T(внешний резистор)
- Уменьшение числа внешних компонентов
- Двухскоростной внутренний RC генератор
- Работа в режиме малого потребления
- EC внешний тактовый сигнал
- XT режим генератора
- HS режим генератора
- LP режим генератора
CMOS технология: Высокоскоростная, энергосберегающая CMOS FLASH технология (0.7 микрон); Полностью статическая архитектура; Широкий диапазон напряжений питания: от 3.0 до 5.5В; Коммерческий, индустриальный и расширенный температурные диапазоны; Малое энергопотребление;
В состав микроконтроллера входит: сброс по включению питания PWRT, сторожевой таймер WDT, программируемая защита кода программы и высокая нагрузочная способность портов ввода/вывода.
Микроконтроллер PIC16F628 программируется в последовательном режиме с использованием двух выводов RB6 и RB7.
На рисунке 1.1 представлено расположение выводов микроконтроллера PIC16F628 в PDIP корпусе, а на рисунке 1.2 схема микроконтроллера.
Рисунок 1.1 - Расположение выводов микроконтроллера PIC16F628
Рисунок 1.2 - Схема микроконтроллера PIC16F628
2. Разработка структурной схемы устройства
В данной работе необходимо разработать цифровые часы с будильником на семисегментном индикаторе. Структурная схема проекта состоит из четырех функциональных блоков (рисунок 2.1): клавиатура, микроконтроллер (МК), дисплей, динамик.
Рисунок 2.1 - Структурная схема цифровых часов с будильником на семисегментном индикаторе
Функции блоков:
-Клавиатура - для цифровой установки режима работы;
-Микроконтроллер (основной узел) - формирует сигнал;
-Дисплей - для отображения времени часов и будильника;
-Динамик - для звуковой индикации.
Основой проектируемого устройства является микроконтроллер (МК). На него возлагаются такие задачи как управление семисегментным индикатором и подача сигнала будильника на динамик. микроконтроллер выполняет обработку полученной информации и выполняет действия согласно заданной программе. Основой блока МК является микроконтроллер PIC16F628.
Стабилизированное и фильтрованное питание поступает с источника питания на блок МК, дисплей и динамик. Блок семисегментного дисплея отображает взаимодействие проектируемого устройства с пользователем посредством визуального отображения информации. Для проектируемого устройства был выбран семисигментный индикаторный дисплей REC-S5461AG-G.
3. Разработка принципиальной схемы устройства
Принципиальная схема разработана в соответствии со структурной схемой. Как видно из схемы часов (рисунок 3.1), микроконтроллер PIC16F628 является единственной микросхемой, используемой в данном устройстве.
Для задания тактовой частоты к выводам 15 и 16 подключен внешний кварцевый резонатор QR1 на 4 МГц.
Керамические конденсаторы С2 и С3 по 33 пФ введены для обеспечения уверенного запуска кварцевого резонатора. К выводам 1, 2, 3, 11, 12, 13, 17, 18 подключен семисегментный дисплей HL1 (REC-S5461AG-G) с общим анодом, аноды которого подключены к выводам 6 - 9 микроконтроллера. Для обеспечения ограничения тока на индикатор на выводы 1, 2, 3, 11, 12, 13, 17, 18 подключены токоограничивающие резисторы R1 - R8 по 1 кОм.
Для управления индикацией времени к выводам 6 - 9 присоединены кнопки SA1 - SA4 без фиксации.
В качестве выхода для сигнала будильника используется вывод 10, к которому присоединен динамик BA1, а в качестве усилителя - каскад на транзисторах VT1, VT2.
Рабочее напряжение питания схемы 5В.
В таблице 3.1 приведена перечень элементов, используемых в схеме.
Рисунок 3.1 - Принципиальная схема цифровых часов с будильником.
Таблица 3.1 - Перечень элементов принципиальной схемы
Поз. обозначение |
Наименование |
Кол. |
Примечание |
|
Конденсаторы |
||||
С1 |
Электролитический конденсатор, 100 мкФ |
1 |
||
С2, С3 |
Конденсатор кепамический 33 пФ |
2 |
||
С4 |
Электролитический конденсатор 0,1 мкФ |
1 |
||
Кварцевые резонаторы |
||||
QR1 |
Кварцевый резонатор 4 МГц |
1 |
||
Транзисторы |
||||
VT1 |
Кремниевый биполярный транзистор КТ315 |
1 |
||
VT2 |
Кремниевый биполярный транзистор КТ361 |
1 |
||
Резисторы |
||||
R1-R8 |
Резистор 1 кОм |
8 |
||
R9, R12-R15 |
Резистор 2,2 мОм |
5 |
||
R10, R11 |
Резистор 10 кОм |
2 |
||
Микросхемы |
||||
DD1 |
Микроконтроллер PIC16F628 |
1 |
||
Дисплей |
||||
HL1 |
Семисегментный индикатор REC-S5461AG-G |
1 |
||
Кнопки |
||||
SA1-SA4 |
Кнопкитактовые 0613HIM-130G-G |
4 |
||
Динамик |
||||
BA1 |
Динамик 3 Ом 3 Вт |
1 |
4. Разработка алгоритма управляющей программы
Для обеспечения работы проектируемого устройства в соответствии с заданными техническими требованиями необходимо запрограммировать микроконтроллер на определённую обработку и выдачу данных. Для составления программы необходимо сначала составить алгоритм работы устройства, т.е. конечный набор правил для выполнения некоторых процедур. Условно алгоритм работы можно разделить на составные части: инициализация переменных и констант, главный цикл программы, цикл коррекции и будильник.
На рисунке 4.1 представлена общая блок-схема программы.
gl_cikl - главный цикл программы.
На рисунке 4.2 представлена блок-схема подпрограммы цикла коррекции.
На рисунке 4.3 представлена блок-схема подпрограммы Cikl_kors0, которая отвечает за настройку секунд.
Sec_nol - подпрограмма инкремента секунд.
Рисунок 4.1 - общая блок-схема программы
Рисунок 4.2 - подпрограмма Cikl_kor
Рисунок 4.3 - блок-схема подпрограммы Cikl_kors0
На рисунке 4.4 представлена блок-схема подпрограммы Ci_kormin, которая отвечает за коррекцию минут.
Inc_min - подпрограмма инкремента минут.
Рисунок 4.4 - блок-схема подпрограммы Ci_kormin
На рисунке 4.5 представлена блок-схема подпрограммы Ci_korhas, которая отвечает за настройку часов.
Inc_has - подпрограмма инкремента часов.
Рисунок 4.5 - блок-схема подпрограммы Ci_korhas
На рисунке 4.6 представлена блок-схема подпрограммы Budkormin, которая отвечает за настройку минут будильника.
Incminbud - подпрограмма инкремента минут будильника.
Рисунок 4.6 - блок-схема подпрограммы budkormin
На рисунке 4.7 представлена блок-схема подпрограммы budkorhas, которая отвечает за настройку часов будильника.
Inchasbud - инкремент часов будильника.
Cikl_bud0 - начало цикла будильника.
Рисунок 4.7 - блок-схема подпрограммы budkorhas
5. Разработка управляющей программы
Для написания программы микроконтроллера для разрабатываемого устройства был выбран язык Assembler.
Написание программы, её отладка и компиляция осуществляется с помощью интегрированной среды разработки MPLAB IDE v7.20 для PIC.
Листинг программы с подробным описанием в комментариях:
; Программа ЧАСЫ на PIC16F628 (Тактовая частота 4 Мгц)
;
; Декремент счётчика ct256 происходит 256 раз в секунду
; в программе прерывания по переполнению таймера TMR1.
; =====================================================
listp=16f628;задали тип контроллера
include<p16F628.inc>;подключили файл опций
; =====Конфигурация=========
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC & _LVP_OFF & _BODEN_OFF & _MCLRE_OFF
;===============================================
; Переменные и флаги, используемые в программе
;===============================================
RBPUequ07h; бит включения подтягивающих резисторов
ct256equ20h; счётчик 256 Гц
flagiequ21h
; назначение битов
zv_ofequ0;бит 0 - нажатие кнопки - выключение звука будильника
bu_srequ1;бит 1 - будильник сработал
mctnequ2;бит 2 - малый счётчик ct256zvuk =0
rindequ3;бит 3 - режим индикации 0=часы-минуты, 1=минуты-секунды
bu_vklequ4;бит 4 - будильник включен
bctnequ5;бит 5 - большой счётчик seczvuk =0
bit_apequ6;бит 6 - бит автоповтора(устанавливается подпрограммой pause_ap)
kon_bitequ7;бит 7 - контрольный бит для автоповтора(flagi)
secequ22h; значение секунд в виде 60-(количество секунд)
minequ23h; значение минут в виде 60-(количество минут)
hasequ24h; значение часов в виде 24-(количество часов)
d_rezequ25h; результат деления на 10(десятки после
; преобразования
e_rezequ26h; единицы после преобразования
ct256zvukequ27h; дополнительный счётчик для генерации звука
time_tempequ28h; ячейка для подпрограммы пауза
temp1equ29h; временная ячейка для работы в прерывании
nom_knequ2Ah; номер опрашиваемой кнопки
temp_knequ2Bh; временная ячейка для работы с кнопками
temp1_knequ2Ch; временная ячейка для работы с кнопками
seczvukequ2Dh; секундный счётчик для генерации звука
ctblknequ2Eh; секундный счётчик для блокировки кнопок
flagi1equ2Fh; флаги
; назначение битов
u_onequ00h; бит состояния портов 0-порты заблокированы напряжения нет
; 1-порты в обычном режиме напряжение есть
blknequ01h; флаг блокировки кнопок 1-кнопки заблокированы
ct_kn_korequ33h; счётчик от дребезга кнопки "коррекция"
fl_korequ34h; флаги нажатия кнопки "коррекция"
ct_kn_budequ35h; счётчик от дребезга кнопки "будильник"
fl_budequ36h; флаги нажатия кнопки "будильник"
ct_kn_incequ37h; счётчик от дребезга кнопки "инкремент"
fl_incequ38h; флаги нажатия кнопки "инкремент"
fl_knequ00h; флаг включения кнопки
fl_apequ01h; флаг автоповтора (кнопка нажата дольше секунды)
n_indequ39h ; номер индикатора, выводимого на индикацию
; в прерывании
ind_0equ3Ah; четыре текущих индицируемых разряда
ind_1equ3Bh
ind_2equ3Ch
ind_3equ3Dh
fl_indequ3Eh; флаги мигания разрядов
; бит 0 - мигание разряда ind_0
; бит 1 - мигание разряда ind_1
; бит 2 - мигание разряда ind_2
; бит 3 - мигание разряда ind_3
; бит 4 - включение мигающей точки
temp_indequ3Fh; временная ячейка
mask_bequ41h; маска порта B
kor_lequ0x42; (EEPROM 0x01)корректирующее значение, прибавляется
kor_hequ0x43; (EEPROM 0x02)к константе в TMR1 один раз в секунду
; по адресу 0x03 EEPROM записывается значение 0x55 (контрольный байт), которое
; проверяется при включении питания
LED0equ49h; Регистр хранения результатов преобразований
; 1-го двоично-десятичного разряда.
LED1equ4Ah; ------- 2-го -------------------------
LED2equ4Bh; ------- 3-го -------------------------
LED3equ4Ch; ------- 4-го -------------------------
Countequ4Dh; Счетчик проходов.
Memequ4Eh; Регистр оперативной памяти.
TimerLequ4Fh; Регистр младшего разряда 2-байтного двоичного числа.
TimerMequ50h; Регистр старшего разряда 2-байтного двоичного числа.
; ячейки, отображаемые во всех банках
tempkor_lequ70h; буфер, чтобы хранить корректирующее значение
tempkor_hequ71h; во время его коррекции
w_tempequ72h; ячейка хранения аккомулятора во время прерывания
status_tempequ73h; для хранения регистра STATUS во время прерывания
temp_fsrequ74h; ячейка для хранения регистра FSR во время прерывания
bud_minequ75h; уставка минут будильника (EEPROM 0x04)
bud_hasequ76h; уставка часов будильника (EEPROM 0x05)
; по адресу 0x06 EEPROM записан контрольный байт 0x55
; проверяемый при включении питания
;==========================
; Точка старта
;==========================
ORG0
GOTOSTART
;======================
; программа прерывания
;======================
ORG0004
movwfw_temp; сохранили аккомулятор во временную ячейку
swapfSTATUS,W; загрузили регистр STATUS в аккомулятор, со сменой полубайтов
movwfstatus_temp; сохранили во временную ячейку
movfFSR,W; загрузили регистр FSR в аккомулятор
movwftemp_fsr; сохранили во временной ячейке
bcfSTATUS,RP0
bcfSTATUS,RP1; выбрали 0-й банк
;=============================================
; загрузка константы в регистры TMR1L и TMR1H
;=============================================
bcfT1CON,TMR1ON; выключили таймер TMR1
movlw0F0h; загрузили в аккомулятор старший полубайт константы
movwfTMR1H; переправили в регистр старшего байта таймера
; уход в прерывание происходит либо за 2 либо за 3 цикла контроллера, поэтому необходима
; коррекция младшего байта константы в зависимости от числа импульсов, оставшихся в
; счётчике TMR1L на момент остановки счёта
movlw0C6h; загрузили в аккомулятор младший полубайт константы
addwfTMR1L,F; суммировали с остатком в TMR1
; так как число импульсов не круглое, каждое четвёртое прерывание
; необходимо уменишить константу на 1
; вычитание происходит только когда включены 0-й и первый биты счётчика ct256
movlw2; загружаем в аккомулятор 2
andwfct256,W; выделяем 2-й бит счётчика
bcfSTATUS,C ;обнуляем флаг переноса
movwftemp1; поместили во временную ячейку
rrftemp1,W; сдвинули бит вправо, оставив в аккомуляторе
andwfct256,W; логическое И с первым битом в счётчике
subwfTMR1L,F; вычли результат из младшего полубайта константы
bsfT1CON,TMR1ON; включили таймер TMR1
;=============================================
; константа загружена
;=============================================
;сброс флага прерывания
bcfPIR1,TMR1IF; сбросили флаг прерывания TMR1
; малый счётчик
decfszct256zvuk,F; декремент звукового счётчика
gotoclock01
bsfflagi,mctn; установили флаг малый счётчик =0
gotoclock00
clock01bcfflagi,mctn; сбросили флаг малый счётчик =0
clock00decfszct256,F
gotoclock_ret; возврат из прерывания по уменьшению счётчика
; 256 Гц на один импульс
; обработка одной секунды
;=====================
; коррекция константы
;=====================
bcfT1CON,TMR1ON; выключили таймер TMR1
movfkor_h,W; загрузили в аккомулятор старший полубайт коррекции
addwfTMR1H,F; суммировали со старшим полубайтом константы
movfkor_l,W; загрузили в аккомулятор младший полубайт коррекции
addwfTMR1L,F; суммировали с младшим полубайтом константы
movfSTATUS,W; загрузили в аккомулятор регистр STATUS
andlwB'00000001'; выделяем бит переноса
addwfTMR1H,F; суммировали со старшим полубайтом константы
bsfT1CON,TMR1ON; включили таймер TMR1
; счётчик блокировки кнопок
decfszctblkn,F; декремент счётчика блокировки кнопок
gotometka00; счётчик не равен 0
; счётчик =0
bcfflagi1,blkn; сброс флага блокировки кнопок
; большой счётчик
metka00decfszseczvuk,F; декремент секундного звукового счётчика
gotonext_1
bsfflagi,zv_of; выставили флаг конец звука (выключить звук будильника)
bsfflagi,bctn; установили флаг большой счётчик=0
gotonext_0
next_1bcfflagi,bctn; сбросили флаг обнуления большого счётчика
next_0decfszsec,F
gotoclock_ret; возврат из прерывания
; обработка одной минуты
movlw3Ch; загрузка в счётчик секунд числа 60(3C hex)
movwfsec
decfszmin,F
gotoclock_ret0; возврат из прерывания
; обработка одного часа
movlw3Ch ;загрузка в счётчик минут числа 60(3C hex)
movwfmin
decfszhas,F
gotoclock_ret0; возврат из прерывания
; переход в следующие сутки
movlw18h; загрузка в счётчик часов числа 24(18 hex)
movwfhas
; возврат из прерывания
clock_ret0callbud_prov; вызвали подпрограмму проверки будильника
clock_retcallu_re; проверка напряжения и переключение портов
btfssflagi1,u_on; проверка напряжения
gotoclock_ret1; напряжения нет, пропускаем опрос кнопок и
; динамическую индикацию
callind_pre; динамическая индикация
btfscflagi1,blkn; проверка блокировки кнопок
gotoclock_ret1; кнопки блокированы, пропускаем опрос кнопок
; опрос кнопок
clrfnom_kn; задали номер кнопки 0 "коррекция"
callknopki; вызвали подпрограмму опроса кнопок
incfnom_kn,F; задали номер кнопки 1 "будильник"
callknopki; вызвали подпрограмму опроса кнопок
incfnom_kn,F; задали номер кнопки 2 "инкремент"
callknopki; вызвали подпрограмму опроса кнопок
clock_ret1movftemp_fsr,W; загрузили в аккомулятор регистр FSR
movwfFSR; восстановили регистр FSR
swapfstatus_temp,W; загрузили регистр STATUS в аккомулятор,
; со сменой полубайтов
movwfSTATUS; восстановили регистр STATUS
swapfw_temp,F
swapfw_temp,W; восстановили аккомулятор
retfie; возврат из прерывания
;==========================
; Начало основной программы
; инициализация контроллера
;==========================
STARTclrw;обнуление аккомулятора
bcfSTATUS,RP0;переход в 0-й
bcfSTATUS,RP1;банк
movwfINTCON;запрет всех прерываний
movwfPIR1;сброс всех флагов прерываний
bsfSTATUS,RP0;1-й банк
movwfPIE1;запрет прерываний от переферийных модулей
bcfSTATUS,RP0;0-й банк
;======================================================
;далее выключаем неиспользуемые модули микроконтроллера
;======================================================
;отключение модуля компараторов
movlw07h;загрузили в аккомулятор число "00000111"
movwfCMCON;включили биты CM0...CM2 регистра CMCON, что
;соответствует отключению модуля компараторов
;отключение модуля USART
clrfRCSTA;обнулили регистр RCSTA, выключив бит SPEN(7-й)
;что соответствует отключеннию USART
;отключение модуля TMR2
clrfT2CON;обнулили регистр T2CON, выключив бит TMR2ON(2-й)
;что соответствует отключению TMR2
;отключение модуля CCP
clrfCCP1CON;обнулили регистр CCP1CON, выключив биты
;CCP1M0...CCP1M3
;(0-й...3-й), что соответствует отключению модуля CCP
;отключение источника опорного напряжения
bsfSTATUS,RP0;1-й банк
clrfVRCON;обнулили регистр VRCON(в 1-м банке), выключив
;бит VREN(7-й),что соответствует отключению ИОН
;отключение TMR0
bcfOPTION_REG,T0CS;обнуляем бит T0CS, что соответствует
;тактированию TMR0 от внутреннего сигнала
bcfSTATUS,RP0;0-й банк
;=====================================================
;закончили отключение неиспользуемых модулей
;======================================================
clrfT1CON; отключили TMR1, и инициализировали, обнулив все биты
; регистра T1CON
; обнуляем все регистры нулевого банка
nolregmovlw20h; адрес первого регистра
movwfFSR; загрузили в FSR
nolreg0clrfINDF; обнулили регистр
movfFSR,W; загрузили FSR в аккомулятор
incfFSR,F; увеличили FSR на 1
xorlw7Fh; сравниваем FSR с адресом последней ячейки
btfssSTATUS,Z; проверка равенства
; флаг нуля сброшен, адреса НЕ равны
gotonolreg0; продолжить обнуление
; закончили обнуление
;загрузка константы в TMR1
movlw0F0h; загрузили в аккомулятор старший полубайт константы
movwfTMR1H; переправили в регистр старшего байта таймера
movlw0C6h; загрузили в аккомулятор младший полубайт константы
movwfTMR1L; переправили в регистр младшего байта таймера
;загружаем счётчики секунд, минут и часов
movlw3Ch; загрузили в аккомулятор число 60(3Ch)
movwfsec; переправили в счётчик секунд
movwfmin; переправили в счётчик минут
movlw18h; загрузили в аккомулятор число 24(18h)
movwfhas; переправили в счётчик часов
;загрузка корректирующей константы
movlw03h ; загрузили в аккомулятор адрес контрольного байта в EEPROM
callee_rd ; вызов подпрограммы чтения из EEPROM
xorlw55h ; сравниваем прочитанное с контрольным значением
btfscSTATUS,Z ;проверка флага нуля
; флаг нуля установлен (контрольное значение есть в EEPROM)
gotokk_ee ; переход к чтению константы из EEPROM
; флаг нуля сброшен (в EEPROM константа не записана)
movlw04h ;загрузили в аккомулятор старший полубайт коррекции(.1032)
movwfkor_h ; переправили в ячейку старшего полубайта
movlw08h ; загрузили в аккомулятор младший полубайт коррекции
movwfkor_l ; переправили в ячейку младшего полубайта
gotoport_inic ; переход к инициализации портов
; чтение корректирующей константы из EEPROM
kk_eemovlw01h ; в аккомулятор- адрес младшего полубайта константы
callee_rd ; читаем из EEPROM
movwfkor_l ; переправили на место младший полубайт
movlw02h ; в аккомулятор адрес старшего полубайта
callee_rd ; читаем из EEPROM
movwfkor_h ; корректируещее значение загружено
; инициализация портов
port_inicclrfPORTA
clrfPORTB
bsfSTATUS,RP0;1-й банк
movlwB'11100000'; загрузили в ак-р число для TRISA
; RA0-RA4 - выходы
; RA5-RA7 - входы
movwfTRISA; переправили в TRISA
movlwB'11100000'; загрузили в ак-р число для TRISB
; RB0-RB4 - выходы
; RB5-RB7 - входы
movwfTRISB; переправили в TRISB
bcfOPTION_REG,RBPU; Включили подтягивающие резисторы
bcfSTATUS,RP0; 0-й банк
; загрузка значения будильника
movlw06h; загрузили в аккомулятор адрес контрольного байта
callee_rd; вызов подпрограммы чтения из EEPROM
xorlw55h; сравниваем прочитанное с контрольным значением
btfssSTATUS,Z;проверка флага нуля
; флаг нуля сброшен (контрольного значения НЕТ в EEPROM)
gotoinic_ok; к окончанию инициализации
; флаг нуля установлен (контрольное значение есть в EEPROM)
; читаем уставку будильника из EEPROM
movlw04h; адрес минут будильника
callee_rd; вызов подпрограммы чтения из EEPROM
movwfbud_min; загрузили минуты будильника
movlw05h; адрес часов будильника
callee_rd; вызов подпрограммы чтения из EEPROM
movwfbud_has; загрузили часы будильника
;включаем прерывания
inic_okbsfSTATUS,RP0; 1-й банк
bsfPIE1,TMR1IE; прерыванине по переполнению TMR1 разрешено
bcfSTATUS,RP0; 0-й банк
bsfINTCON,PEIE; разрешаем прерывания от переферийных модулей
bsfINTCON,GIE; глобальное разрешение прерываний
; включаем таймер/счётчик TMR1
bsfT1CON,TMR1ON; таймер TMR1 включен
;==================================
; Начало главного цикла программы
;==================================
; Главный цикл программы
;===========================
gl_ciklcallhasmin_ind; вывод на индикатор часов-минут
movffl_ind,W; загрузили в аккомулятор флаги мигания индикаторов
andlwB'11110000'; обнулили флаги мигания индикаторов
xorwfflagi,W
andlwB'11101111'
xorwfflagi,W
movwffl_ind; заменили бит мигающей точки на бит включения будильника
; проверяем сработал ли будильник
btfscflagi,bu_sr
; будильник сработал
gotobudilnik ; переход к циклу будильник сработал
; проверяем нажата ли кнопка коррекция
btfscfl_kor,fl_kn
; бит включен, кнопка нажата
gotocikl_kor; переход к циклу коррекции
; проверяем нажата ли кнопка будильник
btfscfl_bud,fl_kn
; бит включен, кнопка нажата
gotocikl_bud; переход к циклу будильника
; проверяем нажата ли кнопка инкремент
btfscfl_inc,fl_kn
; бит включен, кнопка нажата
gotosmrin; смена режима индикации
gotogl_cikl; переход к началу главного цикла
;-------------------------------
; смена режима индикации
;==========================
smrinmovlwB'00001000' ; загрузили маску для 3-го бита
xorwfflagi,F; инвертировали бит режима индикации
bcffl_inc,fl_kn ; сброс флага кнопки инкремент
gotogl_cikl; возврат в главный цикл
;-------------------------------
; цикл коррекции
;=================
cikl_korbcffl_kor,fl_kn ; обнулили флаг кнопки коррекция
bsfflagi,rind; режим индикации минуты-секунды
bcffl_ind,04h ; выключили мигающую точку
; включаем мигание 2-х младших разрядов (секунд)
bsffl_ind,00h
bsffl_ind,01h
; цикл коррекции секунд
;=========================
cikl_kors0callhasmin_ind; вызов подпрограммы индикации
; проверяем флаг выхода из цикла
btfscflagi,bctn; проверка на 0 большого счётчика
gotogl_cikl; если флаг установлен - воврат в главный цикл
; проверяем нажата ли кнопка коррекция
btfscfl_kor,fl_kn
; бит включен, кнопка нажата
gotoci_kormin; переход к циклу коррекции минут
; проверяем автоповтор кнопки коррекция
btfscfl_kor,fl_ap
; автоповтор включен
gotoci_korkonst ; переход к коррекции константы
; проверяем нажата ли кнопка инкремент
btfssfl_inc,fl_kn
; кнопка НЕ нажата
gotocikl_kors0 ; переход к началу цикла коррекции секунд
; кнопка инкремент нажата - обнулить секунды (обнуляется счётчик секунд-sec=.60-, ct256,
; перезагружается константа в TMR1 )
callsec_nol ; вызываем подпрограмму обнуления секунд
bcffl_inc,fl_kn ; сбрасываем бит кнопки инкремент
gotocikl_kors0 ; переход к началу цикла коррекции секунд
;-------------------------------
; цикл коррекции минут
;======================
ci_korminbcffl_kor,fl_kn ; обнулили флаг кнопки коррекция
bcfflagi,rind; режим индикации часы-минуты
ci_kormin0callhasmin_ind ; выводим на индикатор часы-минуты
; проверяем флаг выхода из цикла
btfscflagi,bctn
gotogl_cikl; если флаг установлен - воврат в главный цикл
; проверяем нажата ли кнопка коррекция
btfscfl_kor,fl_kn
; кнопка коррекция нажата
gotoci_korhas ; переход к циклу коррекции часов
; проверяем нажата ли кнопка инкремент
btfssfl_inc,fl_kn
; кнопка инкремент НЕ нажата
gotoci_kormin1 ; переход к проверке автоповтора кнопки инкремент
; кнопка инкремент нажата
bcffl_inc,fl_kn ; сбрасываем флаг кнопки инкремент
callinc_min ; вызываем подпрограмму инкремента минут
gotoci_kormin0 ; к началу цикла коррекции минут
; проверяем автоповтор кнопки инкремент
ci_kormin1btfssfl_inc,fl_ap
; автоповтора нет
gotoci_kormin0 ; переход к началу цикла коррекции минут
; автоповтор включен - увеличиваем счётчик минут с частотой 4 Гц
cikm_apcallpause_ap ; вызываем подпрограмму паузы автоповтора
btfssflagi,bit_ap ; проверяем бит автоповтора
; бит ВЫключен
gotocikm_ap1
; бит включен
bcfflagi,bit_ap ; обнулили бит автоповтора
callinc_min ; вызвали подпрограмму инкремента минут
; индикация и проверка автоповтора кнопки инкремент
cikm_ap1callhasmin_ind
gotoci_kormin1 ; переход к началу цикла автоповтора
;-------------------------------
; цикл коррекции часов
;=======================
ci_korhasbcffl_kor,fl_kn ; обнулили флаг кнопки коррекция
movlwB'00001100'
movwffl_ind ; включаем мигание часов
ci_korhas0callhasmin_ind ; выводим на индикатор часы-минуты
; проверяем флаг выхода из цикла
btfscflagi,bctn
gotogl_cikl; если флаг установлен - воврат в главный цикл
; проверяем нажата ли кнопка коррекция
btfscfl_kor,fl_kn
; кнопка коррекция нажата
gotoingl_cikl; возврат в главный цикл
; проверяем нажата ли кнопка инкремент
btfssfl_inc,fl_kn
; кнопка инкремент НЕ нажата
gotocikh_ap ; переход к проверке автоповтора кнопки инкремент
; кнопка инкремент нажата
bcffl_inc,fl_kn ; сбросили флаг кнопки инкремент
callinc_has ; вызвали подпрограмму инкремента часов
gotoci_korhas0 ; к началу цикла коррекции часов
cikh_apbtfssfl_inc,fl_ap ; проверяем включен ли автоповтор
; автоповтор кнопки инкремент выключен
gotoci_korhas0 ; к началу цикла коррекции часов
; автоповтор включен - увеличиваем счётчик часов с частотой 4 Гц
callpause_ap ; вызываем подпрограмму паузы автоповтора
btfssflagi,bit_ap ; проверяем бит автоповтора
; бит ВЫключен
gotocikh_ap1
; бит включен
bcfflagi,bit_ap ; обнулили бит автоповтора
callinc_has ; вызвали подпрограмму инкремента часов
; индикация и проверка автоповтора кнопки инкремент
cikh_ap1callhasmin_ind ; выводим на индикатор часы-минуты
gotocikh_ap ; переход к началу цикла автоповтора
; возврат в главный цикл
ingl_ciklclrffl_kor
clrffl_bud
clrffl_inc; сброс флагов кнопок
clrfct_kn_kor
clrfct_kn_bud
clrfct_kn_inc; сброс счётчиков дребезга
bcfflagi,rind; включаем режим индикации часы-минуты
; блокировка кнопок на 3 секунды
movlw.3; загрузили в аккомулятор число 3
movwfctblkn; переправили в счётчик блокировки кнопок
bsfflagi1,blkn; установили флаг блокировки кнопок
gotogl_cikl
;-------------------------------
; цикл коррекции константы
;==========================
ci_korkonstbcffl_kor,fl_ap ; обнулили флаг автоповтора кнопки коррекция
bcffl_kor,fl_kn ; сброс флага кнопки коррекция
; включаем мигание 2-х старших разрядов индикатора
bsffl_ind,02h
bsffl_ind,03h
movfkor_l,W
movwftempkor_l ; загрузили в буфер младший полубайт корректирующей константы
movfkor_h,W
movwftempkor_h ; загрузили в буфер старший полубайт корректирующей константы
ci_korcon0movftempkor_l,W
movwfTimerL ; загрузили иладший полубайт в ячейки для преобразования
movftempkor_h,W
movwfTimerM ; загрузили старший полубайт в ячейки для преобразования
callbin2_10 ; вызвали подпрограмму преобразования в дес. код
movfLED0,W
movwfind_0
movfLED1,W
movwfind_1
movfLED2,W
movwfind_2
movfLED3,W
movwfind_3 ; переправили десятичное значение на индикатор
; проверяем флаг выхода из цикла
btfscflagi,bctn
gotogl_cikl; если флаг установлен - воврат в главный цикл
; проверяем автоповтор кнопки инкремент (+)
btfscfl_inc,fl_ap
; автоповтор есть
gotokonsinc_ap ; переход к автоповтору инкремента
; автоповтора нет
; проверяем автоповтор кнопки будильник (-)
btfscfl_bud,fl_ap
; автоповтор есть
gotokonsdec_ap ; переход к автоповтору декремента
; автоповтора нет
; проверяем нажата ли кнопка инкремент (+)
btfscfl_inc,fl_kn
; кнопка нажата
callkonst_inc ; вызываем подпрограмму инкремента константы
; кнопка НЕ нажата
; проверяем нажата ли кнопка будильник (-)
btfscfl_bud,fl_kn
; кнопка нажата
callkonst_dec ; вызываем подпрограмму декремента константы
; кнопка НЕ нажата
btfssfl_kor,fl_kn ; проверяем нажата ли кнопка коррекция
; кнопка коррекция НЕ нажата
gotoci_korcon0 ; возврат к началу цикла коррекции константы
; кнопка коррекция нажата дольше секунды
; запись откорректированной константы во все отведённые для неё ячейки
bcffl_kor,fl_kn
bcffl_kor,fl_ap ; сброс флагов кнопки коррекция
clrfct_kn_kor ; обнуление счётчика дребезга кнопки коррекция
; запрет прерываний
bcfINTCON,GIE
; запись в рабочую ячейку
movftempkor_l,W
movwfkor_l
movftempkor_h,W
movwfkor_h
bsfINTCON,GIE; разрешение прерываний
; запись в EEPROM
bsfSTATUS,RP0; банк1
movlw01h; поместили в аккомулятор адрес kor_l в EEPROM
movwfEEADR; переслали в EEADR
movftempkor_l,W; поместили в аккомулятор новое значение kor_l
callee_wr; вызвали подпрограмму записи в EEPROM
movlw02h; поместили в аккомулятор адрес kor_h в EEPROM
movwfEEADR; переслали в EEADR
movftempkor_h,W; поместили в аккомулятор новое значение kor_h
callee_wr; вызвали подпрограмму записи в EEPROM
movlw03h; поместили в аккомулятор адрес контрольного бита
movwfEEADR; переслали в EEADR
movlw55h; загрузили в аккомулятор контрольный байт
callee_wr; вызвали подпрограмму записи в EEPROM
; возврат в главный цикл
bcfSTATUS,RP0; 0-й банк
gotoingl_cikl
;-------------------------------
; автоповтор инкремента константы
;=================================
konsinc_apcallpause_ap ; вызываем подпрограмму паузы автоповтора
btfssflagi,bit_ap ; проверяем бит автоповтора
; бит ВЫключен
gotoci_korcon0; возврат в цикл коррекции константы
; бит включен
bcfflagi,bit_ap ; обнулили бит автоповтора
callkonst_inc ; вызвали подпрограмму инкремента константы
gotoci_korcon0; возврат в цикл коррекции константы
;-------------------------------
; автоповтор декремента константы
;================================
konsdec_apcallpause_ap ; вызываем подпрограмму паузы автоповтора
btfssflagi,bit_ap ; проверяем бит автоповтора
; бит ВЫключен
gotoci_korcon0; возврат в цикл коррекции константы
; бит включен
bcfflagi,bit_ap ; обнулили бит автоповтора
callkonst_dec ; вызвали подпрограмму декремента константы
gotoci_korcon0; возврат в цикл коррекции константы
;-------------------------------
; цикл будильника
;======================
cikl_budbcffl_bud,fl_kn ; сброс флага кнопки будильник
cikl_bud0callbudind; индикация часов-минут будильника
; проверяем флаг выхода из цикла
btfscflagi,bctn
gotogl_cikl; если флаг установлен - воврат в главный цикл
; опрос кнопок
btfscfl_bud,fl_kn ; проверяем нажата ли кнопка будильник
gotobud_end ; на завершение цикла будильника
btfscfl_kor,fl_kn ; нажата ли кнопка коррекция
gotobudkormin; к коррекции минут будильника
btfssfl_inc,fl_kn ; проверяем нажата ли кнопка инкремент
; кнопка инкремент не нажата
gotocikl_bud0; переход к началу цикла
; кнопка инкремент нажата
bcffl_inc,fl_kn ; сброс флага кнопки инкремент
;-------------------------------
;будильник включить/выключить
;============================
; инвертируем бит включения будильника
movlwB'00010000'; загрузили в аккомулятор маску для 4-го бита
xorwfflagi,F; инвертируем 4-й бит
movffl_ind,W; загрузили в аккомулятор флаги мигания индикаторов
xorwfflagi,W
andlwB'11101111'
xorwfflagi,W
movwffl_ind; заменили бит мигающей точки на бит включения будильника
btfscflagi,bu_vkl ; проверяем включен ли будильник
; будильник включен
callzvuk1sek; вызов звукового сигнала, длительностью 1 секунда
; будильник выключен
gotocikl_bud0; переход к началу цикла
;-------------------------------
; выход из цикла будильника
;===========================
; запись в EEPROM уставки будильника
bud_endbsfSTATUS,RP0; банк1
movlw04h; адрес минут будильника в EEPROM
movwfEEADR; загрузили в ячейку адреса EEPROM
movfbud_min,W; загрузили в аккомулятор минуты будильника
callee_wr; вызвали подпрограмму записи в EEPROM
movlw05h; адрес часов будильника в EEPROM
movwfEEADR; загрузили в ячейку адреса EEPROM
movfbud_has,W; загрузили в аккомулятор часы будильника
callee_wr; вызвали подпрограмму записи в EEPROM
movlw06h; адрес контрольного бита будильника в EEPROM
movwfEEADR; загрузили в ячейку адреса EEPROM
movlw55h; загрузили в аккомулятор контрольный байт
callee_wr; вызвали подпрограмму записи в EEPROM
bcfSTATUS,RP0; банк0
gotoingl_cikl; возврат в главный цикл
;-------------------------------
; цикл коррекции минут будильника
;================================
budkorminbcffl_kor,fl_kn ; сброс флага кнопки коррекция
bsffl_ind,0h;
bsffl_ind,01h; включили мигание двух младших разрядов индикатора
budkormin0callbudind; индикация часов-минут будильника
; проверяем флаг выхода из цикла
btfscflagi,bctn
gotogl_cikl; если флаг установлен - воврат в главный цикл
btfscfl_kor,fl_kn ; проверяем нажата ли кнопка коррекция
; кнопка коррекция нажата
gotobudkorhas; переход к циклу коррекции часов будильника
; кнопка коррекция НЕ нажата
btfssfl_inc,fl_kn ; проверяем нажата ли кнопка инкремент
; кнопка инкремент НЕ нажата
gotobudkormin1; переход к проверке автоповтора
; кнопка инкремент нажата
bcffl_inc,fl_kn ; сброс флага кнопки инкремент
callincminbud; вызов подпрограммы инкремента минут будильника
gotobudkormin0; переход к началу цикла коррекции минут будильника
;-------------------------------
; цикл автоповтора инкремента минут будильника
;=============================================
budkormin1btfssfl_inc,fl_ap ; проверяем автоповтор кнопки инкремент
; автоповтора нет
gotobudkormin0; переход к началу цикла коррекции минут будильника
; автоповтор есть
callpause_ap; вызываем подпрограмму паузы автоповтора
btfssflagi,bit_ap ; проверяем бит автоповтора
; бит автоповтора выключен
gotobudkormin2
; бит автоповтора включен
bcfflagi,bit_ap ; сброс бита автоповтора
callincminbud; вызов подпрограммы инкремента минут будильника
budkormin2callbudind; индикация часов-минут будильника
gotobudkormin1; переход к началу цикла автоповтора
;-------------------------------
; цикл коррекции часов будильника
;====================================
budkorhasbcffl_kor,fl_kn ; сброс флага кнопки коррекция
bcffl_ind,00h
bcffl_ind,01h; выключили мигание 2-х младших разрядов индикатора
bsffl_ind,02h
bsffl_ind,03h; включили мигание двух старших разрядов индикатора
budkorhas0callbudind; индикация часов-минут будильника
; проверяем флаг выхода из цикла
btfscflagi,bctn
gotogl_cikl; если флаг установлен - воврат в главный цикл
btfssfl_kor,fl_kn ; проверка нажатия кнопки коррекция
; кнопка коррекция НЕ нажата
gotobudkorhas1; переход к проверке кнопки инкремент
; кнопка коррекция нажата
bcffl_ind,02h
bcffl_ind,03h; выключили мигание 2-х старших разрядов
bcffl_kor,fl_kn ; сбросили флаг кнопки коррекция
gotocikl_bud0; переход к началу цикла будильника
budkorhas1btfssfl_inc,fl_kn ; проверка нажатия кнопки инкремент
; кнопка инкремент НЕ нажата
gotobudkorhas2; переход к проверке автоповтора инкремента
; кнопка инкремент нажата
bcffl_inc,fl_kn ; сброс флага кнопки инкремент
callinchasbud; вызов подпрограммы инкремента часов будильника
gotobudkorhas0; к началу цикла коррекции часов
;-------------------------------
; цикл автоповтора инкремента часов будильника
;==============================================
budkorhas2btfssfl_inc,fl_ap ; проверка автоповтора кнопки инкремент
; автоповтор выключен
gotobudkorhas0; к началу цикла коррекции часов
; автоповтор включен
callpause_ap; вызываем подпрограмму паузы автоповтора
btfssflagi,bit_ap ; проверяем бит автоповтора
; бит автоповтора выключен
gotobudkorhas3
; бит автоповтора включен
bcfflagi,bit_ap ; сброс бита автоповтора
callinchasbud; вызов подпрограммы инкремента часов будильника
budkorhas3callbudind; индикация часов-минут будильника
gotobudkorhas2; переход к началу цикла автоповтора
;-------------------------------
; будильник сработал
;======================
; генерация звука 0,5 сек 1 кГц 0,5 сек 500 Гц в течении трёх секунд
; затем секундная пауза и повтор последовательности
; генерация длится 255 секунд затем возврат в главный цикл
; возврат в главный цикл по нажатию любой кнопки
budilnikmovlw0FFh
movwfseczvuk
bcfflagi,zv_of; сброс бита окончания звука
bcfflagi,bu_sr; сброс флага "будильник сработал"
bcfflagi,bu_vkl ; сброс флага "будильник включен"
budil_amovlw3; загрузили в аккомулятор счётчик повтора
movwfMem; переправили в регистр счётчика
; звук 1 кГц в течении 0,5 сек
budil0movlw.128
movwfct256zvuk
bcfflagi,mctn; сброс флага ct256zvuk=0
budil1movlwB'00010000'; загрузили в аккомулятор маску для 4-го бита
xorwfPORTB,F; инвертировали 4-й бит порта B
calltime0.5ms; вызвали подпрограмму задержки
btfscflagi,zv_of; проверка флага конец звука
gotobudilend; флаг установлен - выйти из цикла генерации звука
btfssflagi,mctn; проверка на 0 дополнительного счётчика
gotobudil1; счётчик НЕ равен 0 - переход к началу цикла 1 кГц
; звук 500 Гц в течении 0,5 сек
movlw.128
movwfct256zvuk
bcfflagi,mctn; сброс флага ct256zvuk=0
budil2movlwB'00010000'; загрузили в аккомулятор маску для 4-го бита
xorwfPORTB,F; инвертировали 4-й бит порта B
calltime1.0ms; вызвали подпрограмму задержки
btfscflagi,zv_of; проверка флага конец звука
gotobudilend; флаг установлен - выйти из цикла генерации звука
btfssflagi,mctn; проверка на 0 дополнительного счётчика
gotobudil2; счётчик НЕ равен 0 - переход к началу цикла 500 Гц
decfszMem,F; декремент счётчика повторов
gotobudil0; счётчик НЕ =0 - повтор сочетания двух звуков
; секундная пауза
movlw0FFh
movwfct256zvuk
bcfflagi,mctn; сброс флага ct256zvuk=0
budil3btfscflagi,zv_of; проверка флага конец звука
gotobudilend; флаг установлен - выйти из цикла генерации звука
btfssflagi,mctn; проверка на 0 дополнительного счётчика
gotobudil3; счётчик НЕ равен 0 - переход к началу цикла паузы
gotobudil_a; повтор всей последовательности
budilendbcfflagi,0; обнуление флага конец звука
gotoingl_cikl
;-------------------------------
; конец основных циклов
;-------------------------------
;=================================
; преобразование числа в двоично-десятичный формат
; в аккомуляторе преобразуемое число 0...99
;======================================================
dd_preo movwfe_rez; загружаем число в ячейку единиц
; разделить число на 10 - получим десятки
d_10clrfd_rez; очистка регистра десятков
movlw0Ah; загрузка в аккомулятор числа 10
bcfSTATUS,C; обнуление флага переноса
d_10_ciklsubwfe_rez,F; вычитаем из преобразуемого числа 10
btfssSTATUS,C; проверка флага переноса
gotodd_ed; перенос есть(результат отрицательный), прекращаем вычитание
; пререноса нет
incfd_rez,F; увеличиваем на 1 регистр десятков
gotod_10_cikl; продолжаем вычитание
dd_edaddwfe_rez,F; прибавив 10 получим единицы
return; возврат из подпрограммы преобразования
;-------------------------------
; опрос кнопок в прерывании
;=====================================================
knopkimovlwct_kn_kor; загрузили в аккомулятор адрес 0-го счётчика
movwfFSR; переправили в FSR
movfnom_kn,W; переправили в аккомулятор номер опрашиваемой кнопки
movwftemp_kn; загрузили во временную ячейку
addwftemp_kn,W; удвоили номер кнопки так как на кнопку отведено 2 ячейки
addwfFSR,F; суммировали номер кнопки с адресом FSR
; адрес счётчика дребезга в FSR установлен
; сдвигаем бит проверяемой кнопки в 5-ю(RB5- кнопка коррекция) позицию
lb_kn_0movfPORTB,W; загрузили PORTB в аккомулятор
movwftemp1_kn; переправили во временную ячейку
lb1_knmovftemp_kn,F; команда выставляет флаг Z если регистр =0
btfscSTATUS,Z; проверяем номер кнопки на равенство нулю
; номер кнопки =0
gotolb2_kn; бит в 5-й позиции ячейки temp1_kn
; номер кнопки >0
rrftemp1_kn,F; сдвигаем биты вправо
decftemp_kn,F; уменьшаем номер кнопки на 1
gotolb1_kn; переход к началу цикла
; бит в 5-й позиции ячейки temp1_kn
; проверяем нажата ли кнопка
lb2_knbtfsstemp1_kn,5
; кнопка нажата
gotokn_vkl; преход к обработке ситуации "кнопка нажата"
; кнопка НЕ нажата
; Сброс флага автоповтора
incfFSR,F
bcfINDF,fl_ap
decfFSR,F
; проверяем счётчик дребезга данной кнопки на заполнение
movlw019h; загружаем в аккомулятор число 25 (019 hex)
subwfINDF,W; вычитаем из счётчика число 25
btfscSTATUS,C; проверяем флаг переноса
; флаг включен - кнопка отпущена после нажатия счётчик >25
clrfINDF; обнуляем счётчик дребезга
; флаг выключен(результат отрицательный), счётчик не заполнен
; проверка счётчика дребезга на 0
movfINDF,F; выставляем флаг Z при равенстве счётчика 0
btfssSTATUS,Z; проверяем флаг Z
; счётчик дребезга >0
decfINDF,F; уменьшили счётчик на 1
return
; кнопка нажата
kn_vklmovlw.180; счётчик секунд после последнего нажатия кнопки
movwfseczvuk; загружаем в дополнительный счётчик секунд
bcfflagi,5; сброс флага выхода из цикла
bsfflagi,zv_of; выставляем флаг нажатия кнопки (для выключения будильника)
movlw019h; загружаем в аккомулятор число 25 (019 hex)
subwfINDF,W; вычитаем из счётчика число 25
btfssSTATUS,Z; проверяем флаг нуля
; флаг выключен , счётчик не равен 25
gotolb3_kn; переход к проверке на автоповтор
; флаг включен, счётчик =25
incfFSR,F; установили в FSR адрес ячейки с флагами кнопки
bsfINDF,fl_kn; включили флаг "кнопка нажата"
decfFSR,F; в FSR адрес счётчика дребезга
; проверка на автоповтор
lb3_knmovlw.250; загружаем в аккомулятор число 250
subwfINDF,W; вычитаем из счётчика число 250
btfssSTATUS,C; проверяем флаг переноса
; флаг выключен(результат отрицательный), счётчик не заполнен
gotolb4_kn; переход к инкременту счётчика
; счётчик >250 автоповтор есть
incfFSR,F; в FSR адрес ячейки с флагами кнопки
bsfINDF,fl_ap; включили флаг автоповтора
return
; инкремент счётчика дребезга
lb4_knincfINDF,F; увеличили счётчик дребезга на 1
return
;-------------------------------
; динамическая индикация в прерывании
;==================================================
ind_premovlwind_0; загрузили в аккомулятор адрес младшего разряда
movwfFSR ; переправили в FSR
movfct256,W; загрузили в аккомулятор счётчик прерываний
andlwB'00000011'; выключили все биты кроме двух последних
; в аккомуляторе номер индицируемого разряда
movwfn_ind; переправили в ячейку номера индикатора
; вывод цифры в порт A
;***********************
incfn_ind,F; увеличили номер индикатора на 1
decfFSR,F; уменьшили FSR на 1
clrftemp_ind; обнулили временную ячейку
bsfSTATUS,C; включили флаг переноса
ind_pre00rlftemp_ind,F; сдвигаем бит влево во временной ячейке
incfFSR,F; увеличение FSR на 1
decfszn_ind,F; уменьшаем номер индикатора на 1 с проверкой на 0
; номер индикатора > 0
gotoind_pre00; возврат на цикл
; номер индикатора = 0 в FSR адрес нужной цифры
; в temp_ind на месте индицируемого бита 1
movfPORTA,W; загрузили в аккомулятор значение PORTA
xorwfINDF,W
andlwB'11110000' ;
xorwfINDF,W; заменили 4 младших бита в аккомуляторе на
; цифру индикатора
; в аккомуляторе значение, готовое к выводу в PORTA
movwfPORTA; выводим полученный байт в порт A
; включение мигающей точки
bsfPORTA,4; выключили мигающую точку
btfssfl_ind,4; проверили бит точки
gotoind_pre_a; точка выключена
btfscct256,7; проверяем 1 Гц бит счётчика
bcfPORTA,4; сбросили 4-й бит(включили точку) если 1 Гц бит включён
; вывод в порт B
;***********************
; если бит мигания включен, то индикатор мигает с частотой 2 Гц
ind_pre_amovfct256,W; загрузили в аккомулятор счётчик прерываний
andlwB'00000011'; выключили все биты кроме двух последних
; в аккомуляторе номер индицируемого разряда
movwfn_ind; переправили в ячейку номера индикатора
incfn_ind,F; увеличили номер индикатора на 1
movfct256,W; загрузили счётчик в аккомулятор
clrfmask_b; обнулили маску
movwftemp1; загрузили счётчик во временную ячейку
rlftemp1,F
rlftemp1,F; на месте флага переноса - бит 2 Гц
ind_pre01rlfmask_b,F; сдвигаем бит 2 Гц влево в маске
decfszn_ind,F; уменьшаем номер индикатора с проверкой на 0
; номер индикатора >0
gotoind_pre01; уход на цикл
; номер индикатора = 0, в mask_b на месте индицируемого бита - бит 2 Гц
movfmask_b,W; загрузили в аккомулятор бит 2 Гц
andwffl_ind,W; логическое И с флагом мигания
xorwftemp_ind,W; исключающщее ИЛИ с битом включения разряда
xorlwB'00001111'; исключающщее ИЛИ с маскирующим значением
movwfmask_b; в mask_b - значение порта B
; - индицируемый разряд обнулён(если бит мигания выключен)
movfPORTB,W
xorwfmask_b,W
andlwB'11110000'
xorwfmask_b,W
movwfPORTB; заменили 4 ...
Подобные документы
Особенности проектирования часов со звуковым сигналом с использованием однокристального микроконтроллера семейства МК51. Разработка функциональной схемы устройства. Функции, выполняемые клавиатурой. Разработка алгоритма работы и управляющей программы.
курсовая работа [460,5 K], добавлен 16.05.2013Актуальность задачи. Разработка функциональной схемы устройства. Радиолокационная установка (РЛУ). Микропроцессорная часть. Обоснование алгоритма работы устройства. Разработка управляющей программы устройства. Схема алгоритма. Пояснения к программе.
курсовая работа [193,9 K], добавлен 18.10.2007Схема алгоритма работы устройства сравнения трех чисел, структурная, функциональная и принципиальная схемы. Оценка параметров устройства. Схемы задержки и сброса по питанию, комбинационная схема определения среднего числа. Построение временной диаграммы.
курсовая работа [205,0 K], добавлен 24.06.2013Разработка устройства управления двухконфорочной электроплитой на базе микроконтроллера, описание функциональных действий. Структурная схема аппаратной части. Проектирование программного обеспечения. Описание алгоритма работы системы и программы.
курсовая работа [709,3 K], добавлен 22.12.2010Примерный вид выходного сигнала датчика. Описание и блок-схема алгоритма обработчиков прерываний. Формула вычисления температуры на индикаторе. Перевод абсолютного значения в BCD-код. Блок-схема алгоритма основной программы. Динамическая индикация.
курсовая работа [141,2 K], добавлен 21.10.2012Микроконтроллер — компьютер на микросхеме, предназначенный для управления электронными устройствами. Структурная схема типичного современного микроконтроллера. Архитектурная особенность построения портов ввода/вывода. Принципиальная схема устройства.
курсовая работа [2,1 M], добавлен 26.11.2013Основные параметры устройства отображения информации. Обоснование выбора используемых ресурсов микроконтроллера и схемы включения. Разработка схемы алгоритма. Описание и отладка программы. Схема электрическая принципиальная и листинг трансляции программы.
курсовая работа [121,3 K], добавлен 12.12.2014Обеспечение устойчивости грузоподъемных машин - важнейшее условие при разработке систем управления их рабочими операциями. Физическая модель платформы. Краткие технические характеристики элементов. Схема автоматизации и электрическая принципиальная схема.
курсовая работа [4,2 M], добавлен 09.12.2013Разработка алгоритма работы устройства, описание выбора элементной базы и работы принципиальной схемы. Текст программы, инициализация указателя стека, структура системы и ресурсов микроконтроллера. Запись кодов при программировании данного устройства.
контрольная работа [18,4 K], добавлен 24.12.2010Конструкция и принцип работы пеллетных котлов, их основные элементы. Среды для разработки и отладки систем управления. Внутренняя структурная схема микроконтроллеров семейства LPC23. Разработка блок схем алгоритмов работы ИСУ отопительного котла.
дипломная работа [3,8 M], добавлен 19.01.2017Разработка функциональной и принципиальной схемы. Выбор управляющего контроллера. Описание МК PIC16F626, МК AVR, МК 51. Выбор элементной базы. Разработка управляющей программы. Описание алгоритма работы программы. Схема устройства, листинг программы.
курсовая работа [492,9 K], добавлен 28.12.2012Принцип действия устройства сбора информации на базе микроконтроллера МК51: индикация, "рабочий режим" и передача данных персонального компьютера. Алгоритм начального опроса датчиков. Электрическая принципиальная схема устройства, текст программы.
курсовая работа [102,5 K], добавлен 21.10.2012Этапы процедуры принятия решений. Разработка математического алгоритма. Блок-схема алгоритма работы программы. Разработка программы на языке программирования С++ в среде разработки MFC. Текст программы определения технического состояния станка с ЧПУ.
курсовая работа [823,0 K], добавлен 18.12.2011Микропроцессоры позволяют строить универсальные устройства управления электронными весами. Разработка функциональной схемы, схемы алгоритма прикладной программы. Разработка принципиальной схемы, управляющей программы. Листинг управляющей программы.
курсовая работа [118,0 K], добавлен 04.07.2008Охранно–пожарная сигнализация. Принципы работы систем пожарной сигнализации. Блок-схема алгоритма функционирования разработанного устройства. Выбор и обоснование элементной базы. Схема электрической принципиальной и проектирование цифровых устройств.
курсовая работа [786,6 K], добавлен 10.11.2011Выбор принципов проектирования устройства записи, хранения и передачи чисел. Разработка алгоритма выполнения операций, необходимых для обработки информации. Структурная схема устройства. Элементарная база, необходимая для разработки принципиальной схемы.
курсовая работа [1,3 M], добавлен 16.08.2012Моделирование работы вычислительной системы из двух процессоров и общей оперативной памяти. Структурная схема модели системы. Укрупненная схема моделирующего алгоритма. Результаты моделирования и их анализ. Машинная программа объекта исследования.
курсовая работа [1,0 M], добавлен 21.06.2011Разработка алгоритма работы и структуры контроллера кэш-памяти с полностью ассоциативным отображением основной памяти. Представление операционной и управляющей частей черного ящика устройства. Схема алгоритма контроллера кэш на уровне микроопераций.
курсовая работа [1,0 M], добавлен 19.03.2012Сравнительный анализ существующих приборов. Разработка функциональной схемы устройства. Выбор и статистический расчет элементов, входящих в систему: датчика, источник тока, усилителя, микроконтроллера, блок питания. Блок-схема управляющей программы.
курсовая работа [769,9 K], добавлен 12.01.2015Разработка структурной и принципиальной схемы. Блок-схема основной программы и подпрограмм обработки прерываний. Имена переменных, используемых в них. Результаты моделирования работы устройства в программе ISIS пакета Рroteus. Разработка печатной платы.
курсовая работа [1,5 M], добавлен 13.11.2016