راه اندازی جامع ماژول ساعت DS1307 با میکروکنترلر AVR

راه اندازی جامع ماژول ساعت DS1307 با میکروکنترلر AVR

سلام، امیدوارم روز خوبی رو گذرونده باشی. اگ اینجایی احتمالا توی راه اندازی ماژول ساعت DS1307 به مشکل خوردی و هنوز باهاش آشنایی کامل پیدا نکردی.

میخوایم با هم تمامی بخش های این ماژول خفن رو برسی کنیم. و نکاتش رو بگم که اگ رعایت کنی قطعا نتیجه رو میگیری و دیگ مشکلی با این ماژول نداری.

همچنین میخوام ی تابعی رو در ادامه برات بذارم که خیلی راحت میتونی باهاش تاریخ میلادی رو به شمسی تبدیل کنی. و پروژه هات رو خفن تر اجرا کنی تا کاربردی تر باشه!!!

چرا ماژول ساعت؟

جهت ساخت یک ساعت دیجیتال دقیق می توان از RTC داخلی میکروکنترلر استفاده کرد. ولی مشکلی اساسی در این است که با قطع شدن تغذیه مدار یا ریست شدن میکروکنترلر، ساعت خاموش خواهد شد.

اگر بخواهیم یک میکرو را به صورت همیشه روشن نگه داریم نیاز به باتری نیز خواهیم داشت و مشکل آنجا جدی می شود که با توجه به مصرف میکرو این باتری باید توان بالا و ظرفیت ذخیره زیاد  نیز داشته باشد .ماژول ساعت DS1307

 

در این موارد که ما نیاز به ساعت دقیق داریم می توان از IC هایی مانند DS1307 استفاده کرد که علاوه بر ساعت دارای تقویم نیز می باشد و ورودی برای باتری بک آپ دارند که می تواند با یک باتری ۳ ولت سکه ای به مدت ۱۰ سال کار کند .  

 

اصل این ماژول بر پایه آیسی ساعت DS1307 هست. که استفاده ازش رو ساده کرده و در صورت تمایل میتونید از خود آیسی استفاده کنید. و مدار زیر رو ببندید، ماژول DS1307 یسری قابلیت بیشتر داره، مثل راه اندازی سنسور دما که شاید بعضی از مدارات به دردتون بخوره. ولی خب اصل کاربردش ، ساعت و تاریخ هست که با آیسی هم میشه انجام داد.

مدار DS1307

مدار مورد نیاز برای این مقاله

با ۴ تا از پایه های اصلی ماژول کار داریم و مابقی رو به جایی متصل نکنید!!!

  1. پایه Vcc به ۵ ولت مدار متصل بشه
  2. پایه Gnd به زمین یا منفی مدار متصل بشه
  3. پایه SCL به یکی از پایه های میکرو
  4. پایه SDA به یک پایه دیگر از میکرو

نکته: هر دو پایه متصل شده به میکرو باید از یک پورت باشد!!!

مدار DS1307 با avr

خب سخت افزار تکمیل هست و فقط باتری ماژول رو فراموش نکنید نصب کنید که ساعت و تاریخی که تنظیم میکنیم، زمان قطع برق مدار، ساعت و تاریخ رو حفظ کنه و از بین نره.

تنظیمات کدویزارد:

حالا وارد کدویژن بشید و از قسمت کدویزارد تنظیمات زیر رو انجام بدید.

تنظیمات کدویزارد

ابتدا تمامی تنظیمات اعم از میکرو و کلاک و دیگر تنظیمات پروژتون رو انجام بدید و در آخر به این قسمت برید.

  1. وارد تنظیمات پروتکل I2C شوید.
  2. پورت متصل به ماژول رو انتخاب کنید.
  3. پایه های SCL و SDA متصل شده به ماژول رو انتخاب کنید. (شماره پورت میکرو)
  4. مرحله آخر ماژول DS1307 رو پیدا کنید و فعالش کنید.

مابقی تنظیمات رو تغییر ندید و به حالت پیش فرض بذارید بمونه.

