ساعت +تقویم شمسی+دماسنج با ایسیDs1307وatmega8

در اين بخش مي‌توانيد طرح آماده و کامل شده مرتبط با میکروکنترلرهای AVR را مشاهده بفرمایید

مدیران انجمن: SAMAN, sinaset, شوراي نظارت

ارسال پست
Colonel II
Colonel II
نمایه کاربر
پست: 7008
تاریخ عضویت: سه شنبه 26 آذر 1387, 4:20 pm
سپاس‌های ارسالی: 9184 بار
سپاس‌های دریافتی: 21045 بار
تماس:

ساعت +تقویم شمسی+دماسنج با ایسیDs1307وatmega8

پست توسط sinaset » دو شنبه 10 اسفند 1394, 11:21 am

بنام خداوند بخشنده مهربان
باسلام

ساعت +تقویم شمسی+دماسنج با ایسیDs1307وatmega8
 تصویر  این پروژه جالب که اینجاب انجام داده ام. یک ساعت به کمک ایسی DS1307 و میکروکنترولر Atmega8 و دماسنج با دقت DS18b20 و حافظه EEprom خارجی (24c32) ساخته شده است، که همه این قطعات (به غیر از میکروکنترولر) بر روی یک ماژول ساعت تهویه شده.([لینک خارجی برای کاربران مهمان مخفی است، لطفا برای مشاهده لینک ثبت نام نموده و یا وارد سایت شوید]جستجو را ببینید)* لازم به ذکر است ایسی دماسنج DS18b20 بر روی این ماژول تهویه نشده واما جایگاه ان وجود دارد،که باید جداگانه تهیه کنید.

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

اما اشنایی مختصر با قابلیت های ایسی DS1307:

تاریخ (میلادی )و ساعت سنج دقیق
قابلیت تشخیص روز،هفته،ماه،سال
قابلیت شمارش تا 100 سال.
قابلیت تشخیص سال های کبیسه
64 بایت حافظه رم (از نوع nv-flash)-که از این میزان حافظه 8 بایت مورد استفاده خود ایسی و باقی ازاد می باشد!(که در این پروژه برای نگه داری دما از ان استفاده کردیم)
نگه داری اطلاعات خود با یک باتری سکه ی تا 10 سال!(یعنی اگر مقدار تاریخ و زمان را به ان بدهیم،بدون برق می تواند تاریخ را تا 10 سال بشمارد و در حافظه خود نگه دارد)
نوع رابط برقراری ارتباط I2C می باشد.

آشنایی مختصر با ایسی DS18b20


قابلیت اندازه گیری دما (با دقت قابل تنظیم 12 تا 9 بیت)
دما -10 تا +85 درجه(درصد خطا اندازه گیری 0.5 سانتی گراد)
خروجی دیجیتال،فقط با یک سیم (برای ارتباط با این ایسی فقط نیاز به یک سیم نیاز می باشد)

آشنایی مختصر با ایسی حافظه EEprom At24c32


حافظه 32.768 بیتی که جمعا 4096 بایت می باشد (4 کیلو بایت)
1 میلیون بار قابلیت نوشتن و پاک کردن
نگه داری اطلاعات تا 100 سال
ولتاژ کاری در فرکانس 100 کیلو هرتز (1.8 و 2.5 و 2.7 ولت) و در فرکانس 400 کیلوهرتز(5 ولت)
رابط برقراری ارتباط I2C

اما قابلیت ها مهم پروژه نوشته شده:
 تصویر 1-نمایش تاریخ شمسی
