تبلیغات
برنامه نویسی و الکترونیک
 
منوی اصلی


--------------------------

--------------------------

--------------------------

--------------------------


سفارش پروژه

E-Mail :
Mahmood_Mehri@Hotmail.com

سایت برنامه نویس :  Mahmood_M


موضوعات

دانلود نرم افزار
 
تخصصی برنامه نویسی
  تخصصی برق ( الکترونیک )
  کامپوننت ها و ابزارها
  نرم افزارهای متفرقه
برنامه نویسی
  مباحث عمومی
  آموزش Delphi

  آموزش زبان C++ / C
 
آموزش Matlab

  آموزش زبان Assembly
  آموزش زبان SQL

  آموزش پردازش تصویر
  بررسی الگوریتم ها
الکترونیک
  مباحث عمومی
  مباحث عمومی الکترونیک
  معرفی قطعات الکترونیکی
  کار با مولتی متر
  مدارات الکترونیک
  میکروکنترلر
  میکروکنترلرهای AVR
  پروژه ها
مباحث متفرقه
  آموزشهای متفرقه
  معرفی سایت
  معرفی کتاب
  پاسخ به سئوالات
  مطالب عمومی


لینك دوستان
:: پایگاه علمی مهندسی تراشه
:: تمامی راهکارهای کامپیوتری
:: جک :: اس ام اس :: عکس
:: الکترونیک 89 گیلان
:: سورسهای نرم افزاری
:: اینترنت بدون تحریم
:: علمی.کتاب.مجله.نرم افزار.مقاله
:: مبارزات آزاد
:: برنامه نویسی از اهل زمین
:: :: جزیره ی دانلود ::
:: :: کامپیوتر و IT ::
:: بزرگترین پایگاه مدل لباس اینترنتی
:: مرکز دانلود ایرانیان
:: برنامه نویسی و طراحی وب
:: :: فناوری روز ::
:: :: همه چیز واسه موبایل ::
:: آموزش تخصصی کامپیوتر
:: * پیاز داغ اینترنت ! *
:: جدیدترین موزیکها و نرم افزارها
:: دانلود سورس ویژوال بیسیک
:: امپراطور دانلود و آموزش
:: موبایل و کامپیوتر
:: جدیدترین آهنگهای هفته
:: درباره ی دلفی !
:: برنامه نویس
:: پروژه های رایگان و آموزش ++C
:: ابراهیم آنلاین

 : " استفاده از Component Template ها در دلفی " :
 
یکی از موضوعاتی که شاید برای خیلی ها آزارد دهنده باشه، اعمال تغییراتی جزئی و تکراری در برخی از کامپوننتهاست
مثلا وقتی قصد استفاده از کامپوننت TPanel رو دارید، معمولا اولین کاری که بعد از قرار دادن این کامپوننت بر روی فرم باید انجام بدید اینه که خاصیت Caption اون رو خالی کنید! ، یا به عنوان مثال خالی کردن خاصیت Text مربوط به TEdit معمولا در ابتدای کار انجام میشه و موارد دیگه ای که حتما همه دوستان تجربه کردن
در حالت کلی معمولا هر برنامه نویس تغییرات مشخصی رو در شروع استفاده از یک نوع کامپوننت، روی اون اعمال می کنه
انجام این تغییرات معمولا در دفعات زیاد آزاد دهنده ست و باعث هدر رفتن وقت میشه
دلفی امکان ساده و جالبی برای حل این مشکل قرار داده
استفاده از Component Template ها به شما این امکان رو میده که بعد از اعمال تغییرات دلخواه در خاصیتهای یک کامپوننت و تغییر مقادیر پیشفرض خاصیتها، اون کامپوننت رو برای استفاده های بعدی به همون صورت ذخیره کنید
برای استفاده از این امکان، یک پروژه جدید ایجاد کنید و مثلا یک TPanel بر روی فرم قرار بدید و خاصیت Caption اون رو خالی کنید
بعد از اعمال تغییرات، در حالی که کامپوننت مورد نظر رو انتخاب کردید از منوی Component گزینه Create Component Template رو انتخاب کنید، با انتخاب این گزینه یک پنجره باز میشه که می تونید یک نام برای Template خودتون انتخاب کنید و مشخص کنید که در چه صفحه ای از Tool Palette ذخیره بشه و همینطور یک Icon براش درنظر بگیرید
بعد از وارد کردن مقادیر دلخواه OK رو بزنید تا تغییرات اعمال بشه، اگر به Tool Palette و صفحه مشخص شده مراجعه کنید، می بینید که یک کامپوننت جدید به لیست اضافه شده، برای استفاده های بعدی به جای قرار دادن TPanel می تونید این کامپوننت جدید رو به فرم اضافه کنید
برای حذف Template های ایجاد شده هم کافیه که روی Template مورد نظر راست کلیک کرده و گزینه Delete رو بزنید

نکته جالب در مورد Template ها اینه که می تونید چند کامپوننت رو با هم انتخاب کرده و در یک Template قرار بدید، مثلا فرض کنید برای طراحی یک نرم افزار مدیریت بانک اطلاعاتی، همیشه به یک DBGrid و یک GroupBox و چند دکمه برای مدیریت ثبت و حذف اطلاعات و ... نیاز دارید، یک بار این ترکیب رو ایجاد کنید و بعد کامپوننت ها رو انتخاب کرده و به عنوان یک Template ذخیره کنید
در دفعات بعدی می تونید از Template ساخته شده به جای قرار دادن تک تک کامپوننت ها و چیدمان دوباره اونها استفاده کنید

