تارا فایل

پروژه طراحی سیستم ثبت دما با قابلیت کنترل از راه دور


پروژه طراحی سیستم ثبت دما با قابلیت کنترل از راه دور

فهرست
توضیحات کلی پروژه 4
قسمت نرم افزاری 4
چگونگی کار با نرم افزار 4
منوی File 5
منوی Setting 5
منوی Help 5
قسمت Set Alarm 5
قسمت History 6
قسمت Internet Setting: 6
کدهای برنامه نرم افزاری 6
توضیحات در مورد کدهای برنامه نرم افزار 7
متغیر OpenedCom: 7
مرجع mySerialPort: 7
متغیر comBuffer: 8
UpdateFormDelegate(): 8
متغیر n 8
متغیر COMP 8
متغیر Alln: 8
متغیر DT: 9
توضیحاتی در مورد BaudRate: 10
قسمت Load Form اصلی 10
توابع mySerialPort_DataReceived و UpdateDisplay: 11
تایمر T1 12
کدهای نوشته شده در فرم Temperature Values: 13
کدهای نوشته شده در فرم مربوط به اتصال اینترنت 13
کدهای موجود در قسمت فرم History: 14
کدهای موجود در قسمت Set Alarm: 14
ماژول ControlCenter: 15
کلاس Sound: 15
قسمت سخت افزاری 16
ارتباط با LCD: 17
قطعه COMPIM در پروتوس 17
میکروکنترلر 16 ATmega: 18
نحوه ی انتقال برنامه به میکروکنترلر در شبیه ساز پروتوس 18
قسمت CKSEL Fuses در پروتوس 19
نحوه اتصال LCD به میکرو 19
سنسور آنالوگ LM35 19
توضیح درمورد کدهای نوشته شده برای میکروکنترلر ATmega16 20
نکته ای مهم در مورد شبیه سازی 26

توضیحات کلی پروژه:
این پروژه دارای دو قسمت نرم افزاری و سخت افزاری است که به شرح ذیل می باشد:
هدف از انجام این پروژه ایجاد یک سیستم راحت برای ثبت دما می باشد که در بسیاری از مکانهای تولیدی نظیر کارخانه های مواد غذایی، سالنهای پرورش طیور، سالهای پرورش قارچ و … قابل استفاده می باشد. این سیستم کنترل دما ساعات و تاریخهای مشخص شده را ذخیره میکند تا اینکه تولید کننده به راحتی بتواند در مورد دمای محیط خود راحت تر تصمیم بگیرد.
قسمت سخت افزاری این پروژه از طریق پورت سریال و RS232 با کامپیوتر ارتباط بر قرار میکند و داده های رسیده از میکروکنترلر به نرم افزار ارسال میگردد و در سیستم ذخیره می شود. همچنین ارتباط به صورت USART یا همزمان که مخفف Universal Synchronous/Asynchronous Receive Transmitter می باشد انجام می شود.
قسمت نرم افزاری:
توضیحات لازمه و کدهای نوشته شده در قسمت نرم افزاری به شرح ذیل می باشد:
نرم افزار تهیه شده به زبان VB.NET در ویژوال استودیو 2008 نوشته شده است. قسمت ارتباط با پورت سریال نرم افزار در چهارچوب NET. نوشته شده است و قسمت مربوط به مدیریت از راه دور بر اساس توابع API (Library) می باشد.
چگونگی کار با نرم افزار:
نرم افزار دارای قسمتهای مختلفی می باشد که به این شرح است:

در این نرم افزار قسمتی به نام Available Com Ports وجود دارد، که پورتهای قابل دسترس در سیستم را جستجو میکند و در لیست کشوئی اضافه میکند.
در قسمت دیگر، فرمانی برای ارتباط با پورت انتخاب شده از لیست کشوئی وجود دارد که با کلیک بر روی فرمان Connect به پورت مورد نظر متصل میگردد. لازم به ذکر است که در صورت وجود سخت افزار و ارتباط با پورت انتخاب شده، نرم افزار کاراکتری را برای تشخیص سخت افزار ارسال می کند، در صورت پاسخ دادن صحیح فرمان Connect به فرمان Disconnect تبدیل میشود و نرم افزار به سخت افزار متصل میگردد و بعد از آن به روش Polling هر چند ثانیه یک بار دما را از میکروکنترلر دریافت میکند.(در ادامه جزئیات مربوط به اتصال بیان خواهد شد.)
فرمان Set Alarm که برای هشدار دادن مورد استفاده قرار میگیرد. در صورتی که دمای محیط از حد انتخاب شده در قسمت Set Alarm بیشتر باشد، نرم افزار به صورت مداوم هشدار خواهد داد.
فرمان History برای مشاهده تمامی دماهای ثبت شده بر اساس تاریخ و ساعت معین به کار برده خواهد شد.
فرمان Clear برای پاک کردن دماهای نمایش داده شده در قسمت متنی نرم افزار به کار برده خواهد شد.
این نرم افزار دارای منوهایی می باشد که تمامی کارهای بالا را می توان انجام داد.
منوی File:
در این منو گزینه ای به نام Exit وجود دارد که از نرم افزار خارج می شود.

منوی Setting:
در این منو، تمامی فرمانهایی که در بالا توضیح داده شد قرار دارد.
این منو دارای زیر منوی های Clear the screen ،History ، Internet Setting ، Set Alarm می باشد که تمامی عملیاتهای ذکر شده در بالا را انجام خواهند داد.

منوی Help:
این منو دارای دو زیر گزینه می باشد که گزینه های Help و About می باشد.

قسمت Set Alarm:
در این قسمت اگر گزینه Set Alarm انتخاب شود، سیستم با آخرین مقدار دریافتی از سخت افزار دما را مقایسه می کند. در صورتی که دمای محیط از مقدار انتخابی بیشتر باشد، نرم افزار هشدار می دهد.

قسمت History:
در این قسمت تمامی دماهای ثبت شده در سیستم نرم افزار ذخیره می گردد که بعدا قابل مشاهده می باشد.

نرم افزار تمامی فایلهای ذخیره شده را بر اساس تاریخ و روز ثبت می کند که در لیست بالا قابل مشاهده است.
قسمت Internet Setting:
در این قسمت اگر کاربر مایل باشد که اطلاعات ثبت شده را در فضای اینترنت انتقال دهد تا بتواند در مکانهای دیگر هم
از دمای محیط مطلع گردد در این قسمت می بایستی تنظیماتی انجام دهد.
برای انتقال دماهای ثبت شده می توان از FTP سیستم یا از FTP دلخواه یا مخصوص خود استفاده کرد.
در صورت تمایل برای انتقال دماهای ثبت شده گزینه Transfer the history of temperature را انتخاب میکنیم تا بعد از آن فایلهای ثبت شده به فضای اینترنتی انتقال یابند. اگر تمایل دارید که از فضای مخصوص خود استفاده نمائید گزینه Use your FTP account را انتخاب نمائید. بعد از انتخاب این گزینه، می بایستی ،Username ،Serve وPassword را در فیلدهای مخصوص خود وارد کرد و بعد از آن OK را بفشاریم.
در صورتی که تمایل دارید که از فضای خود سیستم استفاده کنید، گزینه Use System FTP را انتخاب نمائید.