2-تشخیص سال کبیسه(ایران)
3-افزایش 1 ساعت در اول فروردین و کاهش 1 ساعت در ماه مهر
4-نمایش دما(با دهم درصد)
5-ذخیر دما،بصورت 1 ساعتی یک بار (24 بار،در طول یک روز، و ذخیر در حافظه رم ds1307)
6-ذخیر دما،به صورت 1 روزی یک بار در ساعت 12 (ذخیر 30 روز پشت سر هم،و ذخیر در حافظه EEprom)
7-دکمه برای نمایش دما ،در 24 ساعت و 30 روز گذشته
8-هر 1 ساعت یک بار، دمایی 24 ساعت گذشته به صورت افکت (حرکت متن به سمت چپ) نمایش داده میشود
9-قابلیت تنظیم تاریخ ،زمان
 تصویر  کاهش 1 ساعته،در مهر ماه  تصویر  افزایش 1 ساعت،در فروردین  تصویر  افکت نمایش دما بصورت اتوماتیک،هر 1 ساعتی یک بار  تصویر  تنظیم تاریخ و زمان اما برنامه نویسی:

*لازم به ذکر دو تابع تبدیل تاریخ شمسی و ذخیر در حافظ eeprom رو به کمک کتاب میکروکنترولرهای avr تالبف جابر الوندی تهیه کردم .

در این پروژه مقدار دما هر 1 ساعتی یک بار در حافظه رم ساعت ، و مقدار دما در روز در حافظه ای ای پی رام خارجی ذخیره میشود.
توصیه می کنم بعد از مقداری دهی و تنظیم ساعت و تاریخ،دستگاه رو خاموش نکنید،وگرنه مقداری در تنظیم و ذخیر دما بهم ریختگی ایجاد میشود.پروژه در حال ازمایش می باشد،لطفا نقاط ضعف رو بفرمایید
نکته دیگه،باید تاریخ رو به میلادی واردی کنید(بعد خود نرم افزار به شمسی اون رو تبدیل می کنه)
بیشتر توضیحات مربوط به برنامه،در خط برنامه داده شده ... و در اینجا فقط تابع تاریخ رو به صورت جداگانه قرار میدم.

تابع تبدیل تاریخ شمسی:

کد: انتخاب همه

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


این یک آرایه دو بعدی که تابع تبدیل به اون مراجعه می کنه

کد: انتخاب همه

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}};         



اما کل کدهایی برنامه :

کد: انتخاب همه

/*******************************************************
ساعت و تاريخ و دماسنج
با قابليت نمونه برداري ساعتي و روزانه به حافظه اي اي پي رام خارجي
و رم ايسي دي اس 1307
Project :Sinaset
Version :v1(Beta)
site:centralclubs.com
Date: 1394.12.10

Chip type         : ATmega8
AVR Core Clock frequency: 8.000000 MHz
*******************************************************/
#include <mega8.h>
#include <i2c.h>
#include <ds1307.h>
#include <delay.h>
#include <stdio.h>
#include <alcd.h>
#include <1wire.h>
#include <sleep.h>
#include <ds18b20.h>
#define EEPROM_BUS_ADDRESS 160     //    ادرس دهي حافظه اي اي پي رام
#define EEPROM_REED_ADDRESS 161    //    ادرس نوشتن در حافظه اي اي پي رام

float t;          //متغير دما
unsigned char s=0,m=0,h=0; //متغيرهاي ساعت
unsigned char se=0,me=0,he=0; //متغيرهاي تغيير دما دلخواه
unsigned char w=0;   //روز هفته
unsigned char we=0,de=0,moe=0,ye=0;  //متغيرهاي تغيير سال و ماه و روز و هفته
unsigned char mo=0,d=0,y=0;  //متغيرهاي ساعت و ماه و روز

char str[16],str2[16];
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}};         