نکته دیگه اینکه در هنگام ذخیره Template ها ، عناصر درون کامپوننت هم درون Template ذخیره میشن، به عنوان مثال اگر چند Edit بر روی Panel قرار بدید و Panel رو انتخاب کرده و به عنوان Template ذخیره کنید، Panel انتخاب شده همراه با Edit هایی که روی اون قرار دارن به عنوان Template دخیره خواهد شد، درواقع کامپوننت اگر Parent باشه، همراه تمام Child هاش ذخیره خواهد شد

Component Template امکان مفیدیه که می تونه باعث صرفه جویی در وقت بشه و از انجام کارهای تکراری و آزاردهنده جلوگیری کنه

امیدوارم مفید بوده باشه
 

 :: لینك ثابت نویسنده : محمود مهری نظرات Comment

 : " مقاله : نحوه ی استفاده از پنل پیامک در نرم افزار " :
  سلام
در این مقال قصد داریم روشهای اضافه کردن امکان ارسال و دریافت پیامک در نرم افزار طراحی شده در محیط دلفی را بررسی نماییم
فرض کنید در حال طراحی نرم افزاری هستید که وظیفه ثبت نام و نگهداری اطلاعات افراد - به عنوان مشتری یا کارمند یا ... - را به عهده دارد
کارفرما از شما خواسته است که نرم افزار طراحی شده امکان ارسال پیامک به افراد ثبت شده را داشته باشد
یکی از راه های پر دردسر! برای ایجاد امکان ارسال پیامک در نرم افزار، استفاده از یک مودم GSM و یک سیمکارت و ابزاری برای مدیریت ارسال و دریافت پیامک از طریق مودم است که می تواند به عنوان مثال کامپوننت KylixSMS باشد
در این روش شما با چند مشکل روبرو هستید ، به عنوان مثال، استفاده از یک سخت افزار اضافی به عنوان مودم و تهیه سیم کارت برای هر نسخه از نرم افزار، مشکل آنتن دهی در محل استفاده از مودم، کدنویسی و مدیریت تمام بخشهای ارسال و دریافت و گزارش گیری ها و ...
اما روش دیگری هم وجود دارد که بدون وجود مشکلات ذکر شده امکان ارسال و دریافت پیامک را در نرم افزار شما فراهم می کند
این روش استفاده از یک پنل پیامک است، پنل پیامک عمدتا به صورت یک وب سرویس SOAP و یک Http Service ارایه می شود
برای استفاده از این روش تنها کافی ست که با سرور پنل پیامک ارتباط برقرار کرده و درخواست مورد نظر را فرستاده و نتیجه درخواست را دریافت نمایید
این درخواست می تواند ارسال یک پیامک، دریافت لیست پیامک های دریافتی، دریافت Delivery ، ثبت مخاطب و هر درخواست مربوط دیگری باشد
تنها چیزی که برای استفاده از یک پنل پیامک نیاز دارید، ارتباط با اینترنت برای ارسال درخواست است
پنل های پیامک علاوه بر ارایه Web Service یک کنترل پنل تحت وب هم در اختیار شما قرار می دهند که می توانید ارسال ها و دریافت ها و گزارشات مورد نظر را در آن مدیریت نمایید
در ادامه نحوه ی استفاده از یک پنل پیامک در محیط Delphi را بررسی می نماییم
در قدم اول باید یک پنل پیامک مناسب انتخاب نمایید، پیشنهاد ما استفاده از پنل پیامک Pars Green است، شرکت پارس گرین از معدود شرکت هایی ست که سیستم پنل از ابتدا توسط خود شرکت طراحی شده و مانند بسیاری از پنل های پیامک صرفا یک نمایندگی از پنل های خارجی نیست
بسیاری از پنل های موجود تنها یک نمایندگی از سیستم های طراحی شده از خارج از کشور هستند و شرکت ارایه دهنده تسلط کافی بر مسائل فنی سیستم ندارد، همچنین سورس پنل در اختیار شرکت نیست و امکان تغییر در امکانات برای شرکت ارایه دهنده وجود ندارد
اما شرکت پارس گرین با در اختیار داشتن سورس کامل پنل و تسلط بر مسائل فنی سیستم، می تواند امکانات دلخواه شما را به سیستم اضافه نماید و مطمئنا پشتیبانی بهتری به شما ارایه خواهد داد
برای ثبت نام در پنل پیامک پارس گرین به لینک زیر رفته و مراحل ثبت نام را انجام دهید


برای استفاده در محیط دلفی از وب سرویس SOAP شرکت پارس گرین استفاده می نماییم
سرویس SOAP یک پروتکل ارتباطی بر پایه ساختار XML است، به این صورت که هر کلاس از Web Service به صورت یک فایل WSDL و با ساختار XML توسط یک آدرس اینترنتی در دسترس است، در این فایل ساختار کلاس مورد نظر و متدها و پارامتر های هر متد ارایه شده است
ابتدا باید این فایل WSDL را از آدرس مربوطه در دلفی وارد نماییم، دلفی پس از بررسی ساختار XML این فایل، در یک Unit مجزا، کلاس ( Interface ) مورد نظر و متد ها و پارامتر های آن را تعریف کرده و در اختیار ما قرار می دهد، سپس به وسیله همین Unit می توانیم از کلاس مورد نظر استفاده نماییم
درواقع دلفی برای هر کلاس از وب سرویس یک Interface تعریف می کند، برای اطلاع از تفاوت اینترفیس و کلاس می توانید به سایتهای معتبر مراجعه کنید
وب سرویس پیامک شرکت پارس گرین، کلاس های زیر را در قالب فایل WSDL با آدرس های زیر در اختیار قرار می دهد :