کدهای برنامه نرم افزاری:
همانطور که گفته شد این نرم افزار از دو قسمت .NET و توابع API نوشته شده است، که قسمت ارتباط با پورت سریال در چهارچوب .NET و قسمت ارتباط با فضای اینترنتی از API library ساخته شده است.
توضیحات در مورد کدهای برنامه نرم افزار:
کدهای فرم اصلی:
Imports System
Imports System.IO.Ports
Imports System.Text
Imports System.IO

در بالا از کلاسهای Text ،ports و IO استفاده شده است که هر کدام کار خاصی را انجام میدهند.
Ports: برای ایجاد یک reference برای ارتباط با پورت سریال ایجاد شده است.
Text: برای کار با فایلها ایجاد شده است.
:IO این کلاس برای کار با سیستم فایل (ساخت فایل، ساخت فولدر و…) ساخته شده است.

Private OpenedCom As Boolean
Private mySerialPort As New IO.Ports.SerialPort
Private comBuffer As Byte()
Private Delegate Sub UpdateFormDelegate()
Private UpdateFormDelegate1 As UpdateFormDelegate
Private n As String
Private COMP As Integer = 0
Dim AllN As String
Dim DT As DateTime = DateTime.Now
در بالا تعدادی متغیر می بینیم که در برنامه استفاده خواهند شد.
متغیر OpenedCom:
متغیر OpenedCom که از نوع Boolean می باشد برای این منظور استفاده شده است که زمانی به پورت سریال متصل شدیم این متغیر مقدار True را میگیرد.
مرجع mySerialPort:
mySerialPort که یک reference از شی Ports.SerialPort می باشد که برای ایجاد یک درگاه با پورت کام ایجاد شده است. تمامی عملیاتهای مربوط به پورت سریال با این رفرنس انجام میشد. لازم به ذکر است که تنها این رفرنس در برنامه برای ارتباط با پورت سریال ایجاد شده است. اگر توجه شود این رفرنس در خارج از رویدادهای هر کنترل ایجاد شده است، چرا که این رفرنس در بسیاری از رویدادها مورد استفاده قرار میگیرد. به عبارت دیگر این رفرنس در کلاس فرم اصلی ایجاد شده است که به صورت Public در همه جا قابل دسترس باشد.
متغیر comBuffer:
متغیر comBuffer برای ایجاد یک بافر از بایتهای رسیده از پورت سریال ایجاد شده است که طول رشته ی ارسالی را دریافت میکند و در خود نگهداری میکند، که بعدا برای دریافت داده مورد استفاده قرار میگیرد. گفتنی است که این بافر در برنامه استفاده نشده است، در ابتدا اینجانب تمایل داشتم که داده ها را به صورت بایت دریافت کنم که می بایستی از کد mySerialPorts.Read(comBuffer,0,byte{}) استفاده میکردم که به جای آن ازکد mySerialPorts.ReadChar() استفاده شده است که می توان دادها را به صورت کدهای ASCII دریافت نمود و با تابع Chr() به حروف تبدیل کرد که در ادامه مفصل تر توضیح داده شده است.
UpdateFormDelegate():
UpdateFormDelegate یک تابع از نوع Delegate می باشد که بتوان از همین نوع متغیرهایی را ایجاد کرد. اگر در کد بالا مشاهده شود می توان دید که یک متغیر از نوع UpdateFormDelegate ایجاد شده است. کار این متغیر این هنگامی که در یک کد می بایستی منتظر ماند، این تابع مانع می شود که فرم ظاهر شده دوباره قابل مشاهده باشد. به عبارت
دیگر اگر ما یک کاراکتر را به پورت سریال ارسال کنیم نرم افزار منتظر دریافت داده از پورت می ماند که ممکن است این کار
برای مدتی طول بکشد که این تابع از هنگ شدن فرم جلوگیری میکند.
متغیر n:
متغیر n برای دریافت کاراکتر به کاراکتر دادهای رسیده از پورت سریال می باشد که به صورت ASCII دریافت میکند و در خود نگه میدارد. مثلا اگر ما از طرف میکروکنترلر کاراکتر A را ارسال کنیم متغیر n مقدار اسکی 65 را دریافت میکند و در خود نگهداری میکند.
متغیر COMP:
متغیر COMP برای شمارش کاراکترهای رسیده از پورت سریال مورد استفاده قرار میگیرد، در کل ما از طرف میکرو سه کاراکتر 000 به کامپیوتر به صورت جداگانه ارسال میکنیم. که در هر بار دریافت یک مقدار به متغیر COMP اضافه میگردد تا زمانی که مقدار این متغیر به 2 برسد COMP) از 0 شمارش را آغاز میکند). هنگامی که مقدار COMP به 2 رسید، دوباره مقدار متغیر به صفر میرسد تا در مرحله بعد بتواند سه کاراکتر بعدی را شمارش کند.
متغیر Alln:
متغیر Alln برای اضافه کردن هر یک از کاراکترها مورد استفاده قرار میگیرد. مثلا اگر از پورت سریال یک کاراکتر دریافت شود آن کاراکتر در متغیر n ذخیره میگردد و بعد به متغیر Alln انتقال داده میشود و اگر دوباره کاراکتری اضافه شود دوباره به Alln اضافه میگردد و در نهایت نمایش داده میشود.
متغیر DT:
متغیر DT برای دریافت تاریخ و ساعت جاری سیستم مورد استفاده قرار میگیرد، که بعد ار دریافت کاراکترهای مورد استفاده در سیستم دما را همراه با تاریخ و ساعت جاری سیستم ذخیره میکند.
کدهای مربوط به ارتباط با پورت سریال:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If LCase(Button1.Text) = LCase("Disconnect") Then
Try
If OpenedCom = True Then mySerialPort.Close()
Button1.Text = "Connect"
Status.Text = "Status: The System has been disconnected.!"
Exit Sub
Catch ex As Exception
MessageBox.Show(ex.Message, "Select Connected port", MessageBoxButtons.OK, MessageBoxIcon.Information,
MessageBoxDefaultButton.Button1)
Exit Sub
End Try
End If
If ComboBox1.Text <> "" Then
Try
1. mySerialPort.PortName = ComboBox1.Text
2. mySerialPort.BaudRate = 9600
3. mySerialPort.DataBits = 8
4. mySerialPort.Parity = Parity.None
5. mySerialPort.StopBits = StopBits.One
6. mySerialPort.Handshake = Handshake.None
7. mySerialPort.Open()
Button1.Text = "Wait…"
Status.Text = "Status: Trying to connect…"
Button1.Enabled = False
Timer1.Enabled = True
ComboBox1.Enabled = False
Label1.Enabled = False
8. mySerialPort.WriteLine("R")
Catch ex As Exception
MessageBox.Show(ex.Message, "Select Connected port", MessageBoxButtons.OK, MessageBoxIcon.Warning,
MessageBoxDefaultButton.Button1)
End Try
Else
MessageBox.Show("Please select connected port to the hardware", "Select Connected port", MessageBoxButtons.OK,
MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1)
End If
End Sub

