تایمر ها از اجزاء پر کاربرد پروژه های 8051 می باشند.کار اصلی تایمر شمارش تعداد سیکل های کریستال می باشد.چون هر دوره تناوب کریستال در کسری از ثانیه رخ می دهد بنابراین می توان برای شمارش زمان سپری شده ، از آن استفاده کرد .
8051 دارای دو عدد تایمر 16 بیتی می باشد که با نامهای تایمر یک و تایمر صفر شناخته شده اند .هر تایمر در حقیقت از دو ثبات 8 بیتی با نام TH و TL ساخته شده است .از تایمر ها در 4 مود کاری می توان استفاده کرد:
مود 00 که از تایمر به عنوان یک شمارشگر 13 بیتی استفاده می کند .
مود 01 از تایمر به عنوان شمارشگر 16 بیتی استفاده می کند .
مود 02 به عنوان شمارشگر 8 بیتی با راه اندازی خودکار استفاده می کند.(AutoReload)
مود 03 تایمر را به دو تایمر 8 بیتی تقسیم می کند که به آن حالت تسخیر شده می گویند.

در 4 مود کاری بالا مود های یک و دو بیشترین کاربرد را در انجام پروژه ها دارند .تایمر 16 بیتی مود 01 می تواند از مقدار 0000 تا FFFFH بشمارد پس از رسیدن به مقدار FFFF تایمر پرچم خود را (TF) را یک می کند و مجددا از مقدار 0000 شروع به شمارش می کند.

در مود 2 که همان حالت AutoReload است تایمر به عنوان یک شمارشگر 8 بیتی از مقدار 00 تا FFh می شمارد البته در این مود می توان برای تایمر تعیین کرد که چه مقدار بشمارد فرضا در برنامه ای احتیاج به این پیدا می کنیم تا تایمر یک وظیفه ای را هر 100 میکرو ثانیه انجام دهد در این حالت از مود 2 استفاده می کنیم . مقدار اولیه شمارش را در ثبات TH قرار می دهیم .و سپس پس از راه اندازی تایمر این مقدار در ثبات TL قرار می گیرد و تایمر از مقدار تعیین شده تا FFh می شمارد . پس از رسیدن TL به FFh تایمر پس از یک کردن TF ، مجددا مقدارموجود در TH را در ،م کپی کرده و به همین ترتیب شمارش ادامه می یابد .

تایمر ها دارای دو ثبات با نامهای TCON وTMOD هستندثبات ،TMOD برای مقدار اولیه دادن به تایمر مورد استفاده قرار می گیرند و ثبات TCON برای کنترل تایمر مورد استفاده قرار می گیرد ثبات TMOD همیشه باید قبل از راه اندازی تایمر مقدار دهی شود.شکل ثبات TMOD به صورت زیر است:



TMODیک ثبات 8 بیتی است که به دو قسمت 4 بیتی (nible) تقسیم می شود نیبل بالا برای تایمر 1 و نیبل پایین برای تایمر 0 مورداستفاده قرار می گیرد .اختلاف دو نیبل در همین است و غیر از این کاملا با هم مشابهند .
بیت Gate ، می توان گفت که یک نوع راه انداز تایمر است . این بیت مشابه کلید روشن و خاموش عمل می کند در صورتی که مقدار این بیت را یک قرار دهیم کنترل تایمر از طریق پالس ورودی به پایه ی INT1 صورت می گیرد یکی از کاربرد های این بیت اندازه گیری پالس خارجی اعمال شده به پایه ی INT1 می باشد.
بیت C/T نوع کارکرد تایمر را تعیین می کند که آیا تایمر برای شمارش تعداد پالس کریستال خارجی متصل به پایه T1 یا T0 مورداستفاده قرار گیرد یا برای شمارش تعداد پالس های کریستال مدار میکرو که آن هم به پایه های 18 و 19 متصل است .در حالت اول می گویند که تایمر به عنوان کانتر (شمارنده اتفاقات) عمل می کند و در حالت دوم می گویند که تایمر در حالت شمارش گر زمان کار می کند .در صورتی که بیتc/T را یک کنیم تایمر به عنوان کانتر و در صورتی که این بیت را صفر کنیم تایمر به عنوان شمارشگر واحد زمان به کار گرفته می شود.