برخی از امکانات موجود
نام کلاس
WSDL Web Address
ارسال تکی و گروهی پیامک
اخذ دلیوری و گزارش ارسال
SendSMS http://login.Parsgreen.com/Api/SendSMS.asmx?WSDL
دریافت مانده اعتبار حساب
انتقال شارژ از نماینده به کاربر
ProfileService  http://login.Parsgreen.com/Api/ProfileService.asmx?WSDL
شمارش پیامک های صندوق
حذف پیامک
دریافت پیامک های صندوق
MsgService  http://login.Parsgreen.com/Api/MsgService.asmx?WSDL
ارسال زماندار در یک تاریخ و ساعت خاص
ارسال زماندار روزانه
ارسال زماندار سالانه
حذف ارسال زماندار
ScheduleService  http://login.Parsgreen.com/Api/ScheduleService.asmx?WSDL
افزودن گروه مخاطبین
دریافت جدول گروه مخاطبین
ثبت مخاطب در دفتر تلفن
ContactService  http://login.Parsgreen.com/Api/ContactService.asmx?WSDL

اگر آدرس های بالا را در مرورگر باز کنید، ساختار XML فایل WSDL را مشاهده خواهید کرد
برای استفاده از امکانات هر کلاس باید فایل WSDL مربوطه را از آدرس داده شده درون دلفی Import نماییم
به عنوان مثال، مراحل وارد کردن و استفاده از کلاس SendSMS برای ارسال پیامک را انجام می دهیم
در این آموزش از نسخه XE 6 دلفی استفاده می شود، در سایر نسخه ها تفوات چندانی وجود ندارد

در محیط دلفی از منوی Component گزینه Import WSDL را اتخاب نمایید
در پنجره باز شده در قسمت WSDL Source آدرس فایل WSDL را مطابق جدول بالا وارد کنید و مقادیر مربوط به Authentication را خالی بگذارید :

WSDL Import

در صفحه بعدی باید نسخه SOAP مشخص شود که نیازی به تغییر نیست و به صورت خودکار انجام خواهد شد، در صفحه آخر هم تنظیمات پیشفرض را بدون تغییر رها کرده و بر روی گزینه Finish کلیک نمایید تا Unit مورد نظر ساخته شود
اگر کدهای درون Unit را بررسی نمایید، متوجه ساختار کلاس و متدها ( توابع ) و پارامتر های هر کدام خواهید شد
علاوه بر کلاس ها ، دلفی Type های استفاده شده در متد ها و توابع را نیز تعریف می کند، مانند ArrayOfString یا ArrayOfInteger که در Unit تعریف شده اند
در Unit ساخته شده یک تابع با عنوان GetSendSMSSoap وجود دارد، این تابع یک مقدار برگشتی از نوع SendSMSSoap دارد که همان کلاس مربوط به ارسال پیام است برای استفاده از هر کدام از توابع این کلاس ابتدا باید به کلاس موجود در WebService متصل شویم، متد GetSendSMSSoap ابتدا به وب سرویس متصل شده و کلاس موردنظر را برمی گرداند، سپس توسط این کلاس می توانیم هرکدام از متدها را با دادن مقادیر ورودی اجرا نماییم و مقدار خروجی متد را دریافت کنیم
به عنوان مثال قصد داریم با استفاده از تابع SendGroupSMS یک پیامک ارسال کنیم
این تابع چند پارامتر به شرح زیر دارد :
  • Signature : هر پنل پیامک ثبت نام شده در شرکت پارس گرین، برای امنیت بیشتر یک امضای دیجیتال دارد، برای استفاده از هر تابع باید Signature پنل خود را به عنوان پارامتر ورودی وارد نمایید
  • From : شماره پنل خود را در این پارامتر وارد نمایید ( هر پنل یک شماره تماس اختصاصی دارد )
  • To_ : این پارامتر یک آرایه از نوع String است که درواقع لیست شماره های مقصد پیامک می باشد
  • Text : متن پیامک
  • IsFlash : از نوع Boolean و مشخص می کند که پیامک از نوع Flash باشد یا خیر
  • UDH : در این پارامتر یک رشته خالی قرار دهید ( برای اطلاعات بیشتر به فایل راهنمای داخل پنل خود مراجعه کنید )
  • Success : این پارامتر از نوع ارجاعی بوده و تعداد پیامک هایی که با موفقیت ارسال شده اند را مشخص می کند، اگر یک متغیر در این پارامتر قرار دهید، پس از اجرای تابع، تعداد ارسال های موفقیت آمیز درون این متغیر قرار خواهد گرفت
  • RetStr : این پارامتر نیز از نوع ارجاعی است و یک آرایه از نوع String را با اطلاعات برگشتی پر می کند، اطلاعات برگشتی شامل وضعیت ارسال برای هر شماره است ( برای اطلاعات بیشتر به فایل راهنمای داخل پنل خود مراجعه کنید )

مقدار برگشتی این تابع یک مقدار Integer است که وضعیت نتیجه اجرای تابع را مشخص می کند، مثلا اگر مقدار برگشتی 1 باشد، یعنی عملیات بدون مشکل انجام شده است، اگر مقدار -1 باشد، یعنی Signature وارد شده مجاز نیست ، برای مشاهده تمامی مقادیر برگشتی و توضیحات هر کدام به فایل راهنمای موجود در پنل خود مراجعه نمایید

