تارا فایل

پروژه ساخت دستگاه آنالایزر VCA005




پروژه ساخت دستگاه آنالایزر (VCA005)
بهینه ساز مصرف برق

فهرست مطا لب
1- مقدمه
2- بلوک و دیاگرام دستگاه
3- توضیح عملیات قطعات رسم شده در بلوک دیاگرام
الف – 89C51(1)
ب – 89C51(2)
ج – HIN 232
د- مدارات یکسو کننده و تقویت کننده
ه – تراشه ADC808
و – طرز کار LCD
4- شرح کار دستگاه
5- مشخصات دستگاه
6 – مزایای دستگاه
7- سخت افزار دستگاه
8- مدارات قسمت نمونه گیری ولتاژ و جریان
9- طرز کار ADC 808
10- نرم افزار دستگاه
11- شرح عملکرد نرم افزار
12- شرح کلیدهای مختلف نرم افزار
13- آنالیز اطلاعات ذخیره شده
14-توضیحات نرم افزار اسمبلی میکرو پروسسورها
15- توضیحات نرم افزار تحت ویندوزبا Visual C++

مقدمه

امــروزه بحران مصرف برق شاید مسئله ای مشکل سـاز برای آینده کشورمـان باشد ، با کاهش و صـرفه جویی در مصـرف برق شاید بتوان نیمی از این مشکل را حل نمود ، اما با کمی تدبیر می توان کمک بزرگی به آینده و اقتصاد نمود .

ساخت دستگاه آنالایزر (VCA005) تنها گامی در بهینه سازی مصرف انرژی می باشد ، این دستگاه با آنالیز کامل از مصـرف انرژی نموداری بصورت ماکزیمم و مینیمم مصرف در اختیار کاربر قرار می دهـد ، بنابراین کاریر قادر خواهد بود ایرادات مصرف برق را شناسایی نموده و سعی در رفع اشکالات نماید . بنابراین از این طریق خواهیم توانست کمک شایانی در بهتر مصرف نمودن انرژی انجام دهیم .

با نصب این دستگاه در کارنجات و رفع ایرادات احتمالی که بوسیله آنالیز برق شناسایی خواهد شد میتوان گامی بزرگ در بهینه سازی مصرف برق و اقتصاد کشور برداشت .
امیدوارم با راهنمایی و کمک اساتید محترم و ساخت دستگاه فوق الذکر توانسته باشم کمکی هر چند کوچک به اقتصاد کشورم کرده باشم .

بلوک و دیاگرام دستگاه :

CH0 CH1 CH2 CH3 CH4 CH5

ورودی ورودی ورودی ورودی ورودی ورودی
ولتاژ 3 ولتاژ 2 ولتاژ 1 جریان3 جریان 2 جریان 1

توضح عملیات قطعات کشیده شده در بلوک :

الف ) 89C51(1) :
1- فرمانهای لازم را به ADC808 می دهد تا مقدار آنالوگ به دیجیتال برای هر شش کانال تبدیل شود ( سه کانال جریان و سه کانال ولتاژ )
2- مقدار دیجیتال گرفته شده از ADC را گرفته و عملیات لازم را روی آن انجام می دهد و مقدار مطلوب را روی صفحه LCD نمایش می دهد و همچنین این مقادیر را از طریق پورت سریال به آی سی 89C51(2) می فرستد .
3- کی بورد ماتریسی را چک می کند تا چنانچه کلید فشار داده شد عملیات لازم را انجام دهد .
4- محاسبه کردن ساعت سیستم و نمایش ساعت روی صفحه LCD .
5- محاسبه تاریخ شمسی و نمایش برروی صفحه LCD .
ب) 89C51(2) :
1- اطلاعات رسیده از خط سریال از آی سی 89C51(1) را در حافظه RAM ذخیره می کند و همچنین این اطلاعات را از طریق سریال به کامپیوتر می فرستد تا این مقادیر در نرم افزار نمایش داده شود .
2- بعد از رسیدن هر باکس اطلاعات یک LED را روشن یا خاموش می کند تا ذخیره اطلاعات در دستگاه نمایش داده شود .
ج) HIN232
یک واسط است برای تبادل سریال بین میکرو و کامپیوتر .
این آی سی ولتاژ پنج و صفر میکرو را با استفاده از خازنهای مدار تبدیل به ولتاژهای پانزده و منفی پانزده می کند .
این آی سی برای تبادل سریال از استاندارد RS232 استفاده می کند .
پایه های RS232
چون در کامپوترهای IBM برای ارتباط سریال از سوکت نه پین استفاده می شود لذا پایه های آن را توضیح می دهیم :
پایه ها :
1- تشخیص حامل داده DCD
2- داده رسیده RXD
3- داده ارسال شده TXD
4- پایانه داده آماده DTR
5- سیگنال زمین
6- مجموعه داده آماده
7- تقاضای ارسال
8- آمادگی برای ارسال
9- تشخیص دهنده
ما برای ارتباط سریال با میکرو فقط از پایه های دو و سه و پنج استفاده می کنیم .
پورتهای COM در IBM PC و سازگار به آنها :
کامپوترهای IBM PC و سازگارهای مبتنی بر (8086 ، 286 ، 386 ، 486 و پنتیوم ) معمولاً دو پورت COM دارند . هـر دو پورت کانکتورهای نوع RS – 232 را دارا می باشند .
بسیاری از PC ها یک DB – 25 و یک DB – 9 را بکار می برند .
پورت های COM با COM 1 و COM 2 نامگذاری شده اند . در سالهای اخیر COM 1 برای ماوس و COM 2 برا ی وسایلی چون مودم بکار رفته اند . برای انجام آزمایشات تبادل اطلاعات ، پورت سریال 8051 را به COM 2 در PC بکار می برند .
د) 1 , 2 , 3 , 4 , 5 , 6 :
یک مدار یکسو کننده و تقویت کننده آپ امپی است که ولتاژ ورودی AC را هم یکسو می کند و هم در یک گین ضرب می کند .
R

V OUT +

ه) تراشه ADC 808 با 8 کانال آنالوگ :

تراشه مفید دیگر ADC 808 از National Semaconductor است .
این تراشه دارای 8 ورودی است که اجازه می دهد تا 8 مبدل مختلف را با یک تراشه ردیابی کنیم . این تراشه دارای خروجی داده هشت بیتی است . هشت ورودی آنالوگ مولتی پلکس است ، برای این کار سه پایه آدرس C , B , A به کار می رود در این تراشه VREF(+) و VREF(-) ، ولتاژ مرجع را تنظیم می کند . اگر VREF (-) = GND و VREF(+) = 5 باشد ، سایر پله ها برابر است با 5/256=19.43mv بنابراین برای داشتن پله 10 میلی ولت به ولتاژ ریفرنس 56/2 نیاز داریم . ما از کانالهای A , B , C برای انتخاب کانالهای صفر تا هفت ورودی آنالوگ و از ALE برای لچ کردن آدرس استفاده می کنیم . SC برای شروع تبدیل است . EOC برای پایان تبدیل می باشد ، OE فعال ساز خروجی است .

D 0 II N0

D 7 7 I N

و) طرز کار LCD :

توصیف پایه های LCD
LCD مورد بحث ما چهارده پایه است .
1- VSS – زمین
2- VCC – منبع تغذیه
3-VEE – منبع تغذیه کنترل درخشندگی
4- RS – انتخاب RS=0 برای انتخاب دستور العمل ، RS=1 برای انتخاب ثبات داده .
5- R/W گذرگاه داده 8 بیت .
6- E – انتخاب
7- DB0 گذرگاه داده 8 بیت .
8- DB1گذرگاه داده 8 بیت .
9- DB2 گذرگاه داده 8 بیت .
10- DB3 گذرگاه داده 8 بیت .
11- DB4 گذرگاه داده 8 بیت .
12- DB5 گذرگاه داده 8 بیت .
13- DB6 گذرگاه داده 8 بیت .
14-DB7 گذرگاه داده 8 بیت .
RS ، انخابگر ثبات :
در داخل LCD دو ثبات وجود دارد و این پایه برای انتخاب آنها به این ترتیب بکار می رود که اگر صفر باشد ثبات فرمان انتخاب می شود و اجازه می دهد فرمانهایی همچون پاک کردن ، نشاندن مکان نما و غیره صادر شود و اگر یک باشد ثبات داده انتخاب می شود و به کاربر اجازه ارسال داده روی LCD برای نمایش می دهد .
R/W خواندن / نوشتن :
این پایه به کاربر اجازه نوشتن اظلاعات و یا خواندن از LCD را فراهم می سازد اگر یک باشد برا ی خواندن و اگر صفر باشد برای نوشتن است .
E ، فعال :
از این پایه برای لچ کردن اطلاعات ارائه شده به پایه های داده اش استفاده می کند . وقتی داده به پایه های داده اعمال شد یک پالس بالا – پایین به این پایه اعمال میگردد تا به این وسیله LCD داده موجود در پایه های داده را لچ کند . این پالس بابد حداقل 450 ns عرض داشته باشد .
D0 – D7 :
هشت بیت خط داده برای ارسال اطلاعات به LCD یا خواندن محتوای ثباتهای داخلی LCD بکار می رود . برای نمایش حروف و اعداد پورتهای اسکی برای حروف A – Z و a – z و اعداد صفر تا نه به پایه ها ارسال می شود و همزمان RS = 1 میگردد همچنین کدهای دستورالعمل فرمانی وجود دارند که برای پاک کردن نمایشگر یا باز گرداندن مکان نما به نقطه شروع یا چشمک زدن آن بکار میرود که به شرح ذیل می باشد :
1- پاک کردن صفحه نمایش ………………………………………………..1
2- باز گشت به مکان اول …………………………………………………..2
3- کاهش مکان نما ………………………………………………………..4
4- افزایش مکان نما ………………………………………………………..6
5- جابجایی نمایش به راست ……………………………………………….5
6- جابجایی نمایش به چپ …………………………………………………7
7- نمایش خاموش مکان نما خاموش …………………………………………8
8- نمایش خاموش مکان نما روشن ………………………………………….A
9- نمایش روشن مکان نما روشن …………………………………………… C
10- نمایش روشن مکان نما روشن …………………………………………..E
11- نمایش روشن مکان نما چشمک بزند……………………………………. F
12- جابجایی محل مکان نما به چپ………………………………………. 10
13- جابجایی محل مکان نما به راست……………………………………… 14
14- کل صفحه نمایش به چپ جابجا شود…………………………………… 18
15- کل صفحه نمایش به راست جابجا شود………………………………… 1C
16- مکان نما به آغاز خط دوم برود……………………………………….. C0
17 – سازماندهی دو خط و ماتریس 5*7 …………………………………… 38

شرح کار دستگاه :

این دستگاه از دو قسمت نرم افزار تحت کامپیوتر با ویژال C++ و یک سخت افزار که یک بورد و ودارات الکترونیکی تشکیل شده است .

مشخصات دستگاه آنالایزر VCA005 :

1- دارای یک صفحه LCD برای نمایش ولتاژ و جریان سه فاز لحظه ای کارخانه و نمایش ساعت و تاریخ شمسی می باشد .
2- دارای کی بورد 4*3 ماتریسی برای بعضی از تنظیمات در دستگاه .
3- نگهداری مقدار ماکزیمم جریان سه فاز و ساعت آن در داخل حافظه دستگاه برای آنالیز اپراتور .
4- نمونه گیری از جریان سه فاز و نگهداری در حافظه دستگاه هر هشت ثانیه .
5- این دستگاه سازگاری با هر تابلوی برق دارد و فقط با تعویض ترانس داخال منوی دستگاه بر اساس C/T (ترانس جریان ) می توان این دستگاه را بر روی تابلوهای مختلف نصب کرد و آنالیز لازم را بر روی آن تابلو انجام داد .
6- این دستگاه نیازی به اپراتور برای تخلیه اطلاعات ندارد و خود سیستم بصورت اتوماتیک روشن خواهد شد و اطلاعات تخلیه می شود و کامپیوتر دوباره خاموش خواهد شد .
7- داخل نرم افزار کامپیوتری این امکان وجود دارد که این دستگاه هر جای کارخانه نصب شده باشد از طریق سریال به کامپیوتر متصل می شود و داخل نرم افزار کامپیوتری این امکان وجود دارد که می توان جریان سه فاز و ولتاژ سه فاز را بصورت On Line نمایش می دهد .
8- در داخل نرم افزار این امکان وجور دارد که می توان سطح پر شدن حافظه دستگاه را مشاهده کرد .
مزایای دستگاه آنالایزر VCA005 :

1- بعد از تخلیه اطلاعات هر 24 ساعت می توان نمودار مصرف برق را در نرم افزار Exel رسم نمود و آنالیز لازم را برای برق مصرفی کارخانه مورد نظر انجام داد .
2- از روی نمودار حتی می توان از سالم یا خراب بودن دستگاههایی که آمپر آنها مشخص است مطلع شد .
3- از روی نمودار میتوان اگر قطعی برق باشد ساعت قطع و وصل شدن برق را بدست آورد .
4- در داخل نرم افزار کامپیوتری این امکان وجود دارد که می توان با دادن تاریخ مورد نظر پول برق مصرفی و کیلو وات مصرفی در آن تاریخ رابراساس دادن تعرفه مصرف برق آن کارخانه به نرم افزار بدست آورد .

سخت افزار دستگاه آنالایزر VCA005 :

در داخل نرم افزار 2 عدد میکرو پروسور809C51 وجود دارد که هر یک به تنهایی کار خاصی را انجام می دهند .
ورودی جریان دستگاه از C/T تابلو می باشد که در سر راه C/T یک مقاومت 1/0 اهم ، 5 وات مجود دارد که جریان عبوری از C/T را تبدیل ولتاژ میکند .
C/T :
برای اندازه گیری جریان عبوری از تابلوی برق از این دستگاه استفاده می شود که این دستگاه در دور شین ورودی کارخانه قرار می گیرد و بر اساس جریان ورودی از شین یک جریان متناسب با آن در C/T برقرار می شود .و رابطه آن امکان دارد به صورت زیر باشد که بر اساس جریان کارخانه انتخاب می شود .
1000/5 , 1500/5 , 2000/5 و … بطور مثال اگر 2000 آمپر کارخانه جریان مصرف کند در داخل C/T 5 آمپر تولید می شود ، حال ما خروجی C/T را به یک مقاومت 1/0 اهم و 5 ولت داده ایم که این جریان را تبدیل به ولتاژی کند ، یعنی اگر 5 آمپر در C/T تولید شود ولتاژ ایجاد شده دو سر مقاومت 5/0 ولت است :
V = R . I = 0.1 * 5 = 0.5 شین ورودی
2000A

+ 0.1 C / T
– 5w

توجه : جریان تولید شده در C/T یک جریان AC است .
ولتاژ دو سر مقاومت به یک مدار یکسو ساز و تقویت کننده وارد می شود و بعد از یکسو سازی و تقویت با یک ولتاژ تقویت شده و DC خواهیم داشت که مدار یکسو ساز بصورت زیر می باشد :
R

10 K 0.1 اهم
vout + Vin
OP07
100میکروفاراد –

10 K

مقاومت متغیر R در دست ماست تا بتوانیم گین مدار تقویت کننده را تغییر دهیم ، با این مقاومت د رمدار می توان مدار را کالیبره نمود تا بتواند جریان صحیح را روی LCD نمایش دهد .
دو عدد دیود ورودی باعث می شود که اگر ولتاژ ورودی بیشتر از 6/0 ولت شود اتصال کوتاه خواهد شد و باعث می شود تا خروجی از یک اندازه ای بیشتر نشود و به مدارات بعدی صدمه وارد نشود . این مدار ولتاژ ورودی را یکسو می کند و هم در یک گین ضرب می کند از این مدار به همین صورت دو نمونه دیگر وجود دارد که دو جریان دیگر نیز اندازه گیری خواهد شد .
خروجی این مدارات به ورودی هر کانال ADC808 متصل می شود .
این (ADC808) IC دارای هشت کانال ورودی است که سه تا ورودی جریان و سه تا ورودی ولتاژ است . جریان این IC هشت بیت اطلاعات دیجیتال است که بصورت یک میکروپروسور 89C51 متصل است که میکرو اطلاعات جریان و ولتاژ را بصورت دیجیتال از این پورت دریافت می کند .

مدارات قسمت نمونه گیری ولتاژ :

ابتدا ولتاژ ورودی (220 ولت ) با یک تقسیم ولتاژ تبدیل به ولتاژ زیر 5/0 ولت می شود که بصورت زیر می باشد :

ورودی ولتاژ

220 کیلو اهم w2

470 اهم

طبق مدار بالا دو مدار مشابه وجود دارد که دو ولتاژ دو فاز دیگر را اندازه گیری و بر روی LCD دستگاه نمایش می دهد .
طرز کار ADC 808 :

