در این پست از سایت اِمیک, پروژه کنترل سرعت نوشتن متن روی LCD کاراکتری با میکروکنترلر AVR قرار داده شده است. در این پروژه ما توسط یک ولوم می توانیم سرعت نمایش یک متن روی LCD را کنترل کنیم. در ادامه شماتیک این پروژه را مشاهده می کنید. در این پروژه از میکروکنترلر ATmega16 استفاده شده است.

همانطور که مشاهده می کنید, LCD کاراکتری به پورت D میکروکنترلر متصل شده است. پتانسیومتر RV2 نیز برای تنظیم کنتراست یا میزان روشنایی LCD کاراکتری استفاده شده است.
به وسیله ولوم RV1 می توانید سرعت نمایش متن روی LCD کاراکتری را کنترل کنید. این ولوم به پایه 40 میکروکنترلر (پین 0 از پورت A) که در واقع یکی از ورودی های انالوگ میکروکنترلر است متصل شده است. با تغییر ولوم RV1 ولتاژ روی پایه 40 میکروکنترلر بین 0 تا 5 ولت تغییر می کند. ما این ولتاژ را توسط ADC میکروکنترلر اندازه گیری می کنیم و با توجه به مقدار این ولتاژ, سرعت نمایش متن روی LCD کاراکتری تنظیم می شود.
توجه کنید که پایه های تغذیه میکروکنترلر (پایه 10 و 11) را که در شماتیک بالا نیست, فراموش نکنید به تغذیه 5 ولت متصل کنید و همچنین پایه های 30 و 32 میکرو را هم بدلیل استفاده از ADC باید به مثبت تغذیه متصل کنیم. در انتهای مطلب می توانید کلیپ تست عملی پروژه را مشاهده کنید.

برنامه کدویژن:
در این پروژه فرکانس میکروکنترلر 1 مگاهرتز تنظیم شده است. در زیر برنامه نوشته شده به زبان C و کامپایلر کدویژن را مشاهده می کنید:
|
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 |
////////// WWW.EMIC.IR ////////// #include <mega16a.h> #include <delay.h> #include <alcd.h> //ايجاد مي شوند adc که توسط خود کدويژن با فعالسازي adc از خط 7 تا 16 دستورات مربوط به// #define ADC_VREF_TYPE ((0<<REFS1) | (0<<REFS0) | (0<<ADLAR)) unsigned int read_adc(unsigned char adc_input) { ADMUX=adc_input | ADC_VREF_TYPE; delay_us(10); ADCSRA|=(1<<ADSC); while ((ADCSRA & (1<<ADIF))==0); ADCSRA|=(1<<ADIF); return ADCW; } void main(void) { int i,a; char text[]={'W','W','W','.','E','M','I','C','.','I','R'}; //درون يک ارايه براي نمايش روي ال سي دي WWW.EMIC.IR قرار دادن حروف عبارت// //ميکرو ورودي شده است A در زير پورت// DDRA=(0<<DDA7) | (0<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) | (0<<DDA2) | (0<<DDA1) | (0<<DDA0); PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0); //ميکرو خروجي شده است D در زير پورت// DDRD=(1<<DDD7) | (1<<DDD6) | (1<<DDD5) | (1<<DDD4) | (1<<DDD3) | (1<<DDD2) | (1<<DDD1) | (1<<DDD0); PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0); //که با توجه به تنظيمات ما در محيط کدويزارد ايجاد مي شوند adc از خط 33 تا 35 رجيسترهاي مربوط به// // ADC initialization // ADC Clock frequency: 500/000 kHz // ADC Voltage Reference: AREF pin // ADC Auto Trigger Source: ADC Stopped ADMUX=ADC_VREF_TYPE; ADCSRA=(1<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (1<<ADPS0); SFIOR=(0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0); lcd_init(16); while (1) { for(i=0;i<11;i++) { //روبرو 11 بار تکرار مي شود for حلقه// a=read_adc(0); //مي ريزد a دستور روبرو با توجه به مقدار ولتاژ انالوگ روي پين 40 ميکرو عددي بين 0 تا 1023 خوانده و درون متغير// lcd_gotoxy(i,0); //مشخص مي کند for دستور روبرو موقعيت نمايش حروف روي ال سي دي را باتوجه به شمارش حلقه// lcd_putchar(text[i]); //را يکي يکي روي ال سي دي کاراکتري نمايش مي دهد WWW.EMIC.IR حروف عبارت for دستور روبرو با شمارش حلقه// delay_ms(a); //تغيير مي کند a يک تاخير زماني ايجاد مي کند. با تغيير پتانسيومتر مقدار متغير a دستور روبرو با توجه به مقدار متغير// } delay_ms(1000+a); //يک تاخير زماني ايجاد مي کند a دستور روبرو با توجه به مقدار متغير// for(i=10;i>=0;i--) { //را که قبلا روي ال سي دي نوشته بوديم يکي يکي پاک مي کند WWW.EMIC.IR روبرو و دستورات درون ان حروف عبارت for حلقه// a=read_adc(0); lcd_gotoxy(i,0); lcd_putsf(" "); delay_ms(a); } } } |
توضیحات قسمت های مهم برنامه نوشته شده, اگر سوالی داشتید می توانید در قسمت نظرات مطرح کنید. فایل های کدویژن و شبیه سازی پروتئوس را هم می تونید از انتهای مطلب دانلود کنید.
کلیپ تست عملی پروژه :
پسورد فایل زیپ : www.emic.ir
نظر یادتون نره….





سلام میشه فیلم بستنش روی برد بورد را بگذارید