قسم الميكروكنترولر والروبوت ودوائر الاتصال بالحاسب الالي قسم المتحكمات الـ microcontroller و المعالجات microprocessor و التحكم الرقمي بالكمبيوتر CNC والانظمة الآلية والروبوت Robots

أدوات الموضوع

ahmadazez
:: مهندس جيد ::
تاريخ التسجيل: Mar 2009
المشاركات: 253
نشاط [ ahmadazez ]
قوة السمعة:0
قديم 24-02-2019, 09:10 PM المشاركة 1   
افتراضي ساعة رقمية بطول متر وعرض 35 سم مع عرض التاريخ ودرجة الحرارة وايام الاسبوع Twitter FaceBook Google+



اقدم لكم هذه الساعة ارجو ان تنال اعجابكم
البرنامج مكتوب بلغة سي على كومبايلر Codevision AVR
المتحكم المستخدم ATmega8
عرض الوقت بنظامي 12 او 24 ساعة بضغط سويتش SET لمدة 5 ثواني
عندما تريد ضبط الوقت او التاريخ او ايام الاسبوع يمكن التنقل لوحدة الاظهار التي تريد ضبطها من خلال كبسة SET فكل ضغطة تنقلك لضبط وحدة اخرى وكبستي INC و DEC لزيادة او انقاص الرقم الذي تريده
درجة الحرارة تقرأ من الحساس كل دقيقة فعند التجريب على برنامج بروتوس لن تتغير القيمة الا عند مرور دقيقة
الساعة مجربة وتعمل عندي في المنزل منذ فترة ولايوجد بها اي مشاكل وهذه ملفات البرنامج والبروتوث والفيديو اثناء تشغيلها

https://up.top4top.net/downloadf-1150bxwwh1-rar.html





https://a.top4top.net/m_1150fqls94.mp4


احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 0 اعجاب
شكراً محمود خلف ( شكر العضو على هذه المشاركة )
اعلانات

ahmadazez
:: مهندس جيد ::
تاريخ التسجيل: Mar 2009
المشاركات: 253
نشاط [ ahmadazez ]
قوة السمعة:0
قديم 26-02-2019, 06:35 AM المشاركة 2   
افتراضي


كود:
#include <mega8.h>
#include <stdlib.h>
#include <delay.h>


#define SH PORTB.0    
#define DS PORTB.1       
#define ST PORTB.2

#define SH1 PORTB.3
#define DS1 PORTB.4       
#define ST1 PORTB.5

// I2C Bus functions
#include <i2c.h>

// DS1307 Real Time Clock functions
#include <ds1307.h>

// Declare your global variables here
//////////////////////////////////////////////////////////////////////////
unsigned char week[9]={128,64,32,16,8,4,2,0};  //مصفوفة لايام الاسبوع
unsigned char out_pw[7]={128,64,32,16,8,4};    //مصفوفة لتشغيل وحدات الاظهار
unsigned char seg0=~192,seg1=~249,seg2=~164,seg3=~176,seg4=~153,seg5=~146,seg6=~130, //مصفوفة الارقام التي تظهر على وحدات الاظهار
              seg7=~248,seg8=~128,seg9=~144,seg10=~255,seg11=~156,seg12=~198; 
unsigned char strh[6],strh12[6],strd[6],stry[6],strr[6]; //مصفوفات لوضع قيم اليوم والتاريخ والسنة بعد تحويلها من النظام الثنائي الى النظام العشري            
unsigned char wek,h,m,s,d2,m2,y2,h12,G1=0,conter=0,SET=0; //المتغيرات المستخدمة ضمن البرنامج             
unsigned char segmant_week,segmant,segmant1=0,segmant2=0,segmant3=0,segmant4=0,X=0,X1=0,Y=0,Z=0,W=0;                
unsigned int  rest=0,rest1=0,Change=0,SET_CONTR=0,set_end=0;                                   
unsigned char TM=0,G=0,off=1,Se=0,INC=0,DEC=0,SEE=0,SEE1=0,Butt=0,Read_wek=0,memory1; 
unsigned int ADC_time=0,time12_24=0;
float hetr=0;
eeprom char memory;
/////////////////////////////////////////////////////////////////////////

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void) //مقاطعة التايمر زيرو تحدث كل 1 ميلي ثانية
    {
     TCNT0=0xF8;
     
        if(PIND.7==0)rest++;    
         else rest=0;          
        if(PIND.7==1)rest1++;
         else rest1=0;
        Change++;
        conter++;
       if(SET!=0)SET_CONTR++; 
       if(SEE==1)set_end++;
       ADC_time++; 
       if(PIND.0==0&&TM==0)time12_24++;
        
    }

   // Voltage Reference: AREF pin
    #define ADC_VREF_TYPE ((0<<REFS1) | (0<<REFS0) | (0<<ADLAR))

    // Read the AD conversion result
    unsigned int read_adc(unsigned char adc_input)
    {
    ADMUX=adc_input | ADC_VREF_TYPE;
    // Delay needed for the stabilization of the ADC input voltage
    delay_us(10);
    // Start the AD conversion
    ADCSRA|=(1<<ADSC);
    // Wait for the AD conversion to complete
    while ((ADCSRA & (1<<ADIF))==0);
    ADCSRA|=(1<<ADIF);
    return ADCW;
    }    

 void divide_h()   //تحويل قيمة متغيرات الوقت من الباينري ووضعها في متغيرات تمثل قيم الأحاد والعشرات 
       {
         strh[0]=(h/10);
         strh[1]=(h%10); 
         strh[2]=(m/10);
         strh[3]=(m%10);         
       } 
       
 void divide_h12()   //تحويل قيمة متغيرات الوقت من الباينري ووضعها في متغيرات تمثل قيم الأحاد والعشرات 
       {
         strh12[0]=(h12/10);
         strh12[1]=(h12%10); 
         strh12[2]=(m/10);
         strh12[3]=(m%10);         
       }      
  /////////////////////////////////////////////////////////////////////     
void divide_d()  //تحويل قيمة متغيرات التاريخ من الباينري ووضعها في متغيرات تمثل قيم الأحاد والعشرات 
       {
         strd[0]=(d2/10);
         strd[1]=(d2%10);
         strd[2]=(m2/10);
         strd[3]=(m2%10);
       }
    ////////////////////////////////////////////////////////////////////   
void divide_Y()    //تحويل قيمة متغيرات السنة  من الباينري ووضعها في متغيرات تمثل قيم الأحاد والعشرات 
      { 
        stry[0]=(2);
        stry[1]=(0);
        stry[2]=(y2/10);
        stry[3]=(y2%10);
      }       
 ///////////////////////////////////////////////////////////////
void out_data (unsigned char B)  //اخراج الداتا على الشيفت ريجيستر
    {
      switch (B)
          { 
                        
                          
            case 0: segmant=seg0;
              if((Y==1||Y==3)&&(Change>=5000&&Change<8000)){segmant=segmant^0b10000000;} //لوضع الفاصلة عند عرض التاريخ فقط
             for (X=0;X<8;X++)
               {
                 DS=segmant&0b10000000; SH=1;SH=0; segmant=segmant<<1;
               }; break;
                              
            case 1: segmant=seg1; 
             if((Y==1||Y==3)&&(Change>=5000&&Change<8000)){segmant=segmant^0b10000000;}
             for (X=0;X<8;X++)
               {
                 DS=segmant&0b10000000; SH=1;SH=0; segmant=segmant<<1;
               };break; 
                           
            case 2: segmant=seg2;
              if((Y==1||Y==3)&&(Change>=5000&&Change<8000)){segmant=segmant^0b10000000;}
             for (X=0;X<8;X++)
               {
                 DS=segmant&0b10000000; SH=1;SH=0; segmant=segmant<<1;
               };break;
                            
            case 3: segmant=seg3;
              if((Y==1||Y==3)&&(Change>=5000&&Change<8000)){segmant=segmant^0b10000000;}
             for (X=0;X<8;X++)
               {
                 DS=segmant&0b10000000; SH=1;SH=0; segmant=segmant<<1;
               };break; 
                           
            case 4: segmant=seg4; 
              if((Y==1||Y==3)&&(Change>=5000&&Change<8000)){segmant=segmant^0b10000000;}
             for (X=0;X<8;X++)
               {
                 DS=segmant&0b10000000; SH=1;SH=0; segmant=segmant<<1;
               };break; 
                           
            case 5: segmant=seg5;
              if((Y==1||Y==3)&&(Change>=5000&&Change<8000)){segmant=segmant^0b10000000;}
             for (X=0;X<8;X++)
               {
                 DS=segmant&0b10000000; SH=1;SH=0; segmant=segmant<<1;
               };break; 
                           
            case 6: segmant=seg6;
              if((Y==1||Y==3)&&(Change>=5000&&Change<8000)){segmant=segmant^0b10000000;}
             for (X=0;X<8;X++)
               {
                 DS=segmant&0b10000000; SH=1;SH=0; segmant=segmant<<1;
               };break;  
                           
            case 7: segmant=seg7;
              if((Y==1||Y==3)&&(Change>=5000&&Change<8000)){segmant=segmant^0b10000000;}
             for (X=0;X<8;X++)
               {
                 DS=segmant&0b10000000; SH=1;SH=0; segmant=segmant<<1;
               };break;  
                           
            case 8: segmant=seg8;
              if((Y==1||Y==3)&&(Change>=5000&&Change<8000)){segmant=segmant^0b10000000;}
             for (X=0;X<8;X++)
               {
                 DS=segmant&0b10000000; SH=1;SH=0; segmant=segmant<<1;
               };break;  
                           
            case 9: segmant=seg9;
              if((Y==1||Y==3)&&(Change>=5000&&Change<8000)){segmant=segmant^0b10000000;}
             for (X=0;X<8;X++)
               {
                 DS=segmant&0b10000000; SH=1;SH=0; segmant=segmant<<1;
               };break;  
             //////////////////////////              
             case 10: segmant=seg10;  //وحدة السفن سيكمنت مطفئة
             for (X=0;X<8;X++)
               {
                 DS=segmant&0b10000000; SH=1;SH=0; segmant=segmant<<1;
               };break;
             /////////////////////////            
             case 11: segmant=seg11; //اظهار الدائرة التي تمثل اشارة درجة الحرارة
             for (X=0;X<8;X++)
               {
                 DS=segmant&0b10000000; SH=1;SH=0; segmant=segmant<<1;
               };break;
             //////////////////////////              
              case 12: segmant=seg12; //اظهار حرف الذي يمثل درجة الحرارة:C
             for (X=0;X<8;X++)
               {
                 DS=segmant&0b10000000; SH=1;SH=0; segmant=segmant<<1;
               };break; 
             ////////////////////                 
          }; 
         ST=1;ST=0;
    }      
  //////////////////////////////////////////////////////////////////////////////
void out_week (unsigned char BB)  //اظهار اليوم على الليدات 
    {
      switch (BB)
          { 
                        
                          
            case 1: segmant_week=week[0];
              if(h>=12){segmant_week=segmant_week^0b00000001;} //لتحديد وتشغيل ليد قبل الظهر او بعد الظهر
             for (X1=0;X1<8;X1++)
               {
                 DS1=segmant_week&0b00000001; SH1=1;SH1=0; segmant_week=segmant_week>>1;
               }; break;
                              
            case 2: segmant_week=week[1]; 
              if(h>=12){segmant_week=segmant_week^0b00000001;}
             for (X1=0;X1<8;X1++)
               {
                 DS1=segmant_week&0b00000001; SH1=1;SH1=0; segmant_week=segmant_week>>1;
               };break; 
                           
            case 3: segmant_week=week[2]; 
              if(h>=12){segmant_week=segmant_week^0b00000001;}
             for (X1=0;X1<8;X1++)
               {
                 DS1=segmant_week&0b00000001; SH1=1;SH1=0; segmant_week=segmant_week>>1;
               };break; 
                            
            case 4: segmant_week=week[3]; 
             if(h>=12){segmant_week=segmant_week^0b00000001;}
             for (X1=0;X1<8;X1++)
               {
                 DS1=segmant_week&0b00000001; SH1=1;SH1=0; segmant_week=segmant_week>>1;
               };break;  
                           
            case 5: segmant_week=week[4]; 
              if(h>=12){segmant_week=segmant_week^0b00000001;}
             for (X1=0;X1<8;X1++)
               {
                 DS1=segmant_week&0b00000001; SH1=1;SH1=0; segmant_week=segmant_week>>1;
               };break; 
                           
            case 6: segmant_week=week[5]; 
              if(h>=12){segmant_week=segmant_week^0b00000001;}
             for (X1=0;X1<8;X1++)
               {
                 DS1=segmant_week&0b00000001; SH1=1;SH1=0; segmant_week=segmant_week>>1;
               };break; 
                           
            case 7: segmant_week=week[6]; 
             if(h>=12){segmant_week=segmant_week^0b00000001;}
             for (X1=0;X1<8;X1++)
               {
                 DS1=segmant_week&0b00000001; SH1=1;SH1=0; segmant_week=segmant_week>>1;
               };break;   
                           
            case 8: segmant_week=week[7]; 
              if(h>=12){segmant_week=segmant_week^0b00000001;}
             for (X1=0;X1<8;X1++)
               {
                 DS1=segmant_week&0b00000001; SH1=1;SH1=0; segmant_week=segmant_week>>1;
               };break;  
            
                    
          }; 
         ST1=1;ST1=0;
    } 
  ////////////////////////////////////////////////////////////////////////////////////////