در کد بالا خطهای شماره گذاری شده مهمترین خطوط برنامه می باشد که شرح داده خواهند شد.
خط1: در این خط نام پورتی که قصد داریم به آن متصل شویم را استفاده میکنیم که می تواند COM1 تا COM7 باشد. بعد از انتخاب پورت سریال باید مقدار مورد نظر را به متد PortName از رفرنس MySerialPort بدهیم تا پورت انتخاب گردد.
خط2: همانطور که میدانیم برای ارتباط با یک سخت افزار از طریق پورت سریال بایستی نرخ ارسال، بیتهای داده، توازن، بیتهای پایان ، ارتباط در دو طرف (در کامپیوتر و سخت افزار موجود) یکسان باشد و مشخص گردد. بنده برای ارتباط سخت افزار با کامپیوتر مقادیر داده شده را ایجاد کرده ام:

1. :BaudRate نرخ ارسال 9600 انتخاب شده است
2. :DataBits بیتهای داده 8 بیتی انتخاب شده است
3. :Parity توازن مقدار صفر داده شده است
4. :StopBits بیتهای پایان مقدار یک گرفته است
5. :Handshake مقدار صفر داده شده است
توضیحاتی در مورد BaudRate:
در ارتباطات سریال باید سرعت ارسال دادها تعیین گردد.
مثلا اگر ما در میکرو یک ارتباط (Universal Synchronous/Asynchronous Receive Transmitter) USART یا همزمان و UART (Universal Asynchronous Receive Transmitter) یا غیرهمزمان ایجاد کنیم در هر دو طرف بایستی گزینه هایی که دربالا گفته شد به طور مشابه ایجاد شود که ارتباط صحیح انجام گیرد.
خط3: در این قسمت بیتهای داده، به صورت 8 بیتی انتخاب شده است.
خط4: برای این ارتباط بیت توازنی در نظر گرفته نشده است، برای همین منظور مقدار None به این متد داده شده است.
خط5: در این خط بیت پایان مقدار یک داده شده است.
خط6: در این خط متد Handshake مقدار None گرفته است.
خط7: بعد از انتخاب تمامی گزینه ای ذکر شده در بالا می بایستی ما با متد Open به پورت متصل شویم.
خط8: با متد WriteLine می توان کاراکتری را به پورت ارسال کرد و همچنین با متد ReadLine یا Read یا ReadChar کاراکتری را دریافت نمود. در اینجا کاراکتری را به میکروارسال میکند، اگر سخت افزار همان کاراکتر را به سیستم ارسال کرد، نرم افزار پیغامی را مبنی بر ارتباط صحیح به کاربر نشان میدهد.
قسمت Load Form اصلی:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
1. Dim strC As String() = mySerialPort.GetPortNames()
If Not Directory.Exists(App_Path() & "Temp") Then
2. Directory.CreateDirectory(App_Path() & "Temp")
End If
3. AddHandler mySerialPort.DataReceived, AddressOf mySerialPort_DataReceived
For i = 0 To strC.Length – 1
4. ComboBox1.Items.Add(strC(i))
Next
End Sub
توضیحات خطوط شماره گزاری شده:
خط1: در این خط آرایه ای از یک متغیر متنی، ایجاد شده است که مقادیر پورتهای موجود بر روی سیستم )پورتهای فعال سیستم که سخت افزاری به آن متصل است) در خود ایجاد میکند. مثلا اگر پورتهای COM2 و COM1 و… فعال باشند در این متغیر ذخیره میگردند. همچنین با دریافت نام پورتها با متد GetPortName() می توان پورتهای فعال را یافت.
خط2:در مسیر برنامه پوشه ای به نام Temp ایجاد میگردد که تمامی فایلهای مربوط به دما در این پوشه ذخیره گردند.
خط3: در این خط یک رویداد که مربوط به تابع Delegate می باشد با استفاده از AddHandler ایجاد میگردد که بتوان دادهای رسیده از پورت را در این رویداد دریافت کرد. برای این کار ما متد DataReceived به mySerialPort_DataReceived هندل کرده ایم که در ادامه این رویداد توضیح داده می شود.
خط4: در این خط حلقه ای از 0 تا طول متغیر strC ایجاد شده است که تمامی داده های ذخیره شده در این متغیر به لیست کشویی گفته شده در بالا اضافه گردد.
توابع mySerialPort_DataReceived و UpdateDisplay:
Private Sub mySerialPort_DataReceived(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs)
1. UpdateFormDelegate1 = New UpdateFormDelegate(AddressOf UpdateDisplay)
2. n = mySerialPort.ReadChar()
3. Me.Invoke(UpdateFormDelegate1) 'Call the delegate
End Sub
Private Sub UpdateDisplay()
Dim FName As String
4. If LCase(Chr(n)) = LCase("R") Then
Status.Text = "Status: The System has been connected correctly."
OpenedCom = True
T1.Enabled = True
Timer1.Enabled = False
Button1.Text = "Disconnect"
Button1.Enabled = True
ComboBox1.Enabled = True
Label1.Enabled = True
n = Nothing
Exit Sub
End If
Dim CurrentDT As String
5. CurrentDT = Now.ToString("yyyy-MM-dd")
6. AllN = AllN & Chr(n)
7. If AllN.Length = 3 Then
8. TextBox1.Text = TextBox1.Text & "- " & "The Current Temprature is: " & AllN & " °C at " & DT.Now & vbCrLf
9. Dim OpenTem As New IO.StreamWriter(App_Path() & "Temp" & CurrentDT, True)
10. OpenTem.Write("- " & "The Current Temprature is: " & AllN & " °C at " & DT.Now & vbCrLf)
CT = CInt(AllN)
OpenTem.Close()
AllN = ""
End If
TextBox1.SelectionStart = TextBox1.Text.Length
TextBox1.ScrollToCaret()
End Sub
خط1: در این خط تابعی به یک رفرنس از نوع Delegate تعریف گردیده است که به تابع UpdateDisplay اشاره می کند.
خط2: در این خط برنامه منتظر دریافت داده از سخت افزار می ماند، بعداز دریافت، کاراکتر موردنظر را به صورت کد اسکی در متغیر n ذخیره می کند.
خط3: در این خط از متدی به نام Invoke استفاده شده است که به تابعی که از نوع Delegate می باشد اشاره میکند. به عبارتی Delegate ایجاد شده را فراخوانی میکند.
خط4: در این خط اولین کاراکتر دریافت شده با کاراکتر R مقایسه میگردد که این کار باعث میشود که نرم افزار به طور صحیح به سخت افزار متصل شده است.
خط5: در این خط فرمت ساعت و تاریخ جاری سیستم را طوری تبدیل کرده ایم که بتوانیم به عنوان نام فایل در سیستم ذخیره کنیم. به طور مثال اگر تاریخ سیستم 23/08/2013 باشد، به 23-08-2013 تبدیل میگردد که بتواند به عنوان نام فایل استفاده گردد، چراکه مجوز استفاده از بعضی از کاراکترها در سیستم فایلِ سیستم عامل ویندوز وجود ندارد.
خط6: در این خط دادها یکی به یکی به متغیر مورد نظر اضافه میشوند.
خط7: در این خط دستور شرطی ای وجود دارد که طول متغیر Alln را چک میکند اگر به 3 رسید دادها را نمایش میدهد، چون قبلا ذکر شد که ما از میکرو سه کاراکتر را می خوانیم (سنسور LM35 دماهای -55 درجه سانتی گراد تا 150 درجه سانتی گراد را می تواند به خروجی ارسال کند.) در اینجا ما نهایت سه کاراکتر را باید به سیستم ارسال نماییم تا عدد مورد نظر خود را دریافت کنیم.
خط8: در این خط تمامی دماهای دریافت شده از میکرو را در یک تکست باکس نمایش می دهیم.
خط9: در اینجا فایلی با نام تاریخ و ساعت جاری سیستم باز میکنیم تا بتوانیم دادهای دریافتی را در فایل ذخیره کنیم.
خط10: در این خط با متد Write داده ها را در فایل ایجاد می کنیم و در نهایت فایل را می بندیم.
تایمر T1:
Private Sub T1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles T1.Tick
On Error Resume Next
1. Dim CurTemp As Integer
2. mySerialPort.WriteLine("G")
If My.Computer.Registry.GetValue("HKEY_CURRENT_USERSoftware", "SetA", Nothing) <> "" Then
3. CurTemp = My.Computer.Registry.GetValue("HKEY_CURRENT_USERSoftware", "SetA", "")
End If
If My.Computer.Registry.GetValue("HKEY_CURRENT_USERSoftware", "SetA", Nothing) <> "" Then
4. If CInt(CT) >= CInt(CurTemp) Then
5. Sound.PlaySound("SystemHand", 0, &H0)
End If
End If
'If CInt(CurTemp) >= CInt(n) Then
'MsgBox("Rising Temperature")
'End If
End Sub
خط1: در این خط متغیری به نام CurTemp ایجاد شده است که دمای تعیین شده برای هشدار از طرف کاربر را ذخیره میکند.
خط2: در این خط کاراکتر G به میکروکنترلر ارسال میگردد و اطلاعات دریافتی از طریق تابع ذکر شده در بالا دریافت می‏گردد.
خط 3: در این خط دمای تعیین شده در رجیستری ویندوز ذخیره میگردد که در صورت خروج از برنامه داده های ثبت شده توسط کاربر دوباره در نرم افزار نمایش داده شوند. مثلا اگر کاربر دمای 45 درجه سانتی گراد را برای هشدار انتخاب کرده است این مقدار در رجیستری ذخیره میشود و بعد از ورود این مقدار از رجیستری دریافت میگردد.
خط4: مقدار آخرین دمای دریافت شده از سخت افزار با دمای ثبت شده توسط کاربر مقایسه میگردد در صورتی که بزرگتر باشد با استفاده از تابع API ویندوز که PlaySound نام دارد صدایی را به اجرا می گذارد.
خط5: کلاسی به نام Sound ایجاد شده است که تابع API را می توان از داخل این کلاس فراخوانی کرد.
کدهای نوشته شده در فرم Temperature Values:
Public Class Showingfrm
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
Close()
End Sub
Private Sub Showingfrm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
TextBox1.Clear()
Dim OpenTem As New IO.StreamReader(App_Path() & "Temp" & Historyfrm.LV.FocusedItem.Text)
TextBox1.Text = OpenTem.ReadToEnd
OpenTem.Close()
End Sub
Private Sub Showingfrm_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize
MinimumSize = New Size(654, 340)
End Sub
Private Sub TextBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TextBox1.MouseMove
HideCaret(TextBox1.Handle)
End Sub
Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
End Sub
End Class
کدهای نوشته شده در فرم مربوط به اتصال اینترنت:
Public Class Internetfrm
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
Close()
End Sub
Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged
If CheckBox1.Checked = True Then
My.Computer.Registry.SetValue("HKEY_CURRENT_USERSoftware", "Transfer", "Do")
If RadioButton2.Checked = True Then
Label1.Enabled = True
Label2.Enabled = True
Label3.Enabled = True
TextBox1.Enabled = True
TextBox2.Enabled = True
TextBox3.Enabled = True
End If
RadioButton1.Enabled = True
RadioButton2.Enabled = True
Else
My.Computer.Registry.SetValue("HKEY_CURRENT_USERSoftware", "Transfer", "")
Label1.Enabled = False
Label2.Enabled = False
Label3.Enabled = False
TextBox1.Enabled = False
TextBox2.Enabled = False
TextBox3.Enabled = False
RadioButton1.Enabled = False
RadioButton2.Enabled = False
End If
End Sub
کدهای موجود در قسمت فرم History:
در کد زیر تابعی به نام GetExams وجود دارد که تمامی فایلهای موجود در پوشه Temp را دریافت میکند و در ListView نمایش میدهد.
Imports System.IO
Public Class Historyfrm
Private Sub Historyfrm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
LV.Clear()
GetExames(App_Path() & "temp")
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Close()
End Sub
End Class
کدهای موجود در قسمت Set Alarm:
Public Class Alarmfrm
Private Sub VScrollBar1_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs)
End Sub
Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged
If CheckBox1.Checked = True Then
Label1.Enabled = True
HSB.Enabled = True
TextBox1.Enabled = True
ElseIf CheckBox1.Checked = False Then
Label1.Enabled = False
HSB.Enabled = False
TextBox1.Enabled = False
My.Computer.Registry.SetValue("HKEY_CURRENT_USERSoftware", "SetA", "")
End If
End Sub
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
Close()
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
If CheckBox1.Checked = False Then
My.Computer.Registry.SetValue("HKEY_CURRENT_USERSoftware", "SetA", "")
Hide()
Exit Sub
End If
My.Computer.Registry.SetValue("HKEY_CURRENT_USERSoftware", "SetA", TextBox1.Text)
Hide()
End Sub
End Class
در این نرم افزار ماژولی ایجاد شده است که تمامی توابع مورد نیاز برنامه در ماژول جاری استفاده شده است.
ماژول ControlCenter:
در این ماژول توابعی برای اتصال به FTP ایجاد شده است که در زیر تمامی توابع قابل مشاهده هستند.
در قسمت دیگر دو تابع به نامهای GetExames و App_Path ایجاد شده است که تابع اول تمامی فایلهای موجود در پوشه Temp را برمیگرداند و App_Path مسیر اجرا برنامه را برمیگرداند.
Imports System.IO
Module ControlCenter
Public Declare Function HideCaret Lib "user32" (ByVal hwnd As Long) As Long
Public CT As Integer
Public Declare Function InternetCheckConnection Lib "wininet.dll" Alias "InternetCheckConnectionA" (ByVal lpszUrl As String, ByVal dwFlags
As Long, ByVal dwReserved As Long) As Long
Public Declare Function InternetCloseHandle Lib "wininet.dll" (ByVal hInet As Long) As Integer
Public Declare Function InternetConnect Lib "wininet.dll" Alias "InternetConnectA" (ByVal hInternetSession As Long, ByVal sServerName As
String, ByVal nServerPort As Integer, ByVal sUserName As String, ByVal sPassword As String, ByVal lService As Long, ByVal lFlags As Long, ByVal
lContext As Long) As Long
Public Function App_Path() As String
On Error Resume Next
Dim SplitedStr() As String
SplitedStr = Split(System.IO.Path.GetDirectoryName(System.Assembly.GetExecutingAssembly().CodeBase), "file:")
Return SplitedStr(1)
End Function
End Module
کلاس Sound:
در کلاس زیر تابعی در کلاس Sound ایجاد شده است که به صورت Sound.PlaySound فراخوانی می شود و با دادن مقادیر مورد نظر کار مخصوص به آن عمل را انجام میدهد.
Public Class Sound
Declare Auto Function PlaySound Lib "winmm.dll" (ByVal name As String, ByVal hmod As Integer, ByVal flags As Integer) As Integer
Public Const SND_SYNC = &H0 ' play synchronously
Public Const SND_ASYNC = &H1 ' play asynchronously
Public Const SND_MEMORY = &H4 'Play wav in memory
Public Const SND_ALIAS = &H10000 'Play system alias wav
Public Const SND_NODEFAULT = &H2
Public Const SND_FILENAME = &H20000 ' name is file name
Public Const SND_RESOURCE = &H40004 ' name is resource name or atom
End Class
قسمت سخت افزاری:
قسمت سخت افزاری این پروژه در نرم افزار 7.6 Proteus Professional طراحی شده است که در ذیل شرح داده خواهند شد. کدهای نوشته شده برای میکروکنترلر AVR در Codevision Evaluation نوشته شده است.
مدار مورد نظر در نرم افزار پروتوس طراحی شده است که شماتیک مدار را در زیر مشاهده می کنید.