همانطور که ذکر شد، برای اجرای دستورات کلاس SendSMSSoap باید ابتدا به این کلاس متصل شده و تابع مورد نظر را اجرا نماییم
ابتدا Unit ساخته شده را در جایی ذخیره نمایید، سپس پروژه جدیدی ایجاد کرده و نام این Unit را در قسمت Uses اضافه کنید ( Unit را در پروژه Add کنید )
یک دکمه بر روی فرم قرار داده و دستورات زیر را در OnClick دکمه بنویسید :

 var
 SendSMS : SendSMSSoap;
 SuccessCount : Integer;
 RetStr : ArrayofString;
 RetValue : Integer;
 Numbers : ArrayOfString;
begin
 
SetLength(Numbers, 1);
 Numbers[0] := '09118202020';

 try
  SendSMS := GetSendSMSSoap(True, '', nil);

  RetValue := SendSMS.SendGroupSMS('', '', [], '', False, '', SuccessCount, RetStr);

  case RetValue of
   -1 : MessageBox(Handle, 'مقدار امضای دیجیتال مجاز نیست', '', MB_OK+MB_ICONEXCLAMATION);
    0 : MessageBox(Handle, 'خطای نامشخص در ارسال، عملیات انجام نشد', '', MB_OK+MB_ICONEXCLAMATION);
    1 : MessageBox(Handle, 'عملیات با موفقیت به پایان رسید', '', MB_OK+MB_ICONINFORMATION);
     ...
  end;
 except
  on E:Exception do
   begin
    MessageBox(Handle, 'خطا در ارتباط با سرور، اتصال به اینترنت را بررسی نمایید', '', MB_OK+MB_ICONEXCLAMATION);
   end;
 end;
end;

توجه کنید که برای متغیر های از نوع آرایه، از Type های تعریف شده در Unit ساخته شده استفاده کردیم ( ArrayOfString )

ابتدا آرایه مربوط به شماره های مقصد را با یک شماره پر کردیم، سپس با فراخوانی تابع GetSendSMSSoap ، به کلاس SendSMS متصل شدیم
به پرامترهای این تابع دقت کنید، پارامتر اول مشخص می کند که آیا برای ارتباط از فایل WSDL استفاده کند یا درخواست HTTP ، اگر True باشد، نیازی به مقداردهی متغیرهای بعدی نیست و برای ارتباط از آدرس فایل WSDL که در بدنه تابع در Unit ساخته شده تعریف شده است، استفاده خواهد شد
( در بالا ذکر شده بود که برای اتصال به وب سرویس هم می توانستیم از WSDL استفاده کنیم و هم از متد های HTTP )

پس از برقراری ارتباط ، می توانیم از تابع SendGroupSMS استفاده نماییم
مقدار برگشتی این تابع که درواقع نتیجه عملیات است، درون متغیر RetValue قرار می گیرد و در ادامه با توجه به مقدار برگشتی با یک پیغام به کاربر اطلاع می دهیم، در صورت عدم موفقیت در ارتباط با سرور نیست به کاربری پیغامی در همین مورد نمایش خواهیم داد که در قسمت Exception مشخص شده است

عموما بسته به سرعت و وضعیت اینترنت و حجم اطلاعات، ممکن است مراحل اتصال به سرور و اجرای دستورات چند ثانیه ای طول بکشد، بنابراین بهتر است این عملیات درون یک Thread انجام شود تا برنامه به اصلاح هنگ نکند

این یک مثال ساده برای ارتباط با وب سرویس و اجرای دستور ارسال پیامک بود، برای سایر کلاسها و توابع به همین صورت باید عمل کنید و تفاوت خاصی وجود ندارد

* دوستانی که از دلفی 7 استفاده می کنند، برای وارد کردن فایل WSDL باید از مسیر زیر استفاده نمایند :

 File --> New --> Other --> WebServices --> WSDL Importer
 
در اینجا به صورت کلی مراحل استفاده از پنل را بررسی نمودیم، برای آشنایی بیشتر با امکانات پنل و توابع و جزئیات هر کلاس، پس از ثبت نام در پنل پارس گرین، می توانید در قسمت "ابزارهای وب"، فایل راهنمای وب سرویس را دریافت و مطالعه نمایید

در این مقاله پنل پیامک شرکت پارس گرین بررسی شد، مراحل کار برای استفاده از سایر پنل هایی که از وب سرویس SOAP استفاده می کنند نیز به همین صورت است، درواقع هر وب سرویس SOAP با هر امکانات و کلاسها و توابعی به این صورت در دسترس خواهد بود

امیدوارم مفید بوده باشه

موفق باشید ...

 

 :: لینك ثابت نویسنده : محمود مهری نظرات Comment

 : " E-Book :: راه اندازی موتورهای DC و پله ای با استفاده از میکرو کنترلر AVR " :
  سلام
فکر کنم چند ماهی بود که پست جدیدی نزاشته بودم ! ، کم کم وبلاگ داشت خاک می گرفت
دنبال بهانه ای برای پس گذاشتن می گشتم ! که یک مقاله ی خوب توی آرشیو پیدا کردم ...
توی این مقاله نحوه ی ارتباط موتورهای DC و پله ای با میکروهای AVR توضیح داده شده ، توضیحاتش هم به نظر کامل و مناسبه
متاسفانه اینترنت پر شده از مقاله های بی ارزش که واقعا خوندنش هیچی به آدم اضافه نمی کنه ! ولی این مقاله به نظرم خوب و باارزشه


لینک دانلود : راه اندازی موتورهای DC و پله ای توسط میکروهای AVR
نویسنده : حمید بادامی نجات

امیدوارم مفید باشه ، موفق باشید ...

 

 :: لینك ثابت نویسنده : محمود مهری نظرات Comment

 : " آشنایی با عملگرهای بیتی ( Bitwise Operators ) " :
  سلام ...

در برنامه نویسی و الکترونیک ( مخصوصا در هنگام کار با میکرو کنترلر ها ) همواره با اعداد مبنای 2 ( Binary ) و مبنای 16 ( Hexadecimal ) سر و کار داریم ، تسلط روی این اعداد و شناخت عملگرهایی که روی این اعداد تاثیرگذار هستن یکی از ملزمات محسوب میشه !

توی این پست در مورد عملگرهای بیتی ( Bitwise Operators ) بحث می کنیم و چند مثال در زبانهای C و Delphi رو با هم مرور خواهیم کرد ...

عملگرهای بیتی پر کاربرد 6 تا هستن :
  • AND
  • NOT
  • OR
  • XOR
  • SHL
  • SHR
قبل از ادامه ی کار این نکته رو بگم که هر عدد مبنای دو رو معمولا با 8 رقم به عنوان یک بایت نشون می دیم و هر رقم اون رو یک بیت در نظر می گیریم .

عملگر AND
:

عملگر AND به این صورت عمل میکنه که اگر بیتهای متناظر در دو عدد باینری هر دو مقدار 1 داشتند ، بیت متناظر در عدد باینری حاصل هم مقدار 1 می گیره ، به عنوان مثال ، فرض کنیم ، قصد داریم دو عدد باینری " 10011010 " و " 00110110 " رو با هم AND کنیم ! ، حاصل به صورت زیر خواهد بود :

10011010
00110110
=
00010010

به نحوه ی محاسبه دقت کنید ، بیتهای شماره ی 2 و 5 عدد نهایی مقدار 1 گرفتن ، چون بیتهای متناظر اونها در اعدادی که با هم AND شدن ، هر دو مقدار 1 داشتن ولی سایر بیتها این ویژگی رو نداشتن و بیت نظیرشون در عدد نهایی مقدار صفر گرفت .


عملگر OR :

عملگر OR به این صورت عمل میکنه که اگر یکی از بیتهای متناظر در دو عددی که با هم OR می شن ، مقدار 1 بگیره ، بیت نظیر اونها توی عدد حاصل هم مقدار یک می گیره ، مثال :

10011010
00110110
=
10111110

توجه کنید که اگر 2 بیت نظیر ، هر دو مقدار یک داشتن باز هم شرط برقراره ...


عملگر XOR :

این عملگر درواقع X + OR هست و X به جای عبارت Exclusive به معنای " یکتا " یا " انفرادی " قرار گرفته ، نحوه ی عملش هم دقیقا مثل OR هست با این تفاوت که اگر هر دو بیت متناظر مقدارشون 1 بود در شرط صدق نمی کنه و عدد نهایی در بیت نظیر اونها مقدار صفر می گیره ، مثال :

10011010
00110110
=
10101100

پس : " یا فقط بیت عدد اول یک باشد یا فقط بیت نظیر در عدد دوم یک باشد "


عملگر NOT :

این عملگر صفرهای یک عدد رو به یک و یک های اون رو به صفر تبدیل میکنه ، به عنوان مثال :

NOT 10011010 => 01100101

عملگر SHL :

حروف SHL مخفف عبارت Shift Left هستن ، به معنی انتقال به چپ ، این عملگر ، بیتهای با مقدار یک رو یک رقم به سمت چپ شیفت میده ، به عنوان مثال :

SHL 10011010 => 00110100

توجه کنید که عدد یک آخری حذف و یک صفر از ابتدا به رقمها اضافه شد ، برای درک بهتر تصویر زیر کمکتون می کنه :
-------------------------------------------------

-------------------------------------------------

عملگر SHR :

حروف SHR مخفف عبارت Shift Right هستن و به معنی انتقال به راست ، این عملگر هم مثل SHL عمل میکنه ، با این تفاوت که بیتهای یک رو به سمت راست شبفت میده ، مثال :

SHR 10011010 => 01001101

مانند SHL اگر در سمت راست رقمها عدد یک وجود داشته باشه حذف میشه و از سمت چپ یک صفر اضافه میشه ، برای درک بهتر تصویر زیر کمکتون می کنه ! :
-------------------------------------------------

-------------------------------------------------

خوب ، تا اینجا با عملگرها آشنا شدیم ، به چند نکته دقت کنید :

در زبان C ، که اغلب در الکترونیک و کار با میکروکنترلرها استفاده میشه ، این عملگرها هر کدوم نماد مشخصی دارن که در جدول زیر مشاهده میکنید ، :

عملگر
نماد
 AND&
OR
|
 XOR^
 NOT~
 SHL<<
 SHR>>

پس ، برای استفاده از این عملگرها در زبان C ، باید از نماد معادل اونها استفاده کنید ، این نکته رو هم در نظر بگیرید که اعداد مبنای دو در زبان C با عبارت " 0b " در ابتداشون مشخص می شن ، اعداد مبنای 16 هم با عبارت " 0x " ، عملگرهایی که معرفی شدن ، هم برای مبنای 2 و هم برای مبنای 16 کاربرد دارن ، اگر از این عملگرها برای اعداد مبنای 16 استفاده کنید ، برنامه ابتدا اونها رو به مبنای دو تغییر میده و بعد از تاثیر دادن عملگر بر روی بیتهای عدد مبنای دو اون رو به صورت یک عدد مبنای 16 در میاره .

چند مثال :

A = 0b10011010;
B = 0b00110110;

A & B = 0b00010010

A = ~ B ;
A = 0b11001001;

A = B >> 2;  : یعنی 2 بیت به سمت راست شیفت شود
A = 0b00001101;
...

