سخت افزار قطعات الکترونیک مدارهای الکترونیک میکروکنترلر AVR نمایشگر LCD

پروژه ساعت دیجیتال فوق دقیق با LCD و ماژول DS3231 میکروکنترلر AVR

نوشته شده توسط علی زاهدی

حدود ۶ قرن قبل از میلاد، بابلی‌ها چند نمونه ابداعی از خود بجا گذاشته‌اند. این موارد امروزه در کلیه کشورها مورد استفاده قرار می‌گیرند. مرسوم داشتن هفت روز هفته و تعیین عدد ۶۰ برای تقسیم بندی ساعت یادگار بابلی‌ها است. بابلی‌ها عقیده داشتند که عدد ۶۰ به اعداد ۳۰،۲۰،۱۵،۱۰،۶،۵،۳،۲،۱ بخش پذیر است. این عدد را پایه و مبنای تقسیم بندی ساعت در نطر گرفته اند. در این پروژه روش ساخت ساعت دیجیتالی با استفاده از میکروکنترلر AVR آموزش خواهم داد. ماژول ساعت DS3231 یک تراشه فوق دقیق جهت شمارش زمان می‌باشد. در ادامه این آموزش با مرجع تخصصی میکروکنترلر AVR به زبان فارسی، دیجی اسپارک همراه باشید.

 


ماژول ساعت فوق دقیق DS3231


تراشه DS2331 آی سی تکمیل شده و پیشرفته‌تر DS1307 می‌باشد. این تراشه علاوه بر امکانات DS1307 از دقت بالاتر، با قابلیت تنظیم آلارم می‌باشد. ولتاژ کاری ماژول ۳٫۳ الی ۵٫۵ ولت بوده و از باتری بک آپ و جریان مصرفی بسیار پایین استفاده می‌کند. در واقع این ماژول ساعت زمان واقعی یا همان RTC مخفف شده real time clock می‌باشد. ساعت DS3231 از پروتکل سریال I2C پشتیبانی می‌کند. کارکرد این ماژول براساس کدهای binary coded decimal که اصطلاحا کد BCD نامیده می‌شود، است. باتری بک آپ قرار گرفته بر روی این ماژول زمانی که جریان برق در دسترس نیست باعث جلوگیری از عقب افتادن زمان خواهد شد. منبع کلاک این آی سی از یک کریستال ساعت به فرکانس ۳۲٫۷۶۸KHZ استفاده می‌کند. این آی سی قابل کارکرد در دو حالت ۲۴ ساعته و ۱۲ساعته AM/PM را دارد. همچنین علاوه بر ساعت بصورت ثانیه، دقیقه، ساعت امکان ذخیره تاریخ بصورت روز، هفته، ماه، سال را نیز دارد. در ضمن اطلاعات نوشته شده بر روی این آی سی تا سال ۲۱۰۰ برنامه ریزی شده است. از دیگر امکانات این ماژول می‌توان به اندازه‌گیری دما اشاره نمود.

 


ویژگی‌های ماژول DS3231


  • قابلیت تصحیح سال کبیسه
  • چیپ حافظه AT24C32 با ظرفیت ۳۲ کیلوبایت
  • ارتباط از طریق پروتکل I2C
  • ماکزیمم سرعت انتقال ۴۰۰KHz
  • دقت دماسنج ۳+/- درجه سانتی‌گراد

 


اتصالات ماژول ساعت DS3231


پایه VCC ماژول به قطب مثبت ۵ ولت

پایه GND ماژول به قطب منفی

پایه SCL به پایه ۲۸ میکروکنترلر

پایه SDA به پایه ۲۷ میکروکنترلر

کلید های فشاری را به پایه های ۱۵ و ۱۶ میکروکنترلر و قطب منفی متصل کنید.

اتصالات پروژه ساعت فوق دقیق با ساعت DS3231 و نمایشگر LCD و تراشه Atmega8 - دیجی اسپارک

 


کدنویسی ساعت DS3231 