در مدار بالا از موارد و قطعات زیر استفاده شده است:
1. RS232
2. میکرو کنترلر 16 ATmega
3. LCD 16*2
4. LM35 Sensor
5. مقاومت
6. خازن
7. Power
8. Ground
در اینجا اینجانب قصد داشتم که از طریق همین شبیه سازی، بتوانم نرم افزار را به سخت افزار شبیه سازی شده متصل کنم که این کار با نرم افزار Virtual Serial Port Emulator انجام شد که در ادامه درباره ارتباط شبیه سازی شده توضیح داده خواهد شد.
هدف از انجام این شبیه سازی فقط تست صحیح عمل کردن مدار و کدهای نوشته شده برای میکرو می بود که تمامی قسمتهای مدار و نرم افزار داده شده به میکرو به خوبی عمل میکند و همچنین به نرم افزار هم به راحتی متصل میگردد. در این مدار از تبدیل کننده 232 MAX استفاده نشده است، چون می توان به طور مستقیم به پورت سریال کامپیوتر از طریق پورتهای TXD و RXD به کامپیوتر متصل گردید.
در این پروژه از سه قسمت اساسی میکروکنترلر استفاده شده است که:
1. ADC
2. USART
3. ارتباط با LCD
ADC یک مبدل آنالوگ به دیجیتال در میکرکنترلرهای Atmega می باشد که کاربردهای زیادی برای این تبادلات دارد. برای مثال اگر ما بخواهیم اطلاعات دریافت شده از یک سنسور که خروجی آنالوگ را دارد(مانند سنسور 35 LM) دریافت کنیم می بایستی ما از مبدل آنالوگ به دیجیتال میکرو استفاده کنیم که برای تنظیمات ADC بایستی به رجیسترهای دسترسی داشته باشم که در ادامه در مورد رجیسترها توضیح خواهم داد.
:USART
قسمتی در میکروها وجود دارد که برای ارتباط با پورت سریال ایجاد گردیده است که می توان از طریق پایه هایی به نام RXD و TXD این ارتباط را ایجاد کرد.
ارتباط با LCD:
برای ارتباط با LCD در میکرو می بایستی کل هشت بیت یک پورت را در اختیار LCD قرار داد که بتوان داده های 8 بیتی ارسال شده به LCD را مشاهده کرد.
توضیحات مربوط به قطعات در نرم افزار پروتوس:
قطعه COMPIM در پروتوس:
این قطعه که همان 232 RS می باشد سوکتی است که به پورت سریال سیستم متصل می شود و داده ها از آن عبور میکنند. برخی از 232 RS ها دارای 9و 25 پین می باشند که در اینجا از 9 پین استفاده شده است.
دوپایه RXو TX برای ارسال و دریافت در این سوکت مورد استفاده قرار می گیرند. بر روی این قطعه می توان تنظیماتی انجام داد که قابلیت دریافت و ارسال داده ها را داشته باشد.
همانطور که قبلا اشاره شد، برای ارسال و دریافت داده ها در پورت سریال باید سرعت ارسال، بیت توازن، بیت پایان و بیت داده مشخص گردد.
برای تنظیم این قطعه بر روی آن دوبار کلیک میکنیم و تنظیمات آن را انجام میدهیم. (شکل زیر)

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

پایه RXD به RXD و پایه TXD به پای TDX هر دو قطعه متصل میگردد. گفتنی است که می توان در بین این دو قطعه از مبدل ولتاژ TTL برای 232 MAX استفاده نمود.
میکروکنترلر 16 ATmega:
میکرو کنترلر 16 ATmega دارای 40 پایه می باشد که هر پایه کار مخصوص به خود را انجا م می دهد. در اینجا ما از پایه های DوBوA و همچنین پایه های AREF و AVCC استفاده کرده ایم. همانطور که می دانیم مبدل آنالوگ به دیجیتال می بایستی مقدار وارد شده از یک سنسور آنالوگ را با یک ولتاژ مقایسه کند که می توان آن ولتاژ پایه AREF باشد. به دلیل همین ما Power را به AREF متصل نموده ایم.
نحوه ی انتقال برنامه به میکروکنترلر در شبیه ساز پروتوس:
برای دادن برنامه به میکرو در پروتوس بایستی بر روی میکرو دوبار کلیک کرد و پنجره زیر مشاهده میشود.

در بالا قسمتهای Program File و CKSEL Fuses از اهمیت زیادی برخوردار است. چون این قسمتها بر اساس تنظیماتی که در کد نوشته شده برای میکرو انجام داده ایم می بایستی یکسان باشند.
قسمت Program File میکروکنترلر در پروتوس:
در اینجا بعد از ایجاد کدها و فایل HEX یا BIN می توان مسیر کد برنامه را به میکرو داد و بر اساس برنامه ی نوشته شده در شبیه ساز پروتوس نتیجه را مشاهده کرد.
برای انتخاب کدهای هگز مسیر مورد نظر را انتخاب و بر روی OPEN کلیک می کنیم.

در بالا مشاهده میشود که فایل هگز به نام 35 Lm در مسیر انتخابی قابل مشاهده می باشد.
قسمت CKSEL Fuses در پروتوس:
در این قسمت می بایستی گزینه ای انتخاب شود که همانند فرکانس انتخابی برای میکرو باشد. در اینجا اینجانب کلاک میکرو را MHz 8 انتخاب کرده ام بنابراین در اینجا کلاک میکرو همان MHz 8 انتخاب شده است. لازم به ذکر است که کلاک میکرو کلاکی داخلی است و از کریستال خارجی استفاده نشده است. اگر در وارد کردن کلاک میکرو دقت
نکنیم نتیجه ای را در خروجی نخواهیم دید.
نحوه اتصال LCD به میکرو:
برای اتصال LCD به میکرو از چندین روش می توان استفاده کرد که از روش زیر که قابل مشاهده هست استفاده کرده ام.

در اینجا 14 پایه برای LCD موجود است که هر یک در زیر توضیح داده شده است:
1. VSS: به GND متصل شده است.
2. :VDD به Power متصل شده است.
3. VEE با یک مقاومت 1کیلو اهمی به زمین متصل است.
4. :RS پایه ریست میکرو می باشد که به ترتیب به PB0 متصل است.
5. :RW پایه نوشتن و خواندن از میکرو می باشد که با یک کردن می توان بر روی LCD نوشت و با صفر کردن می توان از آن خواند.
6. :E پایه فعال سازی LCD می باشد که با یک کردن این پایه می توان عملیاتهایی را بر روی LCD انجام داد.
و همینطور به ترتیب پایه های D4 تا D7 به میکرو متصل است.لازم به ذکر است که پایه های پورت B میکرو به عنوان خروجی تعیین شده اند.
سنسور آنالوگ LM35:
این سنسور دارای 3 پایه می باشد:
پایه1: رای متصل شدن به VCC استفاده میشود.
پایه2: پایه خروجی است که به یکی از پایه های GND مورد استفاده قرار می گیرد.
شکل زیر یک سنسور LM35 را نشان می دهد.

شماتیک سنسور ال ام 35 در پروتوس به شکل زیر می باشد.

همانطور که در شکل بالا مشاهده میشود این سنسور دارای سه پایه می باشد که هر پایه به مکان مورد نظر متصل شده اند. پایه خروجی به پایه ACD0 میکرو که همان پایه PA0 می باشد متصل شده است.
توضیح درمورد کدهای نوشته شده برای میکروکنترلر ATmega16:
کدهای نوشته شده برای میکرو در Codevision C Compiler V2.04.4 نوشته شده است. که خطوط برنامه خط به خط توضیح داده خواهند شد. در برنامه نوشته شده برای میکرو، از وقفه و تایمر میکرو استفاده نشده است، اصلی ترین قسمت کدهای نوشته شده مربوط به خطوطی است که به رجیسترها مقدار داده شده است.
توضیح خطوط کدهای نوشته شده برای میکرو:
1. #include <mega16.h>
2. #include <stdio.h>
3. #include <delay.h>
4. #include <stdlib.h>
5. #include <lcd.h>
6. #asm
7. .equ __lcd_port=0x18
8. #endasm
9. #define ADC_VREF_TYPE 0xC0
//-=-=-=-=-=-=—————————- USART FUNCTIONS —————————-=-=-=-=-=-=-==-=-=-
10. void USARTInit()
{
11. UCSRA=0x00;
12. UCSRB=0x18;
13. UCSRC=0x8F;
14. UBRRH=0x01;
15. UBRRL=0x23;
}
16. char USARTReadChar()
{
17. while(!(UCSRA & (1<<RXC)))
{
}
18. return UDR;
}
19. void USARTWriteChar(char data)
{
20. while(!(UCSRA & (1<<UDRE)))
{
}
21. UDR=data;
}
//-=-=-=-=-=-=————————– ADC FUNCTIONS ————————-=-=-=-=-=-=-==-=-=-
// Read the AD conversion result
22. unsigned int read_adc(unsigned char adc_input)
{
23. ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
24. delay_us(10);
// Start the AD conversion
25. ADCSRA|=0x40;
// Wait for the AD conversion to complete
26. while ((ADCSRA & 0x10)==0);
27. ADCSRA|=0x00;
28. return ADCW;
}
//-=-=-=-=-=-=————————— MAIN FUNCTION ————————=-=-=-=-=-=-==-=-=-
29. void main(){
30. char data;
31. unsigned int temp;
32. char tempC[4];
33. USARTInit();
34. lcd_init(16);
35. ACSR=0x80;
36. SFIOR=0x00;
37. ADMUX=ADC_VREF_TYPE & 0xff;
38. ADCSRA=0xA7;
39. SFIOR&=0x1F;
40. PORTC=0xFF;
41. DDRC=0x00;
42. while(1){
43. temp=(read_adc(0)/4);
44. lcd_gotoxy(1,0);
45. lcd_puts("Temperature is:");
46. lcd_gotoxy(5,1);
47. lcd_putchar(temp/100+48);
48. lcd_putchar(temp/10%10+48);
49. lcd_putchar(temp%10+48);
50. sprintf(tempC," xdfC");
51. lcd_puts(tempC);
52. data=USARTReadChar(); // Read the data from port give the data from RX
53. if (data=='R'){
54. delay_ms(500);
55. USARTWriteChar('R');
}
56. if (data=='G')
{
57. delay_ms(500);
58. USARTWriteChar(temp/100+48);
59. delay_ms(500);
60. USARTWriteChar(temp/10%10+48);
61. delay_ms(500);
62. USARTWriteChar(temp%10+48);
}
}
}
خطوط بالا کدهای مربوط به زبان C می باشد که خط بخ خط توضیح داده می شود.
خط 1: فایل mega16.h به برنامه ضمیمه شده است. زیرا تمامی کدهای مربوط به میکرو ATmega16 در این فایل موجود است.
خط2: این خط به برنامه ضمیمه شده است چون برخی از توابع مورد نیاز در این فایل موجود است. همانند scanf و printf و…
خط3: فایل delay.h دارای توابعی برای ایجاد تاخیر زمانی است که در برنامه استفاده شده است. این فایل دارای دو تابع delay_ms() و delay_us() می باشد.
خط4: این فایل همانند فایلهای بالا دارای توابعی است که در برنامه مورد اتفاده قرار میگیرد.
خط5: فایل lcd.h مربوط به ارتباط lcd به میکروکنترلر می باشد که در ادامه درباره این موضوع بیشتر بحث خواهد شد.
خط6: خط شش بیان گر این است که برنامه نویس تمایل دارد که خطوطی را از زبان اسمبلی در ادیتور C استفاده نماید. برای مثال: وقتی برنامه نویس #asm را در برنامه استفاده میکند باید تمامی خطوط زیر این دستور به صورت کدهای اسمبلی نوشته شوند.
خط7: همانطور که می دانیم تمامی کدهای نوشته شده در زبان سی برای میکرو در هنگام ترجمه به زبان اسمبلی تبدیل میشود و بعد از آن به کد زبان ماشین تبدیل می شود. در این خط ثابتی برای ال سی دی تعریف شده است که در زبان سی به آن مقدار میدهیم. این ثابت مقدار 0×18 را گرفته است. این خط بیان میکند که ال سی دی بایستی به پورت B متصل گردد. مثلا اگر ما بخواهیم ال سی دی را به پورت A متصل کنیم می بایستی به ثابت __lcd_port مقدار 0×0A را بدهیم.
خط8: این دستور بیانگر این است که کدهای اسمبلی نوشته شده در ادیتور C در همین خط خاتمه می یابد. برای این کار از دستور #endasm استفاده شده است.
خط9: در این خط ثابتی تعریف شده است که دارای مقدار 0×0C است که در ادامه این مقدار برای تعیین پورت ADC میکرو استفاده میشود. و همچنین این مقدار به بعضی از رجیسترهای میکرو اعمال میگردد.
خط10: در اینجا تابعی تعریف شده است به نام USARTInit که مقادیر اولیه را به رجیسترهای مربوط به انتقال داده به صورت USART می دهد.
خط11: مقدار 0×00 به رجیستر UCSRA داده شده است. یکی از بیتهای این رجیستر که U2X نامیده می شود می تواند سرعت انتقال داده را تعیین کند. لازم به ذکر است که تنظیم این بیت در مد آسنکرون تاثیر خواهد داشت و باید در مد سنکرون مقدار صفر باشد. رجیستر UCSRA دارای هشت بیت می باشد که به ترتیب زیر می باشد:

خط12: رجیستر UCSRB دارای هشت بیت می باشد. این رجیستر وظیفه کنترل و اعلام وضعیت USART را برعهده دارد.
بیتهای این رجیستر به این گونه است:

خط13: این رجیستر همانند رجیستر بالا وظیفه کنترل و اعلام وضعیت USART را به عهده دارد.
بیتهای این رجیستر به شرح زیر می باشد:

خط14: رجیستر UBRRH دارای مقدار 0×00 است. این رجیستر با رجیستر UCSRC از یک مکان در حافظه I/O استفاده می کنند.
خط15: رجیستر UBRRL دارای مقدار 0×33 است. این رجیستر وظیفه تعیین baud rate را به عهده دارد. همانطور که گفته شد سرعت انتقال داده در ارسال سریال باید با سرعت مشخصی در فرستنده و گیرنده صورت پذیرد زیرا در حالت آسنکرون دیتای ارسالی یا دریافتی بر روی یک خط صورت میگیرد.
خط16: این تابع برای خواندن داده از پورت سریال ایجاد شده است که USARTReadChar نام دارد.
خط17: حلقه ای ایجاد شده است تا زمانی که مقادیر UCSRA و یک شیفت به چپ از بیت RXC تغییر کند برنامه در همین خط متوفق می شود.
خط18: بعد از تغییر مقادیر در خط 17 ، برنامه به خط 18 منتقل می شود. به محض رسیدن به این خط تمامی دیتای رسیده از کامپیوتر در رجیستر UDR ذخیره میگردد و مقدار را به تابع برمیگرداند.
خط19: در این خط تابعی برای نوشتن در پورت سریال و ارسال به کامپیوتر ایجاد شده است به نام USARTWriteChar که دارای یک آرگومان از نوع کاراکتر می باشد که کاراکتر مورد نظر را از طریق همین آرگومان به تابع ارسال میکنیم و تابع مقدار مورد نظر را در رجیستر مخصوص USART ذخیره میکند.
خط20: در این خط حلقه ای ایجاد شده است. و برنامه تا زمانی که مقدار رجیسترهای UCSRA و UDRE تغییر نکند در همین خط باقی می ماند. بعد از تغییر به خط 21 منتقل میشود.
خط21: در این خط داده ای که از آرگومان این تابع گرفته شده است، به رجیستر UDR منتقل می شود و بعد از آن بر روی خط انتقال ارسال میشود.
خط22: در این خط تابعی که مربوط به خواندن مقدار آنالوگ از ADC میکرو می باشد تعریف شده است. این تابع دارای یک آرگومان از نوع کاراکتر بدون علامت است که پورت مورد استفاده میکرو را تعیین میکند.
خط23: رجیستر ADMUX که مربوط به ADC میکرو می باشد برای انتخاب مالتی پلکسری ADC استفاده میگردد بیت های زیر مربوط به رجیستر جاری می باشد.

مقدار 0×C0 با مقدار 0×FF AND می شود و با مقداری که به آرگومان داده شده است OR می شود و پورت انتخابی میکرو بدست می آید که در نهایت در رجیستر ADMUX قرار می گیرد.
خط24: این تابع یک تاخیر 10 میلی ثانیه ایجاد میکند.
خط25: یکی از کارهای مهم این رجیستر تقسیم فرکانسی ADC انتخابی می باشد. همچنین از همین خط شروع تبدیل آنالوگ به دیجیتال شروع میگردد.
این رجیستر دارای بیتهای زیر می باشد:
مقدار 0×40 مقدار خود رجیستر ADCSRA OR می شود و مقدار نهایی در رجیستر جاری قرار میگیرد.

خط26: در اینجا حلقه ای ایجاد شده است تا رمانی که تمامی مقادیر رجیستر ADCSRA صفر شود. البته این رجیستر با مقدار 0×10 AND میشود و مقدار صفر در نهایت در رجیستر ADCSRA قرار میگیرد.
خط27: در این خط مقدار 0×10 دوباره با رجیستر OR ADCSRA میشود که دوباره مقدار اولیه خود را بگیرد تا در حلقه While متوقف شود.
خط28: در این خط داده آنالوگ دریافت شده در نهایت در رجیستر ADCW قرار میگیرد و به تابع read_adc قرار میگیرد. و بعد از آن مقدار تابع در بدنه اصلی مورد استفاده قرار میگیرد. در اینجا مقدار 10 بیتی یا 8 بیتی به تابع برگردانده می شود.
خط29: از این خط تابع اصلی برنامه آغاز می شود.
خط30: در این خط متغیری از نوع char تعریف شده است که دیتایی که قصد داریم به پورت سریال ارسال کنیم نگه داری می شود.
خط31: در این قسمت متغیر بدون علامت از نوع عددی به نام temp تعریف شده است که در آخر مقدار دریافت شده از پورت ADC0 که در رجیستر ADCW قرار گرفته است قرار میگیرد.
خط32: در این خط آرایه ای از نوع کاراکتری ایجا شده است که در ادامه مورد استفاده قرار میگیرد.
خط33: در این خط تابع USARTInit فراخوانی می شود.
خط34: تابع lcd_init مربوط به LCD باشد که این تابع تنظیمات اولیه LCD را به عهده دارد. این تابع دارای یک آرگومان می باشد که مقدار کاراکترهای دریافتی را مشخص میکند. مثلا اگر ما از LCD 2*16 استفاده میکنیم این آرگومان مقدار 16 را باید دریافت کند.
خط35: در این خط مقایسه گر آنالوگ به دیجیتال و وقفه فعال میگردد.
خط36: در این قسمت، از ورودی مالتی پلکسری استفاده شده است. برای همین این رجیستر مقدار گرفته است.
خط37: در این خط رجیستر ADMUX مقداری را برای انتخاب پورت ADC گرفته است.
خط38: در این رجیستر مقدار 0×A7 قرار میگیرد که باعث می شود که مقایسه گر در مد مورد نظر عمل کند.
خط39: در این خط منبع تحریک کننده ADC انتخاب شده است که پایه AREF می باشد.
خط40: در این خط مقاومت Pull-up پورت C فعال شده است.
خط41: در این خط پورت C به عنوان ورودی انتخاب شده است.
خط42: در این خط حلقه ای بی نهایت ایجاد شده است که عملی را به طور مداوم انجام دهد.
خط43: در این خط تابع read_adc(0) مقدار صفر را گرفته است که با 4 تقسیم میشود. مقدار صفر به این معنی است که ما پایه ADC0 را برای گرفتن مقدار آنالوگ انتخاب کرده ایم و سنسور به این پایه متصل شده است.
خط44: در این خط تابع lcd_gotoxy()برای انتقال اشاره گر ال سی دی به مکانهای مورد نظر استفاده می شود.
خط45: در این خط جمله Temperature is: به ال سی دی ارسال میگردد و در ال سی دی می توان این جمله را مشاهده کرد.
خط46: در این خط اشاره گرد به سطر پنجم و ستون دوم انتقال می یابد.
خط47: با انجام عمل temp/100+48 عدد اول دمای دریافت شده به دست می آید.
خط48: با انجام عمل temp/10%10+48 عدد دوم دمای دریافت شده از ADC میکرو بدست می آید.
خط49: با انجام عمل temp%10+48 عدد سوم دمای دریافتی بدست می آید.
خط50: در این خط با استفاده از تابع sprint کاراکترهای موجود در آرگومان دوم این تابع به آرایه ی TempC منتقل می گردد.
خط51: در این خط کاراکترهای موجود در این تابع در ال سی دی نمایش داده می شود.
خط52: در این خط برنامه منتظر می ماند تا کاراکتری را از کامپیوتر دریافت کند و در متغیر data منتقل کند.
خط53: در این قسمت اگر data مقدار R را داشته باشد خطوط زیر این شرط اجرا می شود.
خط54: در این خط یک تاخیر زمانی 5.0 ثانیه ای داریم.
خط55: در این خط کاراکتر R به سیستم ارسال میگردد. دربالا (در قسمت نرم افزار) گفته شد که نرم افزار یک کاراکتر را برای شناسایی سخت افزار ارسال میکند و در جواب همان کاراکتر از طریق سخت افزار به سیستم ارسال میگردد تا نرم افزار
پیامی را مبنی بر صحت سخت افزار به کاربر نمایش دهد.
خط56: در این قسمت اگر در متغیر data کاراکتر G قرار گیرد دستورات زیر این شرط اجرا می شود.
خط57: در این خط یک تاخیر 0.5 ثانیه ای داریم.
خط58: در این خط با انجام عمل تقسیم و جمع با متغیر temp اولین عدد دما به سیستم ارسال میگردد.
خط59: در این خط یک تاخیر 0.5 ثانیه ای داریم.
خط60: در این خط کاراکتر دوم دمای دریافتی به سیستم ارسال میگردد.
خط61: در این خط یک تاخیر 0.5 ثانیه ای داریم.
خط62: و در این خط عدد سوم دمای دریافتی به سیستم ارسال می گردد.
نکته ای مهم در مورد شبیه سازی:
برای شبیه سازی این مدار با کامپیوتر از طریق RS232 و ایجا یک شبیه ساز سخت افزاری از نرم افزار Virtual Serial Port Emulator استفاده شده است. کار این نرم افزار ایجاد یک سخت افزار مجازی برای ارتباط به پورتهای COM می باشد. بعد از فعال سازی پورت COM در این نرم افزار می توان پورتی که برای شبیه سازی استفاده می شود را در نرم افزار ساخته شده مشاهده نمود و از آن برای ارتباط استفاده نمود.
21


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

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