Пример работы с часами реального времени DS1307 на AVR

Нашёл у себя на компьютере экспериментальный проектик на часах DS1307. Сам проект не планировалось собирать, а делался чисто для проверки… поэтому здесь нет никаких наворотов, а просто микроконтроллер+дисплей nokia 3310 + 4 кнопки. Собственно вот схема в Proteus.DS1307+ATMEGA8

На схеме нет кварца — к меге 16мгц, а к часикам часовой кварц желательно с канденсаторами по 22пф. Вообщем чтоб небыло неясностей привожу схему со всеми элементами( схема выше — чисто для симулятора).

DS1307+ATMEGA8_rewrite

 

Фьюзы — нужно настроить на внешний кварц.

Не забудьте про батарейку для часов.

Исходник написан в CVAVR:

Chip type               : ATmega8
Program type            : Application
AVR Core Clock frequency: 16,000000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 256
*****************************************************/

#include <mega8.h>
#include <delay.h>
#include <stdio.h>
#include <stdlib.h> // библиотека преобразоания чисел в символьную строку
#include <ctype.h> // библиотека преобразования символов в число
#include <string.h> //библиотека работы со строками
#include "NokiaLCD.h"
#include "lcd_3310.c"
// I2C Bus functions
#asm
.equ __i2c_port=0x15 ;PORTC
.equ __sda_bit=4
.equ __scl_bit=5
#endasm
#include <i2c.h>

// DS1307 Real Time Clock functions
#include <ds1307.h>
#define btn_m PIND.0
#define btn_minus PIND.2
#define btn_plus PIND.1
#define btn_b PIND.3
unsigned char buff [99];  //буфер дисплея
unsigned char hour,minut,sek; //часы, минуты, секунды
unsigned char m,h,s; //часы, минуты, секунды
unsigned char day,month,year; //день, месяц, год
unsigned char d,mo,y; //день, месяц, год
unsigned char flag,menu;

void read_time()
{
rtc_get_time(&hour,&minut,&sek); //считать время
h=hour;
m=minut;
s=sek;
}

void read_date()
{
rtc_get_date(&day,&month,&year); //считать дату
d=day;
mo=month;
y=year;
}

void btn()
{
if(btn_m==0&&menu==0){menu=1;ClearLcd();}
if(menu==1){if(btn_m!=0){menu=2;ClearLcd();}}
if(btn_m==0&&menu!=0&&menu!=1){delay_ms(100);menu++;flag=0;ClearLcd();}
if(btn_b==0&&menu!=0&&menu!=1){delay_ms(100);menu--;flag=0;ClearLcd();}
if(menu>=8){menu=0;}

if(menu==2)
{
if(flag==0){ read_time(); flag=1;}
if(btn_plus==0){delay_ms(100);hour++;}
if(btn_minus==0){delay_ms(100);hour--;}
}
if(menu==3)
{
if(flag==0){ read_time(); flag=1;}
if(btn_plus==0){delay_ms(100);minut++;}
if(btn_minus==0){delay_ms(100);minut--;}
}
if(menu==4)
{
if(flag==0){ read_time(); flag=1;}
if(btn_plus==0){delay_ms(100);sek++;}
if(btn_minus==0){delay_ms(100);sek--;}

}
if(hour>=24){hour=0;}
if(minut<1){minut=59;hour--;}
if(minut>=60){minut=0;hour++;}
if(sek<1){sek=59;minut--;}
if(sek>=60){sek=0;minut++;}
if(menu>1){  rtc_set_time(hour,minut,sek);} //установить время: часы, минуты, секунды

if(menu==5)
{
if(flag==0){ read_date(); flag=1;}
if(btn_plus==0){delay_ms(100);day++;}
if(btn_minus==0){delay_ms(100);day--;}
}
if(menu==6)
{
if(flag==0){ read_date(); flag=1;}
if(btn_plus==0){delay_ms(100);month++;}
if(btn_minus==0){delay_ms(100);month--;}
}
if(menu==7)
{
if(flag==0){ read_date(); flag=1;}
if(btn_plus==0){delay_ms(100);year++;}
if(btn_minus==0){delay_ms(100);year--;}
}
if(day>=32){day=1;month++;}
if(day<1){day=31;month--;}
if(month>=13){month=1;year++;}
if(month<1){month=12;year--;}
if(year>=255){year=0;}
if(menu>1){ rtc_set_date(day,month,year);} //установить date
}

void lcd()
{
if(menu==0)
{
LcdPutLine("Сегодня:", 2, 1);   // вывели текст
sprintf( buff,"%i.%i.%i г  ", d,mo,y+2000 );
LcdPutLine(buff, 2, 2);
LcdPutLine("Время:", 2, 3);   // вывели текст
sprintf( buff,"%i:%i%i:%i%i  ", h,m/10,m%10,s/10,s%10 );
LcdPutLine(buff, 2, 4);
}
if(menu==1)
{

LcdPutLine("    Режим", 2, 3);   // вывели текст
LcdPutLine("   Настроек", 2, 4);   // вывели текст
delay_ms(500);
}
if(menu==2)
{
LcdPutLine("Сегодня:", 2, 1);   // вывели текст
sprintf( buff,"%i.%i.%i г  ", d,mo,y+2000 );
LcdPutLine(buff, 2, 2);
LcdPutLine("Время:", 2, 3);   // вывели текст
sprintf( buff,"%i<%i%i:%i%i ", h,m/10,m%10,s/10,s%10 );
LcdPutLine(buff, 2, 4);
}
if(menu==3)
{
LcdPutLine("Сегодня:", 2, 1);   // вывели текст
sprintf( buff,"%i.%i.%i г  ", d,mo,y+2000 );
LcdPutLine(buff, 2, 2);
LcdPutLine("Время:", 2, 3);   // вывели текст
sprintf( buff,"%i:%i%i<%i%i ", h,m/10,m%10,s/10,s%10 );
LcdPutLine(buff, 2, 4);
}
if(menu==4)
{
LcdPutLine("Сегодня:", 2, 1);   // вывели текст
sprintf( buff,"%i.%i.%i г  ", d,mo,y+2000 );
LcdPutLine(buff, 2, 2);
LcdPutLine("Время:", 2, 3);   // вывели текст
sprintf( buff,"%i:%i%i:%i%i< ", h,m/10,m%10,s/10,s%10 );
LcdPutLine(buff, 2, 4);
}
if(menu==5)
{
LcdPutLine("Сегодня:", 2, 1);   // вывели текст
sprintf( buff,"%i<%i.%i г  ", d,mo,y+2000 );
LcdPutLine(buff, 2, 2);
LcdPutLine("Время:", 2, 3);   // вывели текст
sprintf( buff,"%i:%i%i:%i%i ", h,m/10,m%10,s/10,s%10 );
LcdPutLine(buff, 2, 4);
}
if(menu==6)
{
LcdPutLine("Сегодня:", 2, 1);   // вывели текст
sprintf( buff,"%i.%i<%i г  ", d,mo,y+2000 );
LcdPutLine(buff, 2, 2);
LcdPutLine("Время:", 2, 3);   // вывели текст
sprintf( buff,"%i:%i%i:%i%i ", h,m/10,m%10,s/10,s%10 );
LcdPutLine(buff, 2, 4);
}
if(menu==7)
{
LcdPutLine("Сегодня:", 2, 1);   // вывели текст
sprintf( buff,"%i.%i.%i<  ", d,mo,y+2000 );
LcdPutLine(buff, 2, 2);
LcdPutLine("Время:", 2, 3);   // вывели текст
sprintf( buff,"%i:%i%i:%i%i ", h,m/10,m%10,s/10,s%10 );
LcdPutLine(buff, 2, 4);
}
}

void main(void)
{
// Port B initialization
PORTB=0x00;
DDRB=0x3F;
// Port C initialization
PORTC=0x70;
DDRC=0x00;
// Port D initialization
PORTD=0x00;
DDRD=0xF0;
PORTD.0=1;
PORTD.1=1;
PORTD.2=1;
PORTD.3=1;
// I2C Bus initialization
i2c_init();

// DS1307 Real Time Clock initialization
// Square wave output on pin SQW/OUT: Off
// SQW/OUT pin state: 0
rtc_init(0,0,0);

LcdInit();
ClearLcd();
LcdContrast (40);
while (1)
{
read_time();
read_date();
lcd();
btn();

}
}

При включени сразуже отображается дата и время. Если нажать кнопку «MENU» то на экране кратковременно появится надпись «Режим настроек» — после этого на дисплее появится стрелка указывающая на изменяемый параметр. Навигация осуществляется той же кнопкой + кнопка «DOWN» для возврата на предыдущий параметр.

Думаю в пояснении схема больше не нуждается, если что то не понятно спрашивайте на форуме или в коментариях.

ВНИМАНИЕ!

Если у вас не работают часы — проверьте питание! — оно должно быть не менее 4,5В! При меньшем напряжении микросхема работает нестабильно, а то и вообще никак!

Скачать проект Часы DS1307 Скачали 5757 раз

 

Добавить комментарий для Артём Виниченко Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *