
چگونه با شیفت رجیستر و آی سی لچ یک ابر شمارنده طراحی کنیم؟
مثالی که در ادامه مشادهده خواهید کرد یک شمارنده ۲۴ رقم با استفاده از آی سی لچ ۷۴۵۷۳ و شیفت رجیستر ۷۴۵۹۵ می باشد
این مثال برای درک بهتر شما عزیزان از نحوه کار آی سی لچ و شیفت رجیستر می باشد
در مورد عکس بالا نباید به هیچ عنوان وحشت زده شوید! توصیه می کنم اگر نحوه عملکرد ای سی لچ و شیفت رجیستر را نمی دانید یا یاد ندارید آموزش هر کدام جداگانه در سایت موجود است ابتدا برگردید مطالعه کنید و سپس این پست را دنبال کنید
اگر به عکس بالا نگاه کنید ما از ۲۴ عدد سون سگمنت تکی استفاده کرده ایم برای اینکه پورت کافی برای راه اندازی تک تک سون سگمنتها را نداریم مجبوریم از المانی استفاده کنیم که دیتای هر سون سگمنت را در خود ذخیره کند و همینطور هر وقت بخواهیم باید بتوانیم این اطلاعات را آپدیت کنیم
برای این المان از ای سی لچ ۷۴۵۷۳ استفاده کرده ایم و روش کار بدین صورت است که ابتدا دیتای مربوط به سون سگمنت رقم اول را در پورت ورودی آی سی لچ قرار می دهیم سپس آی سی لچ سون سگمنت اول را انتخاب می کنیم تا دیتا به خروجی راه یابد نحوه انتخاب آی سی لچ هم توسط شیفت رجیستر ۷۴۵۹۵ صورت می گیرد
بدین صورت که دیتای سون سگمنت را در ای سی لچ سون سگمنت اولی قرار می دهیم سپس توسط شیفت رجیستر ای سی لچ سون سگمنت اولی را انتخاب می کنیم تا دیتا در خروجی لود می شود ،خروجی هر ای سی لچ هم به سون سگمنت وصل می شود بنابراین دیتا به سون سگمنت خواهد رسید بعد از اینکه دیتای رقم اول در سون سگمنت لود کردیم به ترتیب این مراحل را برای سون سگمنت دوم بعد سوم و تا رقم ۲۴ این کار را انجام می دهیم
نکته:در هر لحظه تنها یک ای سی لچ باید فعال شود
بنابراین این شمارنده ۸۰ بیتی می تواند تا عدد ۹۹۹,۹۹۹,۹۹۹,۹۹۹,۹۹۹,۹۹۹,۹۹۹,۹۹۹ را بشمارد
این عدد به حروف می شود:
این پروژه صرفا جنبه آموزشی دارد ، اگر از امروز بخواهید این شمارنده را فعال کنید و میکروکنترلر با سرعت کریستال ۸ مگا هرتز شروع به شمارش کند شاید بعد از چند سال دوباره عدد به صفر برسد…
برنامه در کامپایلر کدویژن نوشته شده و شما با الهام گیری از کد می توانید پروژه های متنوعی انجام دهید.
برنامه در کامپایلر کدویژن:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
/******************************************************* This program was created by the CodeWizardAVR V3.12 Advanced Automatic Program Generator © Copyright 1998-2014 Pavel Haiduc, HP InfoTech s.r.l. http://www.hpinfotech.com Project : Version : Date : 12/18/2020 Author : Company : MCULIBRARY.IR Comments: Chip type : ATmega8 Program type : Application AVR Core Clock frequency: 8.000000 MHz Memory model : Small External RAM size : 0 Data Stack size : 256 *******************************************************/ #include <mega8.h> #include <delay.h> #define clock PORTB.0 #define data_in PORTB.1 #define load_data PORTB.2 #define en1 PORTC.0 #define en2 PORTC.1 #define en3 PORTC.2 #define data_segment PORTD unsigned char value1,value2,value3 , i,i2; unsigned segment_data_var[10]={63,6,91,79,102,109,125,7,127,111}; unsigned char counter[24],flag[24]; /////////////////////////// void disable_all(){ for(i=0;i<24;i++){ data_in=0; clock=1; clock=0; } load_data=1; load_data=0; } ///////////////////////// void enable_segment(unsigned char value,unsigned char data){ unsigned char value_local=0; disable_all(); data_segment=data; value1=0;value2=0;value3=0; if(value<9){value1=(1<<(value-1));} else if(value<17){value2=(1<<(value-9));} else if(value<25){value3=(1<<(value-17));} for(i=0;i<8;i++){ data_in=(value3>>(7-i))&0x01; clock=1; clock=0; } for(i=0;i<8;i++){ data_in=(value2>>(7-i))&0x01; clock=1; clock=0; } for(i=0;i<8;i++){ data_in=(value1>>(7-i))&0x01; clock=1; clock=0; } load_data=1; load_data=0; } ////////////////////////////////////////////////////////////////////////// //main() ////////////////////////////////////////////////////////////////////////// void main() { DDRB=0x0f; DDRD=0xFf; clock=0; data_in=0; load_data=0; disable_all(); for(i=0;i<24;i++){ if(counter[i]>9) counter[i]=0; } while(1){ for(i=0;i<24;i++){ if(counter[i]==10){counter[i+1]++;counter[i]=0;} } for(i2=0;i2<24;i2++){ enable_segment(i2+1,segment_data_var[counter[i2]]); } /// counter[0]++; /// } } |
برنامه شامل دو تابع disable_all و enable_segment و یک تابع اصلی main می باشد
تابع disable_all:
این تابع شیفت رجیستر ها را کنترل می کند هر شیفت رجیستر مسئولیت کنترل هشت عدد آی سی لچ را بر عهده دارد با استفاده از تابع disable_all حالت انتخاب همه ی آی سی های لچ را غیر فعال می کنیم
تابع enable_segment:
این تابع هم در هربار فراخوانی تنها یکی از ای سی های لچ را فعال می کند این تابع دو پارامتر دارد پارامتر اول مقدار یک تا ۲۴ را می پذیرد و این به این معنی می باشد که اگر مقدار پارامتر اول را برابر با یک قرار دهید ای سی لچ انتخاب می شود و دیتا به سون سگمنت رقم اولی فرستاده خواهد شد اگر مقدار پارامتر را ۲ قرار دهید دیتا به سون سگمنت رقم دوم فرستاده خواهد شد و همینطور می توانید یک حلقه ۱ تا ۲۴ تعریف کنید و دیتا را به سون سگمنتها بفرستید
پارامتر دوم این تابع هم دیتا می باشد اگر من بخواهم که روی سون سگمن کاتد مشترک عدد ۵ نمایش داده شود پس مثلما پارامتر دوم را باید برابر با ۱۰۹ قرار دهید یا می توانید دیتای اعداد ۰ تا ۹ را در یک ارایه ذخیره کنید و دیتا را از اریه بخوانید
در تابع اصلی هم ابتدا همه سلکتور یا انتخابگر های ای سی های لچ را غیر فعال کردیم سپس با استفاده از حلقه for شروع به ارسال دیتا برای نمایش در سون سگمنت استفاده کردیم.
می توانید برنامه و فایل شبیه ساز را از باکس دانلود ، دانلود کنید…
تهیه و تنظیم :mculibrary.ir
دانلود
- برای شبیه سازی نیاز به پروتیوس 8.10 به بالا دارید.
دیدگاهها (0)