در زبان دلفی ( یا پاسکال ) از خود عبارت ها به جای نماد اونها استفاده کنید ، نحوه ی استفاده تفاوتی نداره ، توجه کنید که در زبان دلفی نمی تونید مستقیما عدد باینری بنویسید ! ، بلکه باید اعداد رو به صورت مبنای 16 ( Hexadecimal ) بنویسید ، اعداد هگزادسیمال در دلفی با کارکتر " $ " در ابتداشون مشخص می شن.

انشاالله در یک پست جدا در مورد مبناهای عددی و نحوه ی محاسبه ی اونها بحث خواهیم کرد ...
امیدوارم مفید بوده باشه ، موفق باشید ...

 

 :: لینك ثابت نویسنده : محمود مهری نظرات Comment

 : " تست دیود و ترانزیستور با مولتی متر " :
 سلامی دوباره ... !
در این پست می خوایم در مورد نحوه ی تست سالم بودن دیود و تست پایه های ترانزیستور بحث کنیم ...

تست دیود

همون طور که می دونید دیودها یک ویژگی خاص دارند ، و اون هم این هست که از یک جهت جریان رو عبور میدن ( مقاومت صفر ) و از جهت عکسش جریان رو عبور نمیدن ( مقاومت بی نهایت ) ، برای تست سالم بودن یک دیود با استفاده از مولتی متر ، ابتدا مولتی متر رو در حالت تست دیود قرا می دیم ، مانند شکل زیر :
---------------------------------------------
---------------------------------------------
بعد از تنظیم مولتی متر ، پرابهای مولتی متر رو به دو سر دیود متصل می کنیم ، بعد از یک بار اتصال پرابها ، جای اونها رو عوض میکنیم ، در هر دو بار اتصال به صفحه ی مولتی متر دقت کنید ، اگر فقط یک بار از دو بار اتصالی که انجام دادید ، روی صفحه ی مولتی متر عددی نمایش داده شد ، پس دیود سالم هست ولی اگر هر دو بار عدد نمایش داده شد و یا هر دو بار عددی نمایش داده نشد ، دیود سالم نیست و ممکنه از هر دو جهت جریان رو عبور بده و یا از هیچ جهتی عبور نده !

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

توجه کنید که تست دیودهای مختلف کمی با هم متفاوته ! ، اینجا فقط در مورد دیودهای معمولی که زیاد استفاده می شن توضیح داده شد ، برای اطلاعات بیشتر می تونید به این صفحه مراجعه کنید ...


شناسایی پایه های ترانزیستور

برای شناسایی پایه های ترانزیستور ، مانند تست دیود ، مولتی متر رو در همون حالت تست دیود قرار می دیم ، بعد از این کار ، پایه های ترانزیستور رو دو به دو با پرابها تست می کنیم ، در هنگام اتصال پرابها اگر پایه ها به هم ارتباط داشته باشن ، به عنوان دیود شناخته می شن و عددی روی صفحه نمایش مولتی متر نمایش داده میشه ، پایه ای که به هر دو پایه ی دیگه ارتباط داره ، پایه ی Base هست .
اگر پایه ی Base با پراب قرمز ( مثبت ) مولتی متر مشخص شد ( یعنی اگه پراب قرمز به Base متصل بود و با پراب مشکی به پایه های دیگه وصل کردید و عدد نمایش داده شد ) در این صورت ترنزیستور شما از نوع مثبت یا PNP هستش ولی اگه پایه ی Base با پراب مشکی مشخص شد ، ترانزیستور شما از نوع منفی یا NPN هست .
برای تشخیص پایه های Collector و Emitter ، بعد از تشخیص پایه ی Base ، اون رو با پرابهای مولتی متر به پا یه های دیگه متصل کنید و در هنگام اتصال عدد روی صفحه نمایش رو ببینید ، هر پایه ای که در اتصال با Base عدد کمتری رو نشون میده ، پایه ی Collector هست و پایه دیگه هم Emitter خواهد بود !

امیدوارم مفید بوده باشه ، موفق باشید ...

 

 :: لینك ثابت نویسنده : محمود مهری نظرات Comment

 : " دلفی :: ارسال آرایه به حافظه ی Clipboard " :
 

سلام ، بعد از مدتی که در فاز برق بودیم ! ، کمی برمی گردیم به فاز دلفی !

در این پست قصد داریم یک آرایه ی Static را به حافظه ی Clipboard ارسال نماییم ! و سپس مقدار آن را از حافظه ی Clipboard خوانده و نمایش دهیم . ( چرا آخه ؟!    )

قبل از هرچیز برای استفاده از توابع و دستورات کار با حافظه ی Clipboard باید یونیت Clipbrd را به قسمت Uses اضافه نمایید ، برای شروع کار ابتدا یک آرایه به عنوان یک Type تعریف کنید :

type
 TMyArray = array[0..9] of Integer;

دستور بالا را در قسمت Interface و بعد از قسمت Uses بنویسید.

در این برنامه ما قصد داریم که مقدار آرایه را از Clipboard بخوانیم ، پس باید یک نوع Format خاص برای آرایه ی خود به عنوان Format ای از حافظه ی Clipboard ثبت کنیم تا بتوانیم بررسی کنیم که آیا مقدار موجود در حافظه ی Clipboard از نوع آرایه ی مورد نظر ما هست یا خیر ، بدین منظور باید از تابع RegisterClipboardFormat استفاده نماییم ، این تابع یک نام به عنوان نام Format دریافت کرده و بعد از قبت Format جدید یک مقدار عددی به عنوان شناسه ی Format ثبت شده بر می گرداند ، قبل از ثبت آرایه ما به یک متغیر نیاز داریم که مقدار عددی مربوط به شناسه ی Format ثبت شده را در آن قرار دهیم ، پس یک متغیر به نام MyArrayFormat از نوع Cardinal به صورت Global ( در قسمت Var  مربوط به Unit ) تعریف میکنیم ، علاوه بر این متغیر، ما به یک متغیر Cardinal دیگر به عنوان Handle اطلاعات مورد نظر ( که همان آرایه هست ) و همچنین یک متغیر Pointer که اشاره گری به نوع داده ای آرایه ی ما باشد ( یعنی TMyArray ) نیز ، نیاز مندیم ، پس متغیر های زیر را در به صورت Global تعریف می کنیم :

