السلام عليكم ورحمه الله
تفضل أخي
كود:
// ENG ABDALLA HYGAZY //
#define LED1 PORTB.F0
#define LED2 PORTB.F1
#define OFF =0;
#define ON =1;
unsigned int X1=0,X2=0,X3=0;
unsigned int DATA1=0,DATA2=0;
unsigned int TEMR1=0,TEMR2=0,TEMR3=0;
//Timer0
//Prescaler 1:8; TMR0 Preload = 6; Actual Interrupt Time : 1 ms
//Place/Copy this part in declaration section
void InitTimer0(){
OPTION_REG = 0x82;
TMR0 = 6;
INTCON = 0xA0;
}
void Interrupt(){
if (TMR0IF_bit){
TMR0IF_bit = 0;
TMR0 = 6;
//Enter your code here
if( DATA2==0){ TEMR1++; }
if( X1==1 && X2==1 ) { DATA1++; LED2 ON }
if( DATA1==1000 ) { LED2 OFF DATA1=0; X2=0; }
//******************************************************//
if( TEMR1==1000 ) { TEMR2++; TEMR1=0; }
if( TEMR2==60 ) { TEMR3++; TEMR2=0; }
if( TEMR3==5 ) { TEMR3=0; TEMR2=0; TEMR1=0; DATA2=1; PORTB=0; }
}
}
void main() {
PORTB=0; TRISB=0;
PORTA=0; TRISA=7;
InitTimer0();
// dcon1=0x06;
CMCON=7;
while(1){
if( DATA2==0 )
{
if(PORTA.F0==1){ PORTB.F0 =~ PORTB.F0;
if(PORTB.F0==1){ X1=1; } else X1=0;
if(PORTB.F0==1){ X3=1; } else X3=0; delay_ms(250);}
if(PORTA.F1==1 && X1==1 && X3==1 ){X2=1; X3=0; delay_ms(250);}
if(PORTA.F2==1){ delay_ms(10); PORTB.F2 =1; } else PORTB.F2=0;
}
}
}
بالنسبه لضبط الوقت في البرنامج هذا استخدم التايمر الداخلي بمقدار واحد ميلي ثانيه للدورة الواحدة
لو تلاحظ المتغير
هوا يعد 1000 دورة لكي يذيد المتغير المسؤل
عن الثواني بواحد
وهنا تم حسابات الوقت في البرنامج بأن كل 1000 دورة تساوي واحد ثانيه ..
ولأن العداد الداخلي لا يكون دقيق في عد الأوقات الكبيرة مثل 5 قائق فهنا تحدث الخلاف في الوقت
الحقيقي .. والحل هنا كما تفضلت .. انت .. تقوم بذيادة أو انقاص الرقم الشرطي امام المتغير
لكي تحصل علي الوقت الحقيقي ..
بالنسبه لختيار الوقت في البرنامج
كما تفضلت به وقسمت عدد 5 علي 2.5 وهوا عدد الدقائق ..
هنا ايضا يوجد متغير للحساب الواحد ثانيه الخاصه باليد الثاني
ولاحظ هنا
كود:
if( DATA2==0){ TEMR1++; }
if( X1==1 && X2==1 ) { DATA1++; LED2 ON }
if( DATA1==1000 ) { LED2 OFF DATA1=0; X2=0; }
لو تلاحظ يوجد متغير اسمه
ولاحظ الرقم امامه = 1000 وهنا هي 1000 ميلي ثانيه و = واحد ثانيه اللتي ينتظرها الليد الثاني قبل أن ينطفئ
وهنا يمكنك التلاعب في الوقت واختيار ما تشاء .. مثلا يمكنك ان تجعل وقت الديلاي لليد الثاني 10 ثواني
فقط اضف صفر لكل يصبح الرقم 10000 وهكذا لو تريد دقيقه يصبح الرقم 100000 وهنا يكون العد
بالميلي ثانيه يمكنك ضبط الوقت كما تشاء
ايضا توجد مشاريع متقدمه بستخدام شاشه يمكنك منها اختيار وضبط الأوقات للبرنامج كما تشاء بدون اعادة برمجه المتحكم
بالتوفيق
تحياتي ولا تشكرني علي واجب