- רכיבים נדרשים:
- תרשים מעגל:
- שימוש ב- TIMER של 8051 למדידת תדירות:
- טיימר 555 כמקור תדר:
- הסבר על עבודה וקוד:
תדר מוגדר כמספר מחזורים בשנייה. ניתן להגדיר זאת גם כהדדיות של הזמן הכולל 'T'. בפרויקט זה אנו הולכים לספור את מספר הפולסים הנכנסים ליציאת 3.5 של מיקרו-בקר 8051 ולהציגו על צג LCD * 16 * 2. אז בעצם יש לנו למדוד את תדירות האות ביציאה 3.5 של 8051. כאן השתמשנו בשבב AT89S52 8051, ו- IC 555 משמש במצב Astable ליצירת דופק הדגימה לצורך הדגמה. בנינו בעבר דלפק תדרים באמצעות Arduino.
רכיבים נדרשים:
- מיקרו-בקר 8051 (AT89S52)
- 16 * 2 תצוגת LCD
- מקור תדר (טיימר 555)
- פוטנציומטר
- חוטי חיבור
תרשים מעגל:
שימוש ב- TIMER של 8051 למדידת תדירות:
מיקרו-בקר 8051 הוא מיקרו-בקר של 8 סיביות אשר כולל 128 בתים של זיכרון RAM, 4K בתים של שבב ROM, שני טיימרים, יציאה טורית אחת וארבע יציאות 8 ביט. מיקרו-בקר 8052 הוא הרחבה של מיקרו-בקר. כדי להגדיר את יציאת 3.5 כמונה, ערכי הרישום של TMOD מוגדרים ל- 0x51. איור להלן מציג את רישום ה- TMOD.
שַׁעַר | C / T | M1 | M0 | שַׁעַר | C / T | M1 | M2 |
טיימר 1 | טיימר 0 |
GATE - כאשר GATE מוגדר, הטיימר או הדלפק מופעלים רק כאשר סיכת INTx היא HIGH ו- PIN שליטת TRx מוגדר. כאשר ה- GATE מנוקה, הטיימר מופעל בכל פעם שהסיבית של בקרת TRx מוגדרת.
C / T - כאשר C / T = 0, הוא פועל כטיימר. כאשר C / T = 1, זה פועל כ- Counter.
M1 ו- M0 מציינים את מצב הפעולה.
עבור TMOD = 0x51, טיימר 1 משמש כנגד והוא פועל במצב 1 (16 ביט).
LCD 16 * 2 משמש להצגת תדירות האות בהרץ (הרץ). אם אתה לא חדש ב- 16x2 LCD, בדוק כאן יותר על הסיכות של 16x2 LCD ופקודותיו. בדוק גם כיצד לממשק LCD עם 8051.
טיימר 555 כמקור תדר:
מקור התדר אמור לייצר גלים מרובעים והמשרעת המרבית מוגבלת ל -5 וולט, מכיוון שהיציאות של מיקרו-בקר 8051 אינן יכולות להתמודד עם מתח גדול מ -5 וולט. התדר המקסימלי אותו ניתן למדוד הוא 655.35 KHz בגלל מגבלה לזכר הקופה TH1 ו TL1 (8bit כל אחד). בתוך 100 אלפיות השנייה, TH1 ו- TL1 יכולים להחזיק עד 65535 ספירות. מכאן שהתדר המרבי שניתן למדוד הוא 65535 * 10 = 655.35 קילוהרץ.
בפרויקט זה של 8051 מד תדרים, אני משתמש בטיימר 555 במצב מדהים לייצור גלים מרובעים בתדרים משתנים. ניתן לשנות את תדירות האות שנוצר על ידי 555 IC על ידי התאמת הפוטנציומטר כפי שמוצג בסרטון הווידיאו שניתן בסוף פרויקט זה.
בפרויקט זה, ה- Timer1 (T1) מונה את מספר הפולסים הנכנסים ליציאה 3.5 של 8051 מיקרו-בקרים למשך 100 אלפיות השנייה. ערכי הספירה יאוחסנו ברשומות TH1 ו- TL1 בהתאמה. לשילוב ערכים של רישום TH1 ו- TL1, נעשה שימוש בנוסחה הבאה.
פולסים = TH1 * (0x100) + TL1
כעת ל"דופק "יהיו מספר מחזורים ב 100 אלפיות השנייה. אך תדר האות מוגדר כמספר מחזורים בשנייה. כדי להמיר אותו לתדר, נעשה שימוש בנוסחה הבאה.
פולסים = פולסים * 10
הסבר על עבודה וקוד:
תוכנית C השלמה עבור תדר זה המד ניתן בסוף הפרויקט הזה. הקוד מחולק לנתחים משמעותיים קטנים ומוסבר להלן.
עבור ממשק 16 * 2 LCD עם מיקרו-בקר 8051, עלינו להגדיר סיכות שעליהן מחובר 16 * 2 lcd למיקרו-בקר 8051. סיכת RS של 16 * 2 lcd מחוברת ל- P2.7, סיכת RW של 16 * 2 lcd מחוברת ל- P2.6 וסיכה E של 16 * 2 lcd מחוברת ל- P2.5. סיכות נתונים מחוברות ליציאה 0 של מיקרו-בקר 8051.
sbit rs = P2 ^ 7; sbit rw = P2 ^ 6; sbit en = P2 ^ 5;
בשלב הבא עלינו להגדיר כמה פונקציות המשמשות בתוכנית. פונקציית עיכוב משמשת ליצירת עיכוב זמן מוגדר. פונקציית Cmdwrt משמשת לשליחת פקודות לתצוגה 16 * 2 lcd. פונקציית datawrt משמשת לשליחת נתונים לתצוגה 16 * 2 lcd.
עיכוב חלל (int חתום); חלל cmdwrt (char לא חתום); datawrt בטל (char לא חתום);
בחלק זה של הקוד אנו שולחים פקודות ל 16 * 2 lcd. פקודות כגון תצוגה ברורה, סמן תוספת, לאלץ את הסמן לתחילת 1 st הקו נשלח 16 * 2 LCD תצוגה אחד אחד אחרי כמה עיכוב זמן מוגדר.
עבור (i = 0; i <5; i ++) {cmdwrt (cmd); עיכוב (1); }
בחלק זה של הקוד, טיימר 1 מוגדר כמונה ומצב הפעולה מוגדר למצב 1.
טיימר 0 מוגדר כטיימר ומצב הפעולה מוגדר למצב 1. טיימר 1 משמש לספירת מספר הפולסים וטיימר 0 משמש ליצירת עיכוב בזמן. ערכי TH1 ו- TL1 מוגדרים ל- 0, כדי להבטיח שהספירה מתחילה מ- 0.
TMOD = 0x51; TL1 = 0; TH1 = 0;
בחלק זה של הקוד, הטיימר נועד לפעול במשך 100 אלפיות השנייה. עיכוב של 100 אלפיות השנייה נוצר באמצעות פונקציית השהיה. TR1 = 1 מיועד להפעלת הטיימר ו- TR1 = 0 מיועד לעצירת הטיימר לאחר 100 אלפיות השנייה.
TR1 = 1; עיכוב (100); TR1 = 0;
בחלק זה של הקוד משולבים ערכי הספירה הקיימים ברשומות TH1 ו- TL1 ואז מכפילים אותם עם 10 כדי לקבל את מספר המחזורים הכולל בשנייה אחת.
פולסים = TH1 * (0x100) + TL1; פולסים = פולסים * 10;
בחלק זה של הקוד, ערך התדר מומר לבתים בודדים כדי להקל על הצגה בתצוגה 16 * 2 lcd.
d1 = פולסים% 10; s1 = פולסים% 100; s2 = פולסים% 1000; s3 = פולסים% 10000; s4 = פולסים% 100000; d2 = (s1-d1) / 10; d3 = (s2-s1) / 100; d4 = (s3-s2) / 1000; d5 = (s4-s3) / 10000; d6 = (פולסים-s4) / 100000;
בחלק זה של הקוד, ספרות בעלות ערך תדר בודדות מומרות לפורמט ASCII וזה מוצג בתצוגה 16 * 2 lcd.
אם (פולסים> = 100000) datawrt (0x30 + d6); אם (פולסים> = 10000) datawrt (0x30 + d5); אם (פולסים> = 1000) datawrt (0x30 + d4); אם (פולסים> = 100) datawrt (0x30 + d3); אם (פולסים> = 10) datawrt (0x30 + d2); datawrt (0x30 + d1);
בחלק זה של הקוד אנו שולחים פקודות לתצוגה 16 * 2 lcd. הפקודה מועתקת ליציאה 0 של 8051 מיקרו-בקר. RS מופחת עבור כתיבת פקודה. RW הוא נמוך עבור פעולת כתיבה. דופק גבוה עד נמוך מוחל על סיכת הפעלה (E) להפעלת כתיבת הפקודה.
חלל cmdwrt (לא חתום x) {P0 = x; rs = 0; rw = 0; en = 1; עיכוב (1); en = 0; }
בחלק זה של הקוד אנו שולחים נתונים לתצוגה 16 * 2 lcd. הנתונים מועתקים ליציאה 0 של מיקרו-בקר 8051. RS עשוי גבוה לכתיבת פקודות. RW הוא נמוך עבור פעולת כתיבה. דופק גבוה עד נמוך מוחל על סיכת הפעלה (E) להפעלת פעולת כתיבת נתונים.
datawrt בטל (char y לא חתום) {P0 = y; rs = 1; rw = 0; en = 1; עיכוב (1); en = 0; }
כך אנו יכולים למדוד את התדירות של כל אות באמצעות מיקרו-בקר 8051. בדוק את הקוד המלא ואת סרטון ההדגמה למטה.