در ابتدا آدرس ADC روی کانال صفر تنظیم میشود ، طبق اتصالات دستگاه جریان 1 به کانال صفر ، جریان 2 به کانال یک ، جریان 3 به کانال دو ، ولتاژ 1 به کانال سه ، ولتاژ 2 به کانال چهار و ولتاژ 3 به کانال پنج متصل است .
وقتیکه آدرس ADC روی کانال صفر تنظیم شد مقدار دیجیتال که به پورت یک میکرو می رسد مقدار دیجیتال جریان است که این عدد را هم رو ی LCD نمایش می دهد و هم این عدد را از طریق سریال به میکرو دیگر دستگاه می فرستد و آن میکرو این عدد را داخل RAM ذخیره می کند و هم این عدد را از طریق سریال به کامپیوتر می فرستد و در داخل نرم افزار این جریان نمایش داده می شود .
تمام اعداد اندازه گیری شده در داخل دستگاه یک عدد هشت بیتی است ، برای ترانس های بشتر از 250 این عدد خوانده شده از تابلو را در ضریب ترانس ضرب می شود . ضریب ترانس : 2000/250 = 8
مثلاً برای ترانس 2000/5 هر عدد خوانده شده از ADC ضرب در 8 می شود و روی LCDنمایش می دهد .
بطور مثال برای ترانس 800/5 ضریب ترانس برابر 3.2 است که هر عدد خوانده شده ضربدر 3.2 می شود و روی LCDنمایش میدهد.
بعداز اینکه آدرس ADC روی کانال صفرتنظیم شدواطلاعات جریان فاز یک خوانده شد و روی LCD نمایش داده شد آدرس ADC روی کانال یک تنظیم می شود ،
و اطلاعات جریان فاز دوم خوانده می شود و تمام کارهای مراحل قبل انجام می شود یعنی هم روی LCD نمایش می دهد و هم در RAM ذخیره می شود و هم به کامپیوتر فرستاده می شود و در نرم افزار نمایش می دهد و این کار برای کانالهای دیگر ADCنیز انجام می شود تا تمام جریانها و ولتاژهای ورودی اندازه گیری شده و اطلاعات هم روی LCD نمایش داده می شود و هم ذخیره می شود و نیز در نرم افزار کامپیوتری نمایش داده می شود .
نرم افزار دستگاه آنالایزر VCA005 :
این نرم افزار دارای قسمتهای زیادی برای آنالیز جریان دارد . همانطور که در شکل صفحه بعد مشخص است نرم افزار دارای قسمتهای زیادی است .

شرح عملکرد نرم افزار دستگاه آنالایزر VCA005 :

این نرم افزار با ویژوال C++ نوشته شده است . همانطور که در شکل بالا مشخص است این نرم افزار دارای قسمتهای گوناگون می باشد که هر یک را توضیح خواهم داد :
1) کلید800 5 :
این کلید برای تخلیه اطلاعات به صورت دستی می باشد یعنی زمانیکه 24 ساعت از زمان نمونه گیری گذشت حافظه دستگاه پر می شود و باید از طریق نرم افزار کامپیوتری تخلیه شود ، بعد از کلیک بر روی این کلید کامپیوتر از ما سوال میکند آیا مطمئن هستید که می خواهید حافظه را تخلیه کنید .

اگر بعد از این سوال تایید کنید پنجره دیگری باز خواهد شد که از شما تاریخ نمونه را خواهد گرفت که فرمت آن به عنوان مثال با این صورت می باشد 830616 که همان تاریخ 16/06/83 است بعد از وارد نمودن تاریخ و کلیک بر روی کلید تایید نرم افزار یک کد به دستگاه آنالایزر می فرستد و به دستگاه اطلاعات نمونه گیری شده را بصورت باکس های شش تایی می فرستد و نرم افزار آن را دریافت نموده و در یک فایل ذخیره می کند و بعد از اینکه اطلاعات ذخیره شده در دستگاه تمام شد دستگاه آنالایزر یک کد 255 به کامپیوتر می فرستد که به آن اطلاع می دهد اطلاعات تمام شده است و نرم افزار فایل را به صورت کامل با پسوند Meg ذخیره می کند که این فایل بصورت فرمت باینری د رکامپیوتر ذخیره می شود و قابل روئیت بوسیله اپراتور نیست .

2) کلید File Convert :
بعد از تخلیه اطلاعات و ذخیره آنها به صورت باینری چون فایل غیر قابل دیدن است با کلیک بر روی این کلید می توانیم فایل را تبدیل کنیم و فایل قابل دیدن برای آنالیز شود ، بعد از این پنجره ای ظاهر می شود مانند شکل بعد :

که در آن چند گزینه وجود دارد . در قسمت اول می بایست تناریخ فایلی را وارد کنیم که توسط مرحله قبل تخلیه شده و در قسمت بعدی سیستم از ما یک کلمه رمزی می خواهد که اگر اپراتور این کلمه رمز را نداشته باشد نمی تواند فایل را تبدیل کند و اطلاعات ذخیره شده را روئیت نماید و حال چنانچه کلمه رمز صحیح را وارد نماید پیغامی خواهیم داشت که تبدیل صورت گرفته است .
یک فایل بصورت متنی با پسوند txt می دهد که در آن اطلاعات جریان سه فاز که هر هشت ثانیه نمونه گیری شده است وجود دارد که در جلوی هر نمونه ساعت ،دقیقه و ثانیه نمونه گیری مشخص است که با توجه به آن میتوان آنالیز لازم را روی آن انجام داد .مانند شکل صفحه بعد که به این صورت است که ردیف اول جریان فاز یک و ردیف دوم جریان فاز دوم و ردیف سوم جریان فاز سوم وردیف چهارم ساعت ودقیقه وثانیه های نمونه گیری شده در 24 ساعت گذشته است .

3) کلید Change Pass :
این کلید د رهمان پنجره قبلی می باشد که با کلیک بر روی آن پنجره زیر ظاهر می شود :

در این پنجره ما می توانیم کلمه رمز مربوط را عوض کنیم ، برای این کار باید ابتدا کلمه رمز قبلی وارد کنیم و اگر رمز صحیح بود کلمه رمز جدید را وارد می کنیم و دوباره آن را تایید می کنیم به این صورت کلمه رمز عوض خواهد شد و از آن پس می توان با رمز جدید وارد شد .
4) کلید Start New Sample :
بعد از تخلیه اطلاعات باید دستگاه را دوباره برای 24 ساعت بعدی شارچ نماییم که با کلیک این کلید نرم افزار طبق شکل صفحه بعد یک سوال از ما خواهد پرسید :

و اگر آن را تایید نماییم کامپیوتر کد 255 را به دستگاه آنالایزر می فرستد و به آن اطلاع می دهد که نمونه گیری باید دوباره شروع شود و با انجام این کار دستگاه دوباره از خانه اول شروع به نمونه گیری برای 24 ساعت بعدی می کند .
5) کلید Clock :
در قسمت بالای نرم افزار یک پنجره وجود دارد که ساعت سیستم را نمایش می دهد که با تعویض ساعت سیستم آن ساعت هم تغییر خواهد کرد .
6) Change Port :
در این قسمت دو کلید وجود دارد که یکی از آنها قابل انتخاب است که با توجه به اینکه دستگاه را به کدامیک از پورتهای کامپیوتر متصل نموده ایم باید یکی را انتخاب نماییم .

7) قسمت Trans :
این قسمت نیز در بالای نرم افزار قابل مشاهده می باشد که با توجه به اینکه دستگاه به چه تابلویی و یا چه C/T متصل است باید یکی از این گزینه ها را انتخاب نماییم .
* توجه داشته باشید که اگر این گزینه را درست انتخاب نکنید تمام اعدادی که نمایش داده می شود و یا ذخیره می شود اشتباه است .
8) Monitoring :
اگر در نرم افزار این این گزینه تیک زده شود اطلاعات On Line ولتاژ و جریان تابلو در نرم افزار در قسمت پنجره های مورد نظر نمایش داده می شود . دستگاه در هنگام ذخیره اطلاعات همین اطلاعات ولتاژ و جریان را به کامپیوتر می فرستد و کامپیوتر اگر تیک مانیتورینگ زده باشد آنها را نمایش خواهد داد .
9) Auto :
اگر این گزینه تیک خورده باشد یک پنجره باز خواهد شد که کلمه رمز را سوال خواهد کرد و اگر صحیح وارد شود تیک فعال خواهد شد و در دفعه بعد که نرم افزار اجرا شود 10 ثانیه به اپراتور فرصت خواهد داد که تیک برداشته شود ، در این صورت اطلاعات دستگاه را تخلیه خواهد کرد .
این قسمت برای تخلیه اطلاعات بصورت اتوماتیک می باشد به این ترتیب که کامپیوتر در ساعت مورد نظر خودش به صورت اتومات روشن خواهد شد و ویندوز بالا خواهد آمد و بعد از اجرای ویندوز در قسمت فعالیتهای زمان بندی ویندوز نرم افزار آنالایزر را برای آن تعریف می کنیم و یک ساعت به آن می دهیم و در آن ساعت مورد نظر نرم افزار اجرا خواهد شد و بعد از اجرا اگر Tick اتومات در دفعه قبل کلیک شده باشد بعد از اجرای نرم افزار و پس از مدت 10 ثانیه نرم افزار اطلاعات دستگاه راتخلیه خواهد کرد و دوباره آن را شارژ می کند و اطلاعات تخلیه شده را در هارد ذخیره می کند با زدن تاریخ شمسی روی فایل ، نرم افزار دوباره بسته خواهد شد و یک نرم افزار دیگر که با ویژوال C++ نوشته شده است اجرا می شود که همان برنامه Shut Down ویندوز است و پس از 15 ثانیه کامپیوتر را خاموش خواهد کرد تا کامپیوتر بیهوده روشن نباشد . (شکل صفحه بعد )

10) Date – Time :

در قسمت بالا نرم افزار یک یک نوار صفر وجود دارد که بعضی از کارهای خاص نرم افزار در آن قسمت اجرا می شود در منوی Date – Time وقتی باز می شود پنجره ای مانند شکل بعد اجرا خواهد شد :

در آن سه گزینه وجود دارد که دو گزینه اول ساعت و دقیقه خاموش شدن اتومات دستگاه است . ( باید ساعت خاموش شدن را وارد نمود )
در قسمت بعدی باید تاریخ را بصورت شمسی وارد کنیم با فرمت به عنوان مثال 830616 و پس از وارد کردن تاریخ از آن پس فایلها با تاریخ شمسی ذخیره می شوند و نرم افزار خود تاریخ شمسی را محاسبه خواهد کرد .
11) Price :
این گزینه نیز در نوار منو قراردارد که داخل آن دو گزینه دیگر وجود دارد :
الف – Calcutete
با کلیک این گزینه پنجره ای مانند شکل بعد ظاهر می شود :

که در آن دو قسمت وجود دارد که می توان با نوشتن از تاریخ تا تاریخ مورد نظر و با کلیک کلید Enter نرم افزار قیمت برق مصرفی و همچنین KiloWatt مصرفی را در تاریخهای مورد نظر محاسبه و نمایش خواهد داد .
طریقه محاسبه این اطلاعات از طریق تعرفه می باشد که برای هر کارخانه مشخص می باشد و در قسمت Base Value این تعرفه وارد نرم افزار می شود .
فرمول محاسبه قیمت :
Kilo Watt =(3)^1/2 V * I * Cos @
V = 380
I = جریان لحظه ای کارخانه
Price = Kilo Watt * (مبلغ تعرفه برق کارخانه ) * (ساعت مصرف )
ب – Rase Value

با زدن این گزینه پنجره ای مانند شکل زیر ظاهر می شود :

می توان با وارد کردن تعرفه مورد نظر کارخانه در این قسمت بهای برق و کیلو وات مصرفی را درمرحله قبل محاسبه کرد .

آنالیز اطلاعات ذخیره شده :

بعد از تخلیه اطلاعات می توان نمودار آن را از طریق نرم افزار Exel رسم کرد و رفتار مصرف برق کارخانه را در 24 ساعت گذشته بررسی کرد و هر گونه مشکلی که در مصرف برق موجود باشد در این نمودار پدیدار می شود ، حتی از روی نمودار می توان

ساعت شروع بکار و اتمام کار کارگران را با توجه به جریان مصرفی ملاحظه نمود که یک جنبه مدیریتی برای این دستگاه ایجاد نموده است .

ما می توانیم با بررسی این نمودار و اندیشیدن تدابیر درست باعث بهینه سازی مصرف انرژی شویم و در این راه گام بزرگی برداریم .

توضیحات نرم افزار میکرو پروسسورها در سخت افزار :

1- نرم افزار اسمبلی داخل آی سی 89C51(1) :

این قسمت نامگذاری حافظه RAM و پورتها با یک نام مستعار می باشد :

;#######################################
;//////////////////////////////////////
;////////////CONTROL BYTE///////////////
;//////////////////////////////////////
;#######################################
REGISTER_ADC EQU P1

REGISTER_LCD EQU P0

PRS_KEY EQU 25H

D1 EQU 30H
D2 EQU 31H
D3 EQU 32H

K_TRANS EQU 33H

M1 EQU 34H
M2 EQU 35H
M3 EQU 36H
M4 EQU 37H

H_DIV_BYTE EQU 38H
L_DIV_BYTE EQU 39H

DATA_P EQU 3AH
POS EQU 3BH

SEND_DATA EQU 3CH
PUSH_POP_A EQU 3DH
PUSH_POP_R0 EQU 3EH
UPDATE_LCD EQU 3FH

M_S EQU 40H
S01 EQU 41H
S10 EQU 42H
M01 EQU 43H
M10 EQU 44H
H01 EQU 45H
H10 EQU 46H

REG3 EQU 47H

CURRENT_MAX1 EQU 48H
CURRENT_MAX2 EQU 49H
CURRENT_MAX3 EQU 4AH

ACOM EQU 4BH

KEY_OUT EQU 4CH
KO EQU 4DH

DATE EQU 4EH
DAY01 EQU 4FH
DAY10 EQU 50H
MON01 EQU 51H
MON10 EQU 52H
YEAR01 EQU 53H
YEAR10 EQU 54H
KABIS EQU 55H

CURRENT_1 EQU 56H
CURRENT_2 EQU 57H
CURRENT_3 EQU 58H

CHECK_MENU EQU 59H

HOLD_DISPLAY EQU 5AH

DELAY_FOR_TARNS EQU 5BH

VOLT_1 EQU 5CH
VOLT_2 EQU 5DH
VOLT_3 EQU 5EH

MAX_TIME_M01_1 EQU 5FH
MAX_TIME_M10_1 EQU 60H
MAX_TIME_H01_1 EQU 61H
MAX_TIME_H10_1 EQU 62H

MAX_TIME_M01_2 EQU 63H
MAX_TIME_M10_2 EQU 64H
MAX_TIME_H01_2 EQU 65H
MAX_TIME_H10_2 EQU 66H

MAX_TIME_M01_3 EQU 67H
MAX_TIME_M10_3 EQU 68H
MAX_TIME_H01_3 EQU 69H
MAX_TIME_H10_3 EQU 6AH

PASS_1 EQU 6BH
PASS_2 EQU 6CH
PASS_3 EQU 6DH
PASS_4 EQU 6EH

;#######################################
;//////////////////////////////////////
;////////////COMMAND BYTE//////////////
;//////////////////////////////////////
;#######################################
RECIVE_CLOCK EQU 248
ENABLE_DATA EQU 251
DISABLE_DATA EQU 252
RESTART EQU 250
;#######################################
;//////////////////////////////////////
;////////////CONTROL BIT///////////////
;//////////////////////////////////////
;#######################################
OUT_MENU BIT 01H
;#######################################
;//////////////////////////////////////
;//////////CONTROL BIT PORT////////////
;//////////////////////////////////////
;#######################################
ADC_ADRESS_1 BIT P3.4
ADC_ADRESS_2 BIT P2.5
ADC_ADRESS_3 BIT P2.4

MENU_ENTER BIT P2.7

MENU_WAIT BIT P2.6

LTCH_ADRESS_ADC BIT P3.6

CONVERTING_ADC BIT P2.7
LCD_COMMAND_DATA BIT P3.6
LCD_ENABLE BIT P2.1
;#######################################
;//////////////////////////////////////
;////////////STARTING PROGRAM//////////
;//////////////////////////////////////
;#######################################
ORG 00H
JMP MAIN
;#######################################
;//////////////////////////////////////
;////////////INTERUPT TIMER////////////
;//////////////////////////////////////
;#######################################
ORG 000BH
JMP WATCH

;#######################################
;//////////////////////////////////////
;////////////INTERUPT SERIAL///////////
;//////////////////////////////////////
;#######################################
ORG 0023H
JMP SERIAL

;#######################################
;//////////////////////////////////////
;////////////MAIN PROGRAM//////////////
;//////////////////////////////////////
;#######################################

* این قسمت زیر برنامه اصلی می باشد که تمام برنامه های فرعی از این قسمت فراخوانی می شود .
ORG 30H
;**********************************
MAIN:
CALL INIT_VALUE
START:
INC HOLD_DISPLAY
CALL READ_CURRENT_1
CALL READ_CURRENT_2
CALL READ_CURRENT_3

CALL READ_VOLT_1
CALL READ_VOLT_2
CALL READ_VOLT_3

MOV A,UPDATE_LCD
CJNE A,#1,JP1
CALL SHOW_TEXT_VAL
MOV UPDATE_LCD,#0
JP1:
CALL INIT_DATE
MOV A,HOLD_DISPLAY
CJNE A,#3,JP2
CALL SHOW_V_VAL
CALL SHOW_I_VAL
MOV HOLD_DISPLAY,#0
JP2:
MOV A,DELAY_FOR_TARNS
CJNE A,#1,JP3
MOV A,SEND_DATA
CJNE A,#1,JP3
CALL TRANS
MOV DELAY_FOR_TARNS,#0
JP3:
JMP START
;**********************************
* این زیر برنامه وقفه سریال می باشد که هر گونه ارتباط سریال اگر با این آی سی برقرار شود برنامه بصورت اتومات و وقفه ای به این قسمت پرش پیدا می کند که با توجه به اعداد رسیده از سریال یک سری کارهای خاص انجام می شود .

SERIAL:
MOV ACOM,A
MOV REG3,R3
MOV A,SBUF
CALL DELAY0
CLR RI

CJNE A,#DISABLE_DATA,JP4
MOV SEND_DATA,#0
MOV A,ACOM
MOV R3,REG3
RETI
JP4:

CJNE A,#ENABLE_DATA,JP5
MOV SEND_DATA,#1
MOV A,ACOM
MOV R3,REG3
RETI
JP5:

CJNE A,#RECIVE_CLOCK,JP_NEXT
MOV R2,#0
MOV A,ACOM
MOV R3,REG3
RETI
JP_NEXT:
CJNE R2,#0,JP_NEXT1
INC R2
MOV M01,A
MOV A,ACOM
MOV R3,REG3
RETI
JP_NEXT1:
CJNE R2,#1,JP_NEXT2
INC R2
MOV M10,A
MOV A,ACOM
MOV R3,REG3
RETI
JP_NEXT2:
CJNE R2,#2,JP_NEXT3
INC R2
MOV H01,A
MOV A,ACOM
MOV R3,REG3
RETI
JP_NEXT3:
CJNE R2,#3,JP_NEXT4
INC R2
MOV H10,A
CALL SHOW_CLOCK
MOV A,ACOM
MOV R3,REG3
RETI
JP_NEXT4:
RETI
;/////////////////WATCH///////////////

* این قسمت زیر برنامه وقفه تایمر صفر می باشد که ساعت سیستم در این قسمت محاسبه و بر روی LCD نمایش داده می شود . این زیر برنامه هر 0.05 ثانیه فراخوانی می شود .
WATCH:
MOV TH0,#4CH
MOV PUSH_POP_A,A
MOV PUSH_POP_R0,R0
INC M_S
MOV A,M_S
CJNE A,#20,BYE
MOV DELAY_FOR_TARNS,#1
MOV M_S,#0
INC S01
INC CHECK_MENU
MOV A,CHECK_MENU
CJNE A,#20,JP_1
MOV CHECK_MENU,#0
SETB OUT_MENU
JP_1:
MOV A,S01
CJNE A,#10,BYE
MOV S01,#0
INC S10
MOV A,S10
CJNE A,#06,BYE
MOV S10,#0
MOV UPDATE_LCD,#1
INC M01
MOV A,M01
CJNE A,#10,BYE
MOV M01,#0
INC M10
MOV A,M10
CJNE A,#6,BYE
MOV M10,#0
INC H01
MOV A,H01
MOV R0,H10
CJNE R0,#2,JP8
MOV A,H01
CJNE A,#4H,BYE
MOV H01,#0
MOV H10,#0
CALL INIT_MAXIMOM
MOV DATE,#1
JMP BYE
JP8:
CJNE A,#10,BYE
MOV H01,#0
INC H10
MOV A,H10
CJNE A,#2,BYE
MOV A,H01
CJNE A,#4,BYE
MOV H01,#0
MOV H10,#0
MOV R0,H01
BYE:
MOV A,PUSH_POP_A
MOV R0,PUSH_POP_R0
RETI
;///////////////////////////////////

* این زیر برنامه برای نمایش ساعت بر روی صفحه LCD استفاده می شود که ساعت و دقیقه را روی صفحه نمایش نشان می دهد .
SHOW_CLOCK:
MOV POS,#0FH
CALL SET_CURS

MOV A,H10
ORL A,#30H
MOV DATA_P,A
CALL SHOW

MOV A,H01
ORL A,#30H
MOV DATA_P,A
CALL SHOW

MOV DATA_P,#3AH
CALL SHOW

MOV A,M10
ORL A,#30H
MOV DATA_P,A
CALL SHOW

MOV A,M01
ORL A,#30H
MOV DATA_P,A
CALL SHOW
RET
;///////////////////////////////////

* این زیر برنامه نمایش تاریخ بر روی صفحه نمایش مورد استفاده قرار می گیرد .
SHOW_DATE:
MOV POS,#00H
CALL SET_CURS

MOV A,YEAR10
ORL A,#30H
MOV DATA_P,A
CALL SHOW

MOV A,YEAR01
ORL A,#30H
MOV DATA_P,A
CALL SHOW

MOV DATA_P,#2FH
CALL SHOW

MOV A,MON10
ORL A,#30H
MOV DATA_P,A
CALL SHOW

MOV A,MON01
ORL A,#30H
MOV DATA_P,A
CALL SHOW

MOV DATA_P,#2FH
CALL SHOW

MOV A,DAY10
ORL A,#30H
MOV DATA_P,A
CALL SHOW

MOV A,DAY01
ORL A,#30H
MOV DATA_P,A
CALL SHOW
RET
;***********************************************

* این زیر برنامه برای ارسال اطلاعات ولتاژ و جریان سه فاز به آی سی میکرو پروسسور بعدی مورد استفاده قرار می گیرد تا این اطلاعات در حافظه ذخیره شود و همچنین برای نمایش در نرم افزار به کامپیوتر ارسال می شود .
TRANS:
CLR ES
MOV A,#0FDH
MOV SBUF,A
JNB TI,$
CALL DELAY0
CLR TI

MOV A,CURRENT_1
MOV SBUF,A
JNB TI,$
CALL DELAY0
CLR TI

MOV A,CURRENT_2
MOV SBUF,A
JNB TI,$
CALL DELAY0
CLR TI

MOV A,CURRENT_3
MOV SBUF,A
JNB TI,$
CALL DELAY0
CLR TI

MOV A,VOLT_1
MOV SBUF,A
JNB TI,$
CALL DELAY0
CLR TI

MOV A,VOLT_2
MOV SBUF,A
JNB TI,$
CALL DELAY0
CLR TI

MOV A,VOLT_3
MOV SBUF,A
JNB TI,$
CALL DELAY0
CLR TI
SETB ES
RET
;************************* KEY BOARD *************************

* این زیر برنامه برای چک کردن کی بورد مورد استفاده قرار می گیرد .
KEY:
JNB OUT_MENU,JP_2
MOV KEY_OUT,#3
RET
JP_2:
MOV R3,#70
BACK:
CALL GET_KEY
JNC KEY
DJNZ R3,BACK
PUSH ACC
BACK2:
MOV R3,#70
BACK3:
CALL GET_KEY
JC BACK2
DJNZ R3,BACK3
POP ACC
MOV CHECK_MENU,#0
MOV KEY_OUT,ACC
MOV P2,#0FFH
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;CHEK & READ KEY_PAD;;;;;;;;;;;;;;;;;;;;;;;;
GET_KEY:
MOV A,#0FEH
MOV R6,#4
TEST:
MOV P2,A
MOV R7,A
MOV A,P2
ANL A,#0F0H
CJNE A,#0F0H,KEY_HIT
MOV A,R7
RL A
DJNZ R6,TEST
CLR C
SJMP EXIT
KEY_HIT:
MOV R7,A
MOV A,#4
CLR C
SUBB A,R6
MOV R6,A
MOV A,R7
SWAP A
MOV R5,#4
AGAIN:
RRC A
JNC DONE
INC R6
INC R6
INC R6
INC R6
DJNZ R5,AGAIN
DONE:
SETB C
MOV A,R6
EXIT:
MOV KEY_OUT,ACC
MOV P2,#0FFH
RET
;**************************KEY_FUN**************************

* این زیر برنامه برای تنظیم ساعت در قسمت منوی دستگاه مورد استفاده قرار میگیرد .
KEY_FUN:
MOV R1,#0
JP25:
CALL KEY
MOV DPTR,#KEY_TAB
MOV A,KEY_OUT
MOVC A,@A+DPTR
MOV PRS_KEY,A
JNB PRS_KEY.4,JP27
RET
JP26:

JMP JP25
JP27:
CJNE R1,#0,JP28
MOV H10,PRS_KEY

MOV POS,#5CH
CALL SET_CURS

MOV A,H10
ORL A,#30H
MOV DATA_P,A
CALL SHOW

INC R1
JMP JP25
JP28:

CJNE R1,#1,JP29
MOV H01,PRS_KEY

MOV POS,#5DH
CALL SET_CURS

MOV A,H01
ORL A,#30H
MOV DATA_P,A
CALL SHOW

INC R1
JMP JP25
JP29:

CJNE R1,#2,JP30
MOV M10,PRS_KEY

MOV POS,#5FH
CALL SET_CURS

MOV A,M10
ORL A,#30H
MOV DATA_P,A
CALL SHOW

INC R1
JMP JP25
JP30:

CJNE R1,#3,JP31
MOV M01,PRS_KEY

MOV POS,#60H
CALL SET_CURS

MOV A,M01
ORL A,#30H
MOV DATA_P,A
CALL SHOW

INC R1
JP31:
RET
;***********************************************************

* این زیر برنامه برای تنظیم نوع ترانس در قسمت منوی دستگاه مورد استفاده قرار میگیرد .
KEY_FUN_TRANS:
MOV R1,#0
JP_25:
CALL KEY
MOV DPTR,#KEY_TAB
MOV A,KEY_OUT
MOVC A,@A+DPTR
MOV PRS_KEY,A
JNB PRS_KEY.4,JP_27
RET
JP_27:
CJNE R1,#0,JP_28
MOV M2,PRS_KEY
MOV POS,#62H
CALL SET_CURS
MOV A,M2
ORL A,#30H
MOV DATA_P,A
CALL SHOW
INC R1
JMP JP_25
JP_28:
CJNE R1,#1,JP_31
MOV M1,PRS_KEY
MOV POS,#64H
CALL SET_CURS
MOV A,M1
ORL A,#30H
MOV DATA_P,A
CALL SHOW
INC R1
JP_31:
RET
;***********************************************************

* در بعضی از قسمتهای منوی دستگاه احتیاج به وارد کردن کلمه رمز می باشد ، این قسمت همان زیر برنامه گرفتن کلمه رمز می باشد .
KEY_FUN_TRANS:

KEY_FUN_PASS:
MOV POS,#23H
CALL SET_CURS
MOV R1,#0
JP__25:
CALL KEY
MOV DPTR,#KEY_TAB
MOV A,KEY_OUT
MOVC A,@A+DPTR
MOV PRS_KEY,A
JNB PRS_KEY.4,JP__27
RET
JP__27:
CJNE R1,#0,JP__28
MOV M4,PRS_KEY

MOV DATA_P,#42
CALL SHOW

INC R1
JMP JP__25
JP__28:

CJNE R1,#1,JP__29
MOV M3,PRS_KEY

MOV DATA_P,#42
CALL SHOW

INC R1
JMP JP__25
JP__29:

CJNE R1,#2,JP__30
MOV M2,PRS_KEY

MOV DATA_P,#42
CALL SHOW

INC R1
JMP JP__25
JP__30:

CJNE R1,#3,JP__31
MOV M1,PRS_KEY

MOV DATA_P,#42
CALL SHOW

INC R1
JP__31:
RET
;**************************KEY_FUN**************************

* این زیر برنامه برای تنظیم تاریخ سیستم در قسمت منوی دستگاه مورد استفاده قرار میگیرد .
KEY_FUN_TRANS:

KEY_FUN1:
MOV R1,#0
JP32:
CALL KEY
MOV DPTR,#KEY_TAB
MOV A,KEY_OUT
MOVC A,@A+DPTR
MOV PRS_KEY,A
JNB PRS_KEY.4,JP33
RET
JP34:

JMP JP32
JP33:
CJNE R1,#0,JP35
MOV YEAR10,PRS_KEY

MOV POS,#5AH
CALL SET_CURS

MOV A,YEAR10
ORL A,#30H
MOV DATA_P,A
CALL SHOW

INC R1
JMP JP32
JP35:

CJNE R1,#1,JP36
MOV YEAR01,PRS_KEY

MOV POS,#5BH
CALL SET_CURS

MOV A,YEAR01
ORL A,#30H
MOV DATA_P,A
CALL SHOW

INC R1
JMP JP32
JP36:

CJNE R1,#2,JP37
MOV MON10,PRS_KEY

MOV POS,#5DH
CALL SET_CURS

MOV A,MON10
ORL A,#30H
MOV DATA_P,A
CALL SHOW

INC R1
JMP JP32
JP37:

CJNE R1,#3,JP38
MOV MON01,PRS_KEY

MOV POS,#5EH
CALL SET_CURS

MOV A,MON01
ORL A,#30H
MOV DATA_P,A
CALL SHOW

INC R1
JMP JP32
JP38:

CJNE R1,#4,JP39
MOV DAY10,PRS_KEY

MOV POS,#60H
CALL SET_CURS

MOV A,DAY10
ORL A,#30H
MOV DATA_P,A
CALL SHOW

INC R1
JMP JP32
JP39:

CJNE R1,#5,JP40
MOV DAY01,PRS_KEY

MOV POS,#61H
CALL SET_CURS

MOV A,DAY01
ORL A,#30H
MOV DATA_P,A
CALL SHOW

INC R1
JP40:

CALL SHOW_DATE

RET
;**************************KEY_FUN**************************

* این زیر برنامه منوی اصلی دستگاه می باشد که با انتخاب هر کدام از منوها وارد یک زیر منو خواهیم شد .
KEY_FUN2:
JP41:
CALL KEY
MOV DPTR,#KEY_TAB
MOV A,KEY_OUT
MOVC A,@A+DPTR
MOV PRS_KEY,A
JNB PRS_KEY.4,JP42
CALL SHOW_TEXT_VAL
RET
JP43:
JMP JP41
JP42:
CJNE A,#0,JP44
JMP JP50
JP44:
CJNE A,#1,JP45
CALL SHOW_MAX
JMP JP50
JP45:
CJNE A,#2,JP46
CALL RESTART_RAM
JMP JP50
JP46:
CJNE A,#3,JP47
CALL SET_CLOCK
JMP JP50
JP47:
CJNE A,#4,JP48
CALL SET_DATE
JMP JP50
JP48:
CJNE A,#5,JP49
CALL SELECT_TRANS
JMP JP50
JP49:
JMP JP41
JP50:
CALL SHOW_TEXT_VAL
RET
;***********************************

* در منوی دستگاه یک گزینه وجود دارد برای ذخیره مجدد اطلاعات که قبل از این عمل از کاربر یک کلمه رمز گرفته می شود ،این قسمت همین کارها را انجام میدهد .
RESTART_RAM:
CALL LCD_INIT
CALL SHOW_ZARIB
CALL SHOW_CLOCK
CALL SHOW_DATE
CALL PRI28
CALL KEY_FUN_PASS
MOV A,PASS_4
CJNE A,M4,END_RESTART
MOV A,PASS_3
CJNE A,M3,END_RESTART
MOV A,PASS_2
CJNE A,M2,END_RESTART
MOV A,PASS_1
CJNE A,M1,END_RESTART
MOV M1,#0
MOV M2,#0
MOV M3,#0
MOV M4,#0
CLR ES
MOV A,#RESTART
MOV SBUF,A
JNB TI,$
CALL DELAY0
CLR TI
SETB ES
RET
END_RESTART:
MOV M1,#0
MOV M2,#0
MOV M3,#0
MOV M4,#0
CALL LCD_INIT
CALL SHOW_ZARIB
CALL SHOW_CLOCK
CALL SHOW_DATE
CALL PRI29
CALL KEY
RET
;***********************************

* این زیر برنامه زیر منوی تنظیم نوع ترانس می باشد .
SELECT_TRANS:
CALL LCD_INIT
CALL PRI25
CALL PRI26
CALL PRI27
MOV POS,#4EH
CALL SET_CURS
CALL BTB_TRANS
CALL KEY_FUN_TRANS
MOV A,M2
MOV B,#10
MUL AB
ADD A,M1
MOV K_TRANS,A
RET
;***********************************

* این زیر برنامه عدد گرفته شده از جریان سه فاز را در ضریب ترانس ضرب کرده و تبدیل به سه عدد مجزا برای نمایش بر روی صفحه نمایش می کند .
BTB_TRANS:
MOV A,K_TRANS
MOV B,#10
DIV AB
MOV M1,B
MOV M2,A

MOV A,M2
ORL A,#30H
MOV DATA_P,A
CALL SHOW

MOV DATA_P,#46
CALL SHOW

MOV A,M1
ORL A,#30H
MOV DATA_P,A
CALL SHOW

RET
;***********************************

* این زیر برنامه زیر منوی اصلی تنظیم ساعت و نمایش بر روی صفحه نمایش میباشد .
SET_CLOCK:
CALL LCD_INIT
CALL SHOW_ZARIB
CALL SHOW_CLOCK
CALL SHOW_DATE
CALL PRI1
CALL PRI2
CALL KEY_FUN
RET
;************************************

* این زیر برنامه زیر منوی اصلی تنظیم تاریخ و نمایش بر روی صفحه نمایش میباشد.
SET_DATE:
CALL LCD_INIT
CALL SHOW_ZARIB
CALL SHOW_CLOCK
CALL SHOW_DATE
CALL PRI3
CALL PRI4
CALL KEY_FUN1
RET
;****************************

* این زیر برنامه مقادیر ماکزیمم جریان را برای 24 ساعت بعدی صفر می کند .
INIT_MAXIMOM:
MOV CURRENT_MAX1,#0H
MOV CURRENT_MAX2,#0H
MOV CURRENT_MAX3,#0H
RET
;****************************

* این زیر برنامه در ابتدای شروع به کار آی سی مورد استفاده قرار میگیرد و مقادیر اولیه به متغیرها را میدهد .
INIT_VALUE:
MOV PASS_1,#1
MOV PASS_2,#3
MOV PASS_3,#8
MOV PASS_4,#3
MOV K_TRANS,#80
MOV HOLD_DISPLAY,#0
MOV UPDATE_LCD,#1
MOV SEND_DATA,#0
MOV P2,#0FFH
MOV REGISTER_ADC,#0FFH
CALL INIT_MAXIMOM
MOV CURRENT_1,#0H
MOV CURRENT_2,#0H
MOV CURRENT_3,#0H
MOV KABIS,#0
MOV VOLT_1,#0
MOV VOLT_2,#0
MOV VOLT_3,#0
MOV KO,#0
MOV M_S,#0
MOV S01,#5
MOV S10,#5
MOV M01,#9
MOV M10,#5
MOV H01,#3
MOV H10,#2
MOV R2,#100

