- רכיבים נדרשים:
- תרשים מעגל:
- מדידת טמפרטורה עם LM35 באמצעות 8051:
- LCD 16x2:
- ADC0804 IC:
- חיישן טמפרטורה LM35:
- הסבר קוד:
לפעמים אנשים מתקשים לקרוא טמפרטורה ממד חום אנלוגי בגלל תנודות. אז הנה אנחנו הולכים לבנות מדחום דיגיטלי פשוט באמצעות מיקרו - בקר 8051 שבו חיישן LM35 משמש למדידת הטמפרטורה. השתמשנו גם ב- LM35 לבניית מדחום דיגיטלי באמצעות Arduino, NodeMCU, PIC, Raspberry Pi ומיקרו-בקרים אחרים.
פרויקט זה ישמש גם כממשק תקין של ADC0804 עם 8051 ו- 16 * 2 LCD עם מיקרו-בקר 8051.
רכיבים נדרשים:
- לוח פיתוח 8051
- לוח ADC0804
- 16 * 2 תצוגת LCD
- חיישן LM35
- פוטנציומטר
- חוטי מגשר
תרשים מעגל:
דיאגרמת מעגלים עבור מעגל מדחום דיגיטלי באמצעות LM35 מובאת להלן:
מדידת טמפרטורה עם LM35 באמצעות 8051:
מיקרו-בקר 8051 הוא מיקרו-בקר של 8 סיביות אשר כולל 128 בתים של זיכרון RAM, 4K בתים של על שבב ROM, שני טיימרים, יציאה טורית אחת וארבע יציאות 8 ביט. מיקרו-בקר 8052 הוא הרחבה של מיקרו-בקר. הטבלה שלהלן מציגה את ההשוואה בין 8051 בני משפחה.
תכונה |
8051 |
8052 |
ROM (בתים) |
4K |
8K |
זיכרון RAM (בתים) |
128 |
256 |
טיימרים |
2 |
3 |
סיכות קלט / פלט |
32 |
32 |
יציאה טורית |
1 |
1 |
להפריע למקורות |
6 |
8 |
LCD 16x2:
16 * 2 LCD הוא תצוגה בשימוש נרחב ליישומים משובצים. הנה ההסבר הקצר על סיכות ועבודה של תצוגת LCD 16 * 2. ישנם שני רושמים חשובים מאוד בתוך ה- LCD. הם רישום נתונים ורישום פקודות. רישום הפקודה משמש לשליחת פקודות כגון תצוגה ברורה, סמן בבית וכו ', רישום נתונים משמש לשליחת נתונים אשר מוצגים על גבי 16 * 2 LCD. להלן הטבלה מציגה את תיאור הסיכה של 16 * 2 lcd.
פִּין |
סֵמֶל |
קלט / פלט |
תיאור |
1 |
Vss |
- |
קרקע, אדמה |
2 |
Vdd |
- |
+ ספק כוח 5V |
3 |
וי |
- |
ספק כוח לשליטה בניגודיות |
4 |
RS |
אני |
RS = 0 לרישום פקודות, RS = 1 לרישום נתונים |
5 |
RW |
אני |
R / W = 0 לכתיבה, R / W = 1 לקריאה |
6 |
ה |
קלט / פלט |
לְאַפשֵׁר |
7 |
D0 |
קלט / פלט |
אוטובוס נתונים של 8 סיביות (LSB) |
8 |
D1 |
קלט / פלט |
אוטובוס נתונים של 8 סיביות |
9 |
D2 |
קלט / פלט |
אוטובוס נתונים של 8 סיביות |
10 |
D3 |
קלט / פלט |
אוטובוס נתונים של 8 סיביות |
11 |
D4 |
קלט / פלט |
אוטובוס נתונים של 8 סיביות |
12 |
D5 |
קלט / פלט |
אוטובוס נתונים של 8 סיביות |
13 |
D6 |
קלט / פלט |
אוטובוס נתונים של 8 סיביות |
14 |
D7 |
קלט / פלט |
אוטובוס נתונים של 8 סיביות (MSB) |
15 |
א |
- |
+ 5 וולט לתאורה אחורית |
16 |
ק |
- |
קרקע, אדמה |
הטבלה שלהלן מציגה קודי פיקוד LCD הנפוצים.
קוד (hex) |
תיאור |
01 |
נקה מסך תצוגה |
06 |
סמן תוספת (משמרת ימינה) |
0 א |
תצוגה כבויה, סמן פועל |
0C |
תצוגה מופעלת, סמן כבוי |
0F |
התצוגה מופעלת, הסמן מהבהב |
80 |
להכריח את הסמן לתחילת 1 st קו |
C0 |
כפה את הסמן לתחילת השורה השנייה |
38 |
2 שורות ומטריקס 5 * 7 |
ADC0804 IC:
ה- ADC0804 IC הוא ADC מקביל של 8 סיביות במשפחת סדרת ADC0800 מבית National Semiconductor. זה עובד עם +5 וולט ורזולוציה של 8 ביט. גודל הצעד וטווח ה- Vin משתנה עבור ערכים שונים של Vref / 2. הטבלה שלהלן מציגה את הקשר בין טווח Vref / 2 לטווח Vin.
Vref / 2 (V) |
Vin (V) |
גודל צעד (mV) |
לִפְתוֹחַ |
0 עד 5 |
19.53 |
2.0 |
0 עד 4 |
15.62 |
1.5 |
0 עד 3 |
11.71 |
1.28 |
0 עד 2.56 |
10 |
במקרה שלנו Vref / 2 מחובר ל -1.28 וולט, כך שגודל המדרגה הוא 10mV. עבור ADC0804 גודל הצעד מחושב כ (2 * Vref / 2) / 256.
הנוסחה הבאה משמשת לחישוב מתח המוצא:
Dout = Vin / גודל צעד
כאשר Dout הוא פלט נתונים דיגיטלי בעשרוני, Vin = מתח כניסה אנלוגי וגודל צעד (רזולוציה) הוא השינוי הקטן ביותר. למידע נוסף על ADC0804 כאן, בדוק גם את הממשק של ADC0808 עם 8051.
חיישן טמפרטורה LM35:
ה- LM35 הוא חיישן טמפרטורה שמתח המוצא שלו הוא ביחס ליניארי לטמפרטורת צלזיוס. ה- LM35 מגיע כבר מכויל ולכן אינו דורש כיול חיצוני. זה פלט 10mV עבור כל דרגת טמפרטורה צלזיוס.
חיישן LM35 מייצר מתח התואם לטמפרטורה. מתח זה מומר לדיגיטלי (0 עד 256) על ידי ADC0804 והוא מוזן למיקרו-בקר 8051. מיקרו-בקר 8051 ממיר ערך דיגיטלי זה לטמפרטורה במעלות צלזיוס. ואז טמפרטורה זו מומרת לצורת ascii המתאימה להצגה. ערכי ascii אלה מוזנים ל 16 * 2 lcd המציג את הטמפרטורה על גבי המסך. תהליך זה חוזר על עצמו לאחר מרווח שצוין.
להלן תמונת ההתקנה של מד החום הדיגיטלי LM35 באמצעות 8051:
תוכל למצוא את כל המדחומים הדיגיטליים המבוססים על LM35 כאן.
הסבר קוד:
תוכנית C המלאה עבור מדחום דיגיטלי זה המשתמש ב- LM35 ניתנת בסוף פרויקט זה. הקוד מחולק לנתחים משמעותיים קטנים ומוסבר להלן.
עבור ממשק 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; // הירשם בחר (RS) סיכה של 16 * 2 sbit lcd rw = P2 ^ 6; // קריאה / כתיבה (RW) סיכה של 16 * 2 lcd sbit en = P2 ^ 5; // אפשר סיכה (E) של 16 * 2 lcd
באופן דומה, עבור ממשק ADC0804 עם מיקרו-בקר 8051, עלינו להגדיר פינים עליהם מחובר ADC0804 למיקרו-בקרה 8051. סיכת RD של ADC0804 מחוברת ל- P3.0, סיכת WR של ADC0804 מחוברת ל- P3.1 ופין INTR של ADC0804 מחובר ל- P3.2. סיכות נתונים מחוברות ליציאה 1 של 8051 מיקרו-בקר.
sbit rd_adc = P3 ^ 0; // קרא (RD) סיכה של ADC0804 sbit wr_adc = P3 ^ 1; // כתוב (WR) סיכה של ADC0804 sbit intr_adc = P3 ^ 2; // סיכת הפרעה (INTR) של ADC0804
בשלב הבא עלינו להגדיר כמה פונקציות המשמשות בתוכנית. פונקציית עיכוב משמשת ליצירת עיכוב זמן מוגדר, פונקציית mdwrt משמשת למשלוח פקודות לתצוגת 16 * 2 lcd, פונקציית datawrt משמשת למשלוח נתונים לתצוגת 16 * 2 lcd ופונקציית convert_display משמשת להמרת נתוני ADC לטמפרטורה ולהציג אותו בתצוגה 16 * 2 lcd.
עיכוב חלל (int חתום); // פונקציה ליצירת עיכוב ריק cmdwrt (char לא חתום); // פונקציה לשליחת פקודות ל- 16 * 2 lcd display void datawrt (char לא חתום); // פונקציה לשליחת נתונים ל 16 * 2 תצוגת lcd בטל convert_display (char לא חתום); // פונקציה להמרת ערך ADC לטמפרטורה ולהצגתו בתצוגה 16 * 2 lcd
בחלק התחתון של הקוד אנו שולחים פקודות ל 16 * 2 lcd. פקודות כגון תצוגה ברורה, סמן תוספת, לאלץ את הסמן לתחילת 1 st הקו נשלח 16 * 2 LCD תצוגה אחד אחד אחרי כמה עיכוב זמן מוגדר.
עבור (i = 0; i <5; i ++) // שלח פקודות ל- 16 * 2 lcd להציג פקודה אחת בכל פעם {cmdwrt (cmd); // שיחת פונקציה לשליחת פקודות לעיכוב תצוגה 16 * 2 lcd (1); }
בחלק זה של הקוד אנו שולחים נתונים ל- 16 * 2 lcd. הנתונים שיוצגו בתצוגת 16 * 2 lcd נשלחים להצגה בזה אחר זה לאחר עיכוב זמן מוגדר.
עבור (i = 0; i <12; i ++) // שלח נתונים ל- 16 * 2 lcd להציג תו אחד בכל פעם {datawrt (data1); // שיחת פונקציה לשליחת נתונים לעיכוב תצוגה 16 * 2 lcd (1); } בחלק זה של הקוד אנו ממירים את המתח האנלוגי המיוצר על ידי חיישן LM35 לנתונים דיגיטליים ואז הוא מומר לטמפרטורה ומוצג בתצוגה 16 * 2 lcd. כדי ש- ADC0804 יתחיל את ההמרה עלינו לשלוח דופק נמוך עד גבוה על סיכת WR של ADC0804, ואז עלינו לחכות לסיום ההמרה. INTR הופך נמוך בסוף ההמרה. ברגע שה- INTR הופך נמוך, ה- RD מועט כדי להעתיק את הנתונים הדיגיטליים ליציאה 0 של 8051 מיקרו-בקר. לאחר עיכוב זמן מוגדר, המחזור הבא מתחיל. תהליך זה חוזר על עצמו לנצח.
ואילו (1) // חזור לנצח {wr_adc = 0; // שלח דופק LOW ל- HIGH בהשהיית סיכת WR (1); wr_adc = 1; בעוד (intr_adc == 1); // המתן לסיום ההמרה rd_adc = 0; // הפוך את RD = 0 לקריאת הנתונים מערך ADC0804 = P1; // העתק נתוני ADC convert_display (ערך); // שיחת פונקציה להמרת נתוני ADC לטמפרטורה ולהצגתם בעיכוב תצוגה 16 * 2 lcd (1000); // מרווח בין כל מחזורים rd_adc = 1; // הפוך את RD = 1 למחזור הבא}
בחלק התחתון של הקוד אנו שולחים פקודות לתצוגה 16 * 2 lcd. הפקודה מועתקת ליציאה 0 של 8051 מיקרו-בקר. RS מופחת עבור כתיבת פקודה. RW הוא נמוך עבור פעולת כתיבה. דופק גבוה עד נמוך מוחל על סיכת הפעלה (E) להפעלת כתיבת הפקודה.
חלל cmdwrt (לא חתום x) {P0 = x; // שלח את הפקודה ליציאה 0 שעליה 16 * 2 lcd מחובר rs = 0; // הפוך את RS = 0 לפקודה rw = 0; // הפוך RW = 0 לפעולת כתיבה en = 1; // שלח דופק HIGH ל- LOW על Enable (E) pin כדי להתחיל בעיכוב פעולת כתיבת הפקודה (1); en = 0; }
בחלק זה של הקוד אנו שולחים נתונים לתצוגה 16 * 2 lcd. הנתונים מועתקים ליציאה 0 של מיקרו-בקר 8051. RS עשוי גבוה לכתיבת פקודות. RW הוא נמוך עבור פעולת כתיבה. דופק גבוה עד נמוך מוחל על סיכת הפעלה (E) להפעלת פעולת כתיבת נתונים.
datawrt בטל (char y לא חתום) {P0 = y; // שלח את הנתונים ליציאה 0 שעליה מחובר 16 * 2 lcd rs = 1; // הפוך את RS = 1 לפקודה rw = 0; // הפוך RW = 0 לפעולת כתיבה en = 1; // שלח דופק HIGH ל- LOW על Enable (E) pin כדי להתחיל בעיכוב פעולת כתיבת נתונים (1); en = 0; }
בחלק זה של הקוד אנו ממירים נתונים דיגיטליים לטמפרטורה ומציגים אותם בתצוגה 16 * 2 lcd.
בטל convert_display (ערך char לא חתום) {char לא חתום x1, x2, x3; cmdwrt (0xc6); // פקודה להגדרת הסמן למיקום השישי של השורה השנייה ב- 16 * 2 lcd x1 = (value / 10); // חלקו את הערך ב- 10 ואחסנו את המשתנה במשתנה x1 x1 = x1 + (0x30); // להמיר משתנה x1 ל- ascii על ידי הוספת 0x30 x2 = ערך% 10; // חלקו את הערך ב- 10 ואחסנו את שארית במשתנה x2 x2 = x2 + (0x30); // להמיר משתנה x2 ל- ascii על ידי הוספת 0x30 x3 = 0xDF; // ערך ascii של תואר (°) סמל datawrt (x1); // טמפרטורת תצוגה ב- 16 * 2 lcd display datawrt (x2); datawrt (x3); datawrt ('C'); }
כמו כן, בדקו מדחומים אחרים באמצעות LM35 עם מיקרו-בקרים שונים:
- מדחום דיגיטלי באמצעות Arduino ו- LM35
- מדידת טמפרטורה באמצעות מיקרו-בקר LM35 ו- AVR
- מדידת טמפרטורת החדר עם פטל פטל