void Button()   //تابع يتم استدعائه عندما نريد ضبط الوقت عن طريق السويتشات
     {      
        divide_h();                               
         divide_d(); 
         divide_Y();
       
       if(PIND.0==0&&SEE1==0&&TM==0){Se=1;SEE=1;set_end=0;}  // سويتش بداية الضبط       
           if(Se==1&&PIND.0==1){Se=0;SET++;}
             if(TM==1)Se=0;       
         if(PIND.0==1)SEE1=0;      
             
             if(SET==1||SET==2||time12_24!=0&&TM==0){Change=5;} //لاظهار الساعة والدقائق فقط عند الضبط دون التبديل بين التاريخ ودرجة الحرارة
             if(SET==3||SET==4)Change=5000;              //لاظهار اليوم والشهر فقط دون التبديل بين الوقت ودرجة الحرارة اثناء الضبط
             if(SET==5)Change=12000;                    //لاظهار السنة عند الضبط دون التبديل بين الوقت والتاريخ ودرجة الحرارة
                 
             if((SET==7||set_end>=6000)&&(TM==0))//ارسال القيم الى اي سي الوقت بعد الانتهاء من ضبط جميع المتغيرات
               {                      //للوقت والتاريخ والسنة وايام الاسبوع او اذا ضغطنا سويتش بداية
                 SET=0;               //الضبط ولم نتابع الضبط لمدة تزيد عن حمس ثواني عندها تعود الساعة 
                 Change=0;            //للعرض عند اخر قيم تم حفظها
                 SET_CONTR=0;
                 SEE=0;
                 Se=0;
                 set_end=0; 
                 SEE1=1;
                 Butt=0;
                 time12_24=0;
                 TM=0; 
                    
                 rtc_set_time(h,m,s=1);            
                 rtc_set_date(wek,d2,m2,y2); 
                 rtc_get_time(&h,&m,&s);            
                 rtc_get_date(&wek,&d2,&m2,&y2);
                 G1=s; 
                 h12=h; 
                 if(h>12)h12=h-12; 
                 if(h==0)h12=12; 
                 divide_h12();
                 memory1=memory; 
                 out_week(wek);
               } 
        ///////////////////////////////////////////////////////////////////////         
         if(SET==1&&SET_CONTR>500)  {memory1=0;strh[0]=10;strh[1]=10;}  //من اجل وميض الخانة التي نقوم بضبطها
         if(SET==1&&SET_CONTR>1000) {SET_CONTR=0;}
         if(SET==2&&SET_CONTR>500)  {memory1=0;strh[2]=10;strh[3]=10;}
         if(SET==2&&SET_CONTR>1000) {SET_CONTR=0;}
         if(SET==3&&SET_CONTR>500)  {strd[0]=10;strd[1]=10;}
         if(SET==3&&SET_CONTR>1000) {SET_CONTR=0;}
         if(SET==4&&SET_CONTR>500)  {strd[2]=10;strd[3]=10;}
         if(SET==4&&SET_CONTR>1000) {SET_CONTR=0;}
         if(SET==5&&SET_CONTR>500)  {stry[0]=10;stry[1]=10;stry[2]=10;stry[3]=10;}
         if(SET==5&&SET_CONTR>1000) {SET_CONTR=0;}
         if(SET==6&&SET_CONTR>500)  {out_week(8);}
         if(SET==6&&SET_CONTR>1000) {SET_CONTR=0;out_week(wek);}
        /////////////////////////////////////////////////////////////////
       if(SET==1&&INC==0&&PIND.1==0)  //استخدام السويتشات من اجل ضبط الوقت والتاريخ وايام الاسبوع
          {
           memory1=0;INC=1;h++;set_end=0; 
           if(h>23)h=0;
           h12=h;
           out_week(wek);
          } 
         if(PIND.1==1)INC=0;  
         
       if(SET==1&&DEC==0&&PIND.2==0)
          {
           memory1=0;DEC=1;h--;set_end=0;
           if(h==255)h=23;
           h12=h; 
           out_week(wek);
          }
        if(PIND.2==1)DEC=0;
         
         if(SET==2&&INC==0&&PIND.1==0){set_end=0;INC=1;m++;}
         if(PIND.1==1)INC=0; 
         if(m==60)m=0;
         if(SET==2&&DEC==0&&PIND.2==0){set_end=0;DEC=1;m--;}
         if(PIND.2==1)DEC=0;
         if(m==255)m=59;
                 
         if(SET==3&&INC==0&&PIND.1==0){set_end=0;INC=1;d2++;}
         if(PIND.1==1)INC=0; 
         if(d2>31)d2=1;
         if(SET==3&&DEC==0&&PIND.2==0){set_end=0;DEC=1;d2--;}
         if(PIND.2==1)DEC=0;
         if(d2==0)d2=31;
         if(SET==4&&INC==0&&PIND.1==0){set_end=0;INC=1;m2++;}
         if(PIND.1==1)INC=0; 
         if(m2>12)m2=1;
         if(SET==4&&DEC==0&&PIND.2==0){set_end=0;DEC=1;m2--;}
         if(PIND.2==1)DEC=0;
         if(m2==0)m2=12;
         if(SET==5&&INC==0&&PIND.1==0){set_end=0;INC=1;y2++;}
         if(PIND.1==1)INC=0; 
         if(y2>99)y2=0;
         if(SET==5&&DEC==0&&PIND.2==0){set_end=0;DEC=1;y2--;}
         if(PIND.2==1)DEC=0;
         if(y2==255)y2=99; 
                 
         if(SET==6&&INC==0&&PIND.1==0){set_end=0;INC=1;wek++;}
         if(PIND.1==1)INC=0; 
         if(wek>=8)wek=1;
         if(SET==6&&DEC==0&&PIND.2==0){set_end=0;DEC=1;wek--;}
         if(PIND.2==1)DEC=0;
         if(wek==0)wek=7;
         
         
     }  
  
void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port B initialization
// Function: Bit7=In Bit6=In Bit5=Out Bit4=Out Bit3=Out Bit2=Out Bit1=Out Bit0=Out 
DDRB=(0<<DDB7) | (0<<DDB6) | (1<<DDB5) | (1<<DDB4) | (1<<DDB3) | (1<<DDB2) | (1<<DDB1) | (1<<DDB0);
// State: Bit7=T Bit6=T Bit5=0 Bit4=0 Bit3=0 Bit2=0 Bit1=0 Bit0=0 
PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);

// Port C initialization
// Function: Bit6=Out Bit5=Out Bit4=Out Bit3=Out Bit2=Out Bit1=In Bit0=In 
DDRC=(1<<DDC6) | (1<<DDC5) | (1<<DDC4) | (1<<DDC3) | (1<<DDC2) | (0<<DDC1) | (0<<DDC0);
// State: Bit6=0 Bit5=0 Bit4=0 Bit3=0 Bit2=0 Bit1=T Bit0=T 
PORTC=(0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);

// Port D initialization
// Function: Bit7=In Bit6=Out Bit5=Out Bit4=Out Bit3=Out Bit2=In Bit1=In Bit0=In 
DDRD=(0<<DDD7) | (1<<DDD6) | (1<<DDD5) | (1<<DDD4) | (1<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);
// State: Bit7=P Bit6=0 Bit5=0 Bit4=0 Bit3=0 Bit2=P Bit1=P Bit0=P 
PORTD=(1<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (1<<PORTD2) | (1<<PORTD1) | (1<<PORTD0);

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 7.813 kHz
TCCR0=(1<<CS02) | (0<<CS01) | (1<<CS00);
TCNT0=0xF8;


// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (1<<TOIE0);


// ADC initialization
// ADC Clock frequency: 125.000 kHz
// ADC Voltage Reference: AREF pin
  ADMUX=ADC_VREF_TYPE;
  ADCSRA=(1<<ADEN) | (0<<ADSC) | (0<<ADFR) | (0<<ADIF) | (0<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (0<<ADPS0);
  SFIOR=(0<<ACME); 


// Bit-Banged I2C Bus initialization
// I2C Port: PORTB
// I2C SDA bit: 7
// I2C SCL bit: 6
// Bit Rate: 100 kHz
// Note: I2C settings are specified in the
// Project|Configure|C Compiler|Libraries|I2C menu.
i2c_init();

// DS1307 Real Time Clock initialization
// Square wave output on pin SQW/OUT: On
// Square wave frequency: 1Hz
rtc_init(0,1,0);

// Watchdog Timer initialization
// Watchdog Timer Prescaler: OSC/2048k
#pragma optsize-
WDTCR=(1<<WDCE) | (1<<WDE) | (1<<WDP2) | (1<<WDP1) | (1<<WDP0);
WDTCR=(0<<WDCE) | (1<<WDE) | (1<<WDP2) | (1<<WDP1) | (1<<WDP0);
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Global enable interrupts
#asm("sei")
/////////////////////////////////////
rtc_get_time(&h,&m,&s);            //  1307عند بداية التشغيلDS للقراءة من 
rtc_get_date(&wek,&d2,&m2,&y2);
G1=s;
out_week(wek);

hetr=read_adc(0); 
hetr=hetr*5000.0/1023.0;   
 ftoa(hetr,0,strr);  
 strr[0]=strr[0]-48;
 strr[1]=strr[1]-48; 
 strr[2]=11; 
 strr[3]=12;
 
h12=h; 
if(h>12)h12=h-12; 
if(h==0)h12=12; 
divide_h(); 
divide_h12();                          
divide_d();
divide_Y();
memory1=memory;
///////////////////////////////////// 
while (1)
      {
        
       #asm("wdr")
       
        
       if(PIND.0==0)Butt=1;      
       if(Butt==1)Button(); 
        if(PIND.0==0&&TM==0&&time12_24>=4000)
        { 
          TM=1; 
          memory=!memory; 
          memory1=memory; 
        }
        if(PIND.0==1&&TM==1){TM=0;time12_24=0;}
        //////////////////////////////////////////////////////////  
        if(h==0&&Read_wek==0)    //لقراءةوعرض اليوم والتاريخ عند الساعة 12 ليلا
             {
              Read_wek=1;
              rtc_get_date(&wek,&d2,&m2,&y2);
              out_week(wek);           
             }
             else if(h!=0) Read_wek=0;
        //////////////////////////////////////////////////////////////////////////////// 
        
              if(ADC_time>=65000) //قراءة قيمة حساس الحرارة كل دقيقتين وحساب المعادلة الخاصة بالحساس ووضع القيم في المتغيرات
               { 
                ADC_time=0;
                    
                hetr=read_adc(0); 
                hetr=hetr*5000.0/1023.0; 
                ftoa(hetr,0,strr);  
                 strr[0]=strr[0]-48;
                 strr[1]=strr[1]-48; 
                 strr[2]=11;
                 strr[3]=12;           
               }      
        /////////////////////////////////////////////////////////////     
        
       /* 
        if((rest>=600)||(rest1>=600))    // في حال تم التشويش على اي سي الوقت وتوقفت عن العمل
         {                                 //يوجد تايمر مفعل اكثر من نصف ثانية فعند تأخر ورود الاشارة 
            rest=0;                        //اكثر من نصف ثانية نقوم باعادة ارسال الوقت من المتغيرات 
            rest1=0;                       //الى اي سي الوقت لاعادة تشغيلها من حيث توقفت
            rtc_set_time(h,m,s=1);           
            rtc_set_date(wek,d2,m2,y2);          
            rtc_get_time(&h,&m,&s);            
            rtc_get_date(&wek,&d2,&m2,&y2);
            G1=s;           
         }    */
        ////////////////////////////////////////////////////////////////////////////////  
        
        if(G==0&&PIND.7==1){G=PIND.7;G1++;}  //قراءة الوقت من الايسي كل 60 ثانية
        if(PIND.7==0)G=0;
        if(G1>=60)
          {
            G1=0;
            rtc_get_time(&h,&m,&s);
            rtc_get_date(&wek,&d2,&m2,&y2); 
            out_week(wek);
            G1=s; 
            h12=h;
            if(h>12)h12=h-12; 
            if(h==0)h12=12;
            divide_h();                             //استدعاء تابع تقسيم الوقت
            divide_h12();                           //استدعاء تابع تقسيم الوقت لنظام 12 ساعة
            divide_d();                             //استدعاء تابع تقسيم التاريخ 
            divide_Y();                            //استدعاء تابع تقسيم السنة      
          }   
        ////////////////////////////////////////////////////////////////////////////////  
        
         if(off==1)
           { 
             off=0; 
             
            if(memory1==0)segmant1=strh[Y];        //وضع خانة الوقت الحالية في متغير لعرضها على وحدات الاظهار لنظام 24 ساعة  
            else if(memory1==1)segmant1=strh12[Y]; //وضع خانة الوقت الحالية في متغير لعرضها على وحدات الاظهار لنظام 12 ساعة
             
             segmant2=strd[Y];   //وضع خانة التاريخ الحالية في متغير لعرضها على وحدات الاظهار 
             segmant=stry[Y];   //وضع خانة السنة في متغير لعرضها اثناء ضبط السنة فقط
             segmant3=strr[Y];   //وضع خانة الحرارة الحالية في متغير لعرضها على وحدات الاظهار
             segmant4=out_pw[Y]; //لتشغيل وحدة الاظهار المطلوبة 
             ////////////////////////////////////////////////////////

             for (Z=0;Z<8;Z++) //ارسال بايت الى الشيفت ريجيستر لتشغيل وحدات الاظهار بالتسلسل
                   {           //مع ملاحظة اننا وصلنا الشيفت ريجيستر الخاص بالبيانات مع الشيفت
                               //ريجيستر الخاص بتفعيل وحدات الاظهار فهنا نقوم فقط بارسال البايت 
                              // لرقم الوحدة التي سوف يكون دورها بالتشغيل وعند ارسال البيانات
                              //نقوم باخراج القيمة للداتا + تشغيل وحدة الاظهار مع بعض
                              
                    DS=segmant4&0b00000001;SH=1;SH=0;segmant4=segmant4>>1;
                   };
                         
            ////////////////////////////////////////////////////////////////////
                          
              if(Change<5000){out_data(segmant1);PORTD.6=PIND.7;} //اظهار الوقت لمدة اربع ثواني + تشغيل واطفاء ليد الثواني
              if(Change>=5000&&Change<8000){out_data(segmant2);PORTD.6=0;} //اظهار التاريخ لمدة ثلاث ثواني + اطفاء ليد الثواني
              if(Change>=8000&&Change<11000)out_data(segmant3);   //اظهار درجة الحرارة لمدة ثلاث ثواني 
              if(Change>=12000&&SET==5)out_data(segmant);        //لضبط السنة وحفظها دون عرضها اثناء عمل الساعة
              if(Change>=11000&&SET!=5)Change=0;                   //عودة الاظهار من البداية
               Y++;     //متغير اختيار وحدة الاظهار التي تعمل الان وهم اربع وحدات اضهار او ستة اذا كنا نريد وضع وحدتي اظهار اخرى لاظهار الثواني
            /////////////////////////////////////////////////////////////////////////////////
             
           }
        ////////////////////////////////////////////////////////////////////////////  
                                
         if(conter>=3) //تأخير زمني اربعة ميلي ثانية بين عرض كل وحدة اظهار
          { 
           conter=0;
           if(Y>=4)Y=0; //عند الانتهاء من عرض وحدة الاظهار الاخيرة نعود من البداية
           off=1;       // 6ونخفض قيمة الكاونتر من اربعة الى ثلاثة او اثنان =Yاذا اردنا عرض الثواني نضع قيمة 
                        //وهي قيمة التأخير الزمني بين عرض كل وحدة اظهار لكي لانشعر برجفة بوحدات الاظهار
           //////////////////////////////////////////////////////////
           for (W=0;W<16;W++)  //لاطفاء وحدات الاظهار قبل عرض رقم اخر لكي لايحدث تداخل بالارقام                               
                 { 
                   DS=0;
                   SH=1;
                   SH=0;
                   
                 };  
              ST=1;ST=0; 
                
           } 

      }
}

احصائية الشكر والاعجاب - 2 شكراً, 0 عدم اعجاب, 2 اعجاب
شكراً سعيد قادر, عبدالله حجازى ( شكر العضو على هذه المشاركة )
اعجاب سعيد قادر, عبدالله حجازى ( أعجبته المشاركة )
اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )
  

