الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيف يتم برمجة المعادلات بالاسمبلي

مغلق
بدأه KARIMDHM في 27 مايو 2007 · 9 رد · 2,213 مشاهدة · في أرشيف قسم الـــ Assembly
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

اريد كيفية برجة المعادلة

D =((367*Y)-(INT((7/4)*(Y+INT((M+9)/12))))+INT(275*(M/9))+d-730531.5)

انا بحاجة ماسة الى برمجتها

تم تعديل هذه المشاركة بواسطة Xacker في 28 مايو 2007 في 01:13

#2

تريد الكيفية, أم تريد المعادلة بالأسمبلي.. وهل لي أن أسألك بأي لغة تنوي استخدام هذه المعادلة؟

;D =((367*Y)-(INT((7/4)*(Y+INT((M+9)/12))))+INT(275*(M/9))+d-730531.5)


.data?
D	dd	?
Y	dw	?
M	dw	?
d	dw	?
fpoint	dd	730531.5

.code
start:

	mov	eax,Y
	imul	367
	push	eax
	mov	eax,M
	add	eax,9
	idiv	12
	push	eax
	pop	ebx
	mov	eax,Y
	add	eax,ebx
	push	eax
	mov	eax,7
	idiv	4
	pop	ebx
	imul	ebx
	mov	ebx,eax
	pop	eax
	sub	eax,ebx
	push	eax
	mov	eax,M
	idiv	9
	imul	275
	pop	ebx
	add	eax,ebx
	add	eax,d
; Floating Point Units time
	fild	fpoint; st(0)=fpoint
	mov	D,eax
	fild	D; st(0)=D,st(1)=fpoint
	fisub	st(0),st(1); st(0)=D,st(1)=fpoint > st(0)=result
	fist	D; D=st(0)

end start

إن شاء الله صحيحة, لا أستطيع اختبارها على هذا النظام.

لا تنسى, تحتاج الى اضافة مكتبة fpu.inc / fpu.lib

تم تعديل هذه المشاركة بواسطة Xacker في 28 مايو 2007 في 01:44

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#3

شكرا لك اخي على هذا التدخل

هذا جزء من معادلات اوقات الصلاة

واريد برمجتها بلغة الاسمبلي

هذا مشروع تخرجي ساعة الكترونية واوقات الصلاة

سيتم بعون الله برمجة المعادلة في الميكروكنترلور

المعادلات هي

حساب مواقيت الصلاة الشرعية

لأى مكان بالعالم

الأخوة الكرام نظرا لدقة أمر المواقيت وخاصة مواقيت الصلاة الشرعية فقد وضعت هنا معادلات بسيطة لحساب مواقيت الصلاة الشرعية ولم أضف فىالمعادلات أثر إرتفاع الموقع عن سطح البحر أو أثر عوامل الإنكسار أو عناصر الحرارة والضغط الجوى وغيرها من القيم التى نستخدمها فى الحسابات إذا أردنا الحساب بدقة تصل إلى كسور بسيطة من الثانية ولكنى فضلت تبسيط المعادلات حتى يتمكن اى شخص من حساب المواقيت بدقة وهى تعطى نتائج جيدة ودقيقة جدا

العناصر الملطلوبة للحساب هى :

خط الطول الجغرافى للمكان المطلوب الحساب له ورمزه Long

خط العرض الجغرافى للمكان المطلوب الحساب له ورمزه Lat

فرق التوقيت الموقعى عن خط توقيت جرينتش

العام والشهر واليوم المطلوب الحساب له

فى حساب طول الشمس وموقعها فضلت هنا التبسيط ولم أكتب المعادلات التى نستخدمها فى حساب الظواهر الكونية بل ايضا فضلت التبسيط قد ما استطعت وهنا موقع الشمس بحسب مركزية الأرض Geocentric وهى معادلات بسيطة جدا ولكنها دقيقة بحول الله وقوته

أولا نحسب طول " موقع الشمس " للحصول على الميل الزاوى والمطلع المستقيم المستخدم بمعادلات مواقيت الصلاة

