Цифровые часы с будильником на семисегментном индикаторе

Основные характеристики и принцип работы микроконтроллера. Принципиальная схема устройства. Структурная схема цифровых часов с будильником. Разработка алгоритма работы управляющей программы с помощью интегрированной среды разработки 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

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.