الصورة الرمزية عبدالله حجازى
عبدالله حجازى
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2011
الدولة: مصر .. محافظة دمياط
المشاركات: 1,688
نشاط [ عبدالله حجازى ]
قوة السمعة:110
قديم 26-02-2019, 10:30 PM المشاركة 3   
افتراضي


جميل جدااا أخي الكريم ...

فضلا هل لديك امكانيه لتحويل الكود الي مترجم mikroC PRO for PIC


ahmadazez
:: مهندس جيد ::
تاريخ التسجيل: Mar 2009
المشاركات: 253
نشاط [ ahmadazez ]
قوة السمعة:0
قديم 26-02-2019, 11:40 PM المشاركة 4   
افتراضي


وعليكم السلام اخي الكريم
للاسف لم اعمل على متحكمات البك ولكن اعتقد ان الشرح الموجود في الكود يمكن اي احد من محاولة تحويل الكود الى مايكروسي


Hussain800
:: مهندس متميز ::
تاريخ التسجيل: Apr 2012
المشاركات: 638
نشاط [ Hussain800 ]
قوة السمعة:0
قديم 02-03-2019, 07:07 AM المشاركة 5   
افتراضي


السلام عليكم ورحمة الله وبركاته
اخى بارك الله فيك على هدا المجهود ولاكن ؟؟ انا حملت ملف البروتس وملف الهكس ولاكن اعطتنى الساعة كلها تمانيات ولم تشتغل الساعة نهائيا الرجاء تاكد من البرنامج ممكن تكون اخطاءت فى وضع ملف الهكس فى التحميل ..
تانيا ادا امكن هل ممكن تحويل البرنامج الى معالج atmega 328 على الاردوينو لكى نتمكن من التعديل عليه.
وشكرا وبارك الله فيك على المجهود ونحن فى انتظار تعديل ملف الهكس والرجاء تجربته عندك والتشغيل .
والله الموفق