var
 MainFrm: TMainFrm;
 MyArray : TMyArray;
 AHandle, MyArrayFormat : Cardinal;
 APointer : ^TMyArray;

implementation

...

  • MyArray : یک نمونه از آرایه ی مورد نظر ما
  • AHandle : به عنوان Handle اطلاعات که باید به Clipboard ارسال شود
  • MyArrayFormat : نگهدارنده ی شناسه ی Format آرایه
  • APointer : اشاره گری به نوع داده ای TMyArray که همان آرایه ی مورد نظر ما است

روش کار به این صورت است که ابتدا یک نمونه از آرایه خود را مقدار دهی میکنیم ، سپس یک Format برای آرایه خود ثبت می کنیم ، در ادامه باید فضایی از حافظه به اندازه ی آرایه ی خود را رزرو نموده و سپس مقدار آرایه را دروئ فضای رزرو شده قرار دهیم و در نهایت فضای در نظر گرفته شده را به همراه Format مشخص شده برای حافظه ی Clipboard به آن بفرستیم.

یک دکمه برای ارسال آرایه به Clipboard ، یک دکمه برای دریافت مقدار آرایه از Clipboard و یک Edit بر روی فرم قرار دهید و در رویداد OnClick دکمه ی مربوط به ارسال آرایه دستورات زیر را بنویسید :

procedure TMainFrm.SendBtnClick(Sender: TObject);
var
 I: Integer;
begin
 for I := 0 to 9 do
  MyArray[I] := I;

 MyArrayFormat := RegisterClipboardFormat('CF_MYARRAY');

 if not OpenClipboard(Handle) then
  begin
   ShowMessage('Unable to open the Clipboard !');
   Exit;
  end;

 EmptyClipboard;

 AHandle := GlobalAlloc(GMEM_DDESHARE or GMEM_MOVEABLE, SizeOf(TMyArray));
 APointer := GlobalLock(AHandle);
 APointer^ := MyArray;
 GlobalUnlock(AHandle);

 SetClipboardData(MyArrayFormat, AHandle);

 CloseClipboard;

 for I := 0 to 9 do
  MyArray[I] := 0;

 ValueEdit.Text := IntToStr(MyArray[2]);
end;

همانطور که توضیح داده شد ، ابتدا آرایه را مقدار دهی می کنیم ، سپس یک Format ثبت کرده و شناسه ی آن را درون MyArrayFormat قرار میدهیم ، سپس باید Clipboard با اصطلاحا باز کنیم ، در هنگام باز کردن Clipboard بررسی میکنیم که اگر موفقیت آمیز نبود از دستورات خارج می شویم ، برای ثبت مقدار جدید در Clipboard باید ابتدا آن را خالی کنیم که با دستور EmptyClipboard این کار انجام می شود ، در مرحله ی بعد AHandle را برابر فضایی از حافظه قرار می دهیم که توسط تابع GlobalAlloc رزرو می شود و اندازه ای برابر با اندازه نوع داده ای TMyArray دارد ، در ادامه حافظه ی رزرو شده را به نوعی قفل میکنیم تا شیء یا برنامه ی دیگری از آن استفاده نکند و تداخل ایجاد نشود ، سپس مقدار آرایه را درون اشاره گری که به فضای رزرو شده اشاره میکند قرار می دهیم و در نهایت به وسیله ی تابع SetClipboardData مقدار آرایه که در فضای AHandle قرار دارد را به همراه شناسه ی Format آرایه در Clipboard قرار می دهیم ، در پایان کار با Clipboard هم باید آن را ببندیم که به وسیله ی دستور CloseClipboard این کار انجام خواهد شد.

چون می خواهیم یک دور مقدار آرایه را از clipboard بخوانیم ، در پایان کار مقدار عناصر آرایه را برابر صفر قرار می دهیم تا بعد از خواندن مقدار و قرار دادن آن در آرایه تفاوت مشخص شود ! ، در پایان دستورات هم مقدار Text مربوط به Edit روی فرم را برابر با مقدار عنصر شماره ی 2 آرایه قرار می دهیم.

حال نوبت به خواندن اطلاعات می رسد ، در رویداد OnClick مربوط به دکمه ی دریافت کننده ! ، به صورت زیر دستورات را بنویسید :

procedure TMainFrm.ReceiveBtnClick(Sender: TObject);
begin
 if not Clipboard.HasFormat(MyArrayFormat) then
  begin
   ShowMessage('Data in ClipBoard have no "MyArrayFormat" Format');
   Exit;
  end;
 if not OpenClipboard(Handle) then
  begin
   ShowMessage('Unable to open the Clipboard !');
   Exit;
  end;

 AHandle := GetClipboardData(MyArrayFormat);
 APointer := GlobalLock(AHandle);
 MyArray := APointer^;
 GlobalUnlock(AHandle);

 CloseClipboard;

 ValueEdit.Text := IntToStr(MyArray[2]);
end;