نحسب اليوم الجوليانى ورمزه D من المعادلة :

D =((367*Y)-(INT((7/4)*(Y+INT((M+9)/12))))+INT(275*(M/9))+d-730531.5)

مع ملاحظة أن Y = Year = العام

و M = Month = الشهر

و d= Day = اليوم

وهذا هو العام والشهر واليوم المطلوب له الحساب

نحسب طول الشمس الوسطى ورمزه L من المعادلة

L = 280.461+0.9856474*D

مع مراعاة أن يكون الناتج لا يقل أو يزيد عن 360°

ثم نحسب حصة الشمس الوسطى ورمزه M من المعادلة

M = 357.528+0.9856003*D

مع مراعاة أن يكون الناتج لا يقل أو يزيد عن 360°

ثم نحسب طول الشمس البروجى ورمزه Lambda من المعادلة

(Lambda = L +1.915*SIN(M)+0.02*SIN(2*M

مع مراعاة أن يكون الناتج لا يقل أو يزيد عن 360°

ثم نحسب ميل دائرة البروج ورمزها Obliquity من المعادلة

Obliquity = 23.439-0.0000004*D

ثم نحسب المطلع المستقيم ورمزه Alpha من المعادلة

((Alpha =ATAN (COS(Obliquity)*TAN(Lambda

مع مراعاة أن يكون الناتج لا يقل أو يزيد عن 360° بالمعادلة

(Alpha = Alpha - (360*INT(Alpha /360

ثم نعدل المطلع المستقيم

Alpha = Alpha + 90 * ( TRUNC ( Alpha / 90 ) -TRUNC(Alpha / 90))

نحسب الزمن النجمى ورمزه ST بالدرجات الزاوية من المعادلة

ST =100.46 + 0.985647352 *D

ثم نحسب ميل الشمس الزاوى ورمزه Decمن المعادلة

((Dec =ASIN(SIN (Obliquity )*SIN(Lambda

نحسب زوال الشمس الوسطى noon من المعادلة

Noon = Alpha - ST

مع مراعاة أن يكون الناتج لا يقل أو يزيد عن 360° بالمعادلة

ثم الزوالى العالمى UT Noonمن المعادلة

UT Noon = Noon - Long

حيث أن Long هو خط الطول الجغرافى للمكان

ثم الزوال المحلى Local Noonبالمعادلة وهو وقت صلاة الظهر

Local Noon = UT Noon /15 + Zone

حيث أن Zone هو فرق التوقيت العالمى

نحسب وقت صلاة العصر الأول وهو المذهب الشافعى " وهو معمول به فى كثير من الأقطار "

نحسب إرتفاع الشمس لوقت صلاة العصر Asr Altمن المعادلة

((Asr Alt = ATAN (1+ TAN( Lat - Dec

حيث أن Lat هو خط العرض الجغرافى

و Dec هو ميل الشمس الزاوى

وإذا أردتها لوقت صلاة العصر الثانى " المذهب الحنفى " يكون من المعادلة :

((Asr Alt =ATAN(2+TAN(Latitude - Dec

ثم نحسب قوس الدائر أى الوقت المتبقى من وقت الظهر حتى صلاة العصر قوس العصر Asr Arc من المعادلة :

Asr Arc =ACOS ((SIN(90- Asr Alt )-SIN(Dec)*SIN(Lat))/(COS(Dec)*COS(Lat)))

الناتج هنا بالدرجات الزاوية يحول لزمن بالقسمة على 15

Asr Arc = Asr / 15

فيكون وقت صلاة العصر Asr Time من المعادلة

Asr Time = Local Noon + Asr Arc

نحسب وقت شروق الشمس وغروبها من المعادلة :

نحسب نصف قوس النهار Durinal Arcمن المعادلة

Durinal Arc=ACOS ((SIN(-0.8333 )-SIN(Dec)*SIN(Lat))/(COS(Dec)*COS(Lat)))

وقت الشروق Sun Rise

(Sun Rise = Local Noon - (Durinal Arc / 15

وقت الغروب Sun Set

(Sun Set = Local Noon + (Durinal Arc /15

نحسب وقت صلاة العشاء من المعادلة

اولا نحسب فضل الدائر وهو الوقت المتبقى من وقت صلاة الظهر إلى وقت العشاء Esha Arc

Esha Arc = ACOS ((SIN(-18 )-SIN(Dec)*SIN(Lat))/(COS(Dec)*COS(Lat)))

فيكون وقت صلاة العشاء Esha Time

(Esha Time = Local Noon +( Esha Arc /15

نحسب وقت صلاة الفجر من المعادلة

أولا نحسب فضل دائر الفجر وهو الوقت المتبقى من وقت صلاة الفجر حتى وقت صلاة الظهر Fajr Arc

Fajr Arc = ACOS ((SIN(-18 )-SIN(Dec)*SIN(Lat))/(COS(Dec)*COS(Lat)))

فيكون وقت صلاة الفجر Fajr Time

(Fajr Time = Local Noon – (Fajr Arc /15

لك مني خالص الاحترام والتقدير

جزاك الله عنا خيرا وزادك من علمه

ونفعنا الله بك

واسال الله تعالى ان يجعلها في ميزان حسناتك

#4

بارك الله بك على هذا الشرح الوافي

ستضطر بدون شك الى استخدام FPU في معادلاتك من اجل الزوايا والارقام العشرية لذلك عليك بهذا المرجع http://www.website.masmforum.com/tutorials/fptute/index.html

وبالتوفيق ان شاء الله في مشروع التخرج

تم تعديل هذه المشاركة بواسطة Xacker في 28 مايو 2007 في 13:27

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#5

مساعدة بسيطة, لكن توقفت عند العملية الاخيرة اقرأ التعليق لتعرف السبب

أيضا اريد ان انبهك الى موضوع كي لا يفوتك, الزوايا تتعامل معها بالراديان وليس بالدرجات

عليك ان تقوم بعملية التحويل قبل استخدام اي زاوية بالدرجات او اعطاءها بالدرجات كقيمة نهائية

.data
fpoint1	dd	730531.5
fpoint2	dd	280.461
fpoint3	dd	0.9856474
fpoint4	dd	357.528
fpoint5	dd	0.9856003
fpoint6	dd	1.915
fpoint7	dd	0.02
fpoint8	dd	23.439
fpoint9	dd	0.0000004
fpoint10	dd	100.46
fpoint11	dd	0.985647352


.data?
D	dd	?
Y	dw	?
M	dw	?
d	dw	?
L	dd	?
M	dd	?
Lambda	dd	?
Obliq	dd	?
Alpha	dd	?
_ST	dd	?
_Dec	dd	?
Noon	dd	?
UT_Noon	dd	?
Long	dd	?
LN	dd	?
Zone	dd	?

.code
start:

calc_D	proc	far
;D =((367*Y)-(INT((7/4)*(Y+INT((M+9)/12))))+INT(275*(M/9))+d-730531.5)
	mov	eax,Y
	mul	367
	push	eax
	mov	eax,M
	add	eax,9
	div	12
	push	eax
	pop	ebx
	mov	eax,Y
	add	eax,ebx
	push	eax
	mov	eax,7
	div	4
	pop	ebx
	mul	ebx
	mov	ebx,eax
	pop	eax
	sub	eax,ebx
	push	eax
	mov	eax,M
	div	9
	mul	275
	pop	ebx
	add	eax,ebx
	add	eax,d
	mov	D,eax
; Floating Point Units time
	fld	D  ; st(0)=(367*Y)-(INT((7/4)*(Y+INT((M+9)/12))))+INT(275*(M/9))+d
	fsub	fpoint1  ; st(0)=(367*Y)-(INT((7/4)*(Y+INT((M+9)/12))))+INT(275*(M/9))+d-730531.5
	fst	D  ; D=((367*Y)-(INT((7/4)*(Y+INT((M+9)/12))))+INT(275*(M/9))+d-730531.5)
	ret
calc_D	endp

calc_L	proc	far
;L = 280.461+0.9856474*D
	fld	D  ; st(0)=D
	fmul	fpoint3  ; st(0)=D*0.9856474
	fadd	fpoint2  ; st(0)=280.461+0.9856474*D
	fst	L  ; L=st(0)
	ret
calc_L	endp

calc_M	proc	far
;M = 357.528+0.9856003*D
	fld	D  ; st(0)=D
	fmul	fpoint5  ; st(0)=D*0.9856003
	fadd	fpoint4  ; st(0)=357.528+0.9856003*D
	fst	M  ; M=st(0)
	ret
calc_M	endp

calc_Lambda	proc	far
;Lambda = L +1.915*SIN(M)+0.02*SIN(2*M)
	fld	M  ; st(0)=M
	fsin	  ; st(0)=SIN(M)
	fmul	fpoint6  ; st(0)=SIN(M)*1.915
	fadd	L  ; st(0)=L +1.915*SIN(M)
	mov	eax,M  ; EAX=M
	mul	2  ; EAX=EAX*2
	mov	Lambda,eax  ; just a temp val
	fld	Lambda  ; st(0)=2*M / st(1)=L +1.915*SIN(M)
	fsin	  ; st(0)=SIN(2*M) / st(1)=L +1.915*SIN(M)
	fmul	fpoint7  ; st(0)=0.02*SIN(2*M) / st(1)=L +1.915*SIN(M)
	fadd	st,st(1); st(0)=L +1.915*SIN(M)+0.02*SIN(2*M)
	fst	Lambda  ; Lambda=L +1.915*SIN(M)+0.02*SIN(2*M)
	ret
calc_Lambda	endp

calc_Obliquity	proc	far
;Obliquity = 23.439-0.0000004*D
	fld	D  ; st(0)=D
	fmul	fpoint9  ; st(0)=0.0000004*D
	fld	fpoint8  ; st(0)=23.439 / st(1)=0.0000004*D
	fsub	st,st(1); st(0)=23.439-0.0000004*D
	fst	Obliq  ; Obliq=23.439-0.0000004*D
	ret
calc_Obliquity	endp

calc_Alpha	proc	far
;Alpha =ATAN (COS(Obliquity)*TAN(Lambda))
;phase1
	fld	Obliq  ; st(0)=Obliq
	fcos	  ; st(0)=COS(Obliquity)
	fld	Lambda  ; st(0)=Lambda / st(1)=COS(Obliquity)
	fptan	  ; st(0)=1.0 / st(1)=TAN(Lambda) / st(2)=COS(Obliquity)
	fstp	st  ; st(0)=TAN(Lambda) / st(1)=COS(Obliquity)
	fmul	st,st(1); st(0)=COS(Obliquity)*TAN(Lambda)
	fld1	  ; st(0)=1.0 / st(1)=COS(Obliquity)*TAN(Lambda)
	fpatan	  ; st(0)=ATAN(COS(Obliquity)*TAN(Lambda))
	fst	  ; Alpha=ATAN(COS(Obliquity)*TAN(Lambda))
;Alpha = Alpha - (360*INT(Alpha /360))
;phase2
  ; ???
;Alpha = Alpha + 90*(TRUNC(Alpha/90)-TRUNC(Alpha/90))
;phase3
  ; ???
	ret
calc_Alpha	endp

calc_ST	proc	far
;ST =100.46 + 0.985647352*D
	fld	D  ; st(0)=D
	fmul	fpoint11; st(0)=0.985647352*D
	fadd	fpoint10; st(0)=100.46 + 0.985647352*D
	fst	_ST  ; _ST=100.46 + 0.985647352*D
	ret
calc_ST	endp

calc_Dec	proc	far
;Dec =ASIN(SIN(Obliquity)*SIN(Lambda))
	fld	Lambda  ; st(0)=Lambda
	fsin	  ; st(0)=SIN(Lambda)
	fld	Obliq  ; st(0)=Obliq / st(1)=SIN(Lambda)
	fsin	  ; st(0)=SIN(Obliquity) / st(1)=SIN(Lambda)
	fmul	st,st(1); st(0)=SIN(Obliquity)*SIN(Lambda)
	fld1	  ; st(0)=1.0 / st(1)=SIN(Obliquity)*SIN(Lambda)
	fdiv	st,st(1); st(0)=ASIN(SIN(Obliquity)*SIN(Lambda))
	fst	_Dec  ; _Dec=ASIN(SIN(Obliquity)*SIN(Lambda))
	ret
calc_Dec	endp

calc_Noon	proc	far
;Noon = Alpha - ST
	mov	eax,Alpha
	sub	ST
	mov	Noon,eax
	ret
calc_Noon	endp

calc_UT_Noon	proc	far
;UT Noon = Noon - Long
	mov	eax,Noon
	sub	Long
	mov	UT_Noon,eax
	ret
calc_UT_Noon	endp

calc_LN	proc	far
;Local Noon = UT Noon /15 + Zone
	mov	eax,UT_Noon
	div	15
	add	eax,Zone
	mov	LN,eax
	ret
calc_LN	endp

end start

لكن هلاّ توضح لي التالي:

اقتباس
مع مراعاة أن يكون الناتج لا يقل أو يزيد عن 360° بالمعادلة

(Alpha = Alpha - (360*INT(Alpha /360

ثم نعدل المطلع المستقيم

Alpha = Alpha + 90 * ( TRUNC ( Alpha / 90 ) -TRUNC(Alpha / 90))

لأني ارى المعادلتين نتيجتهما صفر!

تم تعديل هذه المشاركة بواسطة Xacker في 28 مايو 2007 في 15:30

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#6

بغية المنفعة لكل اعضاء المنتدى سؤقدم لكم حساب بسيط

ومن خلاله يمكن تدارك اخطائي بحول الله

وسأحسب هنا مواقيت الصلاة وفق الخطوات مستخدماً في ذلك ‏آلة حاسبة عادية

والأحداثيات ‏Booknet ‎‏ للدوحة هي ‏

الطول 51 درجة 36 دقيقة ،نقوم بتحويل هذا إلى رقم عشري بقسمة الدقائق على 60 فيصير ‏الطول هو 51.6 درجة ‏

العرض هو 25 درجة و 15 دقيقة ، وبالكسر العشري يصير 25.25 درجة ‏

والتاريخ هو 3 يونيو لعام 2005 ‏

الخطوة الأولى ‏

‏ نحسب اليوم اليولياني ‏D‏ من القانون ‏

D =((367*Y)-(INT((7/4)*(Y+INT((M+9)/12))))+INT(275*(M/9))+d-730531.5)‎

حيث أن ‏Y ‎‏ هو السنين ، ‏M ‎‏ هو الشهر ، ‏d ‎‏ هو اليوم ‏

وأنا أعلم أن هذه الصيغة الرياضية قد يستشكل فهمها بعض المبتدئين لذلك سأكتبها بالصورة ‏الجبرية الدقيقة كالتالي ‏

‏

لذلك إذا عوضنا في المعادلة كان الحاصل هو ‏

D = 1979.5 ‎

ويمكن تقطيع معادلة حساب اليوم اليولياني إلى بضعة خطوات يسهل التعامل معه كالتالي ‏

ا ) السنة الميلادية × 367 ‏

ب ) ( الشهر + 9 ) ÷ 12 احذف الكسر مطلقاً ‏

ج ) ( السنة + ب ) × 7 ‏

د ) ج ÷ 4 احذف الكسر من الحاصل ‏

ع ) الشهر × 275 ÷ 9 احذف الكسر من الحاصل ‏

اليوم اليولياني = ا - د + ع + اليوم - 730531.5 ‏

نطبق ذلك كالتالي ‏

ا ) 2005 * 367 = 735835 ‏

ب ) (9+6 ) / 12 = 1 حذفنا الكسر من الحاصل ‏

ج ) ( 2005 + 1 ) * 7 = 14042 ‏

د ) 14042 / 4 = 3510 حذفنا الكسر هنا ‏

ع ) 6 * 275 / 9 = 183 حذفنا الكسر ‏

اليوم اليولياني = 735835 - 3510 + 183 + 3 – 730531.5 ‏

اليوم اليولياني = 1979.5 وهو المطلوب ‏

وهناك طريقة أسهل وأسهل بكثير مما ذكرناه سابقاً ، وهو أن تحسب عدد الأيام الماضية من اول ‏يناير لعام 2000 م إلى التاريخ المطلوب والحاصل إطرح منه واحد ونصف ‏

ففي مثالنا السابق التاريخ المطلوب الحساب فيه هو 3 يونيو 2005 ‏

نحسب عدد الأيام الماضية كالتالي ‏

عام 2000 يحتوي 366 يوم لأنه كبيسة ‏

عام 2001 يحتوي 365 يوم لأنه بسيطة ‏

عام 2002 يحتوي 365 يوم لأنه بسيطة‏

عام 2003 يحتوي 365 يوم لأنه بسيطة‏

عام 2004 يحتوي 366 يوم لأنه كبيسة‏

ثم نحسب عدد الأيام من أول يناير 2005 إلى 3

</div>يونيو 2005 فنجدها 154 يوماً ‏

إذن مجموع الأيام الماضية من أول 2000 م إلى 3/6/2005 كالتالي ‏

‏366+365+365+365+366+154 = 1981 ‏

نطرح من الحاصل السابق واحد ونصف فيصير 1979.5 ‏

إذن اليوم اليولياني هو 1979.5 وهو موافق للسابق ‏

نعم أنا أعلم أنني أطلت في شرح حساب اليوم اليولياني لأن أغلب أخطاء زملائي هواة الفلك يقع ‏فيها دائماً ‏

الخطوة الثانية‏ نحسب طول الشمس الوسطي من المعادلة ‏

L = 280.461+0.9856474*D

L = 280.461 + 0.9856474 * (1979.5) ‎

L = 2231.602683‎

‎ ‎‏ لا بد أن يكون الحاصل أقل أو يساوي 360 فقط فإن زاد القيمة عن 360 فإنا نحذف ‏مضاعفات الرقم 360 ، وطريقة ذلك أن نقسم القيمة على 360 والحاصل نحذف منه الأعداد ‏الصحيحة ونأخذ الكسر العشري ونضربه في 360 كالتالي ‏

‎2231.602683‎‏ قسمة 360 الحاصل هو 6.198896342 ‏

نحذف العدد الصحيح وهو الرقم 6 فيصير

#7

نحذف العدد الصحيح وهو الرقم 6 فيصير 0.198896342 وهذا هو الكسر العشري ‏

ثم نضرب الكسر العشري 0.198896342 في 360 فيصبح 71.602683 ‏

إذن ‏

L = 71.602683 ‎

الخطوة الثالثة

‏ نحسب حصة الشمس الوسطي ‏M‏ من المعادلة ‏

M = 357.528+0.9856003*D

M= 357.528 + 0.9856003* ( 1979.5 ) ‎

M= 2308.523794‎

نحذف المضاعفات كما سلف الحديث عنه كالتالي ‏

M = 148.5237939‎

الخطوة الرابعة ‏

نحسب طول الشمس البروجي ‏Lambda‏ من المعادلة‏

Lambda = L +1.915*SIN(M)+0.02*SIN(2*M) ,‎

Lambda = 71.602683 +1.915*sin (148.5238)+0.02*sin(2*

148.5238) ,‎

Lambda = 72.5321‎

الخطوة الخامسة

‏

نحسب الميل الكلي لدائرة البروج ‏Obliquity ‎‏ من المعادلة ‏

Obliquity = 23.439-0.0000004*D

Obliquity = 23.439 – 0.0000004 * (1979.5 ) ,‎

Obliquity = 23.4382082‎

الخطوة السادسة ‏

نحسب المطالع المستقيمة للشمس ‏Alpha‏ من القانون ‏

Alpha =ATAN (COS(Obliquity)*TAN(Lambda)) ,‎

Atan‏ يعني معكوس ظل الزاوية ‏

Alpha = Atan ( cos (23.4382082) * TAN (72.5321)) ,

‎

Alpha = 71.068948‎

مع مراعاة‎ ‎أن يكون الناتج لا يقل أو يزيد عن 360° وفق الملاحظات التالية ‏

إذا كان طول الشمس البروجي بين صفر و 90 فإن المطالع المستقيمة كما هو ‏

إذا كان الطول البروجي بين 90 – 180 فلابد من إضافة 180 على المطالع ‏

إذا كان الطول البروجي بين 180 _ 360 فلابد من إضافة 360 للمطالع ‏

الخطوة السابعة

نحسب الزمن النجمي بالدرجات ‏st‏ ‏

ST =100.46 + 0.985647352 *D

St = 100.46 + 0.985647352 * (1979.5 )‎

St = 2051.548933‎

St = 251.548933‎

الخطوة الثامنة ‏

نحسب ميل الشمس الزاوي ‏DEC ‎‏ ‏

‎

Dec =ASIN(SIN (Obliquity )*SIN(Lambda)),‎

ASIN‏ يعني معكوس جيب الزاوية ‏

DEC = ASIN( sin(23.4382082)* sin(72.5321)‎

DEC = 22.29758‎

الخطوة التاسعة ‏

نحسب زوال الشمس الوسطي ‏noon‏ ‏

Noon = Alpha – ST‎

إذا بلغت القيمة بالسالبة فأضف على الحاصل النهائي 360‏

Noon = 71.068948 - 251.548933‎

Noon = - 180.479985‎

نضيف هنا فوق الحاصل 360 لأنه بالسلب ‏

Noon = 179.520015‎

الخطوة العاشرة ‏

نحسب الزوال العالمي ‏UT Noon‏ ‏

UT Noon = Noon - Long ‎

حيث أن ‏Long ‎‏ هو خط الطول الجغرافي للبلد ‏

UT Noon = 179.520015 – 51.6 ‎

UT Noon = 127.920015 ‎

الخطوة الحادية عشر

نحسب الزوال المحلي الذي هو وقت الظهر ‏Local noon ‎‏ ‏

Local Noon = UT Noon /15 + Zone

حيث أن‎ Zone ‎هو فرق‎ ‎التوقيت العالمى‎ ‎

Local Noon = 127.920015 /15 + 3‎

Local

Noon = 11.528001‎

إذن وقت الظهر بالدوحة هو الساعة 11:31:41

‏

حساب حصص مواقيت ( المغرب والشروق والعشاء والفجر )‏

نرمز للحصص ‏AR ‎‏ ‏

ويحسب وفق المعادلة ‏

‏ ‏

ملاحظة ‏

الرمز ‏alt ‎‏ يرمز إلى ارتفاع أو إنخفاض مركز الشمس عن الأفق ‏

فللمغرب والشروق اجعل ‏alt ‎‏ في المعادلة ( ‏‎-1‎‏ ) ‏

وعليه يصير وقت المغرب ‏sun set ‎‏ ‏

Sun set = Local Noon + AR /15‎

ويصير حساب وقت الشروق ‏sun rise ‎‏ ‏

Sun rise = Local Noon - AR /15 ‎

وللعشاء والفجر إجعل ‏alt ‎‏ في المعادلة ( ‏‎-18 ‎‏)‏

وعليه يصير وقت العشاء ‏Esha ‎‏ ‏

Esha = Local Noon + AR /15‎

ويصير وقت الفجر ‏Fajr

Fajr = Local Noon - AR /15‎

ولتطبيق الحساب على المغرب والشروق في المعادلة كالتالي ‏

‏‏

AR = ACOS ( -0.21426126 ) ‎

AR = 102.3721907‎

نطبق ذلك في حساب المغرب والشروق كالتالي ‏

Sun set = Local Noon + AR /15‎

Sun set = 11:31:41 + 102.3721907 / 15 ‎

Sun set = 11:31:41 + 6:49:29‎

Sun set = 18:21:10‎

Sun rise = 11:31:41 - 6:49:29 ‎

Sun rise = 4:42:12‎

وإذا طبقنا الحساب في معادلة الحصص ‏AR ‎‏ بعد جعل قيمة ‏alt ‎‏ يساوي -18 ‏

نحصل على ‏

AR = 124.241245‎

Esha = Local Noon + AR /15 ‎

<DIV align=left>Esha = 11:31:41

#8

اخي Xacker السائل يقول برمجة ميكروكنترولر...

d4baa0.gif
#9

معادلة ar

ar=ACOS ((SIN(-0.8333 )-SIN(Dec)*SIN(Lat))/(COS(Dec)*COS(Lat)))

Fajr = Local Noon - AR /15‎

Fajr = 11:31:41 - 8:16:58‎

Fajr = 3:14:43‎

من خلال التأمل في قانون حساب الحصص ‏AR ‎‏ نجد أن الذي يحدد مقدار هذا الحصص هو ‏ارتفاع أو إنخفاض مركز الشمس عن الأفق ‏alt ‎‏ فبتغيير قيمته تتغير قيمة الحصة ‏

ولحساب وقت العصر يجب تحديد مقدار ارتفاع مركز الشمس ‏Asr alt‏ عن الأفق وفق القانون ‏

‎,‎‏(( ‏Asr Alt =90- ATAN (1+ TAN( Lat - Dec‎

حيث ان ‏Lat ‎‏ هو عرض البلد ‏

و ‏Dec‏ هو ميل الشمس ‏

وواضح من قانون حساب ارتفاع العصر أنه يعتمد على أخذ الفرق بين الميل وعرض البلد ‏

لذلك لا بد أن تكون قيمة هذا الفارق بالموجب ، وإلا وقع الخلل في حساب وقت العصر ‏

كما يشاهد ذلك في شهري يوليو وأغسطس للبلدان التي يقل عرضها عن الميل الكلي للشمس ‏

أوفي الشتاء للمدن التي تقع أسفل خط الأستواء ‏

لذلك عندما نحسب وقت العصر ببرنامج أكسل أو غيره فإننا نضيف دالة ‏ABS ‎‏ أي دالة القيمة ‏المطلقة التي تحول السالب في آخر القيم إلى موجب كالتالي ‏

‎,‎‏ ((( ‏Asr Alt =90- ATAN (1+ TAN(ABS( Lat - Dec‎

ثم بعد معرفتنا بإرتفاع العصر نطبق الحاصل في قانون الحصص كالآتي ‏

‏

ويصير معرفة العصر ‏Asr Time‏ وفق المعادلة ‏

Asr Time = Local Noon + AR / 15‎

ففي مثالنا لمدينة الدوحة عرضها 25.25 وميل الشمس 22.297 وبالتالي فإن حاصل طرح ‏الميل من العرض تعطي نتيجة موجبة ، لذلك نطبق قانون حساب ارتفاع العصر مباشرة دون ‏تغيير كالتالي ‏

Asr alt = 90 – Atan (1+ Tan ( Lat – Dec )),‎

Asr alt = 90 – Atan ( 1 + Tan (25.25 – 22.297),‎

Asr alt = 43.5596‎

AR = 50.94430‎

Asr Time = Local Noon + AR / 15 ‎

Asr Time = 11:31:41 + 50.94430 / 15‎

Asr Time = 11:31:41 + 3:23:46 ‎

Asr Time = 14:55:27

اسف على عدم التنظيم

‎

#10

اوبس, لم انتبه الى موضوع الميكروكنترولر

في هذه الحالة انسحب, لا افقه الكثير فيه

لكن من خلال Google وجدت انه يوجد رقاقة جاهزة لا أدري ما امكانية طلبها او استخدامها ضمن المشروع.

http://www.micromegacorp.com/#articles

مع الانتباه الى موضوع:

"<a href='http://www.scienceprog.com/increase-microcontroller-code-efficiency/#a كتب:
Don’t use float point arithmetic

Floating point arithmetic is a killer of microcontroller code efficiency unless your design includes FPU. Otherwise compiler uses software subroutines to simulate floating point arithmetic’s. There are many techniques which let you avoid using floating point operations like byte shift instead divide and so on.

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

هذا الموضوع مغلق.

مواضيع مشابهة