بیتهای M1و M0 هم مود کاری را که قبلا بررسی کردیم تعیین می کند .ابتدا مود مورد نظر را تعیین می کنیم سپس مقدار معادل آن در مبنای دو را در بیتهای M1, M2 قرار می دهیم .

یک مثال برای اینکه تایمر 1در حالت AutoReload و به عنوان تایمر (شمارش گر زمان) مورد استفاده قرار گیرد :



معدل این کار دستور زیر است:


کد:
Mov Tmod,#00100000b
مرحله بعدی استفاده از تایمر تعیین چگونگی روشن و خاموش کردن تایمر است.
ثبات دیگری که در مورد تایمر مورد استفاده قرار می گیردثبات TCON است بیتهای این ثبات در شکل زیر مشخص می باشند.



بیت TF:قبلا هم در مورداین بیت صحبت کردیم هنگامی که تایمر شروع به شمارش کرد بسته به مودی که برای کار در آن تنظیم شده است پس از رسیدن به مقدار نهایی (FFh یا FFFFh یا1FFFh ) قبل از اینکه مجددا از صفر شروع به شمارش کند بیتTF را یک می کند تا نشان دهد که مقدار فعلی در دور دوم شمارش است و قبلا یک بار شمارش کامل شده است .
این بیت به صورت سخت افزاری یک می شود و ما باید به صورت نرم افزاری قبل از پایان دور دوم شمارش آن را صفر کنیم .
TF1 برای تایمر یک و TF0 پرچم شمارش برای تایمر صفر است.

بیت TR: بیت کنترل راه اندازی نامیده شده است .در صورتی که این بیت را یک کنیم تایمر شروع به شمارش می کند و در صورتی که این بیت صفر شود تایمر متوقف می شود. مانند TF، ،TR1 برای کنترل تایمر 1 و TR0 برای کنترل راه اندازی تایمر 0 مورد استفاده قرار می گیرد.

4 بیت بعدی این ثبات برای عملیات وقفه کاربرد دارد که انشاالله در مبحث وقفه ها به صورت کامل توضیح خواهیم داد .
اکنون روش کار با تایمر را به صورت الگوریتم در می آوریم تا بهخاطر سپردن آن آسانتر شود.

1.از کدام تایمر استفاده خواهیمکرد؟
2.مود کاری تایمر را تعیین کنید.
3.تایمر مورد نظر شماست یا شمارنده
3.ثبات TMOD را با معادل دودوئی آن بار گذاری کنید.
4.در صورتی که از AutoReload استفاده می کنید TH را با مقدار اولیه مناسب بار کنید.
5.تایمر را راه اندازی کنید .
7.منتظر یک شدن TF بمانید .


مثال:
برنامه ای بنویسید که یک پالس با دوره تناوب 200 میکرو ثانیه بر روی پایه ی P1.0 تولید کند.


حل:
دوره تناوب پالس 200 میکرو ثانیه عنوان شده است یک پالس در نصف دوره تناوب در حالت high و در نصف دیگر در حالت low قرار دارد . نصف دوره تناوب 100 میکرو ثانیه است و چون پالس متقارن است ما فقط به نصف دوره تناوب احتیاج داریم بنابراین مود تایمر را 2 یعنی حالت autoReload و مقدار اولیه را -100 در نظر می گیریم.
برای اینکه بفهمید چرا -100 ،توجه کنید که ما می خواهیم که تایمر 100 واحد بشمارد در حالت AutoReload چون تایمر 8 بیتی است حداکثر مقدار شمارش FFh است بنابراین :
TH=FFh-100d=9Bh
اما -100 هم دقیقا مشابه مقدار بالا است .بنابراین اگر ما به جای -100 مقدار 9Bh را در TH قرار می دادیم نیز نتیجه فرقی نمی کرد.

در این مثال فرقی نمی کند که از کدام تایمر استفاده کنیم .در حقیقت تایمر ها هیچ تفاوتی با هم ندارند .
کد:
Mov TMOD,#00100000b

Mov TH1,#-100
Setb TR1
Wait :jnb Tf1,wait
ClR TF1
CPL p1.0
Sjmp wait
همانطور که مشاهده می کنید قبل از پایان دور دوم شمارش مقدار TF باید صفر شود.
منبع:دانشگاه کردستان