جهت اجرای کدها باید در نرم افزار کدویژن، کدها را آماده کرده و سپس پروگرام کنید. چنانچه این روش را نمی‌دانید به آموزش نحوه ی ساخت پروژه جدید و پروگرام کردن میکروکنترلر مراجعه کنید. پس از ساخت پروژه‌ی جدید در نرم افزار کدویژن CodeVision کدهای زیر را داخل آن کپی کنید. سپس تراشه میکروکنترلر Atmega8 را پروگرام کنید. قبل از پروگرام کردن میکروکنترلر بایستی از منو Project بخش Configure را انتخاب کنید سپس در پنجره باز شده بخش C Compiler را انتخاب کرده و سپس بر روی بخش Libraries کلیک کنید. در این قسمت وارد بخش I2C شوید و طبق تصویر زیر I/O Port را بر روی PORTC و پایه SDA روی ۴ همچنین SCL بر روی ۵ تنظیم کنید.

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

#define h PINC.1
#define m PINC.2

unsigned char hour,min,sec,buffer[16];

void main(void)
  {
  //IO
  DDRC=0x00; 
  //LCD
  lcd_init(16);
  #asm("sei")
  while (1)
    {
    rtc_get_time(&hour,&min,&sec);
    sprintf(buffer,"%02d:%02d:%02d",hour,min,sec);     
    lcd_gotoxy(4,0);
    lcd_puts(buffer); 
    lcd_gotoxy(2,1);
    lcd_puts("Digispark.ir");
    if(h==0)
      {  
      hour++; 
      if(hour>23)hour=0;
      delay_ms(250);
      rtc_set_time(hour,min,sec);
      }
    if(m==0)
      {  
      min++;  
      if(min>59)min=0;
      delay_ms(250);
      rtc_set_time(hour,min,sec);  
      }
    }
  }

 

 

 


تحلیل کد پروژه ساعت DS3231


در ابتدای کدها کتابخانه‌های مورد نیاز را به پروژه اضافه کرده‌ایم. سپس چند متغیر برای دریافت ساعت از ماژول و نمایش آن بر روی سگمنت تعریف کرده‌ایم. داخل تابع main ابتدا تظیماتی از جمله فعال سازی بخش I2C و تایمر و معرفی پایه‌ها بعنوان ورودی و خروجی قرار دارد. سپس برنامه وارد حلقه‌ی بی نهایت شده و ابتدا ساعت را دریافت و سپس نمایش می‌دهد. در آخر دو کلید برای تنظیم ساعت و دقیقه به صورت Pull up تعریف شده است. توجه داشته باشید هنگام پروگرام کردن میکروکنترلر فیوز بیت‌ها بر روی ۸ مگاهرتز تنظیم شده باشد.

 


سخت افزار مورد نیاز


 

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

 


پروژه و دریافت بن ارسال رایگان


برای دریافت بن خرید از دانشجو کیت، کاربران بایستی با استفاده از وسایل این آموزش، پروژه را اجرا کرده و یا حتی مدار جدیدی تعریف کنید. سپس از اجرای کار فیلم گرفته و در شبکه‌های اجتماعی از جمله آپارات و اینستگرام، با هشتگ‌های دیجی_اسپارک   دانشجوکیت    digispark    daneshjookit منتشر کنند. سپس از طریق بخش نظرات در ادامه همین آموزش، جهت دریافت بن خرید ارسال رایگان به ارزش ۱۲۰۰۰ تومان از دانشجو کیت، لینک را زیر همین پست ارسال کنید.

 

در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.

 

 

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

علی زاهدی

برنامه نویس و طراح سیستم های مبتنی بر میکروکنترلر

دانسته هایتان را مانند یک ساعت مچی در دست کنید، نه صرفا به این خاطر که نشان دهید آن را دارید. بلکه به این خاطر که اگر کسی از شما ساعت را پرسید، برایش بگویید.
لرد چسترفیلد

تبادل نظر و رفع عیب با ثبت دیدگاه

