Проектирование автомата подачи звонков

Управление работой устройства микроконтроллером PIC18F2550. Обмен информацией между микроконтроллером и часами. Передача данных на алфавитно-цифровой LED-индикатор. Меню изменения даты и времени. Схема устройства принципиальная. Листинг текста программы.

Рубрика Коммуникации, связь, цифровые приборы и радиоэлектроника
Вид курсовая работа
Язык русский
Дата добавления 15.01.2013
Размер файла 1,7 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

1. Описание разработанного устройства

Разработанный автомат подачи звонков удовлетворяет всем требованиям, предъявленным в задании. Настройка автомата производится с помощью трех кнопок: «вверх», «вниз» и «ввод». При этом вся необходимая информация отображается на шестипозиционном семнадцати сегментном LED - индикаторе. Автомат позволяет записывать в память до 30 звонков, имеет высокоточные часы, учитывает день недели (в воскресенье подача звонков не производится), а также имеет резервную систему питания для часов, что позволяет выключать его в ночное время без потери настроек и установок времени.

Описание функционирования

Питание устройства осуществляется от источника постоянного напряжения +12В. При этом полное напряжение питания подается через реле на звонок, а управляющая схема питается от напряжения +5В, подаваемого от стабилизатора 7805.

Управление работой устройства осуществляется микроконтроллером PIC18F2550. Был выбран этот микроконтроллер, поскольку он имеет достаточное число выводов для управления работой схемы, имеет поддержку интерфейса I2C, что необходимо для работы с часами реального времени, а также потому, что для него имеется хорошее описание в [1]. Вывод MCLR микроконтроллера подтянут через 10 кОм резистор на +5В.

Сигнал на реле подается с вывода RA0 микроконтроллера через транзисторный ключ на биполярном транзисторе 2N3904.

Сигналы от управляющих кнопок поступают на выводы RA1:RA3 микроконтроллера и вызывают прерывания (при подаче лог. «0»).

В схеме имеются часы реального времени PCF8583, которые хранят значение текущего года (от 00 до 03), месяца, числа, дня недели, часа, минуты и секунды. Помимо этого в часах имеется 240 байт свободной памяти, которая в данном устройстве используется для хранения информации о количестве звонков и их времени. К выводам OSC1 и OSC0 присоединен часовой кварцевый резонатор частотой 32768 Гц. Часы имеют резервную схему питания, при этом диод VD1 не дает заряжать резервную батарейку напряжением питания, а диод VD2 не дает батарейке питать всю схему, когда отключается основной источник питания. Вывод А0 часов присоединен к земле, что определяет 6 бит адреса устройства.

Обмен информацией между микроконтроллером и часами происходит при помощи программно-реализуемого I2C-интерфейса, для этого задействованы выводы RB6:RB7. В соответствии со стандартом передачи данных по I2C, шина данных и шина тактов подтянуты через резисторы номиналом 10 кОм к источнику напряжения +5В. При этом микроконтроллер выступает в роли master, а часы - в роли slave.

Передача данных на алфавитно-цифровой LED-индикатор осуществляется с помощью трех сдвиговых регистров 74HC595, при этом первые два регистра U2 и U3 обеспечивают передачу комбинации, соответствующей данному символу (для этого используются выводы RC0:RC6 микроконтроллера), а третий регистр отвечает за передачу данных о позиции данного символа на LED (позиция от 0 до 5). Для этого используются выводы RA1:RA3 микроконтроллера. Передача символа завершается подачей единицы на вывод RC7. Параллельные данные от сдвиговых регистров поступают на драйвера TC4468, которые затем передают сигналы на входы LED-индикатора.

2. Инструкция по эксплуатации

Для включения устройства необходимо подключить его к источнику постоянного напряжения +12В.

Настройка. Настройка осуществляется переходом в режим настройки автомата. Для этого необходимо нажать на кнопку ВВОД.

После этого пользователь переходит в режим главного меню, текущий пункт которого отображается на LED-индикаторе. Главное меню содержит три пункта:

