در این قسمت از آموزش به نحوه استفاده از دستورات کنترلی خواهیم پرداخت.
دستورات کنترلی چیست؟
دستورات کنترلی به طور کلی کد هایی هستند که به کمک آنها می توان مقدار متغییر یا مقدار یک پایه و … بررسی کرد
چهار دستور شرطی مهم زبان C
if , while , for , switch
دستور if:
به صورت زیر نوشته می شود:
if (شرط) {
مجموعه دستورات;
}
توضیح : کد بالا بررسی میکند که اگر شرط نوشته شده در داخل پارانتز درست باشد مجموعه دستورات نوشته شده در بین دو کروشه اجرا خواهد شد و اگر شرط درست نباشد مجموعه دستورات اجرا نمی شود اگر مجموعه دستوارت فقط شامل یک دستور باشد نیازی به قرار دادن کروشه نیست مثال:
if(i==5){
PORTA.0=1;
PORTC.0=0;
}
کد بالا یررسی می کند که اگر مقدار متغییر i برابر 5 باشد پورت صفر A را روشن و پورت 0 C را خاموش میکند مثال دیگر:
if (PIND.1==1) PORTA.0=1;
حالت های دیگر دستور if:
if (شرط) {
مجموعه دستورات1;
} else {
مجموعه دستورات2;
}
در کد بالا اگر شرط درست باشد مجموعه دستورات 1 اجر می شود و اگر شرط غلط باشد مجموعه دستورات 2 اجرا خواهد شد.
if انشعابی بدون else پایانی:
if (شرط1) {
مجموعه دستورات1;
} else if ( شرط 2) {
مجموعه دستورات2;
}
else if ( شرط 3) {
مجموعه دستورات3;
}
…..
در کد بالا اگر شرط1 درست باشد مجموعه دستورات 1 اجر می شود اگر شرط2 درست باشد مجموعه دستورات 2 اجر می شود اگر شرط3 درست باشد مجموعه دستورات 3 اجر می شود و الی آخر
if انشعابی با else پایانی:
if (شرط1) {
مجموعه دستورات1;
} else if ( شرط 2) {
مجموعه دستورات2;
}
else if ( شرط 3) {
مجموعه دستورات3;
}
…..
esle{
مجموعه دستورات else
}
در کد بالا اگر شرط1 درست باشد مجموعه دستورات 1 اجر می شود اگر شرط2 درست باشد مجموعه دستورات 2 اجر می شود اگر شرط3 درست باشد مجموعه دستورات 3 اجر می شود و الی آخر و اگر هیچ شرطی درست نباشد مجموعه دستورات else اجرا خواهد شد.
دستور while:
دستور وایل(تا زمانی که) یک حلقه می باشد و تا زمانی که شرط داخل پارانتز آن درست باشد مجموعه دستورات داخل کروشه آن اجرا و تکرار می شود که به صورت های زیر نوشته می شود:
while (شرط) {
مجموعه دستورات;
}
یا
while (شرط)
یک دستور;
همانطور که مشاهده کردید در کد های بالا اول شرط بررسی می شود سپس در صورت درست بودن شرط دستور یا دستورات اجرا می شود پس اگر شرط درست نباشد هیچ دستوری اجرا نمی شود.دستور while حالت دیگری هم دارد که یک بار مجموعه دستورات را اجرا سپس شرط را بررسی کرده و اگر شرط درست باشد حلقه تکرار می شود این حالت بصورت زیر نوشته می شود:
do{
مجموعه دستورات;
} while ( شرط );
یا
do
یک دستور;
while ( شرط );
همان طور که مشاهده کردید کد بالا دستور یا مجموعه دستورات را حداقل یک بار اجرا خواهد کرد بدون اینکه شرط درست باشد.
در قسمت های قبلی هم دید که اگر به جای شرط عدد یک قرار دهیم حلقه while به تعداد بی نهایت بار تکرار خواهد شد چون عدد یک به معنای درست بودن شرط می باشد.
برای خارج شدن از حلقه چه بی نهایت باشد چه محدود می توان از دستور break بصورت زیر استفاده کرد:
break;
اگر بخواهیم در یک حلقه در بین مجموعه دستورات ، برخی دستورات اجرا نشده و حلقه از اول شروع شود از دستور continue استفاده می شود.
while (1) {
دستور 1;
دستور 2;
دستور 3;
continue;
دستور4;
….
}
در مثال بالا دستورات 1 تا 3 اجرا شده و حلقه دوباره از اول اجرا می شود یعنی در کد بالا دستور 4 و دستورات بعد آن هیچ وقت اجرا نخواهد شد.
دستور for:
دستور For یک دستور کنترلی شمارنده است و در عمل کمی شبیه به دستور قبلی یعنی while می باشد این دستور به صورت زیر نوشته می شود:
for(گام شمارش;شرط شمارش;مقدار اولیه شمارش){
مجموعه دستورات;
}
توضیح:هنگام اجرای دستور بالا مقدار اولیه شمارش در متغییر مورد نظر قرار گرفته سپس شرط حلقه بررسی می شود و اگر درست باشد مجموعه دستورات حلقه اجرا می شود با هر بار اجرا شدن حلقه با توجه به گام حلقه مقدار متغییر تغییر یافته و همین طور ادامه می یابد مثال:
for( i=1 ; i<=10 ; i++){
مجموعه دستورات;
}
در مثال بالا مقدار متغییر i برابر 1 میشود سپس شرط بررسی می شود که آیا مقدار i کمتر و مساوی 10 باشد سپس مجموعه دستورات اجرا می شود بعد از هر بار اجرا به مقدار i با توجه به گام حلقه (++i) یک واحد افزوده می شود پس مجموعه دستورات حلقه فقط 10 بار تکرار خواهد شد مثال دیگر:
for( i=1 ; i<=10 ; i=i+3){
i–;
PORTA.0=1;
delay_ms(500);
PORTA.0=0;
delay_ms(500);
}
در دستورات بالا پورت A.0 چند بار روشن خواهد شد؟
i=1 دستورات یک بار اجرا می شود > i-1=0
i+3=3 دستورات یک بار اجرا می شود > i-1=2
i+3=5 دستورات یک بار اجرا می شود > i-1=4
i+3=7 دستورات یک بار اجرا می شود > i-1=6
i+3=9 دستورات یک بار اجرا می شود > i-1=8
i+3=11 شرط برقرار نبوده و حلقه پایان می یابد
پس در کل دستورات 5 با اجرا شده و پایه مربوطه 5 بار روشن و خاموش می شود.
دستور switch:
switch ( عبارت ) {
case مقدار اول:
مجموعه دستورات اول ;
break;
case مقدار دوم:
مجموعه دستورات دوم ;
break;
.
.
.
default:
مجموعه دستورات
}
دستور switch مقدار عبارت را با مقدارهای مقابل case مقایسه کرده و با هر case برابر باشد مجموعه دستورات مربوطه آن را اجرا می کند و اگر مقدار عبارت با هیچ کیسی برابر نباشد مجموعه دستورات default اجرا خواهد شد . قسمت default اختیاری می باشد و میتوان آن قسمت را حذف کرد
مثال:
m=12;
m++;
switch (m){
case 12:
PORTA.5=1;
break;
case 13:
PORTA.6=1;
break;
}
نتیجه عبارت بالا روشن شدن پایه A.6 می باشد زیرا مقدار اولیه m برابر 12 می باشد سپس یک واحد افزوده شده و دستور switch کیس دوم را انتخاب و اجرا خواهد کرد.
قسمت بعدی آموزش ها شامل چند پروژه آموزشی مربوط به قسمت های 1 تا 4 خواهد بود.
45 پاسخ به “آموزش AVR با کدویژن قسمت 4 دستورات کنترلی”
بسیار عالی بود
امیدوارم با قوت ادامه بدید
عالی بود ممنون
دستتتون درد نکنه خیلی عالی بود
من منتظر ادامش هستم خیلی مشتاقم
سلام
سال نو مبارک
واقعا اموزشتون عالیه مخصوصا با فیلمها یی که توسایتتون قراردادین وباپروتئوس هم شبیه سازی کردین راحترمتوجه میشم
امیدوارم هرچه زودتر ادامه بدین بابت همه زحماتتون ممنون وخسته نباشید.
کوتاه-مختصر-مفید-
تشکر
سلام
سال نو مبارک!
چرا آموزشها رو ادامه نمیدید؟
پیگیر مطالبتون هستم، موفق باشید
سلام سال نو شما هم مبارک
به علت مشغله کاری زیاد نمیتونم آموزش ها رو سریع ادامه بدم ولی سعی میکنم آموزش ها ادامه داشته باشه و کامل بشه
سلام
ممنون از لطفتون
بله حتماً ادامه بدید
واقعا عالی بوی.کوتاه-مختصر-مفید
سلام.
خیلی عالیه.لطفا در مورد برنامه نویسی LCD و اینکه کاراکترها و متغیرهارو در محیط کد ویشن کجا وارد کنیم و مثال های کاربردی دیگه مثل شمارنده رو هم آموزش بدین
با سلام و تشکر از زحماتتون
من به دلیل اینکه برای پروژه ام به یادگیری این برنامه نویسی به شدت نیاز دارم خواهش می کنم هر چه سریع تر ادامه قسمت ها رو در سایت قرار بدید . با تشکر فراوان
عالی بود ادامه بده خیلیا منتظرند.
سلام،دمت گرم خیلی کارت درسته.
سلام
از اینکه میبینم هنوز بعضیا هستن که زکات علمشونو با آموزش به دیگران میدن خیلی خوشحالم
واقعا استفاده کردم.
اگه در مسیر رشد و تعالی علم ، هنر و فنون مختلف در ایران یا هر جای دیگه کاری از دستم بر بیاد دربست درخدمتم.
سلام
واقعا از حوصله ای که به کار بردی برای نوشتن این مطالب باید تشکر کرد .
اگر کمکی خواستی (در رابطه با AVR)دوست دارم کمکت کنم ، چون من خیلی سختی کشیدم تا تونستم یاد بگیرم .
ای کاش منهم همچین مطالب که ساده و روان توضیح میدن رو داشتم.
سلام ممنون
اگه خواستی میتونی یکی از نویسنده های اینجا باشی.
سلام داداش میتونی به من یاد بدی AVR
با تشکر فراوان از زحمات شما بسیار عالی بود
سایت خیلی خوبی دارین موفق باشین
خیلی ممنون . موفق باشید
ممنووون
ادامه بدین لطفا
خدا خیرتون بده
بسیار عالی خیلی مختصر و مفید ممنون از مطالبتون.
دست شما درد نکنه واقعا عالی بود تا حالا تو هیچ جایی به این جالبی آموزش بده
ممنونم
ممنون از مطلب مفید شما
سلام مهندس
خیلی ممنون از مطالب عالی سایتتون
من کلی کتاب برای avr به زبان c خریدم اما حوصله م نکشیده بود بخونم.
در این ۹ تا آموزش سایت شما علاقمند شدم و شروع کردم
هدفم از یادگیری میکرو ساختن یک بالابر ساده سه طبقه با avr هست
تقریبا همه چیزی که نیاز بود گفتین. فقط مونده وقفه رو یاد بدین. کلید اضطراری که هر وقت زده بشه کلا موتور بالابر بایسته.
اگه برنامه شو بنویسین. یا پروژه شو بذارین خیلی عالی میشه
بازم ممنون
سلام ممنون
در مورد باید بگم که در طراحی مدارتون باید نهایت دقت و ایمنی رو در نظر بگیرید چون avr قابل اعتماد نیست و نویزپذیری زیادی داره
آموزش وقفه ها هم بزودی منتشر میشه
با سلام دوباره خدمتتون مهندس و آرزوی سلامتی و موفقیت
خیلی ممنون که آموزش وقفه رو هم در سایت قرار دادین
من یه سوالی داشتم
میخوام یه پورت رو . مثلا پورت B که پین هاش متصل به هشت تا ورودی (سنسور) هستن و در حالتهای مختلف تعدادی ازشون یک میشه و این پورت مقدارش عدد خاصی میشه. عدد این پورت رو به یه متغیر بریزم
چجوری بنویسم کدشو؟
کار خاصی نداره متغییر رو برابر با اون پورت قرار بدین مثال :
i=PINB
خیلی ممنون. این کار و نکرده بودم نمیدونستم به این راحتیه
ضمنا بالا در مورد نویز پذیری avr گفتین و لزوم امنیت مدارم
تو محیط غیر صنعتی نویز میتونه اشکال ایجاد کنه. و سوال دیگه م اینکه برای مقابله با نویزپذیری این میکروکنترلر چه راه هایی هست. منابعی سراغ دارین مهندس
به محیط صنعتی غیر صنعتی زیاد ربطی نداره مثلا اگه سیم حامل جریان بالا نزدیک AVR تون جریانش کم و زیاد بشه میکرو ریست میشه.
واسه نویزپذیری قسمت قدرت رو جدا کنید و دورتر از میکرو قرار بدید و همچنین از avr های جدید استفاده کنید وبحث های تخصصی دیگه ای که منابعش تو اینترنت هست سرچ کنید.
ضمنا نوشتین i مساوی پین B یعنی به بیتشو برمیداره؟ بذارم مساوی با پورت B اون وقت میشه یه بایت؟
وقتی مینویسین i=PINB مقدار کل پورت که میشه یک بایت براتون برمیگردونه.
در ضمن دو خط برنامه بنویسید میتونید سریع تست کنید 🙂 🙂
خخخخخخ بازم خیلی مرسی
راستی آرم خیلی فرق داره با avr ؟ کاش بعد ازین آموزش آرم با نرم افزارهای خودشو هم بذارین خخ
ARM و AVR که معلومه خیلی فرق داره ولی چون زبان سی رو یاد گرفتید راحت می تونید ARM رو شروع کنید
سلام
دو تا سوال داشتم :
چطور میتونم در زبان C به یک بیت از یک متغیر دسترسی پیدا کنم و اونرو صفر یا یک کنم ؟
و دیگر اینکه چطور به بایت با ارزش تر یا کم ارزش تر یک متغیر ۱۶ بیتی دست پیدا کنیم و بتوانیم آنرا مقدار دهی کنیم ؟
برای یک کردن یک بیت بصورت زیر:
فرض کنیم مقدار r بصورت مقابل باشد r=0b0010000
با این عمل r |= 0b100 یا r = r | 0b100
که در این حالت خروجی برابر خواهد بود ۰b0010100
صفر کردن نیز r &= 0b10000
حال یه متغییر ۱۶ بیتی داریم r = 0xf123
برای برگرداندن بیت های پرارزش m = r >> 8 که m برابر به مقدار ۰xf1 خواهد بود
برای برگرداندن بیت های کم ارزش n = r & 0xff که N برابر به مقدار ۰x23 خواهد بود
سلام
ممنون از پاسختون
قسمت دوم رو فهمیدم .
قسمت اول رو اگه میشه بیشتر توضیح بدین
من میخوام یک بیت از یک متغیر ۸ بیتی رو برابر با یک متغیر دیگه که یک واحد از یک آرایه است قرار بدم .
مثلا بیت سوم متغیر CNT برابر بشه با جزء دوم آرایه ROOT
من چون قبلا با پیک بیسیک کار می کردم و تازه اومدم با C کار میکنم مشکل زیاد دارم .
تو پیک بیسیک اینطوری مینوشتم :
[CNT.3 = ROOT[2
من میخوام یک بیت از یک متغیر ۸ بیتی رو برابر با یک متغیر دیگه که یک واحد از یک آرایه است قرار بدم .
مثلا بیت سوم متغیر CNT برابر بشه با جزء دوم آرایه ROOT
من چون قبلا با پیک بیسیک کار می کردم و تازه اومدم با C کار میکنم مشکل زیاد دارم .
تو پیک بیسیک اینطوری مینوشتم :
[CNT.3 = ROOT[2
می خواستم بدونم معادل این دستور در C به چه شکل است .
آقا واقعا ممنون اگه استادمون اینجوری انقدر ساده و قشنگ درس میداد خداییش غم نداشتم
ممنون دوست عزیز.پست مفیدی بود.ازش استفاده کردم
موفق باشید
با سپاس و قدردانی فراوان مطلب مفید و ارزنده ای بود موفق و پیروز باشید
سلام
ممنون از سایت خوبتون
موفق و پیروز باشید
با سپاس و قدردانی فراوان مطلب مفید و ارزنده ای بود موفق و پیروز باشید
زبان برنامه نویسی c خیلی شبیه به java
سلام ممنونم از سایت خوبتون
روی بریدبورد آی سی مگا ۸ و دوتا پوشباتون یا تک سوئیچ و یک led نصب کردم
همچنین یک ترانزیستور با رله ۱۲ ولت به هم درایو شدن (ترانزیستور و led به ترتیب به پورت d7 و d6 میکرو وصل هستن)
چه کدی بنویسم تا با فشردن سوئیچ ۱ پورتd7 یک منطقی شود و پورت d6 به صورت چشمک در بیاید.( میشه گفت led تقریبا حکم چراغ سیگنال یا راهنما را ایفا میکند.)