Hussain800
:: مهندس متميز ::
تاريخ التسجيل: Apr 2012
المشاركات: 638
نشاط [ Hussain800 ]
قوة السمعة:0
قديم 02-03-2019, 07:40 AM المشاركة 6   
افتراضي


لسلام عليكم اخى
تم التجريب على ملف البروتس الاصدار 8 اشتغلت الساعة تمام
لان فى المرة السابقة جربت على ملف البروتس الموجود مع ملفاتك وهو اصدار قديم ولم تشتغل معه الساعة ولم انتبه الى الاصدار الحديت الموجود ايضا ضمن الملفات..
يبقا ياريت ادا امكن التعديل على معالج الاردوينو
وبارك الله فيك والله الموفق


ahmadazez
:: مهندس جيد ::
تاريخ التسجيل: Mar 2009
المشاركات: 253
نشاط [ ahmadazez ]
قوة السمعة:0
قديم 02-03-2019, 10:28 AM المشاركة 7   
افتراضي


وعليكم السلام ورحمة الله وبركاته
نعم اخي على البروتوث القديم لاتعمل لان اي سي udn2981 ليست موجودة في مكتبة البروتوث بالنسبة للتعديل على atmega328 ساقوم برفعه اليوم ان شاء الله


ahmadazez
:: مهندس جيد ::
تاريخ التسجيل: Mar 2009
المشاركات: 253
نشاط [ ahmadazez ]
قوة السمعة:0
قديم 02-03-2019, 10:47 PM المشاركة 8   
افتراضي