Обозначение пункта на индикаторе

Расшифровка

УСТ.ДАТ.

Переход в меню изменения даты и времени

УСТ. ЗВН.

Переход в меню настройки звонков

ВЫХОД

Выход из настройки автомата

Рис. 1. Пример отображения на LED-индикаторе пункта главного меню

Для того, чтобы перейти в режим настройки, соответствующий данному пункту меню, необходимо нажать кнопку ВВОД. Для перемещения между пунктами используются кнопки ВВЕРХ и ВНИЗ.

Нажатие кнопки ВВОД на позиции ВЫХОД позволяет выйти из режима настройки, после чего автомат перейдет в режим работы, соответствующий установленным параметрам.

Меню изменения даты и времени содержит следующие пункты

Обозначение пункта на индикаторе

Расшифровка

ГОД

Переход в режим ввода года

МЕС

Переход в режим ввода месяца

ЧИС

Переход в режим ввода числа

Д/Н

Переход в режим ввода дня

ЧАС

Переход в режим ввода часа

МИН

Переход в режим ввода минут

ВЫХОД

Выход в главное меню

Рис. 2. Пример отображения на LED-индикаторе пункта меню настройки даты и времени

После нажатия кнопки ВВОД на каком либо пункте данного меню, пользователь переходит в режим ввода соответствующего значения. При этом начальное значение, отображаемое на индикаторе, соответствует установленному на данный момент в часах. Изменение значения происходит нажатием кнопок ВВЕРХ и ВНИЗ. Установка выбранного значения - кнопкой ВВОД. После этого происходит возврат в меню настройки даты и времени.

Рис. 3. Отображение на LED-индикаторе режима ввода месяца

Следует заметить, что значение года в часах изменяется в пределах от 0 до 3. Это значит, что при вводе значения года необходимо отсчитывать это значение, начиная с последнего високосного.

Устройство автоматически определяет пределы изменения устанавливаемого значения, таким образом исключается возможность ввода заведомо неверных данных (например, 13 месяц и т.д.) Кроме того, при вводе месяца в некоторых случаях автоматически производится корректировка числа. Например, в случае, когда установлено 31 число, а вводится месяц, содержащий 30 или 28 (29, если год високосный) дней, то число переводится на значение соответственно 30, 28 или 29.

Меню настройки звонков содержит следующие пункты

Обозначение пункта на индикаторе

Расшифровка

КОЛ

Переход в режим ввода количества звонков

ВРЕМЯ

Переход в меню времени звонков

ДЛТ

Переход в режим ввода длительности звонка

ВЫХОД

Выход в главное меню

Рис. 4. Пример отображения на LED-индикаторе пункта меню настройки звонков

Ввод значений производится аналогично тому, как это делается в меню настройки даты и времени. При этом можно ввести до 30 звонков в память автомата. Длительность звонков вводится в секундах. Максимальное значение составляет 59 с.

ВНИМАНИЕ! При первом запуске автомата необходимо произвести настройку звонков, так как устройство не умеет предустановленной схемы. Обязательно нужно установить длительность звонков, иначе они не будут производиться (начальное значение длительности - 0).

Рис. 5. Отображение на LED-индикаторе режима ввода количества звонков

При переходе в режим ввода времени звонков пользователь попадает в меню выбора звонка, где число пунктов соответствует установленному количеству звонков.

Меню времени звонков содержит пункты

Обозначение пункта на индикаторе

Расшифровка

ЗВН 01

Переход в режим ввода звонка 1

ЗВН 02

Переход в режим ввода звонка 2

ЗВН N*

Переход в режим ввода звонка N

ВЫХОД

Выход в меню настройки звонков

Рис. 6. Пример отображения на LED-индикаторе пункта меню времени звонков

После нажатия кнопки ВВОД на одном из пунктов, пользователь последовательно вводит час и минуту звонка, аналогично тому, как это производится в режиме ввода времени, и автоматически возвращается в меню времени звонков.

Список литературы

1. Яценков В.С. Микроконтроллеры Microchip с аппаратной поддержкой USB. - М.: Горячая линия-Телеком, 2008. - 400 с.

Приложение 1

Схема устройства принципиальная

Приложение 2

микроконтроллер автомат звонок часы

Листинг текста программы

/*

Курсовой проект по дисциплине «Цифровые устройства и микроконтроллеры»

// заголовочный файл

#include <pic18.h>

 // конфигурация контроллера

__CONFIG (1, CPUDIV1 & INTIO);

__CONFIG (2, PWRTDIS & BORDIS & WDTDIS);

__CONFIG (3, PBDIGITAL & MCLREN);

__CONFIG (4, LVPDIS);

__CONFIG (5, UNPROTECT);

__CONFIG (6, UNPROTECT);

__CONFIG (7, UNPROTECT);

 // -

 // глобальные переменные

unsigned char i=0, j, l; // вспомогательные счетные переменные

unsigned char d, month, day, year; // вспомогательные вычислительные переменные

const unsigned char CallDuration=5; // длительность звонка в секундах

unsigned char CallCount=0; // для временного хранения числа звонков (максимум 30)

unsigned char Zvonok=0; // для хранения номера звонка, время которого изменяется в настоящий момент

unsigned char WDAY_Month; // переменнная для считывания текущего дня недели и месяца из часов

unsigned char Minutes; // переменнная для считывания текущего значения минут из часов

unsigned char Hours; // переменнная для считывания текущего значения часа

unsigned char Seconds; // переменнная для считывания текущего значения секунд

unsigned char LedWork=0; // логическая переменная (режим настройки вкл/выкл) *дисплей работает только в режиме настройки

unsigned char SymPlace=0x00; // 6 младших битов этой переменной определяют,

 // на какие позиции дисплея необходимо выводить символы

unsigned char DotPlace=0x00; // на какие позиции ставаить точки

unsigned char Symbols[12]; // массив символов, которые в данный момент должны выводиться на экран

 // (каждый символ использует два байта для описания своей конфигурации на дисплее)

unsigned char Mode; // определяет, в каком режиме находится система настройки

 // 1 - главное меню

 // 2 - режим установки времени и даты

 // 3 - режим ввода года

 // 4 - режим ввода месяца

 // 5 - режим ввода числа

 // 6 - режим ввода дня недели

 // 7 - режим ввода часа

 // 8 - режим ввода минуты

 // 9 - меню настройки звонков

 // 10 - настройка количесва звонков (до 30)

 // 11 - выбор номера звонка для настройки времени срабатывания

 // 12 - режим ввода часа выбранного звонка

 // 13 - режим ввода минуты выбранного звонка

 // 14 - режим ввода длительности звонков (в секундах)

unsigned char m; // определяет номер текущей позиции внутри данного режима

 // изображение чисел 0 1 2 3 4 5 6 7 8 9

const unsigned char DigitL[10]={0xFF, 0x30, 0xEE, 0xFC, 0x31, 0xDD, 0xDF, 0xF0, 0xFF, 0xFD}; // младший байт

const unsigned char DigitH[10]={0x00, 0x00, 0x11, 0x11, 0x11, 0x11, 0x11, 0x00, 0x11, 0x11}; // старший байт

 // изображение букв K(0) A(1) Г(2) О(3) Д(4) М(5) Е(6) С(7) Н(8) Ч(9) И(10) Ь(11) |(12) Х(13) У(14) Т(15) З(16) В(17) /(18) Р(19) Я(20) Л(21)

const unsigned char LetterL[22]={0x03, 0x30, 0xC3, 0xFF, 0x3C, 0x33, 0xCF, 0xCF, 0x33, 0x31, 0x33, 0x1F, 0x03, 0x00, 0x3D, 0xC0, 0xCC, 0xCF, 0x00, 0xE3, 0xF1, 0x30};

const unsigned char LetterH[22]={0x29, 0x32, 0x00, 0x00, 0x22, 0xA0, 0x11, 0x00, 0x11, 0x11, 0x22, 0x11, 0x00, 0xAA, 0x11, 0x44, 0x29, 0x29, 0x22, 0x11, 0x13, 0x22};

 // массив позиций 0 1 2 3 4 5

const unsigned char Pos[6]={0x7C, 0xBC, 0xDC, 0xEC, 0xF4, 0xF8};

unsigned short int k=0; // переменная для задержки

 // -

 // вывод на LED-дисплей символа на позицию Pos

void SymbOut (char SymbolL, char SymbolH, char Pos, char Dot)

{

if (Dot) Pos+=(1<<1);

RC7=0;

for (i=0; i<8; i++) // передаем младший байт изображения символа на регистр сдвига

{

RC1=(((1<<i)&(SymbolL))>>i);

RC0=1;

RC0=0;

}

RC2=1;

RC2=0;

for (i=0; i<8; i++) // старший байт изображения

{

RC5=(((1<<i)&(SymbolH))>>i);

RC4=1;

RC4=0;

}

RC6=1;

RC6=0;

for (i=0; i<8; i++) // байт позиции

{

RA2=(((1<<i)&(Pos))>>i);

RA1=1;

RA1=0;

}

RA3=1;

RA3=0;

RC7=1;

}

 // -

 // вывод на LED-дисплей всех необходимых в данный момент символов на соответствующие позиции

void LedOutput(void)

{

for (j=0; j<7; j++)

if ((1<<j)&SymPlace)

if ((1<<j)&DotPlace) SymbOut (Symbols[j], Symbols [j+6], Pos[j], 1);

else SymbOut (Symbols[j], Symbols [j+6], Pos[j], 0);

}

 // -

 // записываем в SymPlace, DotPlace и массив Symbols[12] данные, соответствующие текущему режиму настройки

void SymbolEnter(void)

{

switch (Mode)

{

case 1: // режим главного меню

switch (m)

{

case 1: // находимся на позиции «установка даты»

SymPlace=0x3F;

DotPlace=0x09;

Symbols[0]=LetterL[15];

Symbols[6]=LetterH[15];

Symbols[1]=LetterL[1];

Symbols[7]=LetterH[1];

Symbols[2]=LetterL[4];

Symbols[8]=LetterH[4];

Symbols[3]=LetterL[15];

Symbols[9]=LetterH[15];

Symbols[4]=LetterL[7];

Symbols[10]=LetterH[7];

Symbols[5]=LetterL[14];

Symbols[11]=LetterH[14];

break;

case 2: // находимся на позиции «установка времени звонков»

SymPlace=0x3F;

DotPlace=0x09;

Symbols[0]=LetterL[8];

Symbols[6]=LetterH[8];

Symbols[1]=LetterL[17];

Symbols[7]=LetterH[17];

Symbols[2]=LetterL[16];

Symbols[8]=LetterH[16];

Symbols[3]=LetterL[15];

Symbols[9]=LetterH[15];

Symbols[4]=LetterL[7];

Symbols[10]=LetterH[7];

Symbols[5]=LetterL[14];

Symbols[11]=LetterH[14];

break;

case 3: // находимся на позиции «выход»

SymPlace=0x3F;

DotPlace=0x00;

Symbols[0]=LetterL[4];

Symbols[6]=LetterH[4];

Symbols[1]=LetterL[3];

Symbols[7]=LetterH[3];

Symbols[2]=LetterL[13];

Symbols[8]=LetterH[13];

Symbols[3]=LetterL[12];

Symbols[9]=LetterH[12];

Symbols[4]=LetterL[11];

Symbols[10]=LetterH[11];

Symbols[5]=LetterL[17];

Symbols[11]=LetterH[17];

break;

}

break;

case 2: // режим установки времени и даты

switch (m)

{

case 1: // находимся на позиции «год»

SymPlace=0x38;

DotPlace=0x00;

Symbols[3]=LetterL[4];

Symbols[9]=LetterH[4];

Symbols[4]=LetterL[3];

Symbols[10]=LetterH[3];

Symbols[5]=LetterL[2];

Symbols[11]=LetterH[2];

break;

case 2: // находимся на позиции «месяц»

SymPlace=0x38;

DotPlace=0x00;

Symbols[3]=LetterL[7];

Symbols[9]=LetterH[7];

Symbols[4]=LetterL[6];

Symbols[10]=LetterH[6];

Symbols[5]=LetterL[5];

Symbols[11]=LetterH[5];

break;

case 3: // находимся на позиции «число»

SymPlace=0x38;

DotPlace=0x00;

Symbols[3]=LetterL[7];

Symbols[9]=LetterH[7];

Symbols[4]=LetterL[10];

Symbols[10]=LetterH[10];

Symbols[5]=LetterL[9];

Symbols[11]=LetterH[9];

break;

case 4: // находимся на позиции «день недели»

SymPlace=0x38;

DotPlace=0x00;

Symbols[3]=LetterL[8];

Symbols[9]=LetterH[8];

Symbols[4]=LetterL[18];

Symbols[10]=LetterH[18];

Symbols[5]=LetterL[4];

Symbols[11]=LetterH[4];

break;

case 5: // находимся на позиции «час»

SymPlace=0x38;

DotPlace=0x00;

Symbols[3]=LetterL[7];

Symbols[9]=LetterH[7];

Symbols[4]=LetterL[1];

Symbols[10]=LetterH[1];

Symbols[5]=LetterL[9];

Symbols[11]=LetterH[9];

break;

case 6: // находимся на позиции «минута»

SymPlace=0x38;

DotPlace=0x00;

Symbols[3]=LetterL[8];

Symbols[9]=LetterH[8];

Symbols[4]=LetterL[10];

Symbols[10]=LetterH[10];

Symbols[5]=LetterL[5];

Symbols[11]=LetterH[5];

break;

case 7: // находимся на позиции «выход»

SymPlace=0x3F;

DotPlace=0x00;

Symbols[0]=LetterL[4];

Symbols[6]=LetterH[4];

Symbols[1]=LetterL[3];

Symbols[7]=LetterH[3];

Symbols[2]=LetterL[13];

Symbols[8]=LetterH[13];

Symbols[3]=LetterL[12];

Symbols[9]=LetterH[12];

Symbols[4]=LetterL[11];

Symbols[10]=LetterH[11];

Symbols[5]=LetterL[17];

Symbols[11]=LetterH[17];

break;

}

break;

 // режимы ввода:

case 3: // года

case 4: // месяца

case 5: // числа

case 6: // дня недели

case 7: // часов

case 8: // минут

case 10: // количества звонков

SymPlace=0x3B;

DotPlace=0x00;

d=m/10;

Symbols[0]=DigitL [m-d*10];

Symbols[6]=DigitH [m-d*10];

Symbols[1]=DigitL[d];

Symbols[7]=DigitH[d];

break;

case 9: // режим установки звонков

switch (m)

{

case 1: // находимся на позиции «количество звонков»

SymPlace=0x38;

DotPlace=0x00;

Symbols[3]=LetterL[21];

Symbols[9]=LetterH[21];

Symbols[4]=LetterL[3];

Symbols[10]=LetterH[3];

Symbols[5]=LetterL[0];

Symbols[11]=LetterH[0];

break;

case 2: // находимся на позиции «время звонков»

SymPlace=0x1F;

DotPlace=0x00;

Symbols[0]=LetterL[20];

Symbols[6]=LetterH[20];

Symbols[1]=LetterL[5];

Symbols[7]=LetterH[5];

Symbols[2]=LetterL[6];

Symbols[8]=LetterH[6];

Symbols[3]=LetterL[19];

Symbols[9]=LetterH[19];

Symbols[4]=LetterL[17];

Symbols[10]=LetterH[17];

break;

case 3: // находимся на позиции «длительность звонков»

SymPlace=0x38;

DotPlace=0x00;

Symbols[3]=LetterL[15];

Symbols[9]=LetterH[15];

Symbols[4]=LetterL[21];

Symbols[10]=LetterH[21];

Symbols[5]=LetterL[4];

Symbols[11]=LetterH[4];

break;

case 4: // находимся на позиции «выход»

SymPlace=0x3F;

DotPlace=0x00;

Symbols[0]=LetterL[4];

Symbols[6]=LetterH[4];

Symbols[1]=LetterL[3];

Symbols[7]=LetterH[3];

Symbols[2]=LetterL[13];

Symbols[8]=LetterH[13];

Symbols[3]=LetterL[12];

Symbols[9]=LetterH[12];

Symbols[4]=LetterL[11];

Symbols[10]=LetterH[11];

Symbols[5]=LetterL[17];

Symbols[11]=LetterH[17];

break;

}

break;

case 11: // режим выбора звонка

if (m<CallCount+1)

{

SymPlace=0x3B;

DotPlace=0x00;

d=m/10;

Symbols[0]=DigitL [m-d*10];

Symbols[6]=DigitH [m-d*10];

Symbols[1]=DigitL[d];

Symbols[7]=DigitH[d];

Symbols[3]=LetterL[8];

Symbols[9]=LetterH[8];

Symbols[4]=LetterL[17];

Symbols[10]=LetterH[17];

Symbols[5]=LetterL[16];

Symbols[11]=LetterH[16];

}

else

{

SymPlace=0x3F;

DotPlace=0x00;

Symbols[0]=LetterL[4];

Symbols[6]=LetterH[4];

Symbols[1]=LetterL[3];

Symbols[7]=LetterH[3];

Symbols[2]=LetterL[13];

Symbols[8]=LetterH[13];

Symbols[3]=LetterL[12];

Symbols[9]=LetterH[12];

Symbols[4]=LetterL[11];

Symbols[10]=LetterH[11];

Symbols[5]=LetterL[17];

Symbols[11]=LetterH[17];

}

break;

case 12: // режим ввода часа выбранного звонка

SymPlace=0x3B;

DotPlace=0x00;

d=m/10;

Symbols[0]=DigitL [m-d*10];

Symbols[6]=DigitH [m-d*10];

Symbols[1]=DigitL[d];

Symbols[7]=DigitH[d];

Symbols[3]=LetterL[7];

Symbols[9]=LetterH[7];

Symbols[4]=LetterL[1];

Symbols[10]=LetterH[1];

Symbols[5]=LetterL[9];

Symbols[11]=LetterH[9];

break;

case 13: // режим ввода минуты выбранного звонка

SymPlace=0x3B;

DotPlace=0x00;

d=m/10;

Symbols[0]=DigitL [m-d*10];

Symbols[6]=DigitH [m-d*10];

Symbols[1]=DigitL[d];

Symbols[7]=DigitH[d];

Symbols[3]=LetterL[8];

Symbols[9]=LetterH[8];

Symbols[4]=LetterL[10];

Symbols[10]=LetterH[10];

Symbols[5]=LetterL[5];

Symbols[11]=LetterH[5];

break;

case 14: // режим установки длительности звонков

SymPlace=0x3B;

DotPlace=0x00;

d=m/10;

Symbols[0]=DigitL [m-d*10];

Symbols[6]=DigitH [m-d*10];

Symbols[1]=DigitL[d];

Symbols[7]=DigitH[d];

Symbols[3]=LetterL[15];

Symbols[9]=LetterH[15];

Symbols[4]=LetterL[21];

Symbols[10]=LetterH[21];

Symbols[5]=LetterL[4];

Symbols[11]=LetterH[4];

break;

}

}

 // -

 // работа с передачей данных между часами PCF8583 и микроконтроллером

const char WRITE=0b10100000; // адрес PCF8583 + бит записи

const char READ= 0b10100001; // адрес PCF8583 + бит чтения

void start() // начало передачи данных по интерфейсу I2C

{

TRISB&=~(1<<7);

TRISB&=~(1<<6); // состояние линий SDA и SCL определяет ведущий (мк)

RB6=1;

RB7=1;

RB6=0;

RB7=0;

}

void stop() // окончание передачи данных по интерфейсу I2C

{

TRISB&=~(1<<7);

TRISB&=~(1<<6); // состояние линий SDA и SCL определяет ведущий (мк)

RB7=0;

RB6=0;

RB7=1;

RB6=1;

}

void WriteByte (char c) // передача байта c по интерфейсу I2C

{

TRISB&=~(1<<7);

TRISB&=~(1<<6); // состояние линий SDA и SCL определяет ведущий (мк)

for (i=8; i>=1; i-) // посылаем 8 байтов данных

{

RB6=((c&(1<<(i-1)))>>(i-1));

RB7=1;

RB7=0;

}

TRISB&=~(1<<7);

TRISB|=(1<<6); // здесь уровень на SDA поределяет ведомый (часы)

RB7=1;

RB7=0;

TRISB&=~(1<<7);

TRISB&=~(1<<6);

}

char ReadByte() // прием байта по интерфейсу I2C

{

char out=0x00;

TRISB&=~(1<<7);

TRISB|=(1<<6); // линию SDA определяет ведомый, a SCL - ведущий

for (i=8; i>=1; i-)

{

RB7=1;

out+=(RB6<<(i-1));

RB7=0;

}

TRISB&=~(1<<7);

TRISB&=~(1<<6); // состояние линий SDA и SCL определяет ведущий (мк)

RB6=1;

RB7=1;

RB7=0;

return out;

}

void Write (char Adress, char Data) // записываем данные Data в ячейку часов с адресом Adress

{

start(); // начинаем передачу по I2C

WriteByte(WRITE); // передаем адрес часов + бит записи

WriteByte(Adress); // передаем адрес часов + бит записи

WriteByte(Data); // записывем нужные данные

stop(); // завершаем прием данных по I2C

}

char Read (char Adress) // считываем данные из ячейки часов с адресом Adress

{

char output; // переменная для вывода

start(); // начинаем передачу по I2C

WriteByte(WRITE); // передаем адрес часов + бит записи

WriteByte(Adress); // передаем адрес нужной ячейки

start(); // рестарт протокола I2C

WriteByte(READ); // передаем адрес часов + бит чтения

output=ReadByte(); // считываем ячейку

stop(); // завершаем прием данных по I2C

return output;

}

 // полная копия функции Write, но для обработчика прерываний

 // пришлось сделать такую копию, так как в ином случае возникает необъяснимая ошибка

 // которая не происходит, если эту функцию использовать под разными именами в main() и interrupt()

void W (char Adress, char Data) // записываем данные Data в ячейку часов с адресом Adress

{

start(); // начинаем передачу по I2C

WriteByte(WRITE); // передаем адрес часов + бит записи

WriteByte(Adress); // передаем адрес часов + бит записи

WriteByte(Data); // записывем нужные данные

stop(); // завершаем прием данных по I2C

}

 // -

 // обработчик прерываний

void interrupt ISR()

{

 // - Прерывания от кнопок управления -

 // Нажатие кнопки «ВНИЗ»

if (INT0IF)

{

if (LedWork) // Находимся в режиме настройки

{

switch (Mode) // Смотрим, какой режим активен

{

case 1: // Режим главного меню

if (m<3) m++; else m=1;

break;

case 2: // Режим установки времени и даты

if (m<7) m++; else m=1;

break;

case 3: // Режим ввода года

if (m>0) m-; else m=3;

break;

case 4: // Режим ввода месяца

if (m>1) m-; else m=12;

break;

case 5: // Режим ввода числа

month=((Read(0x06)&0x10)>>4)*10+(Read(0x06)&0x0F); // считываем записанный в часы месяц

year=((0xC0&Read(0x05))>>6);

switch (month) // в зависимости от месяца и високосности года изменяем предел установки дня

{

case 1: case 3: case 5: case 7: case 8: case 10: case 12:

day=31; break;

case 4: case 6: case 9: case 11:

day=30; break;

case 2:

if (year) day=28; else day=29; break;

}

if (m>1) m-; else m=day;

break;

case 6: // Режим ввода дня недели

if (m>0) m-; else m=6;

break;

case 7: // Режим ввода часа

if (m>0) m-; else m=23;

break;

case 8: // Режим ввода минут

if (m>0) m-; else m=59;

break;

case 9: // Режим меню звонков

if (m<4) m++; else m=1;

break;

case 10: // Режим ввода количества звонков

if (m>0) m-; else m=30;

break;

case 11: // Режим выбора звонка для редактирования времени

if (m>1) m-; else m=Read(16)+1;

break;

case 12: // Режим ввода часа выбранного звонка

if (m>0) m-; else m=23;

break;

case 13: // Режим ввода минуты выбранного звонка

if (m>0) m-; else m=59;

break;

case 14: // Режим ввода длительности звонков

if (m>0) m-; else m=59;

break;

}

SymbolEnter();

}

INT0IF=0;

}


Подобные документы

  • Технические характеристики микросхемы часов реального времени. Разработка принципиальной электрической схемы и печатной платы автомата подачи звонков в учебных заведениях. Программирование микроконтроллера фирмы Microchip, тестирование устройства.

    дипломная работа [1,7 M], добавлен 16.07.2012

  • Принцип действия устройства - цифровых весов для взвешивания вагонов. Расчет первичного, нормирующего и аналого-цифрового преобразователя. Выбор мультиплексора и микроконтроллера. Передача информации через порты. Управление микроконтроллером с компьютера.

    дипломная работа [776,4 K], добавлен 20.10.2010

  • Блок-схема алгоритма программы управления микроконтроллером. Требования к печатным платам и их разработка. Структурная схема измерительного устройства Ретом-30КА. Выбор микроконтроллера как одно из самых важных решений при разработке управляющего модуля.

    дипломная работа [1,9 M], добавлен 18.06.2010

  • Проектирование цифрового автомата, формирующего четырехразрядный код на заданном числе тактов. Общая схема синтеза пересчетного устройства, векторная диаграмма работы. Разработка входного комбинационного устройства. Микросхема кодопреобразоателя.

    курсовая работа [2,2 M], добавлен 05.12.2012

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

    дипломная работа [949,9 K], добавлен 20.10.2010

  • Функциональная схема и механизм работы цифрового устройства обработки данных. Синтез управляющего автомата, выбор типа триггера, описание управляющего автомата и счётчиков на языке Verilog. Процесс тестирования и моделирования управляющего автомата.

    курсовая работа [3,2 M], добавлен 05.12.2012

  • Разработка прибора на основе микроконтроллера AtMega8A-16PU и микросхемы часов реального времени DS1307. Типовая конфигурация двухпроводной шины. Изготовление печатной платы автомата. Микросхемы часов реального времени. Проект блок-схемы программы.

    курсовая работа [1,1 M], добавлен 16.04.2015

  • Структурная схема и синтез цифрового автомата. Построение алгоритма, графа и таблицы его функционирования в микрокомандах. Кодирование состояний автомата. Функции возбуждения триггеров и формирования управляющих сигналов. Схема управляющего устройства.

    курсовая работа [789,4 K], добавлен 25.11.2010

  • Формализация постановка и решение задачи разработки проектируемого устройства. Технические характеристики прибора для индикации уровня жидкости. Расчет и метрологическое обоснование параметров. Структурная и принципиальная схема, описание устройства.

    курсовая работа [169,9 K], добавлен 17.09.2014

  • Проектирование цифрового устройства для передачи сообщения через канал связи. Разработка задающего генератора, делителя частоты, преобразователя кода, согласующего устройства с каналом связи, схемы синхронизации и сброса, блока питания конечного автомата.

    курсовая работа [1,6 M], добавлен 28.01.2013

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