16-11-2007, 15:58
|
|
|
חבר מתאריך: 03.11.06
הודעות: 264
|
|
עזרה בהבנת תוכנית שפת C לפרויקט גמר
שלום ותודה לכולם על העזרה.
אני אשמח להסבר על כל שורה ( אלו שלא הבנתי ולא רשום לידן) ואם אפשר הסבר על הגדרת הפורטים.
התוכנית מסובבת מנוע צעד וכאשר המפסקים (SWו LDR( שווים המנוע עוצר.אני עובד עם
#include <reg51.h>
הגדרת כניסות המפסקים #define limit_sw P0
הגדרת כניסות חיישני האור #define ldrs P2
#define ldr1 0x10
#define ldr2 0x04
#define ldr3 0x01
#define ldr4 0x40
#define ldr5 0x08
#define ldr6 0x02
#define ldr7 0x80
#define ldr8 0x20
#define sw1 0x01
#define sw2 0x02
#define sw3 0x04
#define sw4 0x08
#define sw5 0x10
#define sw6 0x20
#define sw7 0x40
#define sw8 0x80
הגדרת – zו-b כמפסקים שעובדים בינארי ( כלומא 0 או 1). unsigned char bdata b,z=0;
הגדרת ערך התחלתי 0 למפסקים char sw_status=0;
הגדרת ערך התחלתי 0 לחיישני האור char ldr_status=0;
sbit nm0=P3^0;
sbit nm1=P3^1;
sbit nm2=P3^2;
sbit nm3=P3^3;
sbit a0=b^0;
sbit a1=b^1;
sbit a2=b^2;
sbit a3=b^3;
הגדרת היציאות של רגלי המנוע ( לפי סדר ) ורגל הבאזר.
sbit motor4=P1^4;
sbit motor3=P1^5;
sbit motor2=P1^6;
sbit motor1=P1^7;
sbit buzzer=P1^3;
פונקצית השהייה delay1 ()
{
הגדרת משתנה לספירת לולאת השהייה , מתחיל מ-0 ומתקדם ב-1 עד 5000 unsigned int i;
for(i=0;i<5000;i++);
}
// שגרה שבודקת את מצב מפסקי הגבול
unsigned char get_sw_status() {
הגדרת משתנה נוסף a עם ערך של המפסקים (p0) unsigned char a=P0;
לולאות בדיקת מצב מפסקים, לולאה אין סופית . אם מצב המפסק שווה ל- a , כלומר אפס , במוצא יהיה מצב המפסק.
if (a==sw1) sw_status=1;
if (a==sw2) sw_status=2;
if (a==sw3) sw_status=3;
if (a==sw4) sw_status=4;
if (a==sw5) sw_status=5;
if (a==sw6) sw_status=6;
if (a==sw7) sw_status=7;
if (a==sw8) sw_status=8;
if (a==0xff) sw_status=0;
חזרה לבדיקת מצב המפסקים return sw_status;
}
// שגרה שבודקת את מצב חיישני הגבול
unsigned char get_ldr_status()
{
unsigned char b=P2;
if (b==ldr1) ldr_status=1;
if (b==ldr2) ldr_status=2;
if (b==ldr3) ldr_status=3;
if (b==ldr4) ldr_status=4;
if (b==ldr5) ldr_status=5;
if (b==ldr6) ldr_status=6;
if (b==ldr7) ldr_status=7;
if (b==ldr8) ldr_status=8;
if (b==0x00) ldr_status=0xff;
return ldr_status;
}
// שגרה המאפשרת סיבוב המנוע ימינה
לולאת סיבוב המנוע. אחרי כל צעד עוברים ללולאת ההשהיה.
step_r()
{
motor4=1;
motor3=0;
motor2=0;
motor1=0;
delay1();
motor4=0;
motor3=1;
motor2=0;
motor1=0;
delay1();
motor4=0;
motor3=0;
motor2=1;
motor1=0;
delay1();
motor4=0;
motor3=0;
motor2=0;
motor1=1;
delay1();
}
display()
{
nm0=a0;
nm1=a1;
nm2=a2;
nm3=a3;
}
התוכנית עצמה.
main()
{
הגדרת משתנה a . unsigned char a;
יציאת הבאזר מוגדרת כ- '0' בהתחלה. buzzer=0;
while (1)
{
הגדרת a כמצב המפסקים. a=get_sw_status(); // check limit switchs
הגדרת b כמצב החיישנים. b=get_ldr_status(); // check ldr
לולאה עיקרית אשר משווה את מצב החיישנים למצב המפסקים . אם הם שווים מופעל הבאזר if (a==b)
{
עובר לפונקצית התצוגה display();
הבאזר מופעל buzzer=1;
}
אחרת : else
{
המנוע ממשיך בלולאה שלו ( עובר לפונקציה המתאימה. step_r();
// z=0;
הבאזר = 0 , כלומר לא מצפצף. buzzer=0;
}
}
}
_____________________________________
טוב שלום מארץ ישראל השלמה!
לצאת מהשטחים למען ישראל!
|