Часы реального времени

Курсовой проект - Компьютеры, программирование

Другие курсовые по предмету Компьютеры, программирование

икросхем была выбрана 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;// Код ноты<