SMT160 یک سنسور دما ساخت شرکت HY-line است.

این سنسور تغییرات دما را به صورت تغییرات زمان وظیفه یاDuty Cycle  آشکار می‌کند.چون خروجی این سنسور به صورت ولتاژ یا دیجیتال نیست، تا حدی در مقابل نویز‌های محیطی مصونیت دارد.

مشخصات  سنسور SMT160 به شرح زیر است:

دقت مطلق: ۰٫۷ -/+ درجه

بازه‌ی اندازه گیری: ۱۷۵ درجه (۱۳۰- تا ۴۵-)

بدون نیاز به کالیبراسیون

مصرف توان پایین (زیر ۱mW)

ارتباط به صورت ۱ سیمه( البته با زمین مشترک)

ولتاژ کاری: ۴٫۷۵ تا ۷ ولت

فرکانس کاری :۱ تا ۴ کیلوهرتز

 پکیج: SO8L ،TO-92 ،TO-18 ،TO-220

دمای اندازه گیری شده را می‌توان توسط فرمول زیر محاسبه نمود:

                    فرمول به دست آوردت درجه حرارت

برای اندازه گیری دما ابتدا باید زمان وظیفه را محاسبه کرد.برای این کار باید مقدار زمانی را که پالس در وضعیت HI  است را اندازه می‌گیریم و بر مقدار زمان یک سیکل کامل تقسیم می‌کنیم. برای محاسبه مقدار زمان یک سیکل کامل کافیست مقدار زمانی را که پالس در وضعیت Low  است را نیز اندازه بگیریم و با مقدار زمان وضعیتHI  جمع کنیم.

برای این کار ۲ راه در پیش روی ماست:

۱- استفاده از وقفه‌های خارجی

۲- منتظر ماندن برای تغییر وضعیت سطح سیگنال.

راه اول:

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

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

بعد از فعال شدن وقفه و پرش به زیر برنامه، تایمر را Stop کرده و مقدار آن را در متغیر VL می‌ریزیم.

مقدار تایمر را صفر کرده و صبر می‌کنیم تا وقفه‌ی حساس به لبه‌ی پایین رونده فعال شود.سپس تایمر را Stop کرده و مقدار آن را در متغییر VH   می‌ریزیم.

حال متغییر‌های VH  و VH را با هم جمع کرده و VH را بر آن تقسیم می‌کنیم.با این کار سیکل وظیفه به دست می‌آید و می‌توان طبق فرمولی که ذکر شد دما را محاسبه نمود.

در این روش خروجی را به مستقیما به ۲ پین مربوط به وقفه‌ها اعمال می‌کنیم.

Config Int0 = Rising
Config Int1 = Falling
Config Timer1 = Timer , Prescale = 1

Dim X As Integer
Dim VH As Word
Dim VL As Word
Dim Temp As Single
Dim F As Single

Enable Interrupts
Enable Timer1
Enable Int0
Enable Int1
Enable Urxc
On Urxc Rec
On Int0 Int0_int
On Int1 Int1_int

Do
   X = VL + VH
   F = VH / X
   F = F - 0.32
   Temp = F / 0.0047
   LCD Temp
Loop
End

Int1_int:
Stop Timer1
VL = Timer1
Timer1 = 0
Start Timer1
Return

Int0_int:
Stop Timer1
VH = Timer1
Timer1 = 0
Start Timer1
Return

راه دوم: در این راه از وقفه‌ها استفاده نمی‌کنیم و محدود به پایه‌های خاصی نخواهیم بود.

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

در سورس زیر خروجی سنسور به PortB.2 متصل است.

Config Timer1 = Timer , Prescale = 1
Enable Timer1

Dim X As Integer
Dim VH As Word
Dim Vl As Word
Dim Temp As Single
Dim F As Single

Config Pinb.2 = Input

do
Bitwait Pinb.2 , Reset
VH= Timer1
Timer1 = 0
Start Timer1

Bitwait Pinb.2 , Set
VL = Timer1
timer1=0
start timer1 

X = Vl + Vf
   F = Vl / X
   F = F - 0.32
   Temp = F / 0.0047
   LCD temp
Loop

End