MOV MAX_TIME_M01_1,#0
MOV MAX_TIME_M10_1,#0
MOV MAX_TIME_H01_1,#0
MOV MAX_TIME_H10_1,#0

MOV MAX_TIME_M01_2,#0
MOV MAX_TIME_M10_2,#0
MOV MAX_TIME_H01_2,#0
MOV MAX_TIME_H10_2,#0

MOV MAX_TIME_M01_3,#0
MOV MAX_TIME_M10_3,#0
MOV MAX_TIME_H01_3,#0
MOV MAX_TIME_H10_3,#0

MOV DAY01,#1
MOV DAY10,#0
MOV MON01,#1
MOV MON10,#0
MOV YEAR01,#3
MOV YEAR10,#8
MOV DATE,#0
CLR LTCH_ADRESS_ADC
MOV P3,#0FFH
CALL LCD_INIT
SETB CONVERTING_ADC
MOV DELAY_FOR_TARNS,#0
CALL LCD_INIT
CALL SHOW_TEXT_VAL

CLR TI
CLR RI
MOV TMOD,#21H
MOV TH1,#0FDH
MOV TCON,#00H
MOV SCON,#50H
MOV IE,#92H
SETB TR0
SETB TR1
RET
;**********************************

* این زیر برنامه کانال صفر ADC را فعال کرده و مقدار جریان فاز یک را خوانده و در داخل رجیستر مربوطه قرار میدهد .
READ_CURRENT_1:
CLR ADC_ADRESS_1
CLR ADC_ADRESS_2
CLR ADC_ADRESS_3
CALL DELAY_FOR_ADC
SETB LTCH_ADRESS_ADC
CALL DELAY_FOR_ADC
CLR LTCH_ADRESS_ADC
CALL DELAY_FOR_ADC
CLR CONVERTING_ADC
CALL DELAY_FOR_ADC
SETB CONVERTING_ADC
CALL DELAY_FOR_ADC
CALL TEST_MAX_1
CLR MENU_WAIT
JB MENU_ENTER,JP10
CALL MENU
JP10:
SETB MENU_WAIT
RET
;***********************************

* این زیر برنامه کانال یک ADC را فعال کرده و مقدار جریان فاز دو را خوانده و در داخل رجیستر مربوطه قرار میدهد .
READ_CURRENT_2:
SETB ADC_ADRESS_1
CLR ADC_ADRESS_2
CLR ADC_ADRESS_3
CALL DELAY_FOR_ADC
SETB LTCH_ADRESS_ADC
CALL DELAY_FOR_ADC
CLR LTCH_ADRESS_ADC
CALL DELAY_FOR_ADC
CLR CONVERTING_ADC ;READ ADC
CALL DELAY_FOR_ADC
SETB CONVERTING_ADC
CALL DELAY_FOR_ADC
CALL TEST_MAX_2
CLR MENU_WAIT
JB MENU_ENTER,JP11
CALL MENU
JP11:
SETB MENU_WAIT
RET
;***********************************

* این زیر برنامه کانال دو ADC را فعال کرده و مقدار جریان فاز سه را خوانده و در داخل رجیستر مربوطه قرار میدهد .
READ_CURRENT_3:
CLR ADC_ADRESS_1
SETB ADC_ADRESS_2
CLR ADC_ADRESS_3
CALL DELAY_FOR_ADC
SETB LTCH_ADRESS_ADC
CALL DELAY_FOR_ADC
CLR LTCH_ADRESS_ADC
CALL DELAY_FOR_ADC
CLR CONVERTING_ADC ;READ ADC
CALL DELAY_FOR_ADC
SETB CONVERTING_ADC
CALL DELAY_FOR_ADC
CALL TEST_MAX_3
CLR MENU_WAIT
JB MENU_ENTER,JP12
CALL MENU
JP12:
SETB MENU_WAIT
RET
;***********************************

* این زیر برنامه کانال سه ADC را فعال کرده و مقدار ولتاژ فاز یک را خوانده و در داخل رجیستر مربوطه قرار میدهد .

READ_VOLT_1:
SETB ADC_ADRESS_1
SETB ADC_ADRESS_2
CLR ADC_ADRESS_3
CALL DELAY_FOR_ADC
SETB LTCH_ADRESS_ADC
CALL DELAY_FOR_ADC
CLR LTCH_ADRESS_ADC
CALL DELAY_FOR_ADC
CLR CONVERTING_ADC ;READ ADC
CALL DELAY_FOR_ADC
SETB CONVERTING_ADC
CALL DELAY_FOR_ADC
MOV A,REGISTER_ADC
MOV VOLT_1,A
CLR MENU_WAIT
JB MENU_ENTER,JP13
CALL MENU
JP13:
SETB MENU_WAIT
RET
;***********************************

* این زیر برنامه کانال چهار ADC را فعال کرده و مقدار ولتاژ فاز دو را خوانده و در داخل رجیستر مربوطه قرار میدهد .

READ_VOLT_2:
CLR ADC_ADRESS_1
CLR ADC_ADRESS_2
SETB ADC_ADRESS_3
CALL DELAY_FOR_ADC
SETB LTCH_ADRESS_ADC
CALL DELAY_FOR_ADC
CLR LTCH_ADRESS_ADC
CALL DELAY_FOR_ADC
CLR CONVERTING_ADC ;READ ADC
CALL DELAY_FOR_ADC
SETB CONVERTING_ADC
CALL DELAY_FOR_ADC
MOV A,REGISTER_ADC
MOV VOLT_2,A
CLR MENU_WAIT
JB MENU_ENTER,JP14
CALL MENU
JP14:
SETB MENU_WAIT
RET
;***********************************

* این زیر برنامه کانال پنج ADC را فعال کرده و مقدار ولتاژ فاز سه را خوانده و در داخل رجیستر مربوطه قرار میدهد .

READ_VOLT_3:
SETB ADC_ADRESS_1
CLR ADC_ADRESS_2
SETB ADC_ADRESS_3
CALL DELAY_FOR_ADC
SETB LTCH_ADRESS_ADC
CALL DELAY_FOR_ADC
CLR LTCH_ADRESS_ADC
CALL DELAY_FOR_ADC
CLR CONVERTING_ADC ;READ ADC
CALL DELAY_FOR_ADC
SETB CONVERTING_ADC
CALL DELAY_FOR_ADC
MOV A,REGISTER_ADC
MOV VOLT_3,A
CLR MENU_WAIT
JB MENU_ENTER,JP15
CALL MENU
JP15:
SETB MENU_WAIT
RET
;***********************************

* این زیر برنامه مقدار ماکزیمم جریان و ساعت مربوطه را در زیر منوی ماکزیمم بر روی صفحه نمایش نشان میدهد .
SHOW_MAX:
CALL LCD_INIT
CALL SHOW_ZARIB
CALL SHOW_CLOCK
CALL SHOW_DATE
CALL PRI15
CALL SHOW_VAL_MAX
CALL SHOW_T_MAX
CALL KEY
RET
;******************************
SHOW_T_MAX:
MOV POS,#14H
CALL SET_CURS

MOV A,MAX_TIME_H10_1
ORL A,#30H
MOV DATA_P,A
CALL SHOW

MOV A,MAX_TIME_H01_1
ORL A,#30H
MOV DATA_P,A
CALL SHOW

MOV DATA_P,#3AH
CALL SHOW

MOV A,MAX_TIME_M10_1
ORL A,#30H
MOV DATA_P,A
CALL SHOW

MOV A,MAX_TIME_M01_1
ORL A,#30H
MOV DATA_P,A
CALL SHOW

MOV POS,#1BH
CALL SET_CURS

MOV A,MAX_TIME_H10_2
ORL A,#30H
MOV DATA_P,A
CALL SHOW

MOV A,MAX_TIME_H01_2
ORL A,#30H
MOV DATA_P,A
CALL SHOW

MOV DATA_P,#3AH
CALL SHOW

MOV A,MAX_TIME_M10_2
ORL A,#30H
MOV DATA_P,A
CALL SHOW

MOV A,MAX_TIME_M01_2
ORL A,#30H
MOV DATA_P,A
CALL SHOW

MOV POS,#23H
CALL SET_CURS

MOV A,MAX_TIME_H10_3
ORL A,#30H
MOV DATA_P,A
CALL SHOW

MOV A,MAX_TIME_H01_3
ORL A,#30H
MOV DATA_P,A
CALL SHOW

MOV DATA_P,#3AH
CALL SHOW

MOV A,MAX_TIME_M10_3
ORL A,#30H
MOV DATA_P,A
CALL SHOW

MOV A,MAX_TIME_M01_3
ORL A,#30H
MOV DATA_P,A
CALL SHOW

RET
;************************************************

* این زیر برنامه تمام نوشته ها بر روی صفحه نمایش در قسمت اصلی را روی LCD نمایش میدهد .

SHOW_TEXT_VAL:
CALL LCD_INIT
CALL PRI11
CALL PRI18
CALL PRI19
CALL SHOW_I_VAL
CALL SHOW_V_VAL
CALL SHOW_CLOCK
CALL SHOW_DATE
CALL SHOW_ZARIB
RET
;****************************************************

* این زیر برنامه مقدار ضریب ترانس را بر روی صفحه اصلی نمایش میدهد .

SHOW_ZARIB:
MOV POS,#0AH
CALL SET_CURS
CALL BTB_TRANS
RET
;****************************************************

* این زیر برنامه نمایش منو بر روی LCD می باشد .
MENU:
CLR OUT_MENU
MOV CHECK_MENU,#0
CALL LCD_INIT
CALL SHOW_ZARIB
CALL SHOW_CLOCK
CALL SHOW_DATE
CALL PRI14
CALL PRI6
CALL PRI7
CALL PRI12
CALL PRI13
CALL PRI24
CALL DELAY5
CALL DELAY5
CALL KEY_FUN2
RET
;******************

* این زیر برنامه در زمانیکه مقادیر جریان فاز یک ماکزیمم باشد ساعت آن لحظه را ثبت می نماید .
MAX_TIME_REC_1:
MOV MAX_TIME_M01_1,M01
MOV MAX_TIME_M10_1,M10
MOV MAX_TIME_H01_1,H01
MOV MAX_TIME_H10_1,H10
RET
;******************

* این زیر برنامه در زمانیکه مقادیر جریان فاز دو ماکزیمم باشد ساعت آن لحظه را ثبت می نماید .

MAX_TIME_REC_2:
MOV MAX_TIME_M01_2,M01
MOV MAX_TIME_M10_2,M10
MOV MAX_TIME_H01_2,H01
MOV MAX_TIME_H10_2,H10
RET
;******************

* این زیر برنامه در زمانیکه مقادیر جریان فاز سه ماکزیمم باشد ساعت آن لحظه را ثبت می نماید .

MAX_TIME_REC_3:
MOV MAX_TIME_M01_3,M01
MOV MAX_TIME_M10_3,M10
MOV MAX_TIME_H01_3,H01
MOV MAX_TIME_H10_3,H10
RET
;************************************************

* این زیر برنامه تست می نماید که آیا جریان لحظه ای فاز یک ماکزیمم است یا خیر و اگر اینگونه است مقدار جریان را ذخیره می نماید .

TEST_MAX_1:
MOV R0,CURRENT_MAX1
MOV A,REGISTER_ADC
MOV CURRENT_1,A
MOV R1,A
CLR CY
SUBB A,R0
JC PR1
MOV CURRENT_MAX1,R1
CALL MAX_TIME_REC_1
PR1:
RET
;*********************************

* این زیر برنامه تست می نماید که آیا جریان لحظه ای فاز دو ماکزیمم است یا خیر و اگر اینگونه است مقدار جریان را ذخیره می نماید .

TEST_MAX_2:
MOV R0,CURRENT_MAX2
MOV A,REGISTER_ADC
MOV CURRENT_2,A
MOV R1,A
CLR CY
SUBB A,R0
JC PR3
MOV CURRENT_MAX2,R1
CALL MAX_TIME_REC_2
PR3:
RET
;*********************************

* این زیر برنامه تست می نماید که آیا جریان لحظه ای فاز سه ماکزیمم است یا خیر و اگر اینگونه است مقدار جریان را ذخیره می نماید .

TEST_MAX_3:
MOV R0,CURRENT_MAX3
MOV A,REGISTER_ADC
MOV CURRENT_3,A
MOV R1,A
CLR CY
SUBB A,R0
JC PR5
MOV CURRENT_MAX3,R1
CALL MAX_TIME_REC_3
PR5:
RET
;*********************************

* این زیر برنامه تاریخ شمسی را محاسبه می نماید .

INIT_DATE:
MOV A,MON10
CJNE A,#0,FF6

MOV A,MON01
CJNE A,#1,FF1
MOV KABIS,#1
JMP HJ
FF1:

MOV A,MON01
CJNE A,#2,FF2
MOV KABIS,#1
JMP HJ
FF2:
MOV A,MON01
CJNE A,#3,FF3
MOV KABIS,#1
JMP HJ
FF3:
MOV A,MON01
CJNE A,#4,FF4
MOV KABIS,#1
JMP HJ
FF4:
MOV A,MON01
CJNE A,#5,FF5
MOV KABIS,#1
JMP HJ
FF5:
MOV A,MON01
CJNE A,#6,FF6
MOV KABIS,#1
JMP HJ
FF6:
MOV KABIS,#0
HJ:
MOV A,DATE
CJNE A,#1,LL1
CALL TARIKH
LL1:

RET
;********SEND DATA TO LCD***********************

* این زیر برنامه هر 24 ساعت فراخوانی می شودو با توجه به زیر برنامه محاسبه تاریخ شمسی تاریخ را محاسبه می نماید .

TARIKH:
INC DAY01
MOV A,DAY01
CJNE A,#10,Y1
MOV DAY01,#0
INC DAY10
JMP EEND
Y1:
MOV A,DAY10
CJNE A,#3,FF7
MOV A,KABIS
CJNE A,#0,FF8
MOV DAY01,#1
MOV DAY10,#0
INC MON01
JMP GG1
FF8:
MOV A,KABIS
CJNE A,#1,FF7
MOV A,DAY01
CJNE A,#2,FF7
MOV DAY01,#1
MOV DAY10,#0
INC MON01
GG1:
MOV A,MON01
CJNE A,#10,FT1
JMP TY
FT1:
MOV A,MON10
CJNE A,#1,FF7
MOV A,MON01
CJNE A,#3,FF7
MOV MON01,#1
MOV MON10,#0
JMP OO
TY:
MOV MON01,#0
INC MON10
JMP FF7
OO:
INC YEAR01
MOV A,YEAR01
CJNE A,#10,FF7
MOV YEAR01,#0
INC YEAR10
FF7:
EEND:
MOV DATE,#0
RET
;*******************SET INITAL VALUE OF LCD****************

* این زیر برنامه برای اولین بار در شروع برنامه صفحه نمایش را راه اندازی مینماید.

LCD_INIT:
CLR LCD_COMMAND_DATA
MOV REGISTER_LCD,#0FH
SETB LCD_ENABLE
CLR LCD_ENABLE
CALL DELAY
MOV REGISTER_LCD,#3FH
SETB LCD_ENABLE
CLR LCD_ENABLE
CALL DELAY
MOV REGISTER_LCD,#80H
SETB LCD_ENABLE
CLR LCD_ENABLE
CALL DELAY
MOV REGISTER_LCD,#0FH
SETB LCD_ENABLE
CLR LCD_ENABLE
CALL DELAY
MOV REGISTER_LCD,#01H
SETB LCD_ENABLE
CLR LCD_ENABLE
CALL DELAY2
MOV REGISTER_LCD,#0CH
SETB LCD_ENABLE
CLR LCD_ENABLE
CALL DELAY
RET
;************CONVERT MIN TO BCD*************************

* این زیر برنامه یک عدد سه رقمی را تبدیل به سه عدد تک رقمی برای نمایش بر روی صفحه نمایش نشان می دهد .

BTB:
MOV B,K_TRANS
MUL AB
MOV L_DIV_BYTE,A
MOV H_DIV_BYTE,B

CALL DIVIDER
CALL DIVIDER
MOV M1,B
CALL DIVIDER
MOV M2,B
CALL DIVIDER
MOV M3,B
CALL DIVIDER
MOV M4,B

MOV A,M1
ORL A,#30H
MOV M1,A
MOV A,M2
ORL A,#30H
MOV M2,A
MOV A,M3
ORL A,#30H
MOV M3,A
MOV A,M4
ORL A,#30H
MOV M4,A
RET
;****************************

* این زیر برنامه ها برای تاخیر زمانی مورد استفاده قرار می گیرد .
DELAY0:
MOV R3,#50
DJNZ R3,$
RET
;——————————-
DELAY:
MOV R3,#50
ER1: MOV R4,#2
DJNZ R4,$
DJNZ R3,ER1
RET
;——————————-
DELAY2:
MOV R3,#30
S2: MOV R4,#100
DJNZ R4,$
DJNZ R3,S2
RET
;——————————-
DELAY_FOR_ADC:
MOV R3,#50
F1: MOV R4,#75
DJNZ R4,$
DJNZ R3,F1
RET
;——————————-
DELAY5:
MOV R3,#255
F2: MOV R4,#255
DJNZ R4,$
DJNZ R3,F2
RET
;********************SET CURSOR LOCATION****

* این زیر برنامه برای SET کردن مکان نمای صفحه نمایش مورد استفاده قرار میگیرد .

SET_CURS:
MOV A,POS
ORL A,#80H
CLR LCD_COMMAND_DATA
MOV REGISTER_LCD,A
SETB LCD_ENABLE
CLR LCD_ENABLE
CALL DELAY
RET
;************************ SHOW ***********************