unsigned char eeprom_read(char address){    //خواندن حافظه اي اي پي رام حافظه خارجي
unsigned char data;
i2c_start();             //ايجاد پالس استارت
i2c_write(EEPROM_BUS_ADDRESS); //ادرس سخت افزاري
i2c_write(0x00);          //هشت بيت اول ادرس خت افزاري ذخير
i2c_write(address);         //هشت بيت دوم ادرس ذخير سازي ذخيره
i2c_start();
i2c_write(EEPROM_REED_ADDRESS);
data=i2c_read(0);
i2c_stop();
delay_ms(5);
return data;
}
void eeprom_write(char address ,char data){   //نوشتن در حافظه اي اي پي رام خارجي
i2c_start();
i2c_write(EEPROM_BUS_ADDRESS);
i2c_write(0x00);
i2c_write(address);
i2c_write(data);
i2c_stop();
delay_ms(5);

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

void edit_data_time(void)    //تابع تغييرات ساعت و تاريخ
{
lcd_clear();   
 
      while(1)      //ساعت
      {   
       if(PIND.1==0)
       {
       he++;
       if(he>24)he=0;
       rtc_set_time(he,me,se);delay_ms(100);lcd_clear();
       _lcd_write_data(0X0F);   
       }
       sprintf(str,"%02u:%02u:%02u",he,me,se);
       lcd_gotoxy(0,0);
       lcd_puts(str);
       delay_ms(50); 
       if(PIND.0==0){delay_ms(200);break;};   
      } 
      
      while(1)          //دقيقه
      {   
       if(PIND.1==0)
       {
       me++;
       if(me>59)me=0;
       rtc_set_time(he,me,se);delay_ms(100);lcd_clear();   
       }
       sprintf(str,"%02u:%02u:%02u",he,me,se);
       lcd_gotoxy(0,0);
       lcd_puts(str);   
       delay_ms(50);
       if(PIND.0==0){delay_ms(200);break;};
      }
      
      while(1)
      {   
       if(PIND.1==0)       //ثانيه
       {
       se++;
       if(se>59)se=0;
       rtc_set_time(he,me,se);delay_ms(100);lcd_clear();   
       }
       sprintf(str,"%02u:%02u:%02u",he,me,se);
       lcd_gotoxy(0,0);
       lcd_puts(str);
       delay_ms(50);
       if(PIND.0==0){delay_ms(200);break;};   
      }
      
       while(1)         //سال
      {
       if(PIND.1==0)
       {
       ye++;
       if(ye>99)ye=0;
       rtc_set_date(we,de,moe,ye);delay_ms(200);lcd_clear();   
       }
       sprintf(str2,"Y:%02d M:%02d D:%02d",ye,moe,de);
       lcd_gotoxy(0,1);
       lcd_puts(str2);
       delay_ms(100);
       if(PIND.0==0){delay_ms(200);break;};   
      }   
      
      while(1)          //ماه
      {
       if(PIND.1==0)
       {
       moe++;
       if(moe>12)moe=0;
       rtc_set_date(we,de,moe,ye);delay_ms(100);lcd_clear();   
       }
       sprintf(str2,"Y:%02d M:%02d D:%02d",ye,moe,de);
       lcd_gotoxy(0,1);
       lcd_puts(str2);
       delay_ms(100);
       if(PIND.0==0){delay_ms(200);break;};   
      } 
      
      while(1)          //روز
      {
       if(PIND.1==0)
       {
       de++;
       if(de>31)de=0;
       rtc_set_date(we,de,moe,ye);delay_ms(200);lcd_clear();   
       }
       sprintf(str2,"Y:%02d M:%02d D:%02d",ye,moe,de);
       lcd_gotoxy(0,1);
       lcd_puts(str2);
       delay_ms(100);
       if(PIND.0==0){delay_ms(200);break;};   
      }
    
}
unsigned char c_h=10,c_d=0;  //دو متغير براي کمک در ذخير سازي روز و ساعت نمونه گيري دما
unsigned char gate_time[35]; // اريه براي گرفتن ساعت ذخيره سازي دما
unsigned char gate_data[31]; //ارايه براي گرفتن روز ذخير سازي دما

void Sampling (void)      //نمونه گيري دما
{
      rtc_write(c_h,t);   //ذخير نمونه ساعت در رم ايسي دي اس 1307
      gate_time[c_h]=h;   //گرفتن ساعت ذخيره دما   
      //در ساعت 12 هر روز نمونه گرفته شود و در حافظه اي پي رام خارجي ذخير شود
      if(h==12&&m==0&&s==0)eeprom_write(c_d,t),gate_data[c_d]=d,c_d++;
      delay_ms(5);
      
      c_h++; //افزايش  براي نمونه گيري روز بعدي
      if(c_h==35)c_h=0; //تايين ظرفيت ساعت هاي ذخيره سازي
      if(c_d==31)c_d=0; //تايين ظرفيت روزهاي ذخيره دما
}
void Read_Sampling(void)       //تابع نمايش نمونه هاي دما در 24 ساعت گذشته و 30 روز گذشته
{
unsigned char i=0,xl;
       lcd_clear();      
       for(i=10;i<35;i++)    //نمايش نمونه  هاي ساعت
       {
         xl=rtc_read(i);
         sprintf(str,"SAT:%02u Temp:%02uC",gate_time[I],xl);
         lcd_gotoxy(0,0);
         lcd_puts(str);
         delay_ms(1000);
       }   
      
       lcd_clear();      
       for(i=0;i<30;i++){   //نمايش نمونه هاي روز
       xl=eeprom_read(i);
       sprintf(str,"ROZE:%02u T:%02uC",gate_data[I],xl);
       lcd_gotoxy(0,0);
       lcd_puts(str);
       delay_ms(1000);
       }
}
void show_temp_auto(void)   //تابع نمايش متن با افکت
{
unsigned char mx,i=0,xl;
      
       for(i=10;i<35;i++)    //نمايش نمونه  هاي ساعت
       {
         xl=rtc_read(i);
         sprintf(str,"%02u:SAT:%02u T:%02uC",i-10,gate_time[I],xl);
         lcd_clear();
         
         lcd_puts(str);
         delay_ms(1500);
         for(mx=0;mx<16;mx++){
         _lcd_write_data(0x1C);
         lcd_gotoxy(0,0);
         lcd_puts(str);
         delay_ms(100);
         }
       } 
}

void main(void)
{
char r_6=1; //جلوگيري از کاهش بيش از اندازه ماه مهر
i2c_init();
rtc_init(0,0,0);
w1_init();   
lcd_init(16);
//  rtc_set_time(24,0,50);     //تايين  مقدار اوليه ساعت
//  rtc_set_date(0,19,3,16);    //تايين مقدار اوليه تاريخ
#asm("sei")

while (1)
    {
    rtc_get_time(&h,&m,&s);    //دريافت ساعت،دقيقه،ثانيه از ايسي
    rtc_get_date(&w,&d,&mo,&y);  //دريافت سال و ماه و روز و هفته از ايسي
    MI_TO_SH(y,mo,d);   //اجرا تابع تبديل روز و ماه و ساعت به شمسي
    t=ds18b20_temperature(NULL);  //دريافت دما از ايسي دما
      
    if(m==00 && s==00)Sampling(); //نمونه گيري دما
    lcd_clear();
    sprintf(str,"%02u:%02u:%02u  T:%.1f",h,m,s,t);
    sprintf(str2,"Date:%u/%02u/%02u",y,mo,d);
    lcd_gotoxy(0,0);
    lcd_puts(str);   
    lcd_gotoxy(0,1);
    lcd_puts(str2);
    delay_ms(100); 
      
    if(PIND.2==0)Read_Sampling();   //نمايش نمونه ها گرفته شده دما ،در 24 ساعت و 30 روز گذشته
    if(mo==01 && d==01 && s==0 && m==0 && h==0)h++,rtc_set_time(h,m,s),r_6=1;  //افزايش يک ساعته در ماه فروردين
    if(mo==07 && d==01 && s==0 && m==0 && h==1 && r_6==1)h--,rtc_set_time(h,m,s),r_6=0;//کاهش يک ساعت در ماه مهر
    if(m==0 && s==59)show_temp_auto();   //بصورت اتوماتيک هر 1 ساعتي 1 بار،بصورت افکت دمايي 24 ساعت گذشته نمايش داده شود
    if(PIND.0==0)    //براي رفتن به تابع تغييرات تاريخ و ساعت
     {
     while(PIND.0==0)
     delay_ms(300);
     edit_data_time();
     }

    }
}


[لینک خارجی برای کاربران مهمان مخفی است، لطفا برای مشاهده لینک ثبت نام نموده و یا وارد سایت شوید]شبیه ساز و کدها.[/I][/I][/I]
باتشکر.
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.

Colonel II
Colonel II
نمایه کاربر
پست: 7008
تاریخ عضویت: سه شنبه 26 آذر 1387, 4:20 pm
سپاس‌های ارسالی: 9184 بار
سپاس‌های دریافتی: 21045 بار
تماس:

Re: ساعت +تقویم شمسی+دماسنج با ایسیDs1307وatmega8

پست توسط sinaset » سه شنبه 12 مرداد 1395, 9:55 am

بنام خدا
باسلام


اصلاح کدها و کاهش حجم فایل فلش برنامه.

در اصطلاحه ی که انجام داده ایم،میزان استفاده از حافظه (که در گذشته در محدود 80 درصد بود) به 56 درصد کاهش یافت است .

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

کدهایی جدید:

کد: انتخاب همه

/*******************************************************
ساعت و تاريخ و دماسنج
با قابليت نمونه برداري ساعتي و روزانه به حافظه اي اي پي رام خارجي
و رم ايسي دي اس 1307
Project :Sinaset
Version :v1.1
site:centralclubs.com
Date: 1395.5.11
Chip type         : ATmega8
AVR Core Clock frequency: 8.000000 MHz
*******************************************************/ /*
تغييرات نسخه 1.1
در نسخه گذشته از تابع پرمصرف  استفاده شده بود و حدود 88 درصد حافظه اشغال شده بود
با اصلاحات انجام شده،اين مشکل برطرف و حجم به حدود 55 درصد رسيده است
********************************************************/
#include <mega8.h>
#include <i2c.h>
#include <ds1307.h>
#include <delay.h>
#include <stdio.h>
#include <stdlib.h>
#include <alcd.h>
#include <1wire.h>
#include <sleep.h>
#include <ds18b20.h>
#define EEPROM_BUS_ADDRESS 160     //    ادرس دهي حافظه اي اي پي رام
#define EEPROM_REED_ADDRESS 161    //    ادرس نوشتن در حافظه اي اي پي رام

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}};         