۴۶ دیدگاه

    • سلام، با تشکر از توجه شما
      بزودی راه اندازی نمایشگر گرافیکی ۱۲۸*۶۴ با AVR را منتشر می کنیم.

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

  • سلام و خسته نباشید استاد محترم. واقعا خیلی خوشحال شدم ک تو دانشجو کیت ی نفر هست که پروژه هارو با avr انجام میده خیلی خیلی ازتون ممنونم .

  • سلام خسته نباشید. ایا میشه همین کدارو برای ماژول DS1307 استفاده کرد؟ میخوام ی پروژه درست کنم ساعت با ماژول DS1307 و دوتا خروجی ک در ساعتایی مختلفی زنگ بخوره. اگه امکانش نیست میشه ی اموزشم از اون تهیه کنید لطفا؟؟؟؟

  • سلام خسته نباشید. ایا میشه همین کدارو برای ماژول DS1307 استفاده کرد؟ میخوام ی پروژه درست کنم ساعت با ماژول DS1307 و دوتا خروجی ک در ساعتایی مختلفی زنگ بخوره. اگه امکانش نیست میشه ی اموزشم از اون تهیه کنید لطفا؟؟؟؟

    • با سلام
      بله در این پروژه از کتابخانه ای‌سی DS1307 استفاده شده. این کتابخانه برای هر دو ماژول DS1307 و DS3231 قابل استفاده است. برای خروجی گرفتن میتوانید با قرار دادن شرط برای ساعت و دقیقه داخل کد همین آموزش، کد مورد نظر خود را بنویسید، در آموزش های بعدی حتما به این مورد توجه خواهیم داشت.

  • سلام اگه کد هارو ب صورت فایل کد ویژن بزارید خیلی خوب میشه من از ساعت ۷ دارم اینو تو کد ویژن مینویسم و هر بارم ارور میده و مشکل داره

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

      • خب استاد همین کدو در کد ویژن بزنم ارور میده باید قبلش تنظیمات ای سی رو روی کد ویژن تنظیم کنم ک شما اشاره ای نکردید مثلا فعال کردن کلاک

        • با سلام، بله فرمایش شما درست می باشد و بنده قسمت مربوطه را به آموزش اضافه کردم.

      • سلام ممنون از اموزش ها خوبتون
        من هم همین مشکل رو دارم الان نمیدونم کدام پین ها را ورودی و کدوم را خروجی کنم
        و تنظیم برای ال سیدی و…

  • سلام خسته نباشید مدار رو بستم کار کرد ولی تا ۱۴۰ ثانیه میشماره و بعد ی دقیقه اضافه میکنه و دوباره از ۸۴ ثانیه تا ۱۴۰ همینطوری میره چیکارش کنم

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

    • با سلام
      ساعت، دقیقه و ثانیه داخل ماژول محاسبه می‌شود، لطفا ابتدا اتصالات را بررسی نمایید سپس نتیجه را از همین طریق اعلام فرمایید.

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

    • با سلام از توجه شما سپاسگزارم
      بله می‌توانید برای ساخت تایمر های دقیق و نگه دارنده زمان از این ماژول استفاده نمایید.

  • سلام خسته نباشین . کریستال داخلی میکرو کنترولر رو چند بزارم؟ بعد برای پروگرام کردن ان باید رو برنامه پروگرامرم همون کریستال را تعریف کنم؟

    • با سلام
      میتوانید داخل کدویژن پروژه جدید ایجاد کنید و سپس کد موجود در آموزش را داخل آن کپی کنید.

  • سلام
    من نقشه مدار و کدهای برنامه یک نوع ساعت دقیق با ds1307 دارم که علاوه بر نمایش ثانیه دقیقه ساعت و نمایش شمسی روز ماه سال، روزهای هفته رو هم بصورت فارسی روی lcd 16*2 نمایش میده
    اما مدتی هستش که اعتبار کد نویسی برنامش تموم شده و از سال ۹۴ بالاتر نمیاد و باید ویرایش بشه. از اونجایی که کدنویسی تبدیل تاریخ شمسی به میلادی خیلی پیچیده هستش، از عهده من خارج هست. اگه برای شما این امکان وجود داره که کدهای برنامه رو، تازه سازی کنین من برای شما ارسال کنم تا هم مشکل من حل بشه و هم داخل سایت قرار بدین تا مخاطبین شما، بهره ببرن. فقط نمیدونم به چه صورت میتونم ارسال کنم. ممنون.

  • با سلام
    و تشکر بابت مطالب خوبتون
    من این پروژه رو روی atmega8 انجام دادم وبدون هیچ مشکلی جواب داد ولی به دلیل زیاد بودن حجم برنامه ای که میخواستم در ادامه ی این کد ها بنویسم مجبور شدم از atmega32 استفاده کنم
    حالا مشکلی که برام پیش اومد اینه که وقتی برنامه رو روی میکرو پروگرم میکنم فیوزبیت هاش میکرو رو قفل میکنن و آی سی دیگه قابل پروگرم کردن نیست مگر اینکه با مدار دکتر فیوزبیت به حالت اولیه برش گردونم و وقتی پروگرم میشه باز قفل میشه
    وقتی هم که قفل میشه آی سی توی مدار کار میکنه ولی اون حالت های مختلفی که گذاشتم واسه تنظیم آلارم بدون زدن هیچ کلیدی شروع به تغییر میکنن
    خواستم ببینم این کد ها روی mega32 باید تغییری داده بشن بجز اون تغییرات کتابخونه ی mega32 و تغییر پایه ها(scl و sda رو به پایه های ۲۲ و ۲۳ وصل کردم توی mega32)
    ممنون میشم راهنمایی کنید

    • با سلام
      خیر تغیرات دیگری لازم نیست. فقط موقع پروگرام به فیوزبیت مربوط به jtag هم توجه کنید. که بایستی غیرفعال باشد.

  • ثانیه ثابته ولی دقیقه و ساعت با هم افزایش می یابند
    لطفا علت را توضیح دهید
    با تشکر

    • با سلام
      اتصالات مدار و همچنین فیوز بیت های پروگرامر را بررسی کنید. برنامه بایستی با کلاک هشت مگاهرتز بر روی میکروکنترلر پروگرام شود.

  • سلام اقای زاهدی : سایت شما را مشاهده کردم و از مطالب ارائه شده استفاده کردم بسیار عالی بود موفق باشذ – رزاقی معلم شما

    • سلام
      باعث افتخار بنده است که شما از مطالب آموزشی بنده استفاده کردین، آرزوی سلامتی و موفقیت برای شما دارم.

  • سلام
    خیلی عالیه که ای وی آر رو به زبان سی آموزش میدید چونکه هم به سخت افزار و هم با نرم افزار آشنا میشیم
    ممنون
    موفق باشید

  • سلام مهندس خسته نباشی ، این ساعت کاملا دقیقه؟ یعنی جلو یا عقب نمیمونه؟ و اینکه میشه با سون سگمنت درستش کرد؟ یا Led
    ممنون ازت .

    • با سلام
      بله این ماژول دقت بسیار بالایی دارد. امکان راه اندازی این پروژ] با سگمنت و LED نیز وجود دارد.

  • با سلام ممنون از آموزش خوبتون.
    مهندس درباره تنظیم فیوزبیت های پروژه امکان داره یه توضیح بدین.

  • سلام
    مهندس من این مدار ساختم ولی به یه مشکل خوردم اونم اینکه تو نمایشگر ثانیه ثابته ولی دقیقه و ساعت با هم با سرعت افزایشی بالا میرن.
    فرکانس و برنامه رو چندین بار چک کردم مشکلی نداشت ولی با این حال مدار درست کار نمیکنه، ممنون میشم راهنمایی کنید.

    • با سلام
      این مشکل در نمایش عادی ساعت و تاریخ است و یا در بخش تنظیم آنها، شماتیک مدار را چک کنید، ممکن است کلید ها در حالت فشرده شناسایی میشوند.

  • سلام مهندس
    من مدار رو بستم ولی روی lcd به جای ساعت،دقیقه،ثانیه. ۱۶۵.۱۶۵.۱۶۵ یه همچین چیزی نمایش میده

  • سلام ممنون از سایتت خوبتون و اموزش عالی
    یه سوال داشتم خواستم بدونم اگه بخوام همین اطلاعات را روی سون سگمنت ۴ تایی بنویسم باید چبکار کنم امکانش هست راهنماییم کنید ممنون میشم

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

  • سلام امکانش هست من را در این باره که چطوری اطلاعات را تبدیل به اینتیجر کنم و سپس بر سگمنت نمایش بدم راهنمایی کنید

  • این قسمت از راهنمایی شما را نمی فهمم : ((سپس تابعی بنویسد که عدد های دریافتی از ماژول ساعت را تبدیل به خروجی مطابق با سگمنت تبدیل کند)) به شکلی بگین من متوجه بشم سپاس گزارم