* این زیر برنامه برای نمایش اطلاعات بر روی صفحه نمایش مورد استفاده قرار میگیرد .
SHOW:
SETB LCD_COMMAND_DATA
MOV REGISTER_LCD,DATA_P
SETB LCD_ENABLE
CLR LCD_ENABLE
CALL DELAY
RET
;***************************************

* از این قسمت تا انتهای برنامه برای نمایش اطلاعاتی که ثابت هستند بر روی صفحه نمایش مورد استفاده قرار میگیرد .
PRI1:
MOV POS,#40H
CALL SET_CURS
MOV R5,#0
MOV DPTR,#Z1
QDF1:
MOV A,R5
MOVC A,@A+DPTR
MOV DATA_P,A
CALL SHOW
INC R5
CJNE R5,#19,QDF1
RET

PRI2:
MOV POS,#5CH
CALL SET_CURS
MOV R5,#0
MOV DPTR,#Z2
QDF2:
MOV A,R5
MOVC A,@A+DPTR
MOV DATA_P,A
CALL SHOW
INC R5
CJNE R5,#5,QDF2
RET

PRI3:
MOV POS,#40H
CALL SET_CURS
MOV R5,#0
MOV DPTR,#Z3
QDF3:
MOV A,R5
MOVC A,@A+DPTR
MOV DATA_P,A
CALL SHOW
INC R5
CJNE R5,#18,QDF3
RET

PRI4:
MOV POS,#5AH
CALL SET_CURS
MOV R5,#0
MOV DPTR,#Z4
QDF4:
MOV A,R5
MOVC A,@A+DPTR
MOV DATA_P,A
CALL SHOW
INC R5
CJNE R5,#8,QDF4
RET

PRI6:
MOV POS,#40H
CALL SET_CURS
MOV R5,#0
MOV DPTR,#Z6
QDF6:
MOV A,R5
MOVC A,@A+DPTR
MOV DATA_P,A
CALL SHOW
INC R5
CJNE R5,#5,QDF6
RET

PRI7:
MOV POS,#14H
CALL SET_CURS
MOV R5,#0
MOV DPTR,#Z7
QDF7:
MOV A,R5
MOVC A,@A+DPTR
MOV DATA_P,A
CALL SHOW
INC R5
CJNE R5,#9,QDF7
RET

PRI10:
MOV POS,#40H
CALL SET_CURS
MOV R5,#0
MOV DPTR,#Z10
QDF10:
MOV A,R5
MOVC A,@A+DPTR
MOV DATA_P,A
CALL SHOW
INC R5
CJNE R5,#6,QDF10
RET

PRI11:
MOV POS,#45H
CALL SET_CURS
MOV R5,#0
MOV DPTR,#Z11
QDF11:
MOV A,R5
MOVC A,@A+DPTR
MOV DATA_P,A
CALL SHOW
INC R5
CJNE R5,#13,QDF11
RET

PRI12:
MOV POS,#54H
CALL SET_CURS
MOV R5,#0
MOV DPTR,#Z12
QDF12:
MOV A,R5
MOVC A,@A+DPTR
MOV DATA_P,A
CALL SHOW
INC R5
CJNE R5,#10,QDF12
RET

PRI13:
MOV POS,#4BH
CALL SET_CURS
MOV R5,#0
MOV DPTR,#Z13
QDF13:
MOV A,R5
MOVC A,@A+DPTR

MOV DATA_P,A
CALL SHOW
INC R5
CJNE R5,#9,QDF13
RET

PRI14:
MOV POS,#5FH
CALL SET_CURS
MOV R5,#0
MOV DPTR,#Z14
QDF14:
MOV A,R5
MOVC A,@A+DPTR
MOV DATA_P,A
CALL SHOW
INC R5
CJNE R5,#6,QDF14
RET

PRI15:
MOV POS,#43H
CALL SET_CURS
MOV R5,#0
MOV DPTR,#Z15
QDF15:
MOV A,R5
MOVC A,@A+DPTR
MOV DATA_P,A
CALL SHOW
INC R5
CJNE R5,#14,QDF15
RET

PRI18:
MOV POS,#14H
CALL SET_CURS
MOV R5,#0
MOV DPTR,#Z18
QDF18:
MOV A,R5
MOVC A,@A+DPTR
MOV DATA_P,A
CALL SHOW
INC R5
CJNE R5,#2,QDF18
RET

PRI19:
MOV POS,#54H
CALL SET_CURS
MOV R5,#0
MOV DPTR,#Z19
QDF19:
MOV A,R5
MOVC A,@A+DPTR
MOV DATA_P,A
CALL SHOW
INC R5
CJNE R5,#2,QDF19
RET
;————————————>
PRI24:
MOV POS,#1FH
CALL SET_CURS
MOV R5,#0
MOV DPTR,#Z24
QDF24:
MOV A,R5
MOVC A,@A+DPTR
MOV DATA_P,A
CALL SHOW
INC R5
CJNE R5,#7,QDF24
RET

PRI27:
MOV POS,#62H
CALL SET_CURS
MOV R5,#0
MOV DPTR,#Z27
QDF27:
MOV A,R5
MOVC A,@A+DPTR
MOV DATA_P,A
CALL SHOW
INC R5
CJNE R5,#3,QDF27
RET

PRI28:
MOV POS,#40H
CALL SET_CURS
MOV R5,#0
MOV DPTR,#Z28
QDF28:
MOV A,R5
MOVC A,@A+DPTR
MOV DATA_P,A
CALL SHOW
INC R5
CJNE R5,#15,QDF28
RET

PRI29:
MOV POS,#14H
CALL SET_CURS
MOV R5,#0
MOV DPTR,#Z29
QDF29:
MOV A,R5
MOVC A,@A+DPTR
MOV DATA_P,A
CALL SHOW
INC R5
CJNE R5,#20,QDF29
RET
;*************************************
KEY_TAB:
DB 1,2,3,11H,4,5,6,12H,7,8,9,14H,00H,0,00H,18H
Z1:
DB'Please Input Clock:'
Z2:
DB'XX:XX'
Z3:
DB'Please Input Date:'
Z4:
DB'XX/XX/XX'
Z6:
DB '1-Max'
Z7:
DB '2-Restart'
Z10:
DB 'Value:'
Z11:
DB 'R S T'
Z12:
DB '3-SetClock'
Z13:
DB '4-SetDate'
Z14:
DB '0-Exit'
Z15:
DB '(( Max ! ))'
Z18:
DB 'V:'
Z19:
DB 'I:'
Z24:
DB '5-Trans'
Z25:
DB 'Current Trans:'
Z26:
DB 'Please Input Trans:'
Z27:
DB 'X.X'
Z28:
DB 'Enter Password:'
Z29:
DB ' Invalid Password '
END
2 – نرم افزار اسمبلی داخل آی سی 89C51(2) :

* این زیر برنامه برای نامگذاری قسمتهای مختلف حافظه وپورتهای میکرو مورد استفاده قرار میگیرد .

;#######################################
;//////////////////////////////////////
;/////////// CONTROL BYTE /////////////
;//////////////////////////////////////
;#######################################

ACOM EQU 41H

I1 EQU 42H
I2 EQU 43H
I3 EQU 44H

V1 EQU 45H
V2 EQU 46H
V3 EQU 47H

COUNT EQU 48H

I_O1 EQU 49H
I_O2 EQU 4AH
I_O3 EQU 4BH

WRITE_DATA EQU 4CH

M01 EQU 4DH
M10 EQU 4EH
H01 EQU 4FH
H10 EQU 50H

ACOM2 EQU 55H

M_S EQU 56H
S01 EQU 57H

TIME_SAMPLE EQU 8 ;UNIT SECOND

COMP_STOP EQU 247
SEND_CLOCK EQU 248
RECIVE_CLOCK EQU 249
RESTART EQU 250
MAIN_ON EQU 251
MAIN_OFF EQU 252
START_SAMPLE EQU 253
TRANS_COM EQU 254

;#######################################
;//////////////////////////////////////
;/////////// CONTROL BIT //////////////
;//////////////////////////////////////
;#######################################

BIT_RESTART BIT 01H
CUT_POWER BIT 04H
BIT_STOP BIT P3.2
BIT_LOW BIT P3.3
BIT_FULL BIT P3.5
BIT_POWER BIT P3.4
;#######################################
;//////////////////////////////////////
;////////////STARTING PROGRAM//////////
;//////////////////////////////////////
;#######################################

ORG 00H
LJMP MAIN

;#######################################
;//////////////////////////////////////
;////////////INTERUPT SERIAL///////////
;//////////////////////////////////////
;#######################################

ORG 23H
LJMP SEND

ORG 30H
;///////////////////////////////////

* این زیر برنامه اصلی دستگاه می باشد که تمام زیر برنامه های دیگر از این قسمت فراخوانی می شود .
MAIN:
CALL INIT
jp__3:
CALL FIRST
CLR ES
MOV A,#MAIN_ON
CALL TRANS_TXD
SETB ES

JNB BIT_RESTART,$
MOV R0,#0
CLR BIT_RESTART
CLR CUT_POWER
CLR BIT_POWER
JMP jp__3

;#######################################
;//////////////////////////////////////
;////////// SERIAL PROGRAM ////////////
;//////////////////////////////////////
;#######################################

* این زیر برنامه وقفه سریال می باشد که اگر هر اطلاعات سریال به دستگاه وارد شود برنامه به این قسمت پرش پیدا می کند .
SEND:
MOV ACOM,A
MOV A,SBUF
CALL DELAY
CLR RI

CJNE A,#RESTART,JP1
SETB BIT_RESTART
MOV A,ACOM
RETI
JP1:
CJNE A,#COMP_STOP,JP2
MOV R0,#100
MOV R5,#100
MOV R3,#1
CLR ES
MOV A,#MAIN_OFF ;MAIN_BOARD:OFF
CALL TRANS_TXD
SETB ES
MOV A,ACOM
RETI
JP2:
CJNE A,#RECIVE_CLOCK,JP0
MOV R4,#0
MOV A,ACOM
RETI
JP0:
CJNE R4,#0,LOAD_M01
INC R4
MOV M01,A
MOV A,ACOM
RETI
LOAD_M01:
CJNE R4,#1,LOAD_M10
INC R4
MOV M10,A
MOV A,ACOM
RETI
LOAD_M10:
CJNE R4,#2,LOAD_H01
INC R4
MOV H01,A
MOV A,ACOM
RETI
LOAD_H01:

CJNE R4,#3,LOAD_H10
INC R4
MOV H10,A
CALL TRANS_CLOCK
MOV A,ACOM
RETI
LOAD_H10:
CJNE A,#START_SAMPLE,LOAD_REG1
CALL RESET_COUNTER
RETI
LOAD_REG1:
CJNE R5,#0,LOAD_REG2
CALL LOAD_I1
RETI
LOAD_REG2:
CJNE R5,#1,LOAD_REG3
CALL LOAD_I2
RETI
LOAD_REG3:
CJNE R5,#2,LOAD_REG4
CALL LOAD_I3
RETI
LOAD_REG4:
CJNE R5,#3,LOAD_REG5
CALL LOAD_V1
RETI
LOAD_REG5:
CJNE R5,#4,LOAD_REG6
CALL LOAD_V2
RETI
LOAD_REG6:
CJNE R5,#5,LOAD_REG7
CALL LOAD_V3
RETI
LOAD_REG7:
CJNE R0,#0,TRANS_DATA_COMPUTER
MOV A,ACOM
RETI
TRANS_DATA_COMPUTER:
CJNE A,#MAIN_OFF,STEP3
CALL FIRST_BYTE
RETI
STEP3:
CJNE A,#255,ERROR
CLR ES
SETB BIT_FULL
CLR BIT_LOW
CALL TRANS_DATA
SETB ES
RETI
ERROR:
RETI
;*******************
* این زیر برنامه مقدار جریان فاز یک را که از طریق سریال رسیده است گرفته وذخیره می کند .
LOAD_I1:
INC R5
MOV I1,A
MOV A,ACOM
RET
;******************
* این زیر برنامه مقدار جریان فاز دو را که از طریق سریال رسیده است گرفته وذخیره می کند .

LOAD_I2:
INC R5
MOV I2,A
MOV A,ACOM
RET
;******************
* این زیر برنامه مقدار جریان فاز سه را که از طریق سریال رسیده است گرفته وذخیره می کند .

LOAD_I3:
INC R5
MOV I3,A
MOV A,ACOM
RET
;******************
* این زیر برنامه مقدار ولتاژ فاز یک را که از طریق سریال رسیده است گرفته وذخیره می کند .

LOAD_V1:
INC R5
MOV V1,A
MOV A,ACOM
RET
;******************
* این زیر برنامه مقدار ولتاژ فاز دو را که از طریق سریال رسیده است گرفته وذخیره می کند .

LOAD_V2:
INC R5
MOV V2,A
MOV A,ACOM
RET
;******************
* این زیر برنامه مقدار ولتاژ فاز سه را که از طریق سریال رسیده است گرفته وذخیره می کند وسپس این مقدار را در حافظه ذخیره می کند .

LOAD_V3:
MOV V3,A
CJNE R3,#1,JP3
MOV R3,#0
MOV A,ACOM
RET
JP3:
JNB CUT_POWER,JP__4
CPL BIT_POWER
JP__4:
INC WRITE_DATA
MOV R5,#100
CJNE R7,#1,MN
CPL BIT_FULL
CLR BIT_LOW
MOV A,WRITE_DATA
CJNE A,#TIME_SAMPLE,MN
CALL RGR
MOV WRITE_DATA,#0
MN:
CALL VOLT_TRANS
MOV A,ACOM
RET
;******************
* این زیر برنامه در زمان تخلیه اطلاعات این مقادیر را به کامپیوتر می فرستد .
TRANS_DATA:

MOVX A,@DPTR
MOV I_O1,A
INC DPTR

MOVX A,@DPTR
MOV I_O2,A
INC DPTR

MOVX A,@DPTR
MOV I_O3,A
INC DPTR

CPL BIT_LOW
CPL BIT_FULL

MOV A,I_O1
CALL TRANS_TXD
CJNE A,#255,PP2
SETB BIT_FULL
SETB BIT_LOW
MOV A,ACOM
RET
PP2:
MOV A,I_O2
CALL TRANS_TXD
CJNE A,#255,PP3
SETB BIT_FULL
SETB BIT_LOW
MOV A,ACOM
RET
PP3:

MOV A,I_O3
CALL TRANS_TXD
CJNE A,#255,PP4
SETB BIT_FULL
SETB BIT_LOW
MOV A,ACOM
RET
PP4:

JMP TRANS_DATA
RET
;**************************
* این زیر برنامه مقادیر جریان سه فاز رسیده از آی سی اصلی را در حافظه ذخیره می نماید .
RGR:

MOV A,I1
MOVX @DPTR,A
INC DPTR

CALL DELAY

MOV A,I2
MOVX @DPTR,A
INC DPTR

CALL DELAY

MOV A,I3
MOVX @DPTR,A
INC DPTR

MOV A,DPH
CJNE A,#7FH,FD
SETB BIT_LOW ;PIN—->RAM LOW
CLR BIT_FULL ;PIN—->RAM FULL
MOV R7,#0
FD:
RET
;***********trans volt to computer***************
* این زیر برنامه در زمان رسیدن ولتاژ و جریان سه فاز از آی سی اصلی این مقادیر را به طور همزمان به کامپیوتر می فرستد تا در نرم افزار نمایش داده شود .
VOLT_TRANS:

CLR ES
MOV A,#TRANS_COM
CALL TRANS_TXD

MOV A,I1
CALL TRANS_TXD

MOV A,I2
CALL TRANS_TXD

MOV A,I3
CALL TRANS_TXD

MOV A,V1
CALL TRANS_TXD

MOV A,V2
CALL TRANS_TXD

MOV A,V3
CALL TRANS_TXD

MOV A,DPH
CALL TRANS_TXD
SETB ES
RET
;********************
* برای ارسال سریال اطلاعات از طریق سریال از این زیر برنامه استفاده می شود .
TRANS_TXD:
CJNE A,#0,JP_1
MOV A,#1
JP_1:
MOV SBUF,A
JNB TI,$
CALL DELAY
CLR TI
RET
;********************
* این زیر برنامه در لحظه ابتدای نمونه گیری آدرس حافظه را صفر می کند .
INIT_RAM:
MOV A,#00H
MOV DPL,A
MOV DPH,A
RET
;*****************INIT SET
* این زیر برنامه در ابتدای راه اندازی آی سی فراخوانی می شود و مقادیر اولیه به متغیرها می دهد .
INIT:
CALL DELAY0
CLR BIT_POWER
SETB CUT_POWER
MOV WRITE_DATA,#TIME_SAMPLE-1
MOV COUNT,#0
MOV R6,#0
MOV R5,#100
CLR BIT_RESTART
MOV R7,#1
MOV R3,#0
MOV R0,#0
MOV R4,#100
MOV M_S,#0
MOV S01,#0
CLR TI
CLR RI
CLR P1.0
SETB BIT_STOP
MOV TMOD,#20H ;TIM1 MOD2,TIM0 MOD1
MOV TH1,#0FDH ;BOUD RATE=9600
MOV TCON,#00H
MOV SCON,#50H
MOV IE,#90H
SETB TR1
RET
;++++++++++++++++++++++DELAY TIME++++++++++
* این زیر برنامه ها برای تاخیر زمانی استفاده می شود .
DELAY:
MOV R1,#50
DJNZ R1,$
RET
;,,,,,,,,,,,,,,,,,,,,,,,
DELAY2:
MOV R1,#30
DJNZ R1,$
RET
;,,,,,,,,,,,,,,,,,,,,,,,
DELAY0:
MOV R1,#255
K3: MOV R2,#255
DJNZ R2,$
DJNZ R1,K3
RET
;''''''''''''''''''''''''
END

