Программа для автомата подачи звонков в учебном учреждении
Разработка прибора на основе микроконтроллера AtMega8A-16PU и микросхемы часов реального времени DS1307. Типовая конфигурация двухпроводной шины. Изготовление печатной платы автомата. Микросхемы часов реального времени. Проект блок-схемы программы.
Рубрика | Коммуникации, связь, цифровые приборы и радиоэлектроника |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 16.04.2015 |
Размер файла | 1,1 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru
Введение
Во многих учебных заведениях России до настоящего времени звонки на урок и с урока подаются вручную. Автоматическая подача звонков позволяет более качественно вести учебный процесс.
Значение качественного учебного процесса в подготовке будущих специалистов трудно переоценить. Своевременная подача звонков дисциплинирует обучающихся, исключает человеческий фактор, освобождает дежурного от напряжения. Исходя из этого, нами была выбрана данная тема в качестве курсовой работы.
Для достижения данной цели нами был разработан прибор на основе микроконтроллера AtMega8A-16PU и микросхемы часов реального времени DS1307. Прибор интуитивно прост в управлении и не прихотлив в использовании (внешний вид на рис.1.).
Разработка проекта длилась на протяжении четырех месяцев. В течение этого времени было освоено программирование микроконтроллеров семейства AVR на языке Си и закреплены навыки создания печатных плат и монтажа электронных элементов.
Рис. 1. Внешний вид устройства
Корпус устройства приобретён в магазине «Чип и Дип».
Марка корпуса для основной схемы G1022BF, для исполнительного элемента - G1017. Монтаж выполняется на верхней и боковых частях корпуса.
Описание устройства
Основные технические характеристики
Габариты блока управления, не более - 156х68х44мм;
Напряжение питания - от 9 до 12В;
Количество вариантов суточных программ (количество звонков) - 16;
Длительность звонка - 3 сек;
Календарь до 2100 года с компенсацией високосных годов;
Принципиальная схема
Рис 2. Принципиальная схема устройства
Список элементов
HG1 |
Lcd дисплей Мэлт 2YLG |
|
R1 |
10 кOм |
|
R2, R3 |
4,7 кОм |
|
R4 |
330 Ом |
|
R5, R6 |
470 Ом |
|
С1 |
100 мкФ |
|
С2, С3 |
0,1 мкФ |
|
С4 |
47 нФ |
|
С5, С6 |
100 нФ |
|
VD1 |
1N4004 |
|
ZQ1 |
32 768 кГц |
|
Т1 |
ВТ 139 |
|
IC1 |
DS1307 |
|
IC2 |
AtMega8A-16PU |
|
IC3 |
МОС3041 |
|
VR1 |
LM7805 |
Принцип работы устройства
При разработке нашего автомата было решено применить микроконтроллер AtMega8A-16PU.
Применение микроконтроллеров AtMega8A-16PU приводит к резкому уменьшению размеров устройства потребляемой мощности и количества используемых элементов. При разработке устройств на микроконтроллерах разработчику электронной схемы необходимо выбрать частоту тактового генератора для поставленной задачи и следить за тем, чтобы максимальная нагрузка на порты ввода вывода не превышала допустимую. Кристаллы AtMega8A-16PU могут работать с четырьмя типами встроенных генераторов (1,2,4 и 8МГц). Если необходимо использовать другой генератор (не 1MГц), то в программе необходимо предусмотреть загрузку регистра OSCCAL соответствующим калибровочным байтом. Кристаллы AVR могут также тактироваться и от внешних источников (1 - 16МГц). Исходя из этих данных, для оптимальной работы микроконтроллера, нами была выбрана частота 1 МГц.
Так же для точной работы часов была использована микросхема «Часов реального времени» DS1307 (описание смотрите в приложении). Обмен данным с микроконтроллером производится по шине I2C.
Интерфейс I2C
I2C - двухпроводный последовательный интерфейс, разработанный корпорацией Philips. В Первоначальном техническом требовании к интерфейсу максимальная скорость передачи данных составляла 100 Кбит/с. Однако позже появились стандартные более скоростные режимы работы шины I2C (400Кбит/с и 1Мбит/с). К одной шине I2C могут быть подключены устройства с различными скоростями доступа, если скорость передачи данных будет удовлетворять требованиям самого низкоскоростного устройства.
Протокол передачи данных по шине I2C разработан таким образом, чтобы гарантировать надежный качественный прием/передачу данных. При передаче данных одно устройство является "Ведущим", которое инициирует передачу данных и формирует сигналы синхронизации. Другое устройство "Ведомое", которое может начать передачу данных только по команде ведущего шины. Модуль SSP микроконтроллеров Р1С16СХХХ полностью поддерживает режим ведомого I2C, за исключением поддержки адреса общего вызова (режим ведущего реализуется программно) Модуль MSSP аппаратно поддерживает режим ведущего/ведомого I2C, адрес общего вызова и скорость обмена данными до 1Мбит/с. Скорость передачи данных 1Мбит/с используют некоторые микросхемы последовательной EEPROM памяти.
Каждое устройство на шине I2C имеет уникальный адрес. Когда ведущий инициирует передачу данных, то сначала передается адрес устройства, к которому выполняется обращение. Остальные устройства проверяют переданный ведущим адрес. В состав байта адреса устройства входит бит направления передачи данных (выполняется чтение из ведомого или запись). Ведомый и ведущий шины всегда находятся в противоположном режиме работы, что можно представить в виде двух состояний
Ведущий передатчик - ведомый приемник.
Ведомый передатчик- ведущий приемник.
В обоих случаях ведущий формирует тактовый сигнал.
DS1307 поддерживает обмен данными по протоколу I2C по двухпроводной двунаправленной шине. Устройство, которое передаёт данные на шину, является передатчиком, а устройство, принимающее данные, - приёмником. Устройство, управляющее передачей данных, называется ведущим. Устройство, которым управляет ведущий, называется ведомым. Ведущее устройство генерирует синхроимпульсы (serial clock - SCL), управляет доступом к шине и генерирует условия START и STOP. DS1307 работает на шине как ведомое устройство. Типовая конфигурация шины с использованием протокола I2C показана на рис. 3.
Рис. 3. Типовая конфигурация двухпроводной шины
На рис. 4, 5 и 6 подробно показан процесс передачи данных по двухпроводной шине.
Основные принципы передачи данных по шине I2C:
1) Передача данных может быть инициирована только когда шина свободна.
2) Во время передачи данные на линии SDA могут меняться только когда на линии SCL низкий уровень, в противном случае изменение данных будет интерпретироваться как управляющий сигнал.
Таким образом, возможны следующие состояния шины:
- Шина не занята - на линиях SDA и SCL сохраняется высокий уровень.
- Начало передачи данных (условие START) - изменение состояния линии SDA с высокого на низкий, в то время как на линии SCL высокий уровень.
- Окончание передачи данных (условие STOP) - изменение состояния линии SDA с низкого на высокий, в то время как на линии SCL высокий уровень.
- Корректные данные - состояние линии SDA представляет корректные данные, если после условия START состояние линии SDA не меняется в течение высокого уровня тактового сигнала. Данные на линии должны меняться в течение периода низкого уровня тактового сигнала. На один бит данных приходится один тактовый импульс.
Каждая передача данных инициируется условием START и завершается условием STOP. Число байтов данных, передаваемых между условиями START и STOP, не ограничено и определяется ведущим устройством. Информация передаётся побайтово, и каждый байт приёмник подтверждает девятым битом (бит подтверждения - ACK). В спецификации двухпроводного интерфейса определены обычный режим (с тактовой частотой 100 кГц) и быстрый режим (с тактовой частотой 400 кГц). DS1307 работает только в обычном режиме (100 кГц).
- Подтверждение - каждое принимающее устройство, когда является адресуемым, обязано генерировать подтверждение после приёма каждого байта. Ведущее устройство должно генерировать дополнительный тактовый импульс, который предназначен для бита подтверждения.
Подтверждающее устройство должно подтянуть к низкому уровню линию SDA во время тактового импульса подтверждения таким образом, чтобы на линии SDA оставался стабильный низкий уровень в течение периода высокого уровня тактового импульса, относящегося к подтверждению. Конечно, настройка и времена удержания должны быть приняты во внимание. Ведущий должен сигнализировать ведомому окончание данных, не генерируя бит подтверждения на последнем байте, который был получен от ведомого. В этом случае ведомый должен оставить линию данных в состоянии высокого уровня, чтобы позволить ведущему сгенерировать условие STOP.
* - бит чтения/записи или бит направления
Рис. 4. Передача данных по двухпроводной последовательной шине
В зависимости от состояния бита возможны два типа передачи данных:
1) Передача данных от ведущего передатчика ведомому приёмнику.
Первый байт, передаваемый ведущим, - это адрес ведомого. Далее следует некоторое количество байтов данных. Ведомый возвращает подтверждающий бит после каждого принятого байта. Данные передаются, начиная со старшего бита (most significant bit - MSB).
2) Данные передаются от ведомого передатчика ведущему приёмнику.
Первый байт (адрес ведомого) передаётся ведущим. Ведомый возвращает подтверждающий бит. За ним следует передаваемое ведомым некоторое количество байтов данных. Ведущий возвращает подтверждающий бит после всех принимаемых байтов кроме последнего байта. В конце последнего принятого байта возвращается "неподтверждение". Ведущее устройство генерирует все последовательные синхроимпульсы, а также условия START и STOP. Передача заканчивается условием STOP или повтором условия START. Поскольку повторение условия START также является и началом следующей последовательной передачи, шина не освобождается. Данные передаются, начиная со старшего бита.
DS1307 может работать в следующих двух режимах:
1) Режим ведомого приёмника (режим записи DS1307).
Последовательные данные принимаются по SDA и синхронизируются по SCL. После каждого принятого байта передаётся бит подтверждения. Условия START и STOP распознаются как начало и конец последовательной передачи. Распознавание адреса выполняется аппаратно после приёма адреса ведомого и бита направления (см. рис. 5).
Байт адреса - это первый байт, принятый после генерации ведущим условия начала. Он содержит 7 битов адреса DS1307, который имеет значение 1101000, и следующий за ним бит направления (), который для записи равен 0. После приёма и декодирования адресного байта DS1307 выдаёт на линию SDA подтверждение, после чего ведущий передаёт в устройство адрес регистра. Это установит регистровый указатель. Затем ведущий начинает передачу байтов данных, каждый из которых будет подтверждаться DS1307. Чтобы завершить запись данных, ведущий генерирует условие окончания.
Рис. 5. Запись данных - режим ведомого приёмника
2) Режим ведомого передатчика (режим чтения DS1307).
Первый байт принимается и обрабатывается так же, как и в режиме ведомого приёмника. Однако в этом режиме бит направления будет указывать, что направление передачи инвертировано. DS1307 передаёт последовательные данные по линии SDA пока на линию SCL поступают последовательные синхроимпульсы. Условия START и STOP распознаются в начале и в конце последовательной передачи (см. рис. 6).
Байт адреса - первый байт, принимаемый после стартового условия, генерируется ведущим. Байт адреса состоит из 7-битного адреса DS1307, который равен 1101000, и следующего за ним бита направления передачи (), который для чтения равен 1. После приёма и декодирования байта адреса, устройство выдаёт подтверждение на линию SDA. Затем DS1307 начинает передавать данные, начиная с указанного адреса, находящегося в регистровом указателе. Если перед началом чтения указатель регистра не записан, то первый читаемый адрес - это адрес, который был сохранён в нём последним. DS1307 должен принять "неподтверждение" для окончания чтения.
Рис. 6. Чтение данных - режим ведомого передатчика
Удобства применения шины I2C очевидны - малое количество соединительных линий и высокая скорость обмена, простота аппаратной реализации линии связи. Наиболее широко поддерживает шину I2C, конечно же, фирма Philips, производящая множество ИС различной сложности с управлением по I2C. В первую очередь, можно выделить микросхемы энергонезависимой памяти (EEPROM) серии 24Схх в 8-ми выводных корпусах, фактически ставшие промышленным стандартом. Из широко распространенных ИС можно выделить: микросхемы часов PCF8583, параллельный порт PCF8574, 4-х канальный 8-ми разрядный АЦП PCF8591. Существует множество модификаций этих ИС и более специализированные контроллеры.
С использованием I2C разработано множество продуктов, особенно в области бытовой электроники.
Разработка, изготовление печатной платы
С помощью программы Sprint-Layout по принципиальной электрической схеме нами была разработана печатная плата автомата.
Система Sprint-Layout может быть использована для решения большого числа задач, которые ставятся перед разработчиками радиоэлектронной аппаратуры. В данном случае нами будут рассмотрены задачи, которые мы решали при проектировании автомата. Во-первых, это проектирование принципиальной электрической схемы и получение ее изображения на бумаге. Во-вторых, это проектирование печатной платы по изображению принципиальной схемы и получение изображений печатной платы с помощью принтера.
Для создания и вывода на печать изображения печатных плат использовался лазерный принтер и фотобумага.
Заготовка печатной платы вырезается из медного стеклотекстолита. Она шлифуется наждачной бумагой №0 и стиральной резинкой, после этого промывается водой и обезжиривается спиртом или ацетоном.
После того как готова заготовка печатной платы. Мы переносим изображение с фотобумаги на стеклотекстолит при помощи утюга.
После этого производят травление платы. Травят плату обычно в растворе персульфата аммония. Нормальной концентрацией раствора можно считать 20…50%. Разводят, примерно, 500 г порошка персульфата аммония в горячей кипяченой воде до получения общего объема раствора, равного 1 л. Раствор переливается в обычную ванночку (например использовать фотографический кювет). Продолжительность травления - 10…60 мин, она зависит от температуры, концентрации раствора, толщины медной фольги. Травление проводят под вытяжкой или в хорошо проветриваемом помещении.
Промытую плату просушивают, залуживают, рассверливают отверстия под выводы радиоэлементов (при этом используются сверла диаметром 0,6…0,8мм.)
Заключительным этапом является монтаж радиоэлементов. Перед монтажом на плату потемневшие выводы радиоэлементов следует зачищать до блеска, лудить их не обязательно. В качестве флюса лучше пользоваться канифольным лаком, а не твердой канифолью. Схема печатной платы изображена на рис 7.
Рис. 7. Схема печатной платы устройства
Разработка программы для микроконтроллера
Разработка блок схемы программы
По сбросу программа стартует с адреса 0000h.
Далее происходит следующее:
- Происходит настройка портов ввода-вывода.
- Включаются встроенные подтягивающие резисторы
- Выводится приветствие
- Начинается индикация текущего времени и даты.
После инициализации программа работает циклически. Постоянно опрашивается состояние кнопок, обслуживается дисплей, проверяется не подавать ли звонок, после чего цикл повторяется.
Код программы автомат звонок микроконтроллер
/** Программа для автомата подачи звонков в учебном учреждении
Разработчики: Гудков Владислав, Соленов Андрей
МОГК 2012 Группа 4АСУ/09 */
#include <avr/io.h>
#include <util/delay.h>
#include "lcd.h"
#include "ds1307.h"
#define MENU (PINC&(1 << PC2))==0 && PINC&(1 << PC0) && PINC&(1 << PC1) && PINC&(1 << PC3)
#define OK (PINC&(1 << PC3))==0 && PINC&(1 << PC0) && PINC&(1 << PC1) && PINC&(1 << PC2)
#define HOUR (PINC&(1 << PC0))==0 && PINC&(1 << PC1) && PINC&(1 << PC2) && PINC&(1 << PC3)
#define MIN (PINC&(1 << PC1))==0 && PINC&(1 << PC0) && PINC&(1 << PC2) && PINC&(1 << PC3)
int main(void)
{
// Инициализация портов
_delay_ms(100);
DDRC = 0x00;
PORTC = 0xFF;
DDRB |=(1 << PB2);
PORTB |=(0 << PB2);
lcd_init(); // Инициализация LCD
I2CInit(); // Инициализация шины I2C
// Запускаем ход часов
uint8_t temp;
DS1307Read(0x00,&temp);
temp &= ~(1 << 7); // обнуляем 7 бит
DS1307Write(0x00,temp);
// Инициализация и объявление переменных
unsigned char hour_za, minute_za, second_start, second_stop;
unsigned char hour_zb, minute_zb;
unsigned char hour_zc, minute_zc;
unsigned char hour_zd, minute_zd;
unsigned char hour_ze, minute_ze;
unsigned char hour_zf, minute_zf;
unsigned char hour_zj, minute_zj;
unsigned char hour_zh, minute_zh;
unsigned char hour_zi, minute_zi;
unsigned char hour_zg, minute_zg;
unsigned char hour_zk, minute_zk;
unsigned char hour_zl, minute_zl;
unsigned char hour_zm, minute_zm;
unsigned char hour_zn, minute_zn;
unsigned char hour_zo, minute_zo;
unsigned char hour_zp, minute_zp;
unsigned char v, i, menu, ok, k, a, c, e, zvon_vkl, f;
menu=0;
i=0;
v=0;
ok=0;
k=0;
a=0;
c=1;
e=1;
zvon_vkl=1;
f=1;
second_start = 0;
second_stop = 3;
hour_za = 8;
minute_za = 15;
hour_zb = 9;
minute_zb = 00;
hour_zc = 9;
minute_zc = 5;
hour_zd = 9;
minute_zd = 50;
hour_ze = 10;
minute_ze = 5;
hour_zf = 10;
minute_zf = 50;
hour_zj = 10;
minute_zj = 55;
hour_zh = 11;
minute_zh = 40;
hour_zi = 12;
minute_zi = 15;
hour_zg = 13;
minute_zg = 0;
hour_zk = 13;
minute_zk = 5;
hour_zl = 13;
minute_zl = 50;
hour_zm = 14;
minute_zm = 00;
hour_zn = 14;
minute_zn = 45;
hour_zo = 14;
minute_zo = 50;
hour_zp = 15;
minute_zp = 35;
// Ввывод приветствия
for(i=0; i<1; i++)
{
lcd_com(0x01);
_delay_ms(100);
lcd_string(0x85, "SolGud");
_delay_ms(1500);
lcd_com(0x01);
_delay_ms(100);
lcd_string(0x86, "2012");
_delay_ms(1500);
lcd_com(0x01);
_delay_ms(100);
lcd_string(0x86, "MOЎK");
_delay_ms(1500);
lcd_com(0x01);
_delay_ms(100);
}
while(1)
{
unsigned char hour, minute, second, day, date, month, years, temp;
// Читаем данные и преобразуем из BCD в двоичную систему
DS1307Read(0x00,&temp); // Чтение регистра секунд
second = (((temp & 0xF0) >> 4)*10)+(temp & 0x0F);
DS1307Read(0x01,&temp); // Чтение регистра минут
minute = (((temp & 0xF0) >> 4)*10)+(temp & 0x0F);
DS1307Read(0x02,&temp); // Чтение регистра часов
hour = (((temp & 0xF0) >> 4)*10)+(temp & 0x0F);
DS1307Read(0x03,&temp); // Чтение регистра дней
day = (temp & 0x0F);
DS1307Read(0x04,&temp); // Чтение регистра даты
date = (((temp & 0xF0) >> 4)*10)+(temp & 0x0F);
DS1307Read(0x05,&temp); // Чтение регистра месяца
month = (((temp & 0xF0) >> 4)*10)+(temp & 0x0F);
DS1307Read(0x06,&temp); // Чтение регистра года
years = (((temp & 0xF0) >> 4)*10)+(temp & 0x0F);
if(v==1)
{
lcd_com(0x08); // полное выключение дисплея
lcd_com(0x01); // очистка дисплея
_delay_us(100);
lcd_com(0x06); // сдвиг курсора вправо
lcd_com(0x0C); // включение дисплея, курсор не видим
v=0;
}
// Вывод часов и календаря
lcd_string(0xC1, " - -20 / "); // дата
lcd_com(0xC1);
LCDWriteInt(date, 2); // Выводим на экран дату
if(month == 1) lcd_string(0xC4, "ЗЅі");
else if (month == 2) lcd_string(0xC4, "дeі");
else if (month == 3) lcd_string(0xC4, "јap");
else if (month == 4) lcd_string(0xC4, "aѕp");
else if (month == 5) lcd_string(0xC4, "јa№");
else if (month == 6) lcd_string(0xC4, "ёЖЅ");
else if (month == 7) lcd_string(0xC4, "ёЖ»");
else if (month == 8) lcd_string(0xC4, "aіґ");
else if (month == 9) lcd_string(0xC4, "ceЅ");
else if (month == 10) lcd_string(0xC4, "oєї");
else if (month == 11) lcd_string(0xC4, "ЅoЗ");
else lcd_string(0xC4, "гeє"); // Выводим на экран месяц
lcd_com(0xCA);
LCDWriteInt(years, 2); // Выводим на экран год
if(day == 1) lcd_string(0xCD, "BC");
else if (day == 2) lcd_string(0xCD, "ЁH");
else if (day == 3) lcd_string(0xCD, "BT");
else if (day == 4) lcd_string(0xCD, "CP");
else if (day == 5) lcd_string(0xCD, "«T");
else if (day == 6) lcd_string(0xCD, "ЁT");
else lcd_string(0xCD, "C "); // Выводим на экран день недели
lcd_string(0x84, " : : ");
lcd_com(0x84);
LCDWriteInt(hour, 2); // Выводим на экран часы
lcd_com(0x87);
LCDWriteInt(minute, 2); // Выводим на экран минуты
lcd_com(0x8A);
LCDWriteInt(second, 2); // Выводим на экран секунды
lcd_com(0x8E);
if(zvon_vkl == 1) lcd_data(0xED); // Выводим на экран индикатор включения/выключения звонка
if(MENU) // если кнопка "меню" нажата
{
while((PINC & (1 << PC2))==0){}
menu=1;
}
// Вход в меню
switch(menu)
{
case 1: // Настройка времени
while(1)
{
if((v==0)||(k==0)||(a==1))
{
lcd_com(0x08); // полное выключение дисплея
lcd_com(0x01); // очистка дисплея
_delay_us(100);
lcd_com(0x06); // сдвиг курсора вправо
lcd_com(0x0C); // включение дисплея, курсор не видим
v=1;
k=1;
a=0;
}
lcd_string(0x86, "MEH°");
lcd_string(0xC1, "Hacїp. Аacoі >");
if(OK) // Если кнопка "ок" нажата
{
while((PINC & (1 << PC3))==0){}
ok=1;
}
if(MIN) // Если нажата кнопка "Минуты+"
{
while((PINC & (1 << PC1))==0){} // Ждем отпускания кнопки
menu=2;
break;
}
while(ok==1)
{
if(k==1)
{
lcd_com(0x08); // полное выключение дисплея
lcd_com(0x01); // очистка дисплея
_delay_us(100);
lcd_com(0x06); // сдвиг курсора вправо
lcd_com(0x0C); // включение дисплея, курсор не видим
k=0;
}
lcd_string(0x81, "HACTPO¦KA «ACOB");
lcd_string(0xC5, " : ");
lcd_com(0xC5);
LCDWriteInt(hour, 2); // Выводим на экран часы
lcd_com(0xC8);
LCDWriteInt(minute, 2); // Выводим на экран минуты
if(HOUR) // Если нажата кнопка "Часы+"
{
while((PINC & (1 << PC0))==0){} // Ждем отпускания кнопки
hour++; // Увеличиваем часы на 1
if(hour > 23) hour = 0;
// Преобразуем из двоичной системы в BCD и записываем в DS1307
uint8_t temp;
temp = ((hour/10) << 4)|(hour%10);
DS1307Write(0x02, temp);
_delay_ms(100);
}
if(MIN) // Если нажата кнопка "Минуты+"
{
while((PINC & (1 << PC1))==0){} // Ждем отпускания кнопки
minute++; // Увеличиваем минуты на 1
if(minute > 59) minute = 0;
// Преобразуем из двоичной системы в BCD и записываем в DS1307
uint8_t temp;
temp = ((minute/10) << 4)|(minute%10);
DS1307Write(0x01, temp);
_delay_ms(100);
}
/**Выход из настроек часов **/
if(OK) // Если кнопка "ок" нажата, то выход
{
while((PINC & (1 << PC3))==0){}
ok=0;
v=1;
}
if(ok==0)
{break;}
}
/** Выход из меню **/
if(MENU) // если кнопка "меню" нажата
{
while((PINC & (1 << PC2))==0){}
menu=0;
break;
}
if(menu=0){break;}
}
break;
case 2://Настройка даты
while(1)
{
if((a==0)||(v==0))
{
lcd_com(0x08); // полное выключение дисплея
lcd_com(0x01); // очистка дисплея
_delay_us(100);
lcd_com(0x06); // сдвиг курсора вправо
lcd_com(0x0C); // включение дисплея, курсор не видим
v=1;
a=1;
}
lcd_string(0x86, "MEH°");
lcd_string(0xC1, "< Hacїp. гaїГ >");
if(HOUR) // Если нажата кнопка "Часы+"
{
while((PINC & (1 << PC0))==0){} // Ждем отпускания кнопки
menu=1;
break;
}
if(MIN) // Если нажата кнопка "Минуты+"
{
while((PINC & (1 << PC1))==0){} // Ждем отпускания кнопки
menu=3;
break;
}
if(OK) // Если кнопка "ок" нажата
{
while((PINC & (1 << PC3))==0){}
ok=1;
}
while(ok==1)
{
if(a==1)
{
lcd_com(0x08); // полное выключение дисплея
lcd_com(0x01); // очистка дисплея
_delay_us(100);
lcd_com(0x06); // сдвиг курсора вправо
lcd_com(0x0C); // включение дисплея, курсор не видим
a=0;
}
lcd_string(0x80, "Hacїpo№єa Аёc»a");
lcd_string(0xC4, " / / ");
lcd_com(0xC4);
LCDWriteInt(date, 2); // Выводим на экран дату
if(month == 1) lcd_string(0xC7, "ЗЅі");
else if (month == 2) lcd_string(0xC7, "дeі");
else if (month == 3) lcd_string(0xC7, "јap");
else if (month == 4) lcd_string(0xC7, "aѕp");
else if (month == 5) lcd_string(0xC7, "јa№");
else if (month == 6) lcd_string(0xC7, "ёЖЅ");
else if (month == 7) lcd_string(0xC7, "ёЖ»");
else if (month == 8) lcd_string(0xC7, "aіґ");
else if (month == 9) lcd_string(0xC7, "ceЅ");
else if (month == 10) lcd_string(0xC7, "oєї");
else if (month == 11) lcd_string(0xC7, "ЅoЗ");
else lcd_string(0xC7, "гeє"); // Выводим на экран день месяц
lcd_com(0xCB);
LCDWriteInt(years, 2); // Выводим на экран год
//настройка даты
if(MENU) // если кнопка "меню" нажата
{
while((PINC & (1 << PC2))==0){}
date++;
if(date > 31) date=1;
uint8_t temp;
temp = ((date/10) << 4)|(date%10);
DS1307Write(0x04, temp);
_delay_ms(100);
}
if(HOUR) // Если нажата кнопка "Часы+"
{
while((PINC & (1 << PC0))==0){} // Ждем отпускания кнопки
month++; // Увеличиваем часы на 1
if(month > 12) month = 1;
// Преобразуем из двоичной системы в BCD и записываем в DS1307
uint8_t temp;
temp = ((month/10) << 4)|(month%10);
DS1307Write(0x05, temp);
_delay_ms(100);
}
if(MIN) // Если нажата кнопка "Минуты+"
{
while((PINC & (1 << PC1))==0){} // Ждем отпускания кнопки
years++; // Увеличиваем минуты на 1
if(years > 99) years = 0;
// Преобразуем из двоичной системы в BCD и записываем в DS1307
uint8_t temp;
temp = ((years/10) << 4)|(years%10);
DS1307Write(0x06, temp);
_delay_ms(100);
}
/**Переход в настройку дня недели **/
if(OK) // Если кнопка "ок" нажата, то выход
{
while((PINC & (1 << PC3))==0){}
ok=2;
}
if(ok==2)
{break;}
}
while(ok==2)
{
if(v==1)
{
lcd_com(0x08); // полное выключение дисплея
lcd_com(0x01); // очистка дисплея
_delay_us(100);
lcd_com(0x06); // сдвиг курсора вправо
lcd_com(0x0C); // включение дисплея, курсор не видим
v=0;
}
lcd_string(0x82, "аeЅД Ѕeгe»ё");
if(day == 1) lcd_string(0xC7, "BC");
else if (day == 2) lcd_string(0xC7, "ЁH");
else if (day == 3) lcd_string(0xC7, "BT");
else if (day == 4) lcd_string(0xC7, "CP");
else if (day == 5) lcd_string(0xC7, "«T");
else if (day == 6) lcd_string(0xC7, "ЁT");
else lcd_string(0xC7, "C "); // Выводим на экран день недели
if(HOUR) // Если нажата кнопка "Часы+"
{
while((PINC & (1 << PC0))==0){} // Ждем отпускания кнопки
day++; // Увеличиваем день на 1
if(day > 7) day = 1;
// Преобразуем из двоичной системы в BCD и записываем в DS1307
uint8_t temp;
temp = (day%10);
DS1307Write(0x03, temp);
_delay_ms(100);
}
/**выход из настроек даты и дня недели**/
if(OK) // Если кнопка "ок" нажата, то выход
{
while((PINC & (1 << PC3))==0){}
ok=0;
}
if(ok==0)
{break;}
}
/** Выход из меню **/
if(MENU) // если кнопка "меню" нажата
{
while((PINC & (1 << PC2))==0){}
menu=0;
break;
}
}
break;
case 3: // Настройка вкл/выкл звонков
while(1)
{
if((c==1)||(e==0)||(v==0))
{
lcd_com(0x08); // полное выключение дисплея
lcd_com(0x01); // очистка дисплея
_delay_us(100);
lcd_com(0x06); // сдвиг курсора вправо
lcd_com(0x0C); // включение дисплея, курсор не видим
c=0;
e=1;
v=1;
}
lcd_string(0x86, "MEH°");
lcd_string(0xC0, "< Bє». ·іoЅєoі >");
if(MENU) // если кнопка "меню" нажата
{
while((PINC & (1 << PC2))==0){}
menu=0;
break;
}
if(HOUR) // Если нажата кнопка "Часы+"
{
while((PINC & (1 << PC0))==0){} // Ждем отпускания кнопки
menu=2;
break;
}
if(MIN) // Если нажата кнопка "Минуты+"
{
while((PINC & (1 << PC1))==0){} // Ждем отпускания кнопки
menu=4;
break;
}
if(OK) //Если кнопка "ок" нажата
{
while((PINC & (1 << PC3))==0){}
ok=1;
}
while(ok==1)
{
if(e==1)
{
lcd_com(0x08); // полное выключение дисплея
lcd_com(0x01); // очистка дисплея
_delay_us(100);
lcd_com(0x06); // сдвиг курсора вправо
lcd_com(0x0C); // включение дисплея, курсор не видим
e=0;
v=1;
}
lcd_string(0x82, "Bє». ·іoЅєoі");
if(zvon_vkl == 1) lcd_string(0xC2, "< Bє»ЖАeЅГ >");
else if (zvon_vkl == 0) lcd_string(0xC2, "< BГє»ЖАeЅГ >");
if(HOUR) // Если нажата кнопка "Часы+"
{
while((PINC & (1 << PC0))==0){} // Ждем отпускания кнопки
zvon_vkl++; // Увеличиваем часы на 1
if(zvon_vkl > 1) zvon_vkl = 0;
_delay_ms(100);
}
if(OK) //Если кнопка "ок" нажата
{
while((PINC & (1 << PC3))==0){}
ok=0;
}
if(ok==0)
{break;}
}
/** Выход из меню **/
if(MENU) // если кнопка "меню" нажата
{
while((PINC & (1 << PC2))==0){}
menu=0;
break;
}
}
break;
case 4: // Информация о разработчиках
while(1)
{
if((a==0)||(f==1)||(e==1))
{
lcd_com(0x08); // полное выключение дисплея
lcd_com(0x01); // очистка дисплея
_delay_us(100);
lcd_com(0x06); // сдвиг курсора вправо
lcd_com(0x0C); // включение дисплея, курсор не видим
a=1;
f=0;
e=0;
v=1;
}
lcd_string(0x86, "MEH°");
lcd_string(0xC1, "< Pa·paІoїАёєё");
if(MENU) // если кнопка "меню" нажата
{
while((PINC & (1 << PC2))==0){}
menu=0;
break;
}
if(HOUR) // Если нажата кнопка "Часы+"
{
while((PINC & (1 << PC0))==0){} // Ждем отпускания кнопки
menu=3;
break;
}
if(OK) //Если кнопка "ок" нажата
{
while((PINC & (1 << PC3))==0){}
ok=1;
}
while(ok==1)
{
if(f==0)
{
lcd_com(0x08); // полное выключение дисплея
lcd_com(0x01); // очистка дисплея
_delay_us(100);
lcd_com(0x06); // сдвиг курсора вправо
lcd_com(0x0C); // включение дисплея, курсор не видим
f=1;
}
lcd_string(0x84, "4 AC©/09");
lcd_string(0xC1, "Ўyгєoі Co»µЅoі");
if(OK) // если кнопка "ок" нажата
{
while((PINC & (1 << PC3))==0){}
ok=0;
}
if(ok==0)
{break;}
}
/** Выход из меню **/
if(MENU) // если кнопка "меню" нажата
{
while((PINC & (1 << PC2))==0){}
menu=0;
break;
}
}
break;
default:
break;
}
// Проверка когда звонить
// 1 урок
if((hour==hour_za) && (minute==minute_za) && (second == second_start) && (day!=1) && (day!=7) && (zvon_vkl==1))
{
PORTB |= _BV(PB2);
}
if((hour==hour_za) && (minute==minute_za) && (second == second_stop) && (day!=1) && (day!=7) && (zvon_vkl==1))
{
PORTB &= ~_BV(PB2);
}
// 5 минут
if((hour==hour_zb) && (minute==minute_zb) && (second == second_start) && (day!=1) && (day!=7) && (zvon_vkl==1))
{
PORTB |= _BV(PB2);
}
if((hour==hour_zb) && (minute==minute_zb) && (second == second_stop) && (day!=1) && (day!=7) && (zvon_vkl==1))
{
PORTB &= ~_BV(PB2);
}
// 2 урок
if((hour==hour_zc) && (minute==minute_zc) && (second == second_start) && (day!=1) && (day!=7) && (zvon_vkl==1))
{
PORTB |= _BV(PB2);
}
if((hour==hour_zc) && (minute==minute_zc) && (second == second_stop) && (day!=1) && (day!=7) && (zvon_vkl==1))
{
PORTB &= ~_BV(PB2);
}
// перемена
if((hour==hour_zd) && (minute==minute_zd) && (second == second_start) && (day!=1) && (day!=7) && (zvon_vkl==1))
{
PORTB |= _BV(PB2);
}
if((hour==hour_zd) && (minute==minute_zd) && (second == second_stop) && (day!=1) && (day!=7) && (zvon_vkl==1))
{
PORTB &= ~_BV(PB2);
}
// 3 урок
if((hour==hour_ze) && (minute==minute_ze) && (second == second_start) && (day!=1) && (day!=7) && (zvon_vkl==1))
{
PORTB |= _BV(PB2);
}
if((hour==hour_ze) && (minute==minute_ze) && (second == second_stop) && (day!=1) && (day!=7) && (zvon_vkl==1))
{
PORTB &= ~_BV(PB2);
}
//5 минут
if((hour==hour_zf) && (minute==minute_zf) && (second == second_start) && (day!=1) && (day!=7) && (zvon_vkl==1))
{
PORTB |= _BV(PB2);
}
if((hour==hour_zf) && (minute==minute_zf) && (second == second_stop) && (day!=1) && (day!=7) && (zvon_vkl==1))
{
PORTB &= ~_BV(PB2);
}
// 4 урок
if((hour==hour_zj) && (minute==minute_zj) && (second == second_start) && (day!=1) && (day!=7) && (zvon_vkl==1))
{
PORTB |= _BV(PB2);
}
if((hour==hour_zj) && (minute==minute_zj) && (second == second_stop) && (day!=1) && (day!=7) && (zvon_vkl==1))
{
PORTB &= ~_BV(PB2);
}
// перемена
if((hour==hour_zh) && (minute==minute_zh) && (second == second_start) && (day!=1) && (day!=7) && (zvon_vkl==1))
{
PORTB |= _BV(PB2);
}
if((hour==hour_zh) && (minute==minute_zh) && (second == second_stop) && (day!=1) && (day!=7) && (zvon_vkl==1))
{
PORTB &= ~_BV(PB2);
}
// 5 урок
if((hour==hour_zi) && (minute==minute_zi) && (second == second_start) && (day!=1) && (day!=7) && (zvon_vkl==1))
{
PORTB |= _BV(PB2);
}
if((hour==hour_zi) && (minute==minute_zi) && (second == second_stop) && (day!=1) && (day!=7) && (zvon_vkl==1))
{
PORTB &= ~_BV(PB2);
}
// 5 минут
if((hour==hour_zg) && (minute==minute_zg) && (second == second_start) && (day!=1) && (day!=7) && (zvon_vkl==1))
{
PORTB |= _BV(PB2);
}
if((hour==hour_zg) && (minute==minute_zg) && (second == second_stop) && (day!=1) && (day!=7) && (zvon_vkl==1))
{
PORTB &= ~_BV(PB2);
}
// 6 урок
if((hour==hour_zk) && (minute==minute_zk) && (second == second_start) && (day!=1) && (day!=7) && (zvon_vkl==1))
{
PORTB |= _BV(PB2);
}
if((hour==hour_zk) && (minute==minute_zk) && (second == second_stop) && (day!=1) && (day!=7) && (zvon_vkl==1))
{
PORTB &= ~_BV(PB2);
}
// перемена
if((hour==hour_zl) && (minute==minute_zl) && (second == second_start) && (day!=1) && (day!=7) && (zvon_vkl==1))
{
PORTB |= _BV(PB2);
}
if((hour==hour_zl) && (minute==minute_zl) && (second == second_stop) && (day!=1) && (day!=7) && (zvon_vkl==1))
{
PORTB &= ~_BV(PB2);
}
// 7 урок
if((hour==hour_zm) && (minute==minute_zm) && (second == second_start) && (day!=1) && (day!=7) && (zvon_vkl==1))
{
PORTB |= _BV(PB2);
}
if((hour==hour_zm) && (minute==minute_zm) && (second == second_stop) && (day!=1) && (day!=7) && (zvon_vkl==1))
{
PORTB &= ~_BV(PB2);
}
//5 минут
if((hour==hour_zn) && (minute==minute_zn) && (second == second_start) && (day!=1) && (day!=7) && (zvon_vkl==1))
{
PORTB |= _BV(PB2);
}
if((hour==hour_zn) && (minute==minute_zn) && (second == second_stop) && (day!=1) && (day!=7) && (zvon_vkl==1))
{
PORTB &= ~_BV(PB2);
}
// 8 урок
if((hour==hour_zo) && (minute==minute_zo) && (second == second_start) && (day!=1) && (day!=7) && (zvon_vkl==1))
{
PORTB |= _BV(PB2);
}
if((hour==hour_zo) && (minute==minute_zo) && (second == second_stop) && (day!=1) && (day!=7) && (zvon_vkl==1))
{
PORTB &= ~_BV(PB2);
}
// окончание
if((hour==hour_zp) && (minute==minute_zp) && (second == second_start) && (day!=1) && (day!=7) && (zvon_vkl==1))
{
PORTB |= _BV(PB2);
}
if((hour==hour_zp) && (minute==minute_zp) && (second == second_stop) && (day!=1) && (day!=7) && (zvon_vkl==1))
{
PORTB &= ~_BV(PB2);
}
}
}
Заключение
Результаты, достигнутые при выполнении курсовой работы:
Проанализирована радиотехническая литература.
На основе структурной схемы спроектирована принципиальная электрическая схема автомата, разработана и изготовлена печатная плата устройства.
Разработана и написана программа на языке программирования Си для автомата подачи звонков.
При испытании автомата были выявлены некоторые недостатки, которые были устранены.
Цель курсовой работы была достигнута: разработан и создан автомат подачи звонков. Он будет использоваться в учебных заведениях. Также он может использоваться в других целях, т.е. там, где нужно подавать напряжение на различные источники питания в соответствии со временем, но при этом нужно будет задавать соответствующее время подачи сигнала.
Данный автомат подачи звонков может программно дорабатываться и совершенствоваться.
Список информационных источников
Синдеев Ю.Г. Электротехника с основами электроники. Ростов-на Дону. 2010.
Шмаков С.Б. Энциклопедия радиолюбителя. Санкт-Петербург. 2010.
Подбельский В.В., Фомин С.С. Курс программирования на языке СИ. Москва. 2012
Керниган Б., Ритчи Д. Язык программирования СИ. Москва. 2012
Приложение А
Микросхемы часов реального времени (RTC)
Преимущество RTC в том, что контроллер нужен только для отправки данных на индикатор, весь счет времени идет внутри RTC, а нам остается только считывать время из ячеек, эти микросхемы также имеют таймер, будильник и вырабатывают прерывание для внешних устройств.
Существует множество микросхем RTC. Это такие как DS1994 и DS1904 выпускаемые фирмой Dallas Semiconductor. Их отличительной особенностью является способ представления времени. Сами часы выполнены как двоичный счётчик с разрешением 1/256 с. Минуты, часы, дни, годы вычисляются из числа секунд, прошедших от условно выбранной даты.
Также есть RTC компании ST, содержащие минимум необходимого для непрерывной выдачи в систему реального времени. К таким устройствам относятся микросхемы M41T0 и M41T80. Они содержат полный набор счетчиков времени и учитывают особенности високосных лет. К дополнительным возможностям этих устройств относятся программируемый сигнал аварии с функцией обработки прерываний, программируемый выходной меандр и отдельный вывод сигнала с частотой 32 кГц, используемый как эталонный входной сигнал для тактовых генераторов других микросхем. Имея такие возможности, данные микросхемы покрывают потребности приложений в значительной части потребительского рынка.
Мы же с своей работе выбираем RTC фирмы Dallas Semiconductor, упомянутой ранее, DS1307.
Характеристики
- часы реального времени (RTC) отсчитывают секунды, минуты, часы, дату месяца, месяц, день недели и год с компенсацией високосного года, действительной до 2100 года;
- 56-байтовое энергонезависимое ОЗУ с питанием от батареи для хранения пользовательских данных;
- двухпроводной последовательный интерфейс;
- программируемый выходной сигнал с прямоугольными импульсами (для тактирования внешних устройств);
- автоматическое обнаружение падения напряжение и схема переключения на батарею;
- потребление менее 500 нА в режиме батарейной поддержки при работающем тактовом генераторе;
- промышленный диапазон температур: от - 40 °C до + 85 °C;
- микросхема производится в 8-выводных корпусах DIP и SOIC.
Классификация
DS1307 - 8-выводный DIP (300 миллидюймов - 7.62 мм)
DS1307Z - 8-выводный SOIC (150 миллидюймов - 3.81 мм)
DS1307N - 8-выводный DIP (промышленный)
DS1307ZN - 8-выводный SOIC (промышленный)
Расположение выводов
DS1307 8-выводный DIP (300 миллидюймов)
DS1307 8-выводный SOIC (150 миллидюймов)
Назначение выводов
VCC - первичный источник питания;
X1, X2 - подключение 32.768 кГц кварцевого резонатора;
VBAT - вход батареи +3 В;
GND - общий минус;
SDA - последовательные данные;
SCL - последовательные синхроимпульсы;
SQW/OUT - выходной сигнал с прямоугольными импульсами.
Описание
Часы реального времени с последовательным интерфейсом DS1307 - это малопотребляющие полные двоично-десятичные часы-календарь, включающие 56 байтов энергонезависимой статической ОЗУ. Адреса и данные передаются последовательно по двухпроводной двунаправленной шине. Часы-календарь отсчитывают секунды, минуты, часы, день, дату, месяц и год. Последняя дата месяца автоматически корректируется для месяцев с количеством дней меньше 31, включая коррекцию високосного года. Часы работают как в 24-часовом, так и в 12-часовом режимах с индикатором AM/PM. DS1307 имеет встроенную схему наблюдения за питанием, которая обнаруживает перебои питания и автоматически переключается на питание от батареи. Для измерения времени в качестве задающего генератора используется кварцевый резонатор частотой 32.768 кГц.
Типовая схема включения
Работа
DS1307 на последовательной шине работает как ведомое устройство. Доступ к нему достигается установкой условия START и передачей устройству идентификационного кода, за которым следует адрес регистра. К следующим за ним регистрам доступ осуществляется последовательно, пока не будет выполнено условие STOP.
Если VCC падает ниже 1.25 * VBAT, DS1307 прерывает процесс доступа и сбрасывает счётчик адреса, причем в это время внешние сигналы не воспринимаются (чтобы предотвратить запись ошибочных данных).
Если VCC падает ниже VBAT, DS1307 переключается в низкоточный режим батарейной поддержки.
При включении питания DS1307 переключается от батареи к Vcc, когда значение Vcc превышает VBAT + 0.2 В. Входящие сигналы начинают восприниматься тогда, когда Vcc превышает 1.25 * VBAT.
Блок-схема на рисунке 8 показывает основные элементы RTC с последовательным интерфейсом.
Рис. 8. Блок-схема DS1307
Описание выводов
VCC, GND - на эти выводы подается питание.
VCC - это вход +5 В. Когда питающее напряжение выше 1.25 * VBAT, устройство полностью доступно, и можно выполнять чтение и запись данных. Когда к устройству подключена батарея на 3 В, и VCC ниже, чем 1.25 * VBAT, чтение и запись запрещены, однако функция отсчёта времени продолжает работать. Как только VCC падает ниже VBAT, ОЗУ и RTC переключаются на батарейное питание VBAT.
VBAT - вход для любой стандартной трёхвольтовой литиевой батареи или другого источника энергии. Для нормальной работы DS1307 необходимо, чтобы напряжение батареи было в диапазоне 2.0... 3.5 В. Литиевая батарея с ёмкостью 48 мА/ч или более при отсутствии питания будет поддерживать DS1307 в течение более 10 лет при температуре 25°C.
SCL (Serial Clock Input - вход последовательных синхроимпульсов) - используется для синхронизации данных по последовательному интерфейсу.
SDA (Serial Data Input/Output - вход/выход последовательных данных) - вывод входа/выхода для двухпроводного последовательного интерфейса. Вывод SDA - с открытым стоком и требует внешнего подтягивающего резистора.
SQW/OUT (Square Wave/Output Driver - сигнал с прямоугольными импульсами) - когда включен, т.е. бит SQWE установлен в 1, вывод SQW/OUT выдаёт прямоугольные импульсы с одной из четырёх частот (1 Гц, 4 кГц, 8 кГц, 32 кГц). Вывод SQW/OUT - с открытым стоком и требует внешнего подтягивающего резистора. SQW/OUT будет работать как при питании от VCC, так и при питании от VBAT.
X1, X2 - выводы для стандартного кварцевого резонатора с частотой 32.768 кГц.
RTC и карта адресации памяти
Карта адресов для RTC и регистров ОЗУ представлена на рисунке 9. Регистры RTC расположены в ячейках адресов от 00h до 07h. Регистры ОЗУ расположены в ячейках адресов от 08h до 3Fh. В процессе многобайтного доступа, когда адресный указатель достигает 3Fh (конец пространства ОЗУ), он перемещается на ячейку 00h - начало пространства RTC.
Рис. 9. Карта адресов DS1307
Часы и календарь
Информация от часов и календаря получается чтением соответствующих байтов регистра. Регистры RTC показаны на рисунке 10. Время и календарь устанавливаются или инициализируются записью соответствующих байтов регистра. Содержимое регистров времени и календаря имеет двоично-десятичный формат. Бит 7 регистра 0 - это бит останова часов (clock halt - CH). Когда этот бит установлен в 1, тактовый генератор выключен. Когда сброшен в 0, - тактовый генератор включен.
Имейте в виду, что при включении питания начальное состояние всех регистров не определено. Поэтому необходимо принудительно включать тактовый генератор (бит CH = 0) во время начальной инициализации.
DS1307 может работать и в 12-часовом, и в 24-часовом режимах. Бит 6 регистра часов отвечает за выбор 12- или 24-часового режима. Когда он установлен в 1, выбран 12-часовой режим. В этом режиме бит 5 - это бит AM/PM, при этом высокий логический уровень означает PM. В 24-часовом режиме бит 5 - это бит второго десятка часов (20 - 23 часа).
При появлении на двухпроводной шине условия START, текущее время копируется во второй набор регистров. Информация о времени читается из этих вспомогательных регистров, в то время как часы могут продолжать работать. Это устраняет необходимость перечитывать регистры DS1307 в случае обновления их содержимого во время чтения.
Рис. 10. Регистры хронометра DS1307
Управляющий регистр
Управляющий регистр используется для управления работой вывода SQW/OUT. Биты управляющего регистра представлены в таблице 1.
Таблица 1. Биты управляющего регистра
БИТ 7 |
БИТ 6 |
БИТ 5 |
БИТ 4 |
БИТ 3 |
БИТ 2 |
БИТ 1 |
БИТ 0 |
|
OUT |
0 |
0 |
SQWE |
0 |
0 |
RS1 |
RS0 |
OUT (Output control - управление выходом) - этот бит управляет логическим уровнем на выводе SQW/OUT, когда выход сигнала с прямоугольными импульсами отключен. Если SQWE = 0, то логический уровень на выводе SQW/OUT равен 1, если OUT = 1, и 0, если OUT = 0.
SQWE (Square Wave Enable - включение сигнала с прямоугольными импульсами) - когда этот бит установлен в 1, включается генерация прямоугольных импульсов. Их частота зависит от значения битов RS0 и RS1. (Если частота выходного сигнала установлена в 1Гц, регистры часов обновляются по заднему фронту этих импульсов).
RS (Rate Select - выбор частоты) - эти биты управляют частотой прямоугольных импульсов, когда бит SQWE=1. В таблице 2 приведены частоты, которые можно выбрать с помощью битов RS.
Таблица 2. Частота выхода SQW
RS1 |
RS0 |
Частота |
|
0 |
0 |
1 Гц |
|
0 |
1 |
4.096 кГц |
|
1 |
0 |
8.192 кГц |
|
1 |
1 |
32.768 кГц |
Приложение Б
ATmega8, ATmega8L
8-разрядные микроконтроллеры с 8 Кбайтами внутрисистемно программируемой Flash памяти
Отличительные особенности:
8-разрядный высокопроизводительный AVR микроконтроллер с малым потреблением
Прогрессивная RISC архитектура
130 высокопроизводительных команд, большинство команд выполняется за один тактовый цикл
32 8-разрядных рабочих регистра общего назначения Полностью статическая работа
Приближающаяся к 16 MIPS (при тактовой частоте 16 МГц) производительность
Встроенный 2-цикловый перемножитель
Энергонезависимая память программ и данных
8 Кбайт внутрисистемно программируемой Flash памяти (In-System Self-Programmable Flash)
Обеспечивает 1000 циклов стирания/записи
Дополнительный сектор загрузочных кодов с независимыми битами блокировки
Обеспечен режим одновременного чтения/записи (Read-While-Write)
512 байт EEPROM
Обеспечивает 100000 циклов стирания/записи
1 Кбайт встроенной SRAM
Программируемая блокировка, обеспечивающая защиту программных средств пользователя
Встроенная периферия
Два 8-разрядных таймера/счетчика с отдельным предварительным делителем, один с режимом сравнения
Один 16-разрядный таймер/счетчик с отдельным предварительным делителем и режимами захвата и сравнения
Счетчик реального времени с отдельным генератором
Три канала PWM
8-канальный аналого-цифровой преобразователь (в корпусах TQFP и MLF)
6 каналов с 10-разрядной точностью
2 канала с 8-разрядной точностью
6-канальный аналого-цифровой преобразователь (в корпусе PDIP)
4 канала с 10-разрядной точностью
2 канала с 8-разрядной точностью
Байт-ориентированный 2-проводный последовательный интерфейс
Программируемый последовательный USART
Последовательный интерфейс SPI (ведущий/ведомый)
Программируемый сторожевой таймер с отдельным встроенным генератором
Встроенный аналоговый компаратор
Специальные микроконтроллерные функции
Сброс по подаче питания и программируемый детектор кратковременного снижения напряжения питания
Встроенный калиброванный RC-генератор
Внутренние и внешние источники прерываний
Пять режимов пониженного потребления: Idle, Power-save, Power-down, Standby и снижения шумов ADC
Выводы I/O и корпуса
23 программируемые линии ввода/вывода
28-выводной корпус PDIP, 32-выводной корпус TQFP и 32-выводной корпус MLF
Рабочие напряжения
2,7 - 5,5 В (ATmega8L)
4,5 - 5,5 В (ATmega8)
Рабочая частота
0 - 8 МГц (ATmega8L)
0 - 16 МГц (ATmega8)
Блок-схема:
Рис. 11. Блок-схема микроконтроллера AtMega8
Рис. 12. Расположение выводов в различных корпусах МК AtMega8
Приложение В
Вам представлен RS-232(COM) программатор совместимый с PonyProg и имеющий 10 пиновый ICSP разъём STKxxx.
Характеристики:
Подключение к ПК через RS-232 (через переходники USB - RS-232 не работает!)
Не требует внешнего питания
Использует Atmel-овский 2x5 пиновый ICSP разъём
Габариты 45x30 мм (1.7x1.2") + 20 см (8") кабель
Программируемые микросхемы:
AT90S1200, AT90S2313, AT90S2323,
AT90S2343, AT90S4414, AT90S4434,
AT90S8515, AT90S8535, AT90S2323,
AT90S2343, AT90S2333, AT90S4433,
AT90S4434, AT90S8535, AT90S8534,
ATmega103, ATmega161, ATmega163,
ATmega323, ATmega128, ATmega8,
ATmega16, ATmega64, ATtiny12 and ATtiny15
Схема программатора
Рис. 13. Принципиальная схема внутрисхемного программатора
Рис. 14. Распиновка разъёма программатора
Рис.15. Схема платы с панелькой для AtMega8
Размещено на Allbest.ru
Подобные документы
Технические характеристики микросхемы часов реального времени. Разработка принципиальной электрической схемы и печатной платы автомата подачи звонков в учебных заведениях. Программирование микроконтроллера фирмы Microchip, тестирование устройства.
дипломная работа [1,7 M], добавлен 16.07.2012Рассмотрение структурной и функциональной схем для часов. Построение графа управляющего автомата. Кодирование входных и выходных сигналов. Разработка 12-часового режима работы и блока отключения индикаторов. Определение площади кристалла микросхемы.
курсовая работа [314,3 K], добавлен 27.04.2011Параметры, характеристики, схемы и назначение выводов микроконтроллера. Разработка программы, реализующей взаимодействие со сторонними устройствами, вместе образующих устройство часов с функцией будильника. Электрическая схема разрабатываемого устройства.
курсовая работа [406,5 K], добавлен 12.09.2012Проектирование шахматных часов с функцией будильника. Создание и разводка печатной платы на основе микроконтроллера при помощи программы Proteus, выбор его архитектуры. Разработка схемы и программного кода. Тестирование прототипа на макетной плате.
дипломная работа [41,0 M], добавлен 22.01.2016Описание работы электронных часов и микроконтроллера АТTiny2313 фирмы Atmel. Выходные буферы порта. Принципиальная схема электронных часов. Разработка печатной платы и практическое её применение. Принципы программирования и прошивки микроконтроллера.
курсовая работа [749,0 K], добавлен 29.05.2009Описание структурной и функциональной схем электронных часов, выбор элементной базы. Разработка счетчика времени с системой управления на базе микроконтроллера. Экономический расчет затрат на проектирование, разработку и сборку макета электронных часов.
дипломная работа [223,5 K], добавлен 26.07.2015Сопряжение микросхемы часов реального времени с микроконтроллером. Последовательная шина данных для связи интегральных схем. Соединение низкоскоростных периферийных компонентов с материнской платой. Управление пересылкой на байтовом и битовом уровнях.
курсовая работа [1,6 M], добавлен 31.05.2012Этапы разработки микропроцессорной системы на основе микроконтроллера. Общая характеристика солнечных часов. Разработка схемы, программного обеспечения и алгоритма управления солнечных часов. Технико-экономическое обоснование разработки и охрана труда.
дипломная работа [5,9 M], добавлен 16.07.2010Проектирование программы узла связи, содержащего часы реального времени. Расположение выводов и их назначение. Подключение к двухпроводной последовательной шине данных. Обзор процесса передачи данных по двухпроводной шине. Разработка алгоритма программы.
курсовая работа [700,6 K], добавлен 01.12.2014Алгоритм работы автомата Мили в табличном виде. Графический способ задания автомата. Синтез автомата Мили на Т-триггерах. Кодирование состояний автомата. Таблицы кодирования входных и выходных сигналов. Таблица переходов и выходов абстрактного автомата.
курсовая работа [24,7 K], добавлен 01.04.2010