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

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

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:332
قديم 19-04-2012, 12:16 PM المشاركة 1   
افتراضي أفضل طريقة لانتخاب وحدات العرض 7-Segment عن طريق TIMER0 Twitter FaceBook Google+



أفضل طريقة لانتخاب وحدات العرض 7-Segment عن طريق TIMER0
عرض جميع وحدات العرض فى نفس الوقت غير ممكن لأن كل وحدة تمثل رقم أو خانة لها معلومات مختلفة مطلوب عرضها , الحل هو عرض وحدة واحدة فى كل مرة . إذا تم عرض جميع الوحدات بتتابع سريع فسوف تظهر بالنسبة للعين كما لو كانت تعرض فى نفس الوقت , هذه الطريقة تسمى "الانتخاب" multiplexing .





من الأفضل تنفيذ خوارزمية الانتخاب باستخدام المؤقت TIMER0 . عن طريق جعل السجل TMR0 يحدث له طفحان overflow وتوليد مقاطعة كل 5 ms , حيث يمكن عرض كل وحدة كل 5 msومن ثم يكون الزمن الكلى للعرض حوالى 20 ms (4 x 5ms) وهذا الزمن بالفعل كافى لتجنب الإرتعاش الذى يمكن أن يظهر للعين .

اعلانات

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:332
قديم 19-04-2012, 12:20 PM المشاركة 2   
افتراضي


عداد تصاعدى تنازلى باستخدام 2 و 4 وحدةعرض 7 SEGMENT
الدائرة الكهربية المستخدمة فى لوحة التجارب :

ملاحظات :
· وحدات العرض من نوع الأنود المشترك أنودات الوحدات (الخانات) DIG1-DIG4 متصلة بالمنفذ PORTA(RA0-RA3) خلال ترانزستورات التحكم نوع PNP .
· الشرائح السبعة A-G متصلة بالمنفذ PORTD(RD0-RD6) خلال مقاومات تحديد التيار .
· مفتاح ( حساس) التزايد متصل بالطرف RB0 ومفتاح التناقص متل بالطرف RB1 .

اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )
  

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:332
قديم 19-04-2012, 12:21 PM المشاركة 3   
افتراضي


البرنامج الأول باستخدام 2 وحدة عرض أى أن مدى التزايد والتناقص هو 0-99:

كود:
/*
UP Down Counter with two 7-Segment Display Multiplexing
In this project two common anode 7-segment LED displays are connected to
PORTD of a PIC16F877A  * 4MHz .
Digit 1 (left digit) enable pin is connected to port pin RA0 ( TENS)
and digit 2 (right digit) enable pin is connected to port pin RA1 (ONES) .
The program counts up -down from buttons at RB0 , RB1 .
The display is updated in a timer interrupt service routine at every 5ms by :
Reload TMR0=100 & prescaler ration 1:32>> imer interrupt service routine at
 (255-100) *32us=5ms = scanning time
MikroC PRO
ENG.F.ABDELAZIZ
http://www.eeecb.com/vb/index.php
*/
#define TENS_DIG PORTA.F0 //tens unit
#define ONES_DIG PORTA.F1//ones unit
//Global variable
unsigned char Count = 0;
unsigned char Flag = 0;
bit oldstate1;
bit oldstate2;
//-Function to Return mask for common anode 7-seg. display
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;
 } //case end
}
كود:
// TMR0 timer interrupt service routine. The program jumps to the ISR at every 5ms. void interrupt () { //Local variable unsigned char TENS_SEG, ONES_SEG; // tens= left unit &ones= right unit TMR0 = 100; // Re-load TMR0>>255-100=155usx32(prescaler)=5ms INTCON = 0x20; // >>>>Set T0IE and clear T0IF<<<< Flag = ~ Flag; // Toggle Flag as switch if(Flag == 0) // Do digit 1 { ONES_DIG = 1; // Disable digit 2 TENS_SEG = Count / 10; // TENS_SEG >>tens PORTD = mask(TENS_SEG); // Send to PORTD TENS_DIG = 0; // Enable digit 1>>RA0 } else { // Do digit 2 TENS_DIG = 1; // Disable digit 1 ONES_SEG = Count % 10; // ONES_SEG >> ones PORTD = mask(ONES_SEG); // Send to PORTD ONES_DIG = 0; // Enable digit 2 >>RA1 } } // // Start of MAIN Program. configure PORTA and PORTD as outputs. // In addition, configure TMR0 to interrupt at every 10ms // void main() { ADCON1=0X07; //set A PORT general I/O TRISD= 0; // PORTD are outputs TRISA = 0; // RA0, RA1 are outputs TENS_DIG = 1; // Disable digit 1 ONES_DIG = 1; // Disable digit 2 // Configure TMR0 timer interrupt OPTION_REG = 0xC4; // Prescaler = 32 TMR0 = 100; // Load TMR0L with 100 INTCON = 0xA0; // Enable TMR0 interrupt //Delay_ms(1000); for(;;) // Endless loop { //UP Count if (Button(&PORTB, 0, 1, 0)) { // Button 0 : Detect logical 0 oldstate1 = 1; // Update flag } if (oldstate1 && Button(&PORTB, 0, 1, 1)) { // Detect zero-to-one transition Count = Count +1; oldstate1 = 0; // Update flag } //DOWN Count if(Button(&PORTB,1,1,0)){ // Button 1 : Detect logical 0 oldstate2 = 1; // Update flag } if (oldstate2 && Button(&PORTB, 1, 1, 1)) { // Detect zero-to-one transition Count = Count -1; oldstate2 = 0; // Update flag } if (Count > 99) // if it's more than 99 go to 0; Count = 0; } }


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:332
قديم 19-04-2012, 12:23 PM المشاركة 4   
افتراضي


البرنامج الثانى باستخدام 4 وحدة عرض أى أن مدى التزايد والتناقص هو 0-9999:


كود:
/*
UP Down Counter with Four 7-Segment Display Multiplexing
In this project four common anode 7-segment LED displays are connected to
PORTD of a PIC16F877A  * 4MHz .
Digit 1 (left digit) enable pin is connected to port pin RA0 ( Thousands)
and digit 2  enable pin is connected to port pin RA1 (Hundreds) .
and digit 3  enable pin is connected to port pin RA2 (Tens) .
and digit 4  enable pin is connected to port pin RA3 (Ones) .
The program counts up -down from buttons at RB0 , RB1 .
The display is updated in a timer interrupt service routine at every 5ms by :
Reload TMR0=100 & prescaler ration 1:32>> imer interrupt service routine at
 (255-100) *32us=5ms = scanning time
MikroC PRO
ENG.F.ABDELAZIZ
http://www.eeecb.com/vb/index.php
*/
#define Thous_Dig  PORTA.B0 //Thousands  unit
#define Hund_Dig  PORTA.B1//Hndreds unit
#define Tens_Dig PORTA.B2//Tens unit
#define Ones_Dig PORTA.B3//ones unit
 
//Global variable
unsigned char Count = 0;
unsigned char Flag = 0;
bit oldstate1;
bit oldstate2;
//-Function to Return mask for common anode 7-seg. display
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;
 } //case end
}
// TMR0 timer interrupt service routine. The program jumps to the ISR at every 5ms.
void interrupt ()
{
//Local variable
unsigned char Thous_Seg,Hund_Seg,Tens_Seg, Ones_Seg;
TMR0 = 100;     // Re-load TMR0>>255-100=155usx32(prescaler)=5ms
INTCON = 0x20;     // >>>>Set T0IE and clear T0IF<<<<
if(Flag == 0)     // Do digit 1
{
Ones_Dig = 1;
Tens_Dig = 1;
Hund_Dig = 1;
Thous_Seg = Count / 1000;    // TENS_SEG >>tens
PORTD = mask(Thous_Seg);    // Send to PORTD
Thous_Dig = 0;     // Enable digit 1>>RA0
}
 else
if(Flag == 1)     // Do digit 1
{
Ones_Dig = 1;
Tens_Dig = 1;
Thous_Dig = 1;
Hund_Seg = (Count / 100)%10;    // TENS_SEG >>tens
PORTD = mask(hund_Seg);    // Send to PORTD
Hund_Dig=0;     // Enable digit 1>>RA0
}
else
if(Flag == 2)     // Do digit 1
{
Ones_Dig = 1;
Hund_Dig = 1;
Thous_Dig = 1;
Tens_Seg = (Count / 10)%10;    // TENS_SEG >>tens
PORTD = mask(Tens_Seg);    // Send to PORTD
Tens_Dig=0;     // Enable digit 1>>RA0
}
 else
if(Flag == 3)     // Do digit 1
{
Tens_Dig = 1;
Hund_Dig = 1;
Thous_Dig = 1;
Ones_Seg = Count %10;    // TENS_SEG >>tens
PORTD = mask(Ones_Seg);    // Send to PORTD
Ones_Dig = 0;     // Enable digit 1>>RA0
}
 Flag =Flag++;
if (Flag > 3)    Flag=0;
    // Toggle Flag as switch
كود:
} // // Start of MAIN Program. configure PORTA and PORTD as outputs. // In addition, configure TMR0 to interrupt at every 10ms // void main() { ADCON1=0X07; //set A PORT general I/O TRISD= 0; // PORTD are outputs PORTD=0XFF; TRISA = 0; // outputs PORTA=0XFF; TRISB=0XFF; PORTB=0XFF; // Configure TMR0 timer interrupt OPTION_REG = 0xC4; // Prescaler = 32 TMR0 = 100; // Load TMR0L with 100 INTCON = 0xA0; // Enable TMR0 interrupt for(;;) // Endless loop { //UP Count if (Button(&PORTB, 0, 1, 0)) { // Button 0 : Detect logical 0 oldstate1 = 1; // Update flag } if (oldstate1 && Button(&PORTB, 0, 1, 1)) { // Detect zero-to-one transition Count = Count +1; oldstate1 = 0; // Update flag } //DOWN Count if(Button(&PORTB,1,1,0)){ // Button 1 : Detect logical 0 oldstate2 = 1; // Update flag } if (oldstate2 && Button(&PORTB, 1, 1, 1)) { // Detect zero-to-one transition Count = Count -1; oldstate2 = 0; // Update flag } if (Count > 9999) // if it's more than 9999 go to 0; Count = 0; } }

إضافة رد

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

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

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


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

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