3-نرم افزار تحت ویندوز نوشته شده با Visual C++ :

//////////////////////////////////////////////////////////////

* این زیر برنامه در ابتدای اجرای برنامه فراخوانی می شود و یک سری تنظیمات اولیه اجرا می شود .
void CAnalyzerView::OnInitialUpdate()
{
int out_file;
CFormView::OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit();
m_led=1;
if (!m_commctrl.Create(NULL,0,CRect(0,0,0,0),this,ID_MS))
{
MessageBox(" Not Found Communiction System —-> Mscomm32.ocx ??? ","Error",MB_OK | MB_ICONSTOP);
Exit_prog();
}
m_commctrl.SetRThreshold(1);

out_file=f.Open("systemsystem.cfg",CFile::modeRead | CFile::typeBinary);
if(out_file==1)
{
f.Read(init,50);
f.Close();
}else
{
MessageBox(" Invalid System.cfg ","Error",MB_OK | MB_ICONSTOP);
Exit_prog();
}

out_file=f.Open("systemInit.cfg",CFile::modeRead | CFile::typeBinary);
if(out_file==1)
{
f.Read(init,50);
f.Close();
}else
{
MessageBox(" Invalid Init.cfg ","Error",MB_OK | MB_ICONSTOP);
Exit_prog();
}

out_file=f.Open("systemPrice.cfg",CFile::modeRead | CFile::typeBinary);
if(out_file==1)
{
f.Read(init,50);
f.Close();
}else
{
MessageBox(" Invalid Price.cfg ","Error",MB_OK | MB_ICONSTOP);
Exit_prog();
}

SetTimer(ID_CLOCK,1,NULL);
m_prog.SetRange(0,32);
m_prog.SetStep(1);
s_prog.SetRange(0,8);
s_prog.SetStep(1);
GetDlgItem(IDC_CLICK1)->EnableWindow(FALSE);
GetDlgItem(IDC_CLICK2)->EnableWindow(FALSE);
GetDlgItem(IDC_CLICK3)->EnableWindow(FALSE);
GetDlgItem(IDC_CLICK4)->EnableWindow(FALSE);
GetDlgItem(IDC_CLICK5)->EnableWindow(FALSE);
GetDlgItem(IDC_CLICK6)->EnableWindow(FALSE);
GetDlgItem(IDC_CLICK7)->EnableWindow(FALSE);
GetDlgItem(IDC_VAL_TRANS)->EnableWindow(FALSE);
m_text1="Invalid";
m_text2="Invalid";
m_text3="Invalid";
s_prog.SetPos(0);
m_info="No Data";
UpdateData(FALSE);
Read_init();
if(Auto==1 || Auto==2)
{
m_auto=TRUE;
SetTimer(ID_LED,300,NULL);
}
switch(trans)
{
case 1:
GetDlgItem(IDC_CLICK1)->EnableWindow(TRUE);
m_250=FALSE;
zarib=1;
UpdateData(FALSE);
break;
case 2:
GetDlgItem(IDC_CLICK2)->EnableWindow(TRUE);
m_500=FALSE;
zarib=2;
UpdateData(FALSE);
break;
case 3:
GetDlgItem(IDC_CLICK3)->EnableWindow(TRUE);
m_750=FALSE;
zarib=3;
UpdateData(FALSE);
break;
case 4:
GetDlgItem(IDC_CLICK4)->EnableWindow(TRUE);
m_1000=FALSE;
zarib=4;
UpdateData(FALSE);
break;
case 6:
GetDlgItem(IDC_CLICK5)->EnableWindow(TRUE);
m_1500=FALSE;
zarib=6;
UpdateData(FALSE);
break;
case 8:
GetDlgItem(IDC_CLICK6)->EnableWindow(TRUE);
m_2000=FALSE;
zarib=8;
UpdateData(FALSE);
break;
case 9:
GetDlgItem(IDC_CLICK7)->EnableWindow(TRUE);
GetDlgItem(IDC_VAL_TRANS)->EnableWindow(TRUE);
m_trans=FALSE;
zarib=m_val_trans/250;
UpdateData(FALSE);
break;
}
switch(PORT)
{
case 1016:
m_com1=FALSE;
m_commctrl.SetCommPort(1);
UpdateData(FALSE);
break;
case 760:
m_com2=FALSE;
m_commctrl.SetCommPort(2);
UpdateData(FALSE);
break;
}
if(Auto==1 || Auto==2)
{
Off();
SetTimer(ID_AUTO1,10000,NULL);
}else
{
SetTimer(ID_LED_OFF,5000,NULL);
}
ChangLable();
}
///////////////

* این زیر برنامه در ابتدای اجرای برنامه فراخوانی می شود و عکس ها و رنگهای زمینه در این قسمت اجرا می شود .
void CAnalyzerView::OnDraw(CDC* pDC)
{
// TODO: Add your specialized code here and/or call the base class

CBitmap bmap;

BITMAP bm;

CDC dcmem;

bmap.LoadBitmap(IDB_BITMAP5);

bmap.GetObject(sizeof(BITMAP),&bm);

dcmem.CreateCompatibleDC(pDC);

CBitmap * pbmold5=dcmem.SelectObject(&bmap);

pDC->BitBlt(0,0,800,600,&dcmem,0,0,SRCCOPY);

bmap.LoadBitmap(IDB_BITMAP6);

bmap.GetObject(sizeof(BITMAP),&bm);

dcmem.CreateCompatibleDC(pDC);

CBitmap * pbmold6=dcmem.SelectObject(&bmap);

pDC->BitBlt(340,80,550,350,&dcmem,0,0,SRCCOPY);

bmap.LoadBitmap(IDB_BITMAP7);

bmap.GetObject(sizeof(BITMAP),&bm);

dcmem.CreateCompatibleDC(pDC);

CBitmap * pbmold7=dcmem.SelectObject(&bmap);

pDC->BitBlt(28,445,550,350,&dcmem,0,0,SRCCOPY);

bmap.LoadBitmap(IDB_BITMAP8);

bmap.GetObject(sizeof(BITMAP),&bm);

dcmem.CreateCompatibleDC(pDC);

CBitmap * pbmold8=dcmem.SelectObject(&bmap);

pDC->BitBlt(26,390,550,350,&dcmem,0,0,SRCCOPY);

bmap.LoadBitmap(IDB_BITMAP9);

bmap.GetObject(sizeof(BITMAP),&bm);

dcmem.CreateCompatibleDC(pDC);

CBitmap * pbmold9=dcmem.SelectObject(&bmap);

pDC->BitBlt(353,448,550,350,&dcmem,0,0,SRCCOPY);

bmap.LoadBitmap(IDB_BITMAP10);

bmap.GetObject(sizeof(BITMAP),&bm);

dcmem.CreateCompatibleDC(pDC);

CBitmap * pbmold10=dcmem.SelectObject(&bmap);

pDC->BitBlt(340,13,550,350,&dcmem,0,0,SRCCOPY);

bmap.LoadBitmap(IDB_BITMAP11);

bmap.GetObject(sizeof(BITMAP),&bm);

dcmem.CreateCompatibleDC(pDC);

CBitmap * pbmold11=dcmem.SelectObject(&bmap);

pDC->BitBlt(550,13,550,350,&dcmem,0,0,SRCCOPY);

bmap.LoadBitmap(IDB_BITMAP12);

bmap.GetObject(sizeof(BITMAP),&bm);

dcmem.CreateCompatibleDC(pDC);

CBitmap * pbmold12=dcmem.SelectObject(&bmap);

pDC->BitBlt(25,10,550,350,&dcmem,0,0,SRCCOPY);

bmap.LoadBitmap(IDB_BITMAP13);

bmap.GetObject(sizeof(BITMAP),&bm);

dcmem.CreateCompatibleDC(pDC);

CBitmap * pbmold13=dcmem.SelectObject(&bmap);

pDC->BitBlt(111,10,550,350,&dcmem,0,0,SRCCOPY);

bmap.LoadBitmap(IDB_BITMAP14);

bmap.GetObject(sizeof(BITMAP),&bm);

dcmem.CreateCompatibleDC(pDC);

CBitmap * pbmold14=dcmem.SelectObject(&bmap);

pDC->BitBlt(110,5,550,350,&dcmem,0,0,SRCCOPY);

bmap.LoadBitmap(IDB_BITMAP15);

bmap.GetObject(sizeof(BITMAP),&bm);

dcmem.CreateCompatibleDC(pDC);

CBitmap * pbmold15=dcmem.SelectObject(&bmap);

pDC->BitBlt(25,5,550,350,&dcmem,0,0,SRCCOPY);

bmap.LoadBitmap(IDB_BITMAP16);

bmap.GetObject(sizeof(BITMAP),&bm);

dcmem.CreateCompatibleDC(pDC);

CBitmap * pbmold16=dcmem.SelectObject(&bmap);

pDC->BitBlt(335,5,550,350,&dcmem,0,0,SRCCOPY);

bmap.LoadBitmap(IDB_BITMAP17);

bmap.GetObject(sizeof(BITMAP),&bm);

dcmem.CreateCompatibleDC(pDC);

CBitmap * pbmold17=dcmem.SelectObject(&bmap);

pDC->BitBlt(337,73,550,350,&dcmem,0,0,SRCCOPY);

bmap.LoadBitmap(IDB_BITMAP18);

bmap.GetObject(sizeof(BITMAP),&bm);

dcmem.CreateCompatibleDC(pDC);

CBitmap * pbmold18=dcmem.SelectObject(&bmap);

pDC->BitBlt(353,340,550,350,&dcmem,0,0,SRCCOPY);

bmap.LoadBitmap(IDB_BITMAP19);

bmap.GetObject(sizeof(BITMAP),&bm);

dcmem.CreateCompatibleDC(pDC);

CBitmap * pbmold19=dcmem.SelectObject(&bmap);

pDC->BitBlt(351,442,550,350,&dcmem,0,0,SRCCOPY);

bmap.LoadBitmap(IDB_BITMAP20);

bmap.GetObject(sizeof(BITMAP),&bm);

dcmem.CreateCompatibleDC(pDC);

CBitmap * pbmold20=dcmem.SelectObject(&bmap);

pDC->BitBlt(24,60,550,350,&dcmem,0,0,SRCCOPY);

bmap.LoadBitmap(IDB_BITMAP4);

bmap.GetObject(sizeof(BITMAP),&bm);

dcmem.CreateCompatibleDC(pDC);

CBitmap * pbmold4=dcmem.SelectObject(&bmap);

pDC->BitBlt(25,68,550,350,&dcmem,0,0,SRCCOPY);

bmap.LoadBitmap(IDB_BITMAP3);

bmap.GetObject(sizeof(BITMAP),&bm);

dcmem.CreateCompatibleDC(pDC);

CBitmap * pbmold=dcmem.SelectObject(&bmap);

pDC->BitBlt(355,350,550,350,&dcmem,0,0,SRCCOPY);

bmap.LoadBitmap(IDB_BITMAP2);

bmap.GetObject(sizeof(BITMAP),&bm);

dcmem.CreateCompatibleDC(pDC);

CBitmap * pbmold2=dcmem.SelectObject(&bmap);

pDC->BitBlt(662,257,550,350,&dcmem,0,0,SRCCOPY);

bmap.LoadBitmap(IDB_BITMAP1);

bmap.GetObject(sizeof(BITMAP),&bm);

dcmem.CreateCompatibleDC(pDC);

CBitmap * pbmold3=dcmem.SelectObject(&bmap);

pDC->BitBlt(378,255,550,350,&dcmem,0,0,SRCCOPY);

bmap.LoadBitmap(IDB_BITMAP21);

bmap.GetObject(sizeof(BITMAP),&bm);

dcmem.CreateCompatibleDC(pDC);

CBitmap * pbmold21=dcmem.SelectObject(&bmap);

pDC->BitBlt(24,382,550,350,&dcmem,0,0,SRCCOPY);

bmap.LoadBitmap(IDB_BITMAP22);

bmap.GetObject(sizeof(BITMAP),&bm);

dcmem.CreateCompatibleDC(pDC);

CBitmap * pbmold22=dcmem.SelectObject(&bmap);

pDC->BitBlt(24,438,550,350,&dcmem,0,0,SRCCOPY);

}

/****************************************************/

* این زیر برنامه قسمت تایمرها مختلف است که زمان اجرای هر تایمر شد برنامه به این قسمت به صورت وقفه پرش می کند .
void CAnalyzerView::OnTimer(UINT nIDEvent)
{
UpdateData(TRUE);
switch(nIDEvent)
{
case ID_CLOCK:
{
KillTimer(ID_CLOCK);
SetTimer(ID_CLOCK,60000,NULL);
CTime curTime=CTime::GetCurrentTime();
m_sTime.Format(" %d : %d ",curTime.GetHour(),
curTime.GetMinute());
UpdateData(FALSE);
return;
break;
}
case ID_COM:
{
OnCommEvent();
return;
break;
}
case ID_COM_MONITORING:
{
OnCommEventMonitoring();
return;
break;
}
case ID_LINK:
{
show1.out=1;
ComClose();
m_enable=FALSE;
UpdateData(FALSE);
KillTimer(ID_COM_MONITORING);
KillTimer(ID_COM);
KillTimer(ID_LINK);
if(Auto==0)
{
MessageBox(" No Data Please Check —-> [ COM & CABLE ] ","ERORR",MB_OK | MB_ICONSTOP);
On();
}else
{
OnRestart();
if(Auto==1 || Auto==2){
Shut_down();
}
Exit_prog();
}
return;
break;
}
case ID_AUTO1:
{
KillTimer(ID_LED);
KillTimer(ID_AUTO1);
Led_Red();
GetDlgItem(IDC_AUTO)->EnableWindow(FALSE);
OnClick6();
return;
break;
}
case ID_AUTO2:
{
KillTimer(ID_AUTO2);
OnRestart();
return;
break;
}
case ID_AUTO3:
{
KillTimer(ID_AUTO3);
OnButton8();
return;
break;
}
case ID_LED:
{
if(m_led==1)
{
Led_Green();
m_led=0;
}else
{
Led_Off();
m_led=1;
}
return;
break;
}
case ID_LED_OFF:
{
KillTimer(ID_LED_OFF);
Led_Off();
return;
break;
}
}
CFormView::OnTimer(nIDEvent);
}
/****************************************************/

* وقتیکه ما در نرم افزار کلید Start New Sample را فشار می دهیم برنامه این زیر برنامه را اجرا می کند و یک سری کد های خاص به دستگاه می فرستد تا عمل نمونه گیری مجدد انجام شود .
void CAnalyzerView::OnRestart()
{
int go;
KillTimer(ID_COM_MONITORING);
KillTimer(ID_LINK);
ComClose();
m_enable=FALSE;
UpdateData(FALSE);
for(counter_recive=0;counter_recive<=50000;counter_recive++)
{
recive_com[counter_recive]=0;
}
for(z=0;z<3000;z++)
{
t[z]=" ";
}
for(z=0;z<3000;z++)
{
size_len[z]=0;
}
GetDlgItem(IDC_RESTART)->EnableWindow(FALSE);
if(Auto==0)
{
go = MessageBox("Are You Sure Restart Memory ?","Warning",MB_YESNOCANCEL | MB_ICONEXCLAMATION);
switch(go)
{
case IDYES:
UpdateData(TRUE);
Get_Clock();
ComOpen();
send_data=250;
Send_Port();
ComClose();
UpdateData(TRUE);
m_enable=TRUE;
UpdateData(FALSE);
GetDlgItem(IDC_RESTART)->EnableWindow(TRUE);
ComOpen();
l_monitoring=0;
SetTimer(ID_COM_MONITORING,500,NULL);
SetTimer(ID_LINK,5000,NULL);
return;
break;
case IDNO:
GetDlgItem(IDC_RESTART)->EnableWindow(TRUE);
return;
break;
case IDCANCEL:
GetDlgItem(IDC_RESTART)->EnableWindow(TRUE);
return;
break;
default:
return;
}
}else
{
Get_Clock();
ComOpen();
send_data=250;
Send_Port();
ComClose();
SetTimer(ID_AUTO3,3000,NULL);
}
}
/****************************************************/

* این زیر برنامه وقتی اجرا می شود که ما در نرم افزار کلید تخلیه 800 ———->5 را می زنیم و یک سری کد های خاص به دستگاه میفرستد تا عمل تخلیه انجام شود .
void CAnalyzerView::OnClick6()
{
show1.out=0;
if(Auto==0)
{
Off();
go = MessageBox("Are You Sure DownLoad Memory ?","Warning",MB_YESNOCANCEL | MB_ICONEXCLAMATION);
switch(go)
{
case IDYES:
{
m_enable=FALSE;
OnCheck1();
Read_init();
enter_date.DoModal();
DATE=enter_date.m_date;
Write_init();
file_date.Format("%d",enter_date.m_date);
count_pos=0;
locate_pos=0;
ComOpen();
send_data=247;
Send_Port();
ComClose();
ComOpen();
send_data=0xfc;
Send_Port();
ComClose();
ComOpen();
send_data=255;
Send_Port();
init_port();
SetTimer(ID_LINK,5000,NULL);
show1.DoModal();
return;
break;
}
case IDNO:
{
On();
return;
break;
}
case IDCANCEL:
{
On();
return;
break;
}
default:
return;
}
}else
{
OnCheck1();
Cal_Date();
count_pos=0;
locate_pos=0;
ComOpen();
send_data=247;
Send_Port();
ComClose();
ComOpen();
send_data=0xfc;
Send_Port();
ComClose();
ComOpen();
send_data=255;
Send_Port();
init_port();
show1.DoModal();
}

}
/****************************************/