unsigned char s=0,m=0,h=0; //متغيرهاي ساعت
unsigned char mo=0,d=0,y=0,w=0;  //متغيرهاي ساعت و ماه و روز و هفته

unsigned char eeprom_read(char address){    //خواندن حافظه اي اي پي رام حافظه خارجي
unsigned char data;
i2c_start();             //ايجاد پالس استارت
i2c_write(EEPROM_BUS_ADDRESS); //ادرس سخت افزاري
i2c_write(0x00);          //هشت بيت اول ادرس خت افزاري ذخير
i2c_write(address);         //هشت بيت دوم ادرس ذخير سازي ذخيره
i2c_start();
i2c_write(EEPROM_REED_ADDRESS);
data=i2c_read(0);
i2c_stop();
delay_ms(5);
return data;
}

void eeprom_write(char address ,char data){   //نوشتن در حافظه اي اي پي رام خارجي
i2c_start();
i2c_write(EEPROM_BUS_ADDRESS);
i2c_write(0x00);
i2c_write(address);
i2c_write(data);
i2c_stop();
delay_ms(5);


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

void edit_data_time(void)    //تابع تغييرات ساعت و تاريخ
{
unsigned char se=0,me=0,he=0; //متغيرهاي تغيير دما دلخواه
unsigned char we=0,de=0,moe=0,ye=0;  //متغيرهاي تغيير سال و ماه و روز و هفته
unsigned char str[16],str2[16];
lcd_clear();   
 
      while(1)      //ساعت
      {   
       if(PIND.1==0)
       {
       he++;
       if(he>24)he=0;
       rtc_set_time(he,me,se);delay_ms(100);lcd_clear();
       _lcd_write_data(0X0F);   
       }
       sprintf(str,"%02u:%02u:%02u",he,me,se);
       lcd_gotoxy(0,0);
       lcd_puts(str);
       delay_ms(50); 
       if(PIND.0==0){delay_ms(200);break;};   
      } 
      
      while(1)          //دقيقه
      {   
       if(PIND.1==0)
       {
       me++;
       if(me>59)me=0;
       rtc_set_time(he,me,se);delay_ms(100);lcd_clear();   
       }
       sprintf(str,"%02u:%02u:%02u",he,me,se);
       lcd_gotoxy(0,0);
       lcd_puts(str);   
       delay_ms(50);
       if(PIND.0==0){delay_ms(200);break;};
      }
      
      while(1)
      {   
       if(PIND.1==0)       //ثانيه
       {
       se++;
       if(se>59)se=0;
       rtc_set_time(he,me,se);delay_ms(100);lcd_clear();   
       }
       sprintf(str,"%02u:%02u:%02u",he,me,se);
       lcd_gotoxy(0,0);
       lcd_puts(str);
       delay_ms(50);
       if(PIND.0==0){delay_ms(200);break;};   
      }
      
       while(1)         //سال
      {
       if(PIND.1==0)
       {
       ye++;
       if(ye>99)ye=0;
       rtc_set_date(we,de,moe,ye);delay_ms(200);lcd_clear();   
       }
       sprintf(str2,"Y:%02d M:%02d D:%02d",ye,moe,de);
       lcd_gotoxy(0,1);
       lcd_puts(str2);
       delay_ms(100);
       if(PIND.0==0){delay_ms(200);break;};   
      }   
      
      while(1)          //ماه
      {
       if(PIND.1==0)
       {
       moe++;
       if(moe>12)moe=0;
       rtc_set_date(we,de,moe,ye);delay_ms(100);lcd_clear();   
       }
       sprintf(str2,"Y:%02d M:%02d D:%02d",ye,moe,de);
       lcd_gotoxy(0,1);
       lcd_puts(str2);
       delay_ms(100);
       if(PIND.0==0){delay_ms(200);break;};   
      } 
      
      while(1)          //روز
      {
       if(PIND.1==0)
       {
       de++;
       if(de>31)de=0;
       rtc_set_date(we,de,moe,ye);delay_ms(200);lcd_clear();   
       }
       sprintf(str2,"Y:%02d M:%02d D:%02d",ye,moe,de);
       lcd_gotoxy(0,1);
       lcd_puts(str2);
       delay_ms(100);
       if(PIND.0==0){delay_ms(200);break;};   
      }
    
}

unsigned char c_h=10,c_d=0;  //دو متغير براي کمک در ذخير سازي روز و ساعت نمونه گيري دما
unsigned char gate_time[35]; // اريه براي گرفتن ساعت ذخيره سازي دما
unsigned char gate_data[31]; //ارايه براي گرفتن روز ذخير سازي دما
void Sampling (unsigned char t)      //نمونه گيري دما
{


      rtc_write(c_h,t);   //ذخير نمونه ساعت در رم ايسي دي اس 1307
      gate_time[c_h]=h;   //گرفتن ساعت ذخيره دما   
      //در ساعت 12 هر روز نمونه گرفته شود و در حافظه اي پي رام خارجي ذخير شود
      if(h==12&&m==0&&s==0)eeprom_write(c_d,t),gate_data[c_d]=d,c_d++;
      delay_ms(5);
      
      c_h++; //افزايش  براي نمونه گيري روز بعدي
      if(c_h==35)c_h=0; //تايين ظرفيت ساعت هاي ذخيره سازي
      if(c_d==31)c_d=0; //تايين ظرفيت روزهاي ذخيره دما
}
void Read_Sampling(void)       //تابع نمايش نمونه هاي دما در 24 ساعت گذشته و 30 روز گذشته
{
unsigned char i=0,xl,str[16];
       lcd_clear();      
       for(i=10;i<35;i++)    //نمايش نمونه  هاي ساعت
       {
         xl=rtc_read(i);
         sprintf(str,"SAT:%02u Temp:%02uC",gate_time,xl);
         lcd_gotoxy(0,0);
         lcd_puts(str);
         delay_ms(1000);
       }   
      
       lcd_clear();      
       for(i=0;i<30;i++){   //نمايش نمونه هاي روز
       xl=eeprom_read(i);
       sprintf(str,"ROZE:%02u T:%02uC",gate_data,xl);
       lcd_gotoxy(0,0);
       lcd_puts(str);
       delay_ms(1000);
       }
}
void show_temp_auto(void)   //تابع نمايش متن با افکت
{
unsigned char mx,i=0,xl,str[16];
      
       for(i=10;i<35;i++)    //نمايش نمونه  هاي ساعت
       {
         xl=rtc_read(i);
         sprintf(str,"%02u:SAT:%02u T:%02uC",i-10,gate_time,xl);
         lcd_clear();
         
         lcd_puts(str);
         delay_ms(1500);
         for(mx=0;mx<16;mx++){
         _lcd_write_data(0x1C);
         lcd_gotoxy(0,0);
         lcd_puts(str);
         delay_ms(100);
         }
       } 
}

void main(void)
{
float t;          //متغير دما
unsigned char str[16],str2[16],str3[5];
unsigned int tempx=0;
char r_6=1; //جلوگيري از کاهش بيش از اندازه ماه مهر
i2c_init();
rtc_init(0,0,0);
w1_init();   
lcd_init(16);
//  rtc_set_time(24,0,50);     //تايين  مقدار اوليه ساعت
//  rtc_set_date(0,19,3,16);    //تايين مقدار اوليه تاريخ
#asm("sei")
while (1)
    {
    rtc_get_time(&h,&m,&s);    //دريافت ساعت،دقيقه،ثانيه از ايسي
    rtc_get_date(&w,&d,&mo,&y);  //دريافت سال و ماه و روز و هفته از ايسي
    MI_TO_SH(y,mo,d);   //اجرا تابع تبديل روز و ماه و ساعت به شمسي
    t=ds18b20_temperature(NULL);  //دريافت دما از ايسي دما   
    tempx=(t*10),itoa(tempx,str3); //راه کاري جديد براي محاسبه دما
    if(m==00 && s==00)Sampling(t); //نمونه گيري دما
    lcd_clear();
    sprintf(str,"%02u:%02u:%02u T:%c%c.%c",h,m,s,str3[0],str3[1],str3[2]);
    sprintf(str2,"Date:%u/%02u/%02u",y,mo,d);   
    lcd_gotoxy(0,0);
    lcd_puts(str);   
    lcd_gotoxy(0,1);
    lcd_puts(str2);
    delay_ms(100);   
    if(PIND.2==0)Read_Sampling();   //نمايش نمونه ها گرفته شده دما ،در 24 ساعت و 30 روز گذشته
    if(mo==01 && d==01 && s==0 && m==0 && h==0)h++,rtc_set_time(h,m,s),r_6=1;  //افزايش يک ساعته در ماه فروردين
    if(mo==07 && d==01 && s==0 && m==0 && h==1 && r_6==1)h--,rtc_set_time(h,m,s),r_6=0;//کاهش يک ساعت در ماه مهر
    if(m==0 && s==59)show_temp_auto();   //بصورت اتوماتيک هر 1 ساعتي 1 بار،بصورت افکت دمايي 24 ساعت گذشته نمايش داده شود
    if(PIND.0==0)    //براي رفتن به تابع تغييرات تاريخ و ساعت
     {
     while(PIND.0==0)
     delay_ms(300);
     edit_data_time();
     }

    }
}


باتشکر.
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.

ارسال پست

بازگشت به “طرح آماده و کامل شده AVR”