Часы реального времени
Курсовой проект - Компьютеры, программирование
Другие курсовые по предмету Компьютеры, программирование
икросхем была выбрана DS1307 ввиду её распространённости, простоты использования и дешевизны. Для получения текущего значения времени будем использовать прерывания по таймеру так, как было описано выше.
Средства используемой среды разработки(CodeVisionAVR) позволяют сильно упростить работу с LCD дисплеем, предлагая готовые функции инициализации и вывода символов. Но при этом мы обязаны работать по четырёхразрядной шине, вместо восьмиразрядной, что повлияет на скорость вывода информации. Обновлять информацию на дисплее будем сразу после считывания значения времени с микросхемы DS1307 в том же прерывании.
Для обеспечения возможности настройки часов и будильника, порт B микроконтроллера будет опрашивать состояние кнопок, соединенных с землёй.
.2 Описание исходного кода программы
Строки 1-19: подключение необходимых заголовочных файлов, конфигурирование микроконтроллера для работы с внешними устройствами.
Строки 21-39: объявление глобальных переменных с заданием начальных значений.
Строки 43-50: функция, вызываемая по прерыванию таймера. Обнуляет значение счётчика, изменяет изначально заданное число для сравнения(поскольку при инициализации на дисплей выводится информационное сообщение и во время его отображение прерывание срабатывать не должно) и вызывает функцию Display();
Строки 52-67: функция About(). Выводит на дисплей бегущую строку с информацией об устройстве и её авторе.
Строки 69-74: функция Delay_note(). Используется для обеспечения возможности задания паузы в работе с помощью переменной(встроенная функция delay_ms() способна принимать только константы). Это необходимо при проигрывании мелодии, т.к. время задержки звука задана в массиве и для каждой ноты разное значение задержки.
Строки 76-108: функция Alarm(). Вызывается, когда значение даты и времени совпадает со значением переменных, хранящих настройки будильника. Она выводит на дисплей сообщение о включении будильника и проигрывает мелодию, задавая логические уровни на входе динамика с определённой частотой, значение которых хранится в массиве.
Строки 110-222: функция Display(). Обрабатывает значением переменных времени, предотвращая ввод неверных значений времени(например, если значение hour=23, то нажимая на кнопку +1 Hour, значение hour обнуляется, инкрементируя значение переменной day, после чего выводит информацию на дисплей. Аналогичные операции функция проделывает, если идёт работа с настройкой будильника.
Строки 224-298: функция Setting().Отвечает за обработку нажатия кнопок, соответствующим образом подстраивая часы или будильник. Также отвечает за остановку будильника.
Строки 300-354: функция main(). Производит начальную настройку портов ввода\вывода, значение регистров таймера, включает прерывания, после чего инициализирует LCD дисплей и сразу же вывод информационное сообщение с помощью функции About(). Затем инициализирует работу I2C шины и микросхемы RTC DS1307, задаёт ей начальные значения даты и времени, после чего входит в бесконечный цикл, вызывая функцию Settings() для обработки нажатия клавиш и проверяя необходимость включения будильника.
ЗАКЛЮЧЕНИЕ
В данном курсовом проекте была написана программа для микроконтроллера Atmega8 фирмы ATMEL. Программа была написана на языке С и составляет более 350 строк кода, реализующих взаимодействие со сторонними устройствами, вместе образующие устройство часов с функцией будильника. Разработка программы велась в среде программирования CodeVisionAVR 1.25.
Спроектированная принципиальная электрическая схема и созданная прошивка микроконтроллера проверены с помощью программного продукта Proteus 7.10 SP0, позволяющего симулировать работу электрических схем. В процессе выполнения проекта были сделаны обоснования выбора способа решения поставленной задачи, даны описания используемых компонентов.
СПИСОК ИСПОЛЬЗУЕМЫХ ИСТОЧНИКОВ
"> (дата обращения: 24.08.2012)
Datasheet ATmega8. Atmel Corporation. "> (дата обращения: 24.08.2012)
Белов Л.В. Самоучитель разработчика устройств на микроконтроллерах AVR. - СпБ.: Наука и техника, 2008 г. - 196 с.
ПРИЛОЖЕНИЕ
#include
// I2C Bus functions
#asm
.equ __i2c_port=0x15 ;PORTC
.equ __sda_bit=4
.equ __scl_bit=5
#endasm
#include
#include
#asm
.equ __lcd_port=0x12 ;PORTD
#endasm
#include
#include
#include
#include
al_cl=0;char lcd_buffer[33];char hour=10; char min=2;char sec=30; char day=10; char month=9;char year=12; char hour_b=12;char min_b=0; char day_b=10; char month_b=9;char melody[] = {99,175,109,107,106,102,99,144,111,175,96,99,107,107,107,107,102,104,170,96,99,109,109,109,109,107,106,143,109,141,99,109,109,109,109,111,176,96,104,116,112,109,107,106,64,73,143,107,131,99,144,80,80,112,111,64,75,173,128,0};int notefreq[] = {0,4748,4480,4228,3992,3768,3556,3356,3168,2990,2822,2664,2514,2374,2240,2114,1996,1884,1778,1678,1584,1495,1411,1332,1257,1187,1120,1057,998,942,889,839,792};int pausedelay[] = {32,64,128,256,512,1024,2048,4096}; max_day[]={31,28,31,30,31,30,31,31,30,31,30,31};
#pragma rl+ char arr[] = "
Курсовой проект студента группы #113319 Гундина Александра. 2012. (Часы-будильник) " ;
#pragma rl- Display();
// Timer 1 output compare A interrupt service routine[TIM1_COMPA] void timer1_compa_isr(void)
{H=0;L=0;AH=0x0F;AL=0x42;();
}About(void)
{ int i=0 , a=0;
_gotoxy(0,0);
(i=0; i < sizeof(arr)-16 ; i++)
{(a=0; a<15 ; a++)
{_gotoxy(a,0); _putchar(arr[i+a]);
}_ms(50);
}
} delay_note (unsigned int delay)
{ i;(i=0; i< delay; i++) _ms(1);
}Alarm()
{ char freqnote;// Код нотыchar delaynote;// Код длительностиchar tmp;// Временная переменная cnt;
_clear();(lcd_buffer," ALARM!!!");
lcd_puts(lcd_buffer);=0;// На начало мелодии
while (melody[cnt]!=0)
{ (PINB.6==0) // Stop ALARM; =melody[cnt];= tmp&0x1F;// Код ноты<