* این زیر برنامه وقتی اجرا می شود که ما در قسمت ترانس یک عدد قرار دهیم .
void CAnalyzerView::OnTrans1()
{
Read_init();
UpdateData(TRUE);
m_500=TRUE;
m_1500=TRUE;
m_1000=TRUE;
m_750=TRUE;
m_2000=TRUE;
m_250=TRUE;
m_trans=FALSE;
trans=9;
GetDlgItem(IDC_CLICK1)->EnableWindow(FALSE);
GetDlgItem(IDC_CLICK2)->EnableWindow(FALSE);
GetDlgItem(IDC_CLICK3)->EnableWindow(FALSE);
GetDlgItem(IDC_CLICK4)->EnableWindow(FALSE);
GetDlgItem(IDC_CLICK5)->EnableWindow(FALSE);
GetDlgItem(IDC_CLICK6)->EnableWindow(FALSE);
GetDlgItem(IDC_CLICK7)->EnableWindow(TRUE);
GetDlgItem(IDC_VAL_TRANS)->EnableWindow(TRUE);
UpdateData(FALSE);
zarib=m_val_trans/250;
Write_init();
ChangLable();
}
/****************************************/

* این زیر برنامه زمانی فراخوانی می شود که ما ترانس را در حالت 2000 قرار دهیم ودر این حالت ضریب ترانس تغییر خواهد کرد .

void CAnalyzerView::OnRadio2000()
{
Read_init();
m_2000=FALSE;
m_1500=TRUE;
m_1000=TRUE;
m_750=TRUE;
m_500=TRUE;
m_250=TRUE;
m_trans=TRUE;
trans=8;
GetDlgItem(IDC_CLICK1)->EnableWindow(FALSE);
GetDlgItem(IDC_CLICK2)->EnableWindow(FALSE);
GetDlgItem(IDC_CLICK3)->EnableWindow(FALSE);
GetDlgItem(IDC_CLICK4)->EnableWindow(FALSE);
GetDlgItem(IDC_CLICK5)->EnableWindow(FALSE);
GetDlgItem(IDC_CLICK6)->EnableWindow(TRUE);
GetDlgItem(IDC_CLICK7)->EnableWindow(FALSE);
GetDlgItem(IDC_VAL_TRANS)->EnableWindow(FALSE);
UpdateData(FALSE);
zarib=8;
Write_init();
}
/****************************************/
* این زیر برنامه زمانی فراخوانی می شود که ما ترانس را در حالت 1500 قرار دهیم ودر این حالت ضریب ترانس تغییر خواهد کرد .

void CAnalyzerView::OnRadio1500()
{
Read_init();
m_1500=FALSE;
m_2000=TRUE;
m_1000=TRUE;
m_750=TRUE;
m_500=TRUE;
m_250=TRUE;
m_trans=TRUE;
trans=6;
GetDlgItem(IDC_CLICK1)->EnableWindow(FALSE);
GetDlgItem(IDC_CLICK2)->EnableWindow(FALSE);
GetDlgItem(IDC_CLICK3)->EnableWindow(FALSE);
GetDlgItem(IDC_CLICK4)->EnableWindow(FALSE);
GetDlgItem(IDC_CLICK5)->EnableWindow(TRUE);
GetDlgItem(IDC_CLICK6)->EnableWindow(FALSE);
GetDlgItem(IDC_CLICK7)->EnableWindow(FALSE);
GetDlgItem(IDC_VAL_TRANS)->EnableWindow(FALSE);
UpdateData(FALSE);
zarib=6;
Write_init();
}
/****************************************/
* این زیر برنامه زمانی فراخوانی می شود که ما ترانس را در حالت 1000 قرار دهیم ودر این حالت ضریب ترانس تغییر خواهد کرد .

void CAnalyzerView::OnRadio1000()
{
Read_init();
m_1000=FALSE;
m_1500=TRUE;
m_2000=TRUE;
m_750=TRUE;
m_500=TRUE;
m_250=TRUE;
m_trans=TRUE;
trans=4;
GetDlgItem(IDC_CLICK1)->EnableWindow(FALSE);
GetDlgItem(IDC_CLICK2)->EnableWindow(FALSE);
GetDlgItem(IDC_CLICK3)->EnableWindow(FALSE);
GetDlgItem(IDC_CLICK4)->EnableWindow(TRUE);
GetDlgItem(IDC_CLICK5)->EnableWindow(FALSE);
GetDlgItem(IDC_CLICK6)->EnableWindow(FALSE);
GetDlgItem(IDC_CLICK7)->EnableWindow(FALSE);
GetDlgItem(IDC_VAL_TRANS)->EnableWindow(FALSE);
UpdateData(FALSE);
zarib=4;
Write_init();
}
/****************************************/
* این زیر برنامه زمانی فراخوانی می شود که ما ترانس را در حالت 750 قرار دهیم ودر این حالت ضریب ترانس تغییر خواهد کرد .

void CAnalyzerView::OnRadio750()
{
Read_init();
m_750=FALSE;
m_1500=TRUE;
m_1000=TRUE;
m_2000=TRUE;
m_500=TRUE;
m_250=TRUE;
m_trans=TRUE;
trans=3;
GetDlgItem(IDC_CLICK1)->EnableWindow(FALSE);
GetDlgItem(IDC_CLICK2)->EnableWindow(FALSE);
GetDlgItem(IDC_CLICK3)->EnableWindow(TRUE);
GetDlgItem(IDC_CLICK4)->EnableWindow(FALSE);
GetDlgItem(IDC_CLICK5)->EnableWindow(FALSE);
GetDlgItem(IDC_CLICK6)->EnableWindow(FALSE);
GetDlgItem(IDC_CLICK7)->EnableWindow(FALSE);
GetDlgItem(IDC_VAL_TRANS)->EnableWindow(FALSE);
UpdateData(FALSE);
zarib=3;
Write_init();
}
/****************************************/
* این زیر برنامه زمانی فراخوانی می شود که ما ترانس را در حالت 500 قرار دهیم ودر این حالت ضریب ترانس تغییر خواهد کرد .

void CAnalyzerView::OnRadio500()
{
Read_init();
m_500=FALSE;
m_1500=TRUE;
m_1000=TRUE;
m_750=TRUE;
m_2000=TRUE;
m_250=TRUE;
m_trans=TRUE;
trans=2;
GetDlgItem(IDC_CLICK1)->EnableWindow(FALSE);
GetDlgItem(IDC_CLICK2)->EnableWindow(TRUE);
GetDlgItem(IDC_CLICK3)->EnableWindow(FALSE);
GetDlgItem(IDC_CLICK4)->EnableWindow(FALSE);
GetDlgItem(IDC_CLICK5)->EnableWindow(FALSE);
GetDlgItem(IDC_CLICK6)->EnableWindow(FALSE);
GetDlgItem(IDC_CLICK7)->EnableWindow(FALSE);
GetDlgItem(IDC_VAL_TRANS)->EnableWindow(FALSE);
UpdateData(FALSE);
zarib=2;
Write_init();
}
/****************************************/
* این زیر برنامه زمانی فراخوانی می شود که ما ترانس را در حالت 250 قرار دهیم ودر این حالت ضریب ترانس تغییر خواهد کرد .

void CAnalyzerView::OnRadio250()
{
Read_init();
m_250=FALSE;
m_1500=TRUE;
m_1000=TRUE;
m_750=TRUE;
m_500=TRUE;
m_2000=TRUE;
m_trans=TRUE;
trans=1;
GetDlgItem(IDC_CLICK1)->EnableWindow(TRUE);
GetDlgItem(IDC_CLICK2)->EnableWindow(FALSE);
GetDlgItem(IDC_CLICK3)->EnableWindow(FALSE);
GetDlgItem(IDC_CLICK4)->EnableWindow(FALSE);
GetDlgItem(IDC_CLICK5)->EnableWindow(FALSE);
GetDlgItem(IDC_CLICK6)->EnableWindow(FALSE);
GetDlgItem(IDC_CLICK7)->EnableWindow(FALSE);
GetDlgItem(IDC_VAL_TRANS)->EnableWindow(FALSE);
UpdateData(FALSE);
zarib=1;
Write_init();
}
/****************************************/
* این زیر برنامه پورت را برای ارتباط سریال آماده می کند .
void CAnalyzerView::init_port()
{
m_enable=FALSE;
UpdateData(FALSE);
KillTimer(ID_COM_MONITORING);
counter_recive=0;
l=0;
SetTimer(ID_COM,50,NULL);
SetTimer(ID_LINK,5000,NULL);
}
/****************************************/
* وقتیکه در نرم افزار پورت یک را انتخاب می کنیم این زیر برنامه اجرا می شود و پورت را در حالت کام یک قرار می دهد .
void CAnalyzerView::OnCom1()
{
Read_init();
m_commctrl.SetCommPort(1);
m_com1=FALSE;
m_com2=TRUE;
UpdateData(FALSE);
PORT=0x3f8;
COMBASE=0x3f0;
Write_init();
}
/****************************************/
* وقتیکه در نرم افزار پورت دو را انتخاب می کنیم این زیر برنامه اجرا می شود و پورت را در حالت کام دو قرار می دهد .

void CAnalyzerView::OnCom2()
{
Read_init();
m_commctrl.SetCommPort(2);
m_com2=FALSE;
m_com1=TRUE;
UpdateData(FALSE);
PORT=0x2f8;
COMBASE=0x2f0;
Write_init();
}
/****************************************/
* وقتیکه در نرم افزار کلید File Convert فشار داده می شود این زیر برنامه اجرا می شود .

void CAnalyzerView::OnButton8()
{
int in_pass;
int minute;
int hour;
int second;
int y=0;
int out_file;
long int j;
int convert_int;
p=0;
if(Auto==1)
{
Led_Green();
Sleep(1000);
Shut_down();
Exit_prog();
}
if(Auto==0)
{
enter_pass.m_pass=1111;
enter_pass.m_date=file_date;
enter_pass.DoModal();
file_date=enter_pass.m_date;
in_pass=enter_pass.out_pass;
if(in_pass==1)
{
MessageBox(" You Need Super Password _ Please Contact With Us ","Converting",MB_OK | MB_ICONSTOP);
}
if(in_pass==2)
{
out_file=f.Open("Analyz"+file_date+".Meg",CFile::modeRead | CFile::typeBinary);
if(out_file==1)
{
f.Read(recive_com,150000);
hour=recive_com[0];
minute=recive_com[1];
second=recive_com[2];
f.Close();
}else
{
MessageBox(" Invalid *.Meg ","Error",MB_OK | MB_ICONSTOP);
Exit_prog();
}
in=fopen("Analyz"+file_date+".txt","w");
for(j=3;j<32292;j++)
{
if(recive_com[j]==0)
{
convert_int=recive_com[j]*zarib;
file_contor[p]=convert_int;
p++;
fprintf(in,"%d",convert_int);
y++;
}else
{
convert_int=(recive_com[j]-1234)*zarib;
file_contor[p]=convert_int;
p++;
fprintf(in,"%d",convert_int);
y++;
}
if(y==3)
{
file_contor[p]=hour;
p++;
putc('t',in);
fprintf(in,"%d",hour);
putc(':',in);
fprintf(in,"%d",minute);
putc(':',in);
fprintf(in,"%d",second);
second=second+8;
if(second>=60)
{
second=second-60;
minute=minute+1;
if(minute==60)
{
minute=0;
hour=hour+1;
if(hour==25)
{
hour=1;
}
}
}
y=0;
putc('n',in);
}
else
{
putc('t',in);
}
}
fclose(in);
f.Open("Price"+file_date+".con",CFile::modeCreate | CFile::modeWrite | CFile::typeBinary);
f.Write(file_contor,250000);
f.Close();
remove("Analyz"+file_date+".Meg");
MessageBox(" Converting File For Analyz ","Converting");
}
if(in_pass==0)
{
MessageBox(" Don't Converting ","Converting",MB_OK | MB_ICONSTOP);
}
}
if(Auto==2)
{
out_file=f.Open("Analyz"+file_date+".Meg",CFile::modeRead | CFile::typeBinary);
if(out_file==1)
{
f.Read(recive_com,150000);
hour=recive_com[0];
minute=recive_com[1];
second=recive_com[2];
f.Close();
}
in=fopen("Analyz"+file_date+".txt","w");
for(j=3;j<32292;j++)
{
if(recive_com[j]==0)
{
convert_int=recive_com[j]*zarib;
file_contor[p]=convert_int;
p++;
fprintf(in,"%d",convert_int);
y++;
}else
{
convert_int=(recive_com[j]-1234)*zarib;
file_contor[p]=convert_int;
p++;
fprintf(in,"%d",convert_int);
y++;
}
if(y==3)
{
file_contor[p]=hour;
p++;
putc('t',in);
fprintf(in,"%d",hour);
putc(':',in);
fprintf(in,"%d",minute);
putc(':',in);
fprintf(in,"%d",second);
second=second+8;
if(second>=60)
{
second=second-60;
minute=minute+1;
if(minute==60)
{
minute=0;
hour=hour+1;
if(hour==25)
{
hour=1;
}
}
}
y=0;
putc('n',in);
}
else
{
putc('t',in);
}
}
fclose(in);
f.Open("Price"+file_date+".con",CFile::modeCreate | CFile::modeWrite | CFile::typeBinary);
f.Write(file_contor,250000);
f.Close();
remove("Analyz"+file_date+".Meg");
Led_Green();
Sleep(1000);
Shut_down();
Exit_prog();
}
}
/****************************************/
* این زیر برنامه برای کارکردن با پورت سریال کامپیوتر مورد استفاده قرار میگیرد.

void CAnalyzerView::OnCommEvent()
{
switch(m_commctrl.GetCommEvent())
{
case 1: // vbMSCommEvSend:
MessageBox("send");
break;
case 2: // vbMSCommEvReceive:
KillTimer(ID_LINK);
VariantInit(&var);
var=m_commctrl.GetInput();
var.vt = VT_BSTR;
t[l]=var.bstrVal;
size_len[l]=t[l].GetLength();
Save();
t[l]=" ";
SysFreeString(var.bstrVal);
l++;
VariantClear(&var);
return;
break;
case 3: // vbMSCommEvCTS:
MessageBox("error");
break;
case 4: // vbMSCommEvDSR:
MessageBox("error");
break;
case 5: // vbMSCommEvCD:
MessageBox("error");
break;
case 6: // vbMSCommEvRing:
MessageBox("error");
break;
case 7: // vbMSCommEvEOF:
MessageBox("error");
break;
case 1001: // vbMSCommErBreak:
MessageBox("error");
break;
case 1002: // vbMSCommErCTSTO:
MessageBox("error");
break;
case 1003: // vbMSCommErDSRTO:
MessageBox("error");
break;
case 1004: // vbMSCommErFrame:
MessageBox("error");
break;
case 1006: // vbMSCommErOverrun:
MessageBox("error");
break;
case 1007: // vbMSCommErCDTO:
MessageBox("error");
break;
case 1008: // vbMSCommErRxOver:
MessageBox("error");
break;
case 1009: // vbMSCommErRxParity:
MessageBox("error");
break;
case 1010: // vbMSCommErTxFull:
MessageBox("error");
break;
}
}
/*******************************************/

* کار این زیر برنامه این است که اطلاعات ذخیره شده در بافر سریال پورت را تخلیه می کند و در یک متغیر نگهداری می کند .

void CAnalyzerView::Save()
{
int out_file;
for(z=0;z<size_len[l];z++)
{
int b=t[l][z];
if(b<0)
{
b=256+b;
}
if(b==1)
{
b=0;
}
recive_com[counter_recive]=b+1234;
if(recive_com[counter_recive]-1234==255)
{
recive_com[counter_recive]=0;
KillTimer(ID_COM);
show1.out=1;
out_file=f.Open("systemsystem.cfg",CFile::modeRead | CFile::typeBinary);
if(out_file==1)
{
f.Read(init,50);
f.Close();
recive_com[0]=init[1];
recive_com[1]=init[2];
recive_com[2]=init[3];
}else
{
MessageBox(" Invalid System.cfg ","Error",MB_OK | MB_ICONSTOP);
Exit_prog();
}
f.Open("Analyz"+file_date+".Meg",CFile::modeCreate | CFile::modeWrite | CFile::typeBinary);
f.Write(recive_com,150000);
f.Close();
ComClose();
recive_com[0,150000]=0;
if(Auto==1 || Auto==2)
{
SetTimer(ID_AUTO2,3000,NULL);
m_prog.SetPos(0);
}else
{
MessageBox("*** Finish *** ","FINISH",MB_OK | MB_ICONQUESTION);
m_prog.SetPos(0);
On();
}
}
counter_recive++;
count_pos++;
if(count_pos==1000)
{
count_pos=0;
locate_pos++;
m_prog.SetPos(locate_pos);
}
}
}
/*************************************************/

* این زیر برنامه برای فرستادن اطلاعات به پورت مورد استفاده قرار می گیرد

void CAnalyzerView::Send_Port()
{
if (m_commctrl.GetPortOpen())
{
VariantInit(&var);
var.vt = VT_BSTR;
var.bstrVal =send_data.AllocSysString();
m_commctrl.SetOutput(var);
VariantClear(&var);
}else
{
MessageBox("Port Is Close");
}
}
/******************************************/

* این زیر برنامه کام سریال را در اختیار نرم افزار قرار می دهد .

void CAnalyzerView::ComOpen()
{
if (!m_commctrl.GetPortOpen())
{
m_commctrl.SetPortOpen(TRUE);
}
}
/*******************************************/

* این زیر برنامه کام سریال را از نرم افزار می گیرد و در اختیار ویندوز قرار میدهد

void CAnalyzerView::ComClose()
{
if (m_commctrl.GetPortOpen())
{
m_commctrl.SetPortOpen(FALSE);
}
}
/*******************************************/

* این زیر برنامه تمامی کنترلهای موجود در نرم افزار را فعال می نماید .

void CAnalyzerView::On()
{
UpdateData(TRUE);
switch(trans)
{
case 1:
GetDlgItem(IDC_CLICK1)->EnableWindow(TRUE);
UpdateData(FALSE);
break;
case 2:
GetDlgItem(IDC_CLICK2)->EnableWindow(TRUE);
UpdateData(FALSE);
break;
case 3:
GetDlgItem(IDC_CLICK3)->EnableWindow(TRUE);
UpdateData(FALSE);
break;
case 4:
GetDlgItem(IDC_CLICK4)->EnableWindow(TRUE);
UpdateData(FALSE);
break;
case 6:
GetDlgItem(IDC_CLICK5)->EnableWindow(TRUE);
UpdateData(FALSE);
break;
case 8:
GetDlgItem(IDC_CLICK6)->EnableWindow(TRUE);
UpdateData(FALSE);
break;
case 9:
GetDlgItem(IDC_CLICK7)->EnableWindow(TRUE);
GetDlgItem(IDC_VAL_TRANS)->EnableWindow(TRUE);
UpdateData(FALSE);
break;
}
GetDlgItem(IDC_RESTART)->EnableWindow(TRUE);
GetDlgItem(IDC_BUTTON8)->EnableWindow(TRUE);
GetDlgItem(IDC_CHECK1)->EnableWindow(TRUE);
GetDlgItem(IDC_RADIO2000)->EnableWindow(TRUE);
GetDlgItem(IDC_RADIO1500)->EnableWindow(TRUE);
GetDlgItem(IDC_RADIO1000)->EnableWindow(TRUE);
GetDlgItem(IDC_RADIO750)->EnableWindow(TRUE);
GetDlgItem(IDC_RADIO500)->EnableWindow(TRUE);
GetDlgItem(IDC_RADIO250)->EnableWindow(TRUE);
GetDlgItem(IDC_TRANS)->EnableWindow(TRUE);
GetDlgItem(IDC_COM1)->EnableWindow(TRUE);
GetDlgItem(IDC_COM2)->EnableWindow(TRUE);
UpdateData(FALSE);

}
/*******************************************/

* این زیر برنامه تمامی کنترلهای موجود در نرم افزار را غیرفعال می نماید .

void CAnalyzerView::Off()
{
UpdateData(TRUE);
GetDlgItem(IDC_CLICK1)->EnableWindow(FALSE);
GetDlgItem(IDC_CLICK2)->EnableWindow(FALSE);
GetDlgItem(IDC_CLICK3)->EnableWindow(FALSE);
GetDlgItem(IDC_CLICK4)->EnableWindow(FALSE);
GetDlgItem(IDC_CLICK5)->EnableWindow(FALSE);
GetDlgItem(IDC_CLICK6)->EnableWindow(FALSE);
GetDlgItem(IDC_RESTART)->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON8)->EnableWindow(FALSE);
GetDlgItem(IDC_CHECK1)->EnableWindow(FALSE);
GetDlgItem(IDC_RADIO2000)->EnableWindow(FALSE);
GetDlgItem(IDC_RADIO1500)->EnableWindow(FALSE);
GetDlgItem(IDC_RADIO1000)->EnableWindow(FALSE);
GetDlgItem(IDC_RADIO750)->EnableWindow(FALSE);
GetDlgItem(IDC_RADIO500)->EnableWindow(FALSE);
GetDlgItem(IDC_RADIO250)->EnableWindow(FALSE);
GetDlgItem(IDC_CLICK7)->EnableWindow(FALSE);
GetDlgItem(IDC_VAL_TRANS)->EnableWindow(FALSE);
GetDlgItem(IDC_TRANS)->EnableWindow(FALSE);
GetDlgItem(IDC_COM1)->EnableWindow(FALSE);
GetDlgItem(IDC_COM2)->EnableWindow(FALSE);
UpdateData(FALSE);
}
/*******************************************/

* این زیر برنامه تاریخ شمسی را محاسبه و برای فایلها قرار می دهد .

void CAnalyzerView::Cal_Date()
{
CString day;
CString mount;
CString year;
int year_int1;
int mount_int1;
int day_int1;
Read_init();
year_int1=DATE/100;
day_int1=DATE % 100;
mount_int1=year_int1 % 100;
year_int1=year_int1/100;

day_int1++;
if(mount_int1>=1 && mount_int1<=6)
{
if(day_int1==32)
{
day_int1=1;
mount_int1++;
}
}
if(mount_int1>=7 && mount_int1<=11)
{
if(day_int1==31)
{
day_int1=1;
mount_int1++;
}

}
if(mount_int1==12)
{
if(day_int1==30)
{
day_int1=1;
mount_int1=1;
year_int1++;
}
}

if(year_int1<10)
{
year.Format("0%d",year_int1);
}else
{
year.Format("%d",year_int1);
}

if(mount_int1<10)
{
mount.Format("0%d",mount_int1);
}else
{
mount.Format("%d",mount_int1);
}
if(day_int1<10)
{
day.Format("0%d",day_int1);
}else
{
day.Format("%d",day_int1);
}
file_date.Format("%s%s%s",year,mount,day);
DATE=atol(file_date);
Write_init();
}
/*******************************************/

* این زیر برنامه فایل init . cfg را با مقادیر مربوطه پر می کند و در آن فایل ذخیره می نماید.
void CAnalyzerView::Read_init()
{
int out_file;
out_file=f.Open("systeminit.cfg",CFile::modeRead | CFile::typeBinary);
if(out_file==1)
{
f.Read(init,50);
f.Close();
}else
{
MessageBox(" Invalid Init.cfg ","Error",MB_OK | MB_ICONSTOP);
Exit_prog();
}
trans=init[0];
PORT=init[1];
COMBASE=init[2];
Auto=init[3];
DATE=init[4];
HOUR_OFF=init[5];
MINUTE_OFF=init[6];
m_val_trans=init[7];
}
/*******************************************/

* دراین زیر برنامه برنامه Shut Down.exe فراخوانی می شود .

void CAnalyzerView::Shut_down()
{
int h_shut=100,m_shut=100;
Read_init();
CTime curTime=CTime::GetCurrentTime();
h_shut=curTime.GetHour();
m_shut=curTime.GetMinute();
m_shut=m_shut-MINUTE_OFF;
if(HOUR_OFF==h_shut){
if(m_shut<=5 && m_shut>=0){
ShellExecute( NULL, NULL, "Shutdown.exe", NULL, NULL, SW_SHOWNORMAL);
}
}

}
//*************************************

* این زیر برنامه برای نمایش لحظه ای ولتاژ و جریان در نرم افزار مورد استفاده قرار می گیرد .
void CAnalyzerView::OnCommEventMonitoring()
{
switch(m_commctrl.GetCommEvent())
{
case 1: // vbMSCommEvSend:
MessageBox("send");
break;
case 2: // vbMSCommEvReceive:
KillTimer(ID_LINK);
VariantInit(&var_monitoring);
var_monitoring=m_commctrl.GetInput();
var_monitoring.vt = VT_BSTR;
t_monitoring[l_monitoring]=var_monitoring.bstrVal;
size_len_monitoring[l_monitoring]=t_monitoring[l_monitoring].GetLength();
SaveMonitoring();
t_monitoring[l_monitoring]=" ";
SysFreeString(var_monitoring.bstrVal);
l_monitoring++;
VariantClear(&var_monitoring);
return;
break;
case 3: // vbMSCommEvCTS:
MessageBox("error");
break;
case 4: // vbMSCommEvDSR:
MessageBox("error");
break;
case 5: // vbMSCommEvCD:
MessageBox("error");
break;
case 6: // vbMSCommEvRing:
MessageBox("error");
break;
case 7: // vbMSCommEvEOF:
MessageBox("error");
break;
case 1001: // vbMSCommErBreak:
MessageBox("error");
break;
case 1002: // vbMSCommErCTSTO:
MessageBox("error");
break;
case 1003: // vbMSCommErDSRTO:
MessageBox("error");
break;
case 1004: // vbMSCommErFrame:
MessageBox("error");
break;
case 1006: // vbMSCommErOverrun:
MessageBox("error");
break;
case 1007: // vbMSCommErCDTO:
MessageBox("error");
break;
case 1008: // vbMSCommErRxOver:
MessageBox("error");
break;
case 1009: // vbMSCommErRxParity:
MessageBox("error");
break;
case 1010: // vbMSCommErTxFull:
MessageBox("error");
break;
}
}
//*************************************

* این زیر برنامه مقادیر ولتاژ و جریان را از پورت گرفته و در روی صفحه نشان می دهد .
void CAnalyzerView::SaveMonitoring()
{
int b_monitoring;
for(z_monitoring=0;z_monitoring<size_len_monitoring[l_monitoring];z_monitoring++)
{
b_monitoring=t_monitoring[l_monitoring][z_monitoring];
counter_monitoring++;
if(b_monitoring<0)
{
b_monitoring=256+b_monitoring;
}
if(b_monitoring==1)
{
b_monitoring=0;
}
if(b_monitoring==254){
counter_monitoring=0;
}
switch(counter_monitoring)
{
case 1:
m_amp1=b_monitoring*zarib;
break;
case 2:
m_amp2=b_monitoring*zarib;
break;
case 3:
m_amp3=b_monitoring*zarib;
break;
case 4:
m_vol1=b_monitoring;
break;
case 5:
m_vol2=b_monitoring;
break;
case 6:
m_vol3=b_monitoring;
break;
case 7:
level=b_monitoring;
DisLevel();
break;
}
}
UpdateData(FALSE);
}
//*************************************

* این زیر برنامه برای نمایش سطح حافظه دستگاه در داخل نرم افزار مورد استفاده قرار می گیرد .
void CAnalyzerView::DisLevel()
{
if(level>=0x0 && level<0x11){
s_prog.SetPos(1);
m_info="Low";
UpdateData(FALSE);
return;
}
if(level>=0x11 && level<0x22){
m_info="Low";
s_prog.SetPos(2);
UpdateData(FALSE);
return;
}
if(level>=0x22 && level<0x33){
m_info="Low";
s_prog.SetPos(3);
UpdateData(FALSE);
return;
}
if(level>=0x33 && level<0x44){
m_info="Medium";
s_prog.SetPos(4);
UpdateData(FALSE);
return;
}
if(level>=0x44 && level<0x55){
m_info="Medium";
s_prog.SetPos(5);
UpdateData(FALSE);
return;
}
if(level>=0x55 && level<0x66){
m_info="Medium";
s_prog.SetPos(6);
UpdateData(FALSE);
return;
}
if(level>=0x66 && level<0x77){
m_info="Medium";
s_prog.SetPos(7);
UpdateData(FALSE);
return;
}
if(level>=0x77 && level<=0x7f){
m_info="Medium";
if(level==0x7f){
m_info="Full";
}
s_prog.SetPos(8);
UpdateData(FALSE);
return;
}
}
/************************************/

این زیر برنامه زمانی اجرا می شود که صفحه گرفتن کلمه رمز اجرا می شود و یک کلمه رمز عبور از کاربر می گیرد .

void CMsg1View::OnOK()
{
int password,super_pass,out_file;
CFile f;
int init[50];
UpdateData(TRUE);
out_file=f.Open("systemsystem.cfg",CFile::modeRead | CFile::typeBinary);
if(out_file==1)
{
f.Read(init,50);
password=init[0]-4321;
super_pass=init[4]-4321;
f.Close();
}else
{
MessageBox(" Invalid System.cfg ","Error",MB_OK | MB_ICONSTOP);
exit(1);
}
if(m_pass==super_pass)
{
out_pass=2;
}
if(m_pass==password)
{
out_pass=1;
}
if(m_pass!=password && m_pass!=super_pass)
{
out_pass=0;
MessageBox(" Invalid Password ","Password",MB_OK | MB_ICONSTOP);
}

CDialog::OnOK();
}

void CMsg1View::OnCancel()
{

out_pass=0;
CDialog::OnCancel();
}
//////////////////////////////////////////////////////

* این زیر برنامه برای عوض کردن کلمه رمز سیستم مورد استفاده قرار می گیرد .

void CMsg1View::OnChang()
{
chang_pass.m_old_pass=2222;
chang_pass.m_new_pass=3333;
chang_pass.m_confrim_pass=4444;
chang_pass.m_super_old_pass=5555;
chang_pass.m_super_new_pass=6666;
chang_pass.m_super_confrim_pass=7777;
chang_pass.DoModal();

}

//////////////////////////////////////////////////////////////
// CMsg2View message handlers

* این زیر برنامه زمانیکه پنجره تعویض کلمه رمز اجرا می شود این زیر برنامه فراخوانی می شود .

void CMsg2View::OnOK()
{
CFile f;
int password,super_pass,out_file;
int hour;
int minute;
int second;
int init[50];
UpdateData(TRUE);
out_file=f.Open("systemsystem.cfg",CFile::modeRead | CFile::typeBinary);
if(out_file==1)
{
f.Read(init,50);
password=init[0]-4321;
hour=init[1];
minute=init[2];
second=init[3];
super_pass=init[4]-4321;
f.Close();
}else
{
MessageBox(" Invalid System.cfg ","Error",MB_OK | MB_ICONSTOP);
exit(1);
}
if(m_old_pass==password)
{
if(m_new_pass==m_confrim_pass)
{
f.Open("systemsystem.cfg",CFile::modeCreate | CFile::modeWrite | CFile::typeBinary);
init[0]=m_new_pass+4321;
init[1]=hour;
init[2]=minute;
init[3]=second;
init[4]=super_pass+4321;
f.Write(init,50);
f.Close();
}
else
{
MessageBox(" Confrim Password —–> is Mistake ","Password",MB_OK | MB_ICONSTOP);
}

}
else
{
MessageBox(" OLd Password —–> is Mistake ","Password",MB_OK | MB_ICONSTOP);
}

CDialog::OnOK();
}

void CMsg2View::OnCancel()
{
// TODO: Add extra cleanup here

CDialog::OnCancel();
}

void CMsg2View::OnOk2()
{
CFile f;
int password,super_pass,out_file;
int hour;
int minute;
int second;
int init[50];
UpdateData(TRUE);
out_file=f.Open("systemsystem.cfg",CFile::modeRead | CFile::typeBinary);
if(out_file==1)
{
f.Read(init,50);
password=init[0]-4321;
hour=init[1];
minute=init[2];
second=init[3];
super_pass=init[4]-4321;
f.Close();
}else
{
MessageBox(" Invalid System.cfg ","Error",MB_OK | MB_ICONSTOP);
exit(1);
}
if(m_super_old_pass==super_pass)
{
if(m_super_new_pass==m_super_confrim_pass)
{
f.Open("systemsystem.cfg",CFile::modeCreate | CFile::modeWrite | CFile::typeBinary);
init[0]=password+4321;
init[1]=hour;
init[2]=minute;
init[3]=second;
init[4]=m_super_new_pass+4321;
f.Write(init,50);
f.Close();
}
else
{
MessageBox(" Confrim Super Password —–> is Mistake ","Password",MB_OK | MB_ICONSTOP);
}

}
else
{
MessageBox(" OLd Super Password —–> is Mistake ","Password",MB_OK | MB_ICONSTOP);
}

CDialog::OnOK();
}
//////////////////////////////////////////////////////////////
// CMsg4View message handlers

* این زیر برنامه زمانی اجرا می شود که پنجره مربوط به محاسبه بهای انرژی وکیلو وات مصرفی فراخوانی می شود .

void CMsg4View::OnCalculate()
{
FILE *in;
int price_full=0;
int kw_aoj_full=0;
int kw_adi_full=0;
int kw_kam_full=0;

UpdateData(TRUE);
year_int1=m_date1/100;
day_int1=m_date1 % 100;
mount_int1=year_int1 % 100;
year_int1=year_int1/100;

year_int2=m_date2/100;
day_int2=m_date2 % 100;
mount_int2=year_int2 % 100;
year_int2=year_int2/100;
remove("out.txt");
while(year_int1!=year_int2 || mount_int1!=mount_int2 || day_int1!=day_int2)
{
int_string();
calculate_kw();
price_full=price_full+m_adi+m_aoj+m_kam;
kw_adi_full=kw_adi_full+kw_adi;
kw_aoj_full=kw_aoj_full+kw_aoj;
kw_kam_full=kw_kam_full+kw_kam;

day_int1++;
if(mount_int1>=1 && mount_int1<=6)
{
if(day_int1==32)
{
day_int1=1;
mount_int1++;
}
}
if(mount_int1>=7 && mount_int1<=11)
{
if(day_int1==31)
{
day_int1=1;
mount_int1++;
}

}
if(mount_int1==12)
{
if(day_int1==30)
{
day_int1=1;
mount_int1=1;
year_int1++;
}
}
}//end of while
// m_date1=0;
// m_date2=0;
m_price=price_full;
m_kw_adi=kw_adi_full;
}

در پایان امیدوارم این پروژه که با صـرف زمانی نزدیک به چهار سال تلاش

بی وقفه طراحی و تنظیم شده است بتواند برای برای اقتصاد کشورم مفید

واقع شود که هم اکنون با نصب این دستگاه در کارخانه های چرم مشهد ،

فرش مشهد ، ریسندگی مشهد ، رنگرزی مشهد ، ریسندگی نگین ، فرش

نگین و کارخانه ای در سیرجان و تهران موجبات بهینه سازی مصرف انرژی

را فراهم ساخته است .

* از استاد محترم جناب آقای مهندس گوهری کمال تشکر را دارم .


تعداد صفحات : 117 | فرمت فایل : WORD

بلافاصله بعد از پرداخت لینک دانلود فعال می شود