در ابتدای دستورات ، نوع Format اطلاعات درون Clipboard را بررسی میکنیم ، اگر نوع مورد نظر ما نبود از دستورات خارج می شویم ، در ادامه Clipboard را Open میکنیم ، بعد از باز کردن Clipboard ، به وسیله ی تابع GetClipboardData مقدار درون Clipboard که Format آن مطابق با MyArrayFormat است را درون AHandle قرار می دهیم ، سپس فضای اختصاص داده شده به AHandle را قفل کرده و اشاره گری که تعریف کرده بودیم را برابر با آدرس فضای آن قرار می رهیم ، در ادامه مقدار آرایه را برابر با اطلاعات درون فضای اشاره گر قرار داده و در نهایت فضای قفل شده AHandle را آزاد میکنیم ، در پایان کار با Clipboard هم آن را Close میکنیم ، در پایان کار مقدار عنصر شماره ی 2 آرایه را درون Edit روی فرم نمایش میدهیم ، همانطور که مشاهده میکنید آرایه دوباره مقدار دهی شده است .

برنامه نمونه ی این پست رو هم از لینک زیر می تونید دریافت کنید :

موفق باشید ...

 

 :: لینك ثابت نویسنده : محمود مهری نظرات Comment

 : " یک سایت فوق العاده برای علاقه مندان به علم فیزیک " :
 سلام

اگر به فیزیک یا شاخه ای از اون علاقه مندید ، این سایت خیلی می تونه براتون مفید باشه ، حتما امتحان کنید ...
البته ظاهر جالبی نداره ! ولی مطالب و روش آموزشش واقعا عالیه ...

موفق باشید ...
 

 :: لینك ثابت نویسنده : محمود مهری نظرات Comment

 : " مداری برای نمایش عبور جریان برق از بدن !! " :
  سلام ...
سال جدید رو با یک پست جالب شروع میکنیم ...

در این پست قصد داریم یک مدار جالب رو با هم ببندیم ، قطعات مورد نیاز برای بستن مدار :
  • یک عدد LED
  • یک عدد مقاومت 220 اهم
  • یک عدد ترانزیستور NPN BC 547
  • منبع تغذیه 6 ولت
شماتیک مدار رو در تصویر زیر مشاهده می کنید :
----------------------------------------------------

----------------------------------------------------
دقت کنید که مقاومت به پایه ی Collector ترانزیستور متصل شده و پایه ی خروجی هم Emitter هست که با فلش مشخصه .
به دو قسمتی که با عبارت " Touch here " مشخص شده دقت کنید ، اگر این دو قسمت رو با انگشتانتون لمس کنید ، روشنایی LED افزایش پیدا میکنه ، اگر فشار انگشتانتون رو بیشتر کنید ، نور LED هم افزایش پیدا میکنه !!
بدن انسان دارای مقاومت الکتریکیه ! ، وقتی اختلاف پتانسیلی بین دو قسمت از بدن وصل بشه ، جریانی از راه بدن بین دو قطب برقرار میشه ، عبود جریان از بدن ، جریان رو به پایه Base ترانزیستور میرسونه و باعث افزایش جریان توسط ترانزیستور میشه و این افزایش جریان باعث افزایش نور LED خواهد شد ...

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

البته این موضوع جدیدی نیست ! ، دلیل برقگرفتگی هم همینه ، وقتی ولتاژ زیادی بین دو قسمت از بدن برقرار میشه ، بسته به میزان مقاومت ، جریانی از بدن عبور میکنه که اگر زیاد باشه در مواقعی منجر به مرگ هم میشه ، توجه کنید که این آزمایش رو با ولتاژ پایین انجام بدید تا به بدنتون آسیبی نرسه !!

یک تصویر از مدار نهایی :
----------------------------------------------------

----------------------------------------------------

امیدوارم مفید بوده باشه ، موفق باشید ...
 

 :: لینك ثابت نویسنده : محمود مهری نظرات Comment

 : " سال نو مبارک ... " :
 
سال نو رو به همه ی دوستان عزیز تبریک میگم




امیدوارم سال خوبی داشته باشید و به آرزوهاتون نزدیک تر بشید ... !

موفق باشید ...

 

 :: لینك ثابت نویسنده : محمود مهری نظرات Comment

 : " آدرس وبلاگ ! " :
 سلام ...
آدرس www.DelphiPlus.com دوباره فعال شد ، دوستانی که وبلاگ رو بوکمارک کردن از این آدرس استفاده کنن .
اگر مشکلی با آدرس فوق داشتید لطفا در بخش نظرات اعلام کنید ( ممنون ! )

موفق باشید ...
 

 :: لینك ثابت نویسنده : محمود مهری نظرات Comment

مطالب اخیر

استفاده از Component Template ها در دلفی
مقاله : نحوه ی استفاده از پنل پیامک در نرم افزار
E-Book :: راه اندازی موتورهای DC و پله ای با استفاده از میکرو کنترلر AVR
آشنایی با عملگرهای بیتی ( Bitwise Operators )
تست دیود و ترانزیستور با مولتی متر
دلفی :: ارسال آرایه به حافظه ی Clipboard
یک سایت فوق العاده برای علاقه مندان به علم فیزیک
مداری برای نمایش عبور جریان برق از بدن !!
سال نو مبارک ...
آدرس وبلاگ !
ساخت یک LED فلاشر با میکروکنترلر AVR ATMega16A
آشنایی با کاربرد " رله " ( Relay ) در مدار
کار با ماتریسها در Matlab
SQL :: آشنایی با دستور شرطی WHERE
معرفی برخی از توابع ریاضی نرم افزار Matlab


صفحات وبلاگ :  1  2  3  4  5  6  7  ...