لسلام عليكم اخى
تم التجريب على ملف البروتس الاصدار 8 اشتغلت الساعة تمام
لان فى المرة السابقة جربت على ملف البروتس الموجود مع ملفاتك وهو اصدار قديم ولم تشتغل معه الساعة ولم انتبه الى الاصدار الحديت الموجود ايضا ضمن الملفات..
يبقا ياريت ادا امكن التعديل على معالج الاردوينو
وبارك الله فيك والله الموفق
تفضل اخي هي الكود معدل على ATmega328 بالاضافة الى ملف البروتوس

https://up.top4top.net/downloadf-1156y73v91-rar.html

إضافة رد

العلامات المرجعية

«     الموضوع السابق       الموضوع التالي    »
أدوات الموضوع

الانتقال السريع إلى


الساعة معتمدة بتوقيت جرينتش +3 الساعة الآن: 05:36 AM
موقع القرية الالكترونية غير مسؤول عن أي اتفاق تجاري أو تعاوني بين الأعضاء
فعلى كل شخص تحمل مسئولية نفسه إتجاه مايقوم به من بيع وشراء وإتفاق وأعطاء معلومات موقعه
التعليقات المنشورة لا تعبر عن رأي موقع القرية الالكترونية ولايتحمل الموقع أي مسؤولية قانونية حيال ذلك (ويتحمل كاتبها مسؤولية النشر)

Powered by vBulletin® Version 3.8.6, Copyright ©2000 - 2025