پس از انجام تنظیمات به جزئیات کد نویسی میپزدازیم، حتما مطمئن بشید که کتابخانه (#include <ds1307.h>) اول برنامه نوشته شده باشد.

نکته بعدی، باید قبل از حلقه اصلی برنامه یعنی WHILE (1) حتما پروتکل I2C و تابع RTC فراخوانی شده باشند.

کد نویسی

توابع ماژول ساعت DS1307

rtc_init (0,0,0); RTC راه اندازی کتابخانه
rtc_get_time (ثانیه, دقیقه, ساعت); دریافت ساعت
rtc_set_time(ثانیه, دقیقه, ساعت); تنظیم ساعت
rtc_get_date(سال, ماه, روز, روز هفته); دریافت تاریخ و روز هفته
rtc_set_date(سال, ماه, روز, روز هفته); تنظیم تاریخ و روز هفته

 

نمایش ساعت

برای راه اندازی ساعت ابتدا توسط تابع (rtc_set_time) ساعت رو تنظیم میکنیم و پس از یکبار اجرا توسط میکرو کد را حذف میکنیم که دیگ تنظیممون بهم نخوره.

حالا کافیه با استفاده از تابع (rtc_get_time) زمان رو دریافت کنید و در متغییر ذخیره کنید و نمایش بدید و استفاده کنید، مانند کد زیر بر روی LCD ساعت و دقیقه و ثانیه رو نمایش میدیم.

#include <mega8.h>
#include <i2c.h>
#include <ds1307.h>
#include <alcd.h>
#include <delay.h>
#include <stdio.h>

char h=0,m=0,s=0;

i2c_init();
rtc_init(0,0,0);
lcd_init(16);

while (1)
{
rtc_get_time(&h,&m,&s);
lcd_clear();
lcd_gotoxy(0,0);
sprintf(buffer,%d:%d:%d" ,h,m,s);
lcd_puts(buffer);
delay_ms(20);
}

 

نمایش تاریخ میلادی و روز هفته

برای راه اندازی تاریخ ابتدا توسط تابع (rtc_set_date) تاریخ و روز هفته را تنظیم میکنیم و پس از یکبار اجرا توسط میکرو کد را حذف میکنیم که دیگ تنظیممون بهم نخوره.

حالا کافیه با استفاده از تابع (rtc_get_date) تاریخ رو دریافت کنید و در متغییر ذخیره کنید و نمایش بدید و استفاده کنید، مانند کد زیر بر روی LCD سال و ماه و روز و روز هفته رو نمایش میدیم.

#include <mega8.h>
#include <i2c.h>
#include <ds1307.h>
#include <alcd.h>
#include <delay.h>
#include <stdio.h>

char w , d, mo, y;

i2c_init();
rtc_init(0,0,0);
lcd_init(16);

while (1)
{
rtc_get_date(&w,&d,&mo,&y);
lcd_clear();
lcd_gotoxy(0,0);
sprintf(buffer,%d/%d/%d - %d",y+2000,mo,d,w);
lcd_puts(buffer);
delay_ms(20);
}

 

نمایش تاریخ شمسی

برای اینکه تاریخ میلادی به شمسی تبدیل بشه، از تابع زیر استفاده میکنیم.

flash unsigned char mi_table[6][12]={ //تابعي اعداد براي تبديل ميلادي به شمسي
{20,19,19,19,20,20,21,21,21,21,20,20},
{10,11,10,12,11,11,10,10,10,9,10,10},
{19,18,20,20,21,21,22,22,22,22,21,21},
{11,12,10,11,10,10,9,9,9,8,9,9},
{20,19,20,20,21,21,22,22,22,22,21,21},
{10,11,9,11,10,10,9,9,9,8,9,9}};

 

void MI_TO_SH(unsigned int ym,unsigned char mm,unsigned char dm)
{ //تابع تبديل سال و ماه و روز ميلادي به شمسي
unsigned int k,t1,t2;
//ym=(0x000f &amp;amp; ym);
k=ym%4;
if(k==3) k=2;
k*=2;
t1=mi_table[k][mm-1];
t2=mi_table[k+1][mm-1];
if(mm&amp;lt;3 || (mm==3 &amp;amp;&amp;amp; dm&amp;lt;=mi_table[k][mm-1])) y=ym + 78;
else y=ym + 79;
if(dm&amp;lt;=t1)
        { //تبديل روز و ماه
        d=dm+t2;
        mo=(mm+8)%12+1;
        }
else
        {
        d=dm-t1;
        mo=(mm+9)%12+1;
        }
}

پس از اضافه کردن متغییر (flash unsigned char mi_table) به ابتدا برنامه و تابع (void MI_TO_SH) به قبل از تابع اصلی main برنامه، میتوانید در هر جای کدتون ازش استفاده کنید.

به کد زیر توجه کنید، دقیقا مانند تاریخ میلادی عمل میکنیم و فقط پس از دریافت تاریخ توسط تابع (rtc_get_date) مقادیر رو به تابع جدید میدیم تا تبدیل کنه و پس از اون مقدار های جدید رو نمایش میدیم.

#include <mega8.h>
#include <i2c.h>
#include <ds1307.h>
#include <alcd.h>
#include <delay.h>
#include <stdio.h>

char w , d, mo, y;

i2c_init();
rtc_init(0,0,0);
lcd_init(16);

while (1)
{
rtc_get_date(&w,&d,&mo,&y);
MI_TO_SH(y,mo,d);
lcd_clear();
lcd_gotoxy(0,0);
sprintf(buffer,%d/%d/%d - %d",y+1300,mo,d,w);
lcd_puts(buffer);
delay_ms(20);
}

 

نکته: تاریخ در ماژول ساعت به صورت ۲ رقمی هست. یعنی برای سال میلادی باید از ۲۱ استفاده کنید (۲۰۲۱) و برای تاریخ شمس از ۱۰۰ (۱۴۰۰). اگر توجه کرده باشید تاریخ میلادی ۲۰۰۰ و تاریخ شمسی ۱۳۰۰ کمتره پس این رو هنگام نمایش میتونید اضافه کنید.

دوباره به کد ها بالا دقت کنید تا بهتر این موضوع رو متوجه بشید

 

راه اندازی جامع ماژول ساعت DS1307 با میکروکنترلر AVR

تمامی بخش های راه اندازی ماژول ساعت DS1307 رو با هم برسی کردیم و امیدوارم براتون مفید و کاربردی باشه، اگر در هر قسمت مشکلی داشتید و یا سوالی بود حتما در قسمت دیدگاه ها بنویسید تا سریع جواب بدم، نظرات و توجهتون به مطالب باعث انگیزه ما میشه 🙂

میلاد نیک پندار

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *