قسم الميكروكنترولر والروبوت ودوائر الاتصال بالحاسب الاليقسم المتحكمات الـ microcontroller و المعالجات microprocessor و التحكم الرقمي بالكمبيوتر CNC والانظمة الآلية والروبوت Robots
اريد عمل مشروع عداد تصاعدي من 0 الي 9 مكون من 7segment واحدة و pic16f877a بحث اقوم بضبطه علي خمسه مثلا يعد لحد خمسه ثم يشغل ريلاي وتصفير للعداد
اشكركم جزيلا
اريد عمل مشروع عداد تصاعدي من 0 الي 9 مكون من 7segment واحدة و pic16f877a بحث اقوم بضبطه علي خمسه مثلا يعد لحد خمسه ثم يشغل ريلاي وتصفير للعداد
اشكركم جزيلا
السلام عليكم
تفضل اخي
كود:
// ENG/Adalla Hygazy //
// 7SEGMENT Counter //
// PIC16F877A //
// KH 8M //
// DATA 2020/8/12 //
unsigned short mask(unsigned short num);
unsigned int SEMENT=0,m1=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(PORTD.F5==0){ PORTB=mask(SEMENT); }
if(PORTD.F5==1){ PORTB=mask(m1); }
if(PORTD.F3==1){ SEMENT=0; PORTC.F0=0; }
}
}
void main(){
InitTimer0();
TRISB=0; PORTB=0;
TRISC=0; PORTC=0;
TRISD=248; PORTD=0;
while(1){
if(PORTD.F5==1)
{
if(PORTD.F7==1){m1++; delay_ms(250); }
if(PORTD.F6==1){m1--; delay_ms(250); }
if( m1>9 ){ m1=0; }
if( m1<0 ){ m1=9; }
}
if( m1 >0 && SEMENT == m1){PORTC.F0=1; }
if(PORTD.F4==1){delay_ms(10); while(PORTD.F4==1){ } SEMENT++; }
}
}
unsigned short mask(unsigned short num){
switch (num){
case 0 : return 0xC0;
case 1 : return 0xF9;
case 2 : return 0xA4;
case 3 : return 0xB0;
case 4 : return 0x99;
case 5 : return 0x92;
case 6 : return 0x82;
case 7 : return 0xF8;
case 8 : return 0x80;
case 9 : return 0x90;
}
}
استمر بالضغط علي مفتاح SET + UP لضبط واختيار رقم العداد
استمر بالضغط علي مفتاح SET + DOWEN لضبط واختيار رقم العداد
مفتاح ++ TEST كل ضغطه ليبدأ تشغيل العداد
مفتاح REST لتصفير العداد
توقعت من المهندس الكبير عبد الله حجازي المساعدة نظرا لانه ساعدني كثير فى السابق
الف شكر لحضرتك
بس ممكن تعديل بسيط لو امكن
طبعا العداد بيعد الضغطات بتاعت المفتاح TEST هل ممكن العداد يعد طول ما انا ضاغط على المفتاح
بمعني فى حاجة هتضغط على المفتاح على طول عاوز بعد العدد اللي انا ضابطه يفصل الريلاي
بمعني انا عاوز مفتاح ال TEST يبقي مفتاح تشغيل للعداد وبعدين العداد يعد لوحده
ومعلش هل ممكن لما العداد يوصل للرقم اللي انا ضابطه يرجع للصفر تاني
توقعت من المهندس الكبير عبد الله حجازي المساعدة نظرا لانه ساعدني كثير فى السابق
الف شكر لحضرتك
بس ممكن تعديل بسيط لو امكن
طبعا العداد بيعد الضغطات بتاعت المفتاح TEST هل ممكن العداد يعد طول ما انا ضاغط على المفتاح
بمعني فى حاجة هتضغط على المفتاح على طول عاوز بعد العدد اللي انا ضابطه يفصل الريلاي
بمعني انا عاوز مفتاح ال TEST يبقي مفتاح تشغيل للعداد وبعدين العداد يعد لوحده
ومعلش هل ممكن لما العداد يوصل للرقم اللي انا ضابطه يرجع للصفر تاني
تفضل أخي
تم تعديل واضافة ما طلبته
لاحظ الصور مع الشرح
أخي توجد خطوات لضبط العداد لكي يعمل بشكل صحيح
حضرتك طلبت أن العداد يبدأ في العد بشكل مستمر عند قفل المفتاح TEST اللذي اصبح
اسمه بعد التعديل START
وهنا لازم نحدد للعداد وقت العد يعني مثلا هيذيد العدد بواحد كل سانيه ؟
وهنا موجود مفتاح لضبط سرعة العداد تبدأ بواحد سانيه الي 9 سواني ..
انظر الصورة اعلاة تجد مفتاح اسمه TEMR_SET استمر بالضغط
علي هذا المفتاح + مفتاح UP أو DOWEN
لأختيار وضبط سرعة تبديل العدد
ولاحظ عند الضغط علي مفتاح TEMR_SET يضوي ليد اسمة Time ليخبرك أنك تختار وقت التبديل
أو سرعة العداد
بعد أختيار سرعة تبديل العداد حرر مفتاح TEMR_SET
وانتقل الي مفتاح SET_counter واستمر بالضغط + مفتاح UP أو DOWEN لضبط رقم العدد
ثم حرر مفتاح SET_counter واضغط علي مفتاح START ليبدأ العداد في العد
صورة توضح اختيار العدد
صورة توضح وصول العداد للرقم المختار
البرنامج الجديد
كود:
// ENG/Adalla Hygazy //
// 7SEGMENT Counter //
// PIC16F877A //
// KH 8M //
// DATA 2020/8/12 //
unsigned short mask(unsigned short num);
unsigned int SEMENT,Time,counter,X1,X2;
//----------------------------------------------------------------------------------//
//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(PORTD.F5==0 && X2==0){ PORTB=mask(SEMENT); }
if(PORTD.F5==1 && X2==0){ PORTB=mask(counter); PORTC.F6=1; }
else PORTC.F6=0;
if(PORTD.F2==1 ){ PORTB=mask(Time);X2=1; PORTC.F7=1; }
else PORTC.F7=0;
if(PORTD.F2==0 ){ X2=0;}
}
}
void TEMER()
{
for(X1=0; X1<Time; X1++){ delay_ms(1000); }
}
void main(){
InitTimer0();
TRISB=0; PORTB=0;
TRISC=0; PORTC=0;
TRISD=252; PORTD=0;
while(1){
if(PORTD.F2==1)
{
if(PORTD.F7==1){Time++; delay_ms(250); }
if(PORTD.F6==1){Time--; delay_ms(250); }
if( Time>9 ){ Time=0; }
if( Time<0 ){ Time=9; }
}
if(PORTD.F4==1 && counter>0 && PORTD.F5==0 && PORTD.F2==0 ){ TEMER();SEMENT++; }
if( counter >0 && SEMENT == counter){PORTC.F0=1;delay_ms(2000); PORTC.F0=0; SEMENT=0;}
if(PORTD.F5==1)
{
if(PORTD.F7==1){counter++; delay_ms(250); }
if(PORTD.F6==1){counter--; delay_ms(250); }
if( counter>9 ){ counter=0; }
if( counter<0 ){ counter=9; }
}
}
}
unsigned short mask(unsigned short num){
switch (num){
case 0 : return 0xC0;
case 1 : return 0xF9;
case 2 : return 0xA4;
case 3 : return 0xB0;
case 4 : return 0x99;
case 5 : return 0x92;
case 6 : return 0x82;
case 7 : return 0xF8;
case 8 : return 0x80;
case 9 : return 0x90;
}
}
الساعة معتمدة بتوقيت جرينتش +3 الساعة الآن: 07:37 AM
موقع القرية الالكترونية غير مسؤول عن أي اتفاق تجاري أو تعاوني بين الأعضاء
فعلى كل شخص تحمل مسئولية نفسه إتجاه مايقوم به من بيع وشراء وإتفاق وأعطاء معلومات موقعه
التعليقات المنشورة لا تعبر عن رأي موقع القرية الالكترونية ولايتحمل الموقع أي مسؤولية قانونية حيال ذلك (ويتحمل كاتبها مسؤولية النشر)