leilooooon
تازه وارد
ارسالها: 3
موضوعها: 1
تاریخ عضویت: شهریور ۱۳۹۵
تشکرها : 0
( 1 تشکر در 1 ارسال )
|
RE: توضیح برنامه
سلام
واقعا ممنون که کمکم میکنین.
کد php: <include <mega8.h# <include <delay.h# <include <i2c.h# <include <m2s.h# <include <ds1307.h# <include <stdio.h# <include <1wire.h#
<include <ds18b20.h# include "74hc595.h"
در دستورات زیر نام یک پین از میکرو تغییر میدهیم و در برنامه از همین نام استفاده میکنیم
کد php: #define OE PORTB.1 #define MR PORTB.3
متغییر های مورد نیاز در برنامه را تعریف میکنیم
کد php: ;int ys,ms,ds ;unsigned char ds1820_devices [unsigned char rom_codes[MAX_DS1820][9 ;unsigned char temp,dis=0 ;int n // Declare your global variables here ;unsigned char a,hour,min,sec,week_day,day,month,year ; unsigned char buf[32],i=0,j // Declare your global variables here ;{unsigned char col[9]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80
کد های عدد از صفر تا 9 و علامت ها در درون این ثابت میباشد و برای نمایش یک عدد کد آن را از درون این ثبات میخوانیم .
کد php: \}=[]const unsigned char TEXT \ // ..@@@@..,0x3C \ // .@....@. 0x42 \ // .@....@.0x42, \ // ..@@@@.. 0x3C, \ // ........ 0x00, \ // ........ 0x00, \ // .@...@.. 0x22, \ // .@@@@@@. 0x7E, \ // .@...... 0x02, \ // ........ 0x00, \ // .@...@.. 0x22, \ // .@@...@. 0x46, \ // .@.@..@. 0x4A, \ // .@..@@.. 0x32, \ // ........ 0x00, \ // ..@..@.. 0x24, \ // .@....@. 0x42, \ // .@..@.@. 0x52, \ // ..@@.@.. 0x2C, \ // ........
0x00, 0x18, \ // ...@@... 0x28, \ // ...@.@.. 0x7E, \ // .@@@@@@. 0x08, \ // ...@.... 0x00, \ // ........ 0x74, \ // ..@.@@@. 0x52, \ // .@..@.@. 0x52, \ // .@..@.@. 0x4C, \ // ..@@..@. 0x00, \ // ........ 0x3C, \ // ..@@@@.. 0x52, \ // .@.@..@. 0x52, \ // .@..@.@. 0x0C, \ // ..@@.... 0x00, \ // ........ 0x40, \ // ......@. 0x4E, \ // .@@...@. 0x50, \ // ...@@.@. 0x60, \ // .....@@. 0x00, \ // ........ 0x2C, \ // ..@@.@.. 0x52, \ // .@..@.@. 0x52, \ // .@..@.@. 0x2C, \ // ..@@.@.. 0x00, \ // ........ 0x30, \ // ....@@.. 0x4A, \ // .@.@..@. 0x4A, \ // .@..@.@. 0x3C, \ // ..@@@@.. 0x00, \ // ........ 0x40, \ // ......@. 0x40, \ // ......@. 0x7E, \ // .@@@@@@. 0x40, \ // ......@. 0x40, \ // ......@. 0x3C, \ // ..@@@@.. 0x42, \ // .@....@. 0x42, \ // .@....@. 0x24, \ // ..@..@.. 0x00, \ // ........ 0x02, \ // .@...... 0x04, \ // ..@..... 0x08, \ // ...@.... 0x10, \ // ....@... 0x20, \ // .....@.. 0x00, \ // ........ 0x36, \ // .@@.@@.. 0x36, \ // .@@.@@.. 0x00, \ // ........ 0x00, \ // ........ 0x00, \ // ........ 0x00, \ //........ 0x00, \ // ........ 0x00, \ // ........ 0x00, \ // ........ 0x00, \ // ........ 0x20, \ // .@@.@@.. 0x50, \ // .@@.@@.. 0x20, \ // ........ 0x00, \ // ........ 0x00, \ // ........ 0x04, \ // .@@.@@.. 0x04, \ // .@@.@@.. 0x04, \ // ........ \ // ........ 0x04, };
در این زیر برنامه کد مربوط به عدد مثلا ساعت درون متغییر آرایه ای 32 خانه ای که هر خانه مربوط به یک ستون هست قرار میگیرد .
کد php: void dat_col(unsigned char v){ a=a*5; a=i+a; buf[i+v]=TEXT[a]; }
زیر برنامه مربوط به تایمر صفر که میکرو هر 1 میلی ثانیه به این زیر برنامه پرش کرده و دستورات در درون این زیر برنامه را اجرا میکند و عدد و علامت ها را در دات ماتریس نمایش میدهد.
کد php: interrupt [TIM0_OVF] void timer0_ovf_isr(void) { // Reinitialize Timer 0 value TCNT0=0x00; n++; // Place your code here
در دستور زیرمقدار دما از سنسور خوانده میشود
کد php: if(dis==1){ if(n>500){n=0; temp=ds18b20_temperature(&rom_codes[0][0]); } } if(dis==0){ if(n>100){ n=0;
در دستور زیر ساعت از آیسی ds1307 خوانده میشود
کد php: rtc_get_time(&hour,&min,&sec); }} if(dis>=2){ if(n>100){ n=0;
در دستور زیر تاریخ میلادی از آیسی خوانده میشود
کد php: rtc_get_date(&week_day,&day,&month,&year);
}}
در دستورات زیر اطلاعات در دات ماتریس نمایش داده میشود
هر ستون توسط آیسی 2803 صفر میشود و اطلاعات الیدی های که میخواهند روشن شوند توسط آیسی 74595 ارسال میشود
کد php: for(i=0;i<8;i++){ MR=0; MR=1; OE=1; PORTD=col[i]; for(j=4;j>0;j--){ send_to_74hc595(buf[((j*8)+i-8)]); } OE=0; delay_us(500); PORTD=0X00; } }
تابع اصلی برنامه
در دستورات زیر برای پیکره بندی پورت های میکرو میباشد
کد php: init_774hc595(); DDRD=0XFF; PORTD=0X00; DDRB=0XFE; DDRC=0X00; PORTC=0XFF; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 125/000 kHz TCCR0=(0<<CS02) | (1<<CS01) | (1<<CS00); TCNT0=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=1; // Bit-Banged I2C Bus initialization // I2C Port: PORTC // I2C SDA bit: 2 // I2C SCL bit: 1 // Bit Rate: 100 kHz // Note: I2C settings are specified in the // Project|Configure|C Compiler|Libraries|I2C menu. i2c_init(); // DS1307 Real Time Clock initialization // Square wave output on pin SQW/OUT: On // Square wave frequency: 1Hz rtc_init(0,1,0); // 1 Wire Bus initialization // 1 Wire Data port: PORTB // 1 Wire Data bit: 0 // Note: 1 Wire port settings are specified in the // Project|Configure|C Compiler|Libraries|1 Wire menu. w1_init();
در دستورات زیر دما و زمان از آیسی و سنسور خوانده میشود
کد php: ds1820_devices=w1_search(0xf0,rom_codes); temp=ds18b20_temperature(&rom_codes[0][0]); rtc_get_time(&hour,&min,&sec); rtc_get_date(&week_day,&day,&month,&year); #asm("sei") while (1) { TIMSK=0;
در دستور زیر اگر کلید مربوط به تعویض نمایش اطلاعات فشار داده شود به یک متغییر یک واحد اضافه میشود و اگر از 5 بیشتر شود صفر میشود و طبق این متغییر که در ادامه دستورات هست ساعت یا دما یا تاریخ میلادی و شمسی نمایش داده میشود .
کد php: if(PINC.5==0){ dis++; for(i=0;i<32;i++)buf[i]=0; if(dis>5)dis=0; delay_ms(500);}
اگر این کلید فشار داده شود طبق متغییر که نشان میدهد ساعت یا تاریخ در حال نمایش در دات ماتریس هست آن را تغییر میدهد و یک واحد به آن میافزاید اگر ساعت نمایش داده میشود یک واحد به ساعت اضافه میشود و اگر تاریخ نمایش داده میشود یک واحد به متغییر ماه اضافه میشود و اگر سال میلادی نمایش داده میشود یک واحد به متغییر سال اضافه میشود
کد php: if(PINC.3==0){ if(dis==0){ hour++; delay_ms(300); if(hour>23)hour=0; rtc_set_time(hour,min,0);} if(dis==2){ month++; delay_ms(300); if(month>12)month=1; rtc_set_date(1,day,month,year);} if(dis==3){ year++; delay_ms(300); if(year>20)year=15; rtc_set_date(1,day,month,year);} }
اگر این کلید فشار داده شود طبق متغییر که نشان میدهد ساعت یا تاریخ در حال نمایش در دات ماتریس هست آن را تغییر میدهد و یک واحد به آن میافزاید اگر ساعت نمایش داده میشود یک واحد به دقیقه اضافه میشود و اگر تاریخ نمایش داده میشود یک واحد به متغییر روز اضافه میشود
کد php: if(PINC.4==0){ if(dis==0){ min++; delay_ms(300); if(min>59)min=0; rtc_set_time(hour,min,0); } if(dis==2){ day++; delay_ms(300); if(month<7){ if(day>31)day=1;} else{ if(day>30)day=1;} rtc_set_date(1,day,month,year);} }
در دستور زیر اگر متغییر dis=0 باشد ساعت در دات ماتریس نمایش داده میشود به این صورت که دهگان ویکان هر متغییر درون متغییر a قرار میگیرد و مکان نمایش آن که در چه ستونی باشد در ورودی زیر برنامه dat_col مشخص میشود و میکرو به این زیر برنامه پرش میکند و کد های اعداد را در میخواند و در دات ماتریس نمایش میدهد
کد php: if(dis==0){ for(i=0;i<5;i++){ a=hour/10; dat_col(2); a=hour%10; dat_col(8); a=min/10; dat_col(20); a=min%10; dat_col(26); if(PINC.0==0) a=13; else a=14; dat_col(14); } }
در دستور زیر اگر متغییر dis=1 باشد دما در دات ماتریس نمایش داده میشود به این صورت که دهگان ویکان هر متغییر درون متغییر a قرار میگیرد و مکان نمایش آن که در چه ستونی باشد در ورودی زیر برنامه dat_col مشخص میشود و میکرو به این زیر برنامه پرش میکند و کد های اعداد را در میخواند و در دات ماتریس نمایش میدهد
کد php: if(dis==1){ for(i=0;i<5;i++){ a=10; dat_col(2); a=temp/10; dat_col(9); a=temp%10; dat_col(15); a=15; dat_col(20); a=11; dat_col(25); } }
در دستور زیر اگر متغییر dis=2 باشد تاریخ میلادی در دات ماتریس نمایش داده میشود به این صورت که دهگان ویکان هر متغییر درون متغییر a قرار میگیرد و مکان نمایش آن که در چه ستونی باشد در ورودی زیر برنامه dat_col مشخص میشود و میکرو به این زیر برنامه پرش میکند و کد های اعداد را در میخواند و در دات ماتریس نمایش میدهد
کد php: if(dis==2){ for(i=0;i<5;i++){ a=month/10; dat_col(2); a=month%10; dat_col(8); a=day/10; dat_col(21); a=day%10; dat_col(27); a=16; dat_col(13); } }
در دستور زیر اگر متغییر dis=3 باشد سال میلادی در دات ماتریس نمایش داده میشود به این صورت که دهگان ویکان هر متغییر درون متغییر a قرار میگیرد و مکان نمایش آن که در چه ستونی باشد در ورودی زیر برنامه dat_col مشخص میشود و میکرو به این زیر برنامه پرش میکند و کد های اعداد را در میخواند و در دات ماتریس نمایش میدهد
کد php: if(dis==3){ for(i=0;i<5;i++){ a=2; dat_col(5); a=0; dat_col(11); a=year/10; dat_col(17); a=year%10; dat_col(23); } }
در دستور زیر اگر متغییر dis=4 باشد تاریخ میلادی به شمسی تبدیل در دات ماتریس نمایش داده میشود به این صورت که دهگان ویکان هر متغییر درون متغییر a قرار میگیرد و مکان نمایش آن که در چه ستونی باشد در ورودی زیر برنامه dat_col مشخص میشود و میکرو به این زیر برنامه پرش میکند و کد های اعداد را در میخواند و در دات ماتریس نمایش میدهد
کد php: if(dis==4){ m2s(year,month,day,&ys,&ms,&ds); for(i=0;i<5;i++){ a=ms/10; dat_col(2); a=ms%10; dat_col(8); a=ds/10; dat_col(21); a=ds%10; dat_col(27); a=12; dat_col(14); } }
در دستور زیر اگر متغییر dis=5 باشد سال شمسی در دات ماتریس نمایش داده میشود به این صورت که دهگان ویکان هر متغییر درون متغییر a قرار میگیرد و مکان نمایش آن که در چه ستونی باشد در ورودی زیر برنامه dat_col مشخص میشود و میکرو به این زیر برنامه پرش میکند و کد های اعداد را در میخواند و در دات ماتریس نمایش میدهد
کد php: if(dis==5){ for(i=0;i<5;i++){ a=1; dat_col(5); a=3; dat_col(11); a=ys/10; dat_col(17); a=ys%10; dat_col(23); } } delay_us(1); TIMSK=1; } }
(آخرین ویرایش در این ارسال: ۰۲-شهریور-۱۳۹۵, ۱۲:۱۴:۰۶، توسط babyy.
دلیل ویرایش: افرودن کدها در داخل تگ!!!!!
)
|
|