به نام خدا!
سلام دوستان امیدوارم حالتون خوب باشه!
خوب در این بحث میخوام برنامه نویسی مبتدی رو توضیح بدم تا خوب یاد بگیرید!
قبل از استفاده از مطالب سایت میتونید کتاب های زیر رو بخونید تا سر رشته دستتون بیاد....
خوب پس از مطالعه کتاب ها اگه چیزی یاد گرفتید و نگرفتید دیگه من باید ادامه بدم!
خوب این کد رو توسط برنامه کدویژن بنویسین اگر نمیدونید پورت و DDRA چی هست میتونید به مطالب قبلی مراجعه کنید!
یه توضیح هم الان بدم بهتره....!
متن سبزه که نوشته #include برای فراخوانی کتابخانه است که ما در اینجا کتابخانه میکرو کنترلر atmega32 رو فرخوانی کردیم!
در خط بعد تابع اصلی نوشته میشه که معمولا ثابت هست توی خط بعد هم که نوشته DDRA.0=1 به این معنیه که پین اول یا پایه اول پورت A رو خروجی قرار بده و اگه مساوی با صفر باشه ورودی میشه که بحثش جداست.! خط بعدی که پورت هست هم برای فعال کردن پایه هست یعنی اینکه با این کد ولتاژ توی پایه میره در اینجا هم 1 به معنی فعال و 0 به معنی غیر فعال هست!
#include <mega32.h>
void main(void){
DDRA.0=1;
PORTA.0=1;
}
بعد برید توی برنامه پرتئوس اونجا یه LEd و Atmega32 بسازید و یک سیم از LED به پایه اول پورت A وصل کنید! منبع تغذیه هم یادتون نره!
حالا موفقیت خودتون رو ببینید....!
اگه دقت کنید این فقط یک ال ای دی ثابت هست که اگه مستقیم به منبع تغذیه وصل بشه فرقی نداره...! با اینکه به میکرو وصل بشه!
ولی اگه بخوایم چشمک زن باشه باید از کد زیر استفاده کنید!
#include <mega32.h>
#include <delay.h>//کتابخانه تاخیر
//تابع اصلی را اضافه میکنیم
void main (void){
DDRA.0=1; // را خروجی تعریف کردیم A.0 پورت
while(1){ // حلقه بینهایت
PORTA.0=1; //روشن
delay_ms(1000); // تاخیر به مدت 1000 میلی ثانیه یا 1 ثانیه
PORTA.0=0; //خاموش
delay_ms(1000); // تاخیر
//تکرار حلقه
}
}
در خط اول فایل هدر میکروکنترلر مورد نظر را اضافه می کنیم
چون در این پروژه نیاز به ایجاد تاخیر در برنامه است فایل کتابخانه ای تاخیر را به برنامه اضافه می کنیم خط دوم
در خط بعدی تابع اصلی را اضافه میکنیم سپس در خط بعدی پایه اول (بیت صفرم ) پورت A را خروجی تعریف کرده ایم
در خط بعدی حلقه while را اضافه کرده ایم while به معنی تا زمانی که می باشد یعنی تا زمانی که شرط داخل while درست باشد تمامی دستورات داخل حلقه while را اجرا کن و
while(1){
}
حلقه است که همیشه درست است و تا زمانی که از دستور break استفاده نشود این حلقه تکرار خواهد شد
در خط بعدی پایه A.0 را روشن میکنیم در خط بعدی از تابع delay_ms استفاده کرده ایم این تابع برنامه را به مدت عددی که داخل آن نوشته شده است (میلی ثانیه) نگه می دارد مثلا برای ایجاد تاخیر 2 ثانیه ای باید مقدار 2000 را در این تابع بنویسیم این تابع یکی از توابع فابل کتابخانه ای delay.h است که در اول برنامه اضافه کردیم این فایل کتابخانه ای تابع دیگری نیز دارد که به مقدار میکرو ثانیه تاخیر ایجاد می کند...!
حالا فرض کنید میخوایم به جای یک ال ای دی دو تا LED استفاده کنیم! اصلا برای محکم کاری هشت تا LED استفاده میکنیم!
حالا توی پرتئوس هشت تا LED درست کنید و همه رو به پورت A یعنی از PA0 تا PA7 وصل کنید!
حالا دوباره به کدویژن برید میخوایم یه کاری کنیم 8 تا ال ای دی همزمان روشن باشه چکار میکنیم...!
باید بیایم بگیم
DDRA.0=1;
DDRA.1=1;
DDRA.2=1;
DDRA.3=1;
DDRA.4=1;
و... که اینکار بسیار مشکله تازه بعدش باید برای پورت ها هم همین کار رو بکنیم یعنی برای اینکه هشت تا ال ای دی چشمک بزنه باید کد زیر رو بدیم
PORTA.0=1;
PORTA.1=1;
PORTA.2=1;
// و غیره
delay_ms(1000);
PORTA.0=0;
PORTA.1=0;
PORTA.2=0;
// و غیره
delay_ms(1000);
تا چشمک بزنه! دیدید چقدر دشواره برای اینکار کافیه یه کد بدیم تا دیگه انقدر دردسر نداشته باشه!
ما با یک کد میگیم همه پایه های پورت A رو خروجی کن همچنین با یک کد میگیم همه ی پایه ها رو روشن کن بعد با یک کد میگیم همه رو خاموش کن!
چجوری؟ اینجوری!
به جای اینکه دونه،دونه بگیم این رو خروجی کن و این رو خروجی کن و... توی یه کد میگیم
DDRA=0b11111111;
با اینکار تمام پورت ها رو که هشت تا هستن 1 قرار دادیم که خروجی باشن شما میتونین هر کدوم رو صفر کنید تا ورودی شن!
حالا برای پورت هم میتونیم بنویسیم!
PORTA=0b11111111;
delay_ms(1000);
PORTA=0b0000000;
delay_ms(1000);
اینجوری همه چراغ ها همزمان روشن میشه همزمان خاموش میشه!
شمام دارید به چیزی که من فکر میکنم فکر میکنید! یعنی میخواید که مثلا چراغ ها یکی در میون روشن شن و دوباره اون یکی ها که خاموشن، روشن شن یا برای بار اول فقط 4 تا اولی روشن شن و برای بار دوم 4 تا دومی ها روشن شن برای همین باید اینکار رو بکنید!
PORTA=0b11110000;
delay_ms(1000);
PORTA=0b11110000;
delay_ms(1000);
اینجوری در هر ٍانیه چهار تا اولی و در ثانیه بعد چهارتا دومی روشن میشن و 4 تا اولی خاموش میشن همینجوری ادامه داره
حالا فکر کنید میخواید شیوه های دیگه ای برای روشن شدن بهش اضافه کنید تا قشنگ تر بشه و مثلا یکی در میون روشن بشن باید همینجوری ادامه بدید یعنی مثلا به صورت زیر
PORTA=0b10101010;
delay_ms(1000);
PORTA=0b01010101;
delay_ms(1000);
PORTA=0b11110000;
delay_ms(1000);
PORTA=0b11110000;
delay_ms(1000);
در کد بالا در ثانیه اول یکی در میان روشن میشن مثلا لامپ های 1-3-5-7 شن میشن بعدش اینا خاموش میشن لامپ های 2-4-6-8 روشن میشن بعدش 4 تا اولی و بعدش 4 تا آخری روشن میشن...!
اگه بخوایم اینجوری ادامه بدیم خیلی طولانی میشه برای همین باید ارایه بنویسیم!
کد زیر یک کد کامل ال ای دی هست
#include <mega32.h>
#include <delay.h>
void main(void) {
unsigned char led[]={0b10101010,0b01010101,0b11110000,0b00001111,0b11111111};
int a;
DDRA=0xFF;
while (1) {
for (a=0 ; a<=3 ; a=a+1)
{
PORTA = led[a];
delay_ms (100);
};
}
}
در کد بالا اگه با مشکل مواجه شدین و LED ها پیدا نشدن زمان رو از 100 به 1000 تغییر بدین!
خوب طبق کد بالا DDRA=0xFF همون کد DDRA=0b11111111 خودمون هست که با هگزا نوشم! خیلی سریعتر و راحت تر!
خیلی خیلی ممنون
مختصر و مفید 🌹🙏🏻👌🏼