پروژه ساعت با AVR- به همراه سورس و شبیه سازی
در این پست برای شما بازدیدگنندگان گرامی پروژه ساعت با میکروکنترلر AVR را قرار داده ام که در پروتئوس نیز شبیه سازی شده است. در این مدار ما از یک عدد LCD کاراکتری با سایز 16×2 برای نمایش ساعت و 3 عدد کلیک برای ریست کردن و افزایش دقیقه و ساعت استفاده کرده ایم. در زیر به توضیح برنامه نوشته شده بر اساس شماره خط می پردازم.
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 |
//www.enee.ir //@eneeir #include <mega16.h> #include <delay.h> #include <stdio.h> // Alphanumeric LCD Module functions #asm .equ __lcd_port=0x18 ;PORTB #endasm #include <lcd.h> unsigned char sec,minut,hour; unsigned char str[10]; // External Interrupt 0 service routine interrupt [EXT_INT0] void ext_int0_isr(void) { minut++; if(minut>=60) hour=0; delay_ms(100); } // External Interrupt 1 service routine interrupt [EXT_INT1] void ext_int1_isr(void) { hour++; if(hour>=24) hour=0; delay_ms(100); } interrupt [TIM1_OVF] void timer1_ovf_isr(void) { // Reinitialize Timer 1 value TCNT1H=0x7A; TCNT1L=0x12; sec++; if(sec>=60){ sec=0;minut++; if(minut>=60){ minut=0;hour++; if(hour>=24) hour=0; }} } void main(void) { // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 31.250 kHz // Timer 1 Overflow Interrupt: On TCCR1A=0x00; TCCR1B=0x04; TCNT1H=0x7A; TCNT1L=0x12; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x04; // External Interrupt(s) initialization // INT0: On // INT0 Mode: Falling Edge // INT1: On // INT1 Mode: Falling Edge // INT2: Off GICR|=0xC0; MCUCR=0x0A; MCUCSR=0x00; GIFR=0xC0; #asm("sei") // LCD module initialization lcd_init(16); while (1) { lcd_clear(); lcd_gotoxy(4,0); sprintf(str,"%02d:%02d:%02d",hour,minut,sec); lcd_puts(str); lcd_putsf("\n @eneeir "); delay_ms(100); }; } |
خط 15 تا خط 20 مربوط به وقفه خارجی شماره صفر می باشد. به این وقفه یک عدد کلید فشاری متصل شده که برای افزایش دقیق در برنامه می باشد.ن وقفه به لبه پایین رونده حساس می باشد. یعنی زمانیکه ما یک سیگنال صفر روش این پایه داشته باشیم برنامه وارد این وقفه شده و دستورات وقفه را اجرا می کند.ما از مقاومت برای یک کردن پایه وقفه استفاده کرده ایم تا وقفه همیشه در یکی از موقعیت های صفر و یا یک قرار داشته باشد.همچنین در روتین وقفه از یک عدد تابع تاخیر استفاده شده و دلیل آن کم کردن اثر نویز روی کلید می باشد.زمانیکه کلید زده می شود ممکن است فرکانس بالایی روی وقفه ایجاد شود به همین خاطر با استفاده از یک عدد تاخیر این فرکانس را خنثی کرده ایم. در صورت نبودن این تاخیر ممکن است مقدار دقیق تا چند عدد افزایش داشته باشد.
خط شماره 28 تا 40 مربوط به وقفه تایمر 1 می باشد.مقدار متغییر ها طوری تنظیم شده است تا هر یک ثانیه برنامه به وقفه مراجعه کرده و ثانیه را یک عدد افزایش دهد. در روتین این وقفه برنامه ساعت قرار دارد.خط شماره 48 تا 51 مربوط به تنظیم تایمر شماره 1 می باشد.
خط شماره 53 برای فعال کردن اینتراپت تایمر شماره یک می باشد.خط شماره 60 تا 63 برای فعال کردن واحد های وقفه خارجی و تنظیم آنها روی لبه پایین رونده می باشد.خط شماره 64 با استفاده از یک دستور اسمبلی وقفه ها را فعال کرده است. از خط شماره 67 تا 77 نیز مربوط به برنامه نمایش ساعت و رشته ها روی LCD می باشد.
دقت داشته باشید که در روتین وقفه ها باید کمترین دستور ها نوشته شود. در صورت نوشته شدن دستوارت زیاد ممکن است به علت نرسیدن وقفه به انتهای روتین وقفه دیگری اتفاق بیافتد که در اینصورت آن وقفه اتفاق افتاده اجرا نخواهد شد.
در زیر می توانید سورس برنامه را که در نرم افزار پروتئوس نیز شبیه سازی شده است را دانلود کنید.