جدول المحتويات:

جهاز مراقبة مستوى درجة الحرارة والضوء مع العرض على شاشة LCD NOKIA 5110: 4 خطوات
جهاز مراقبة مستوى درجة الحرارة والضوء مع العرض على شاشة LCD NOKIA 5110: 4 خطوات

فيديو: جهاز مراقبة مستوى درجة الحرارة والضوء مع العرض على شاشة LCD NOKIA 5110: 4 خطوات

فيديو: جهاز مراقبة مستوى درجة الحرارة والضوء مع العرض على شاشة LCD NOKIA 5110: 4 خطوات
فيديو: اصلاح عطل الاضاءة و البينات نوكيا 3310 Nokia 3310 TA-1030 lcd & light problem 2024, يوليو
Anonim
Image
Image

مرحبا بالجميع!

في هذا القسم نصنع جهاز الكتروني بسيط لمراقبة درجة الحرارة ومستوى الضوء. يتم عرض قياسات هذه المعلمات على شاشة LCD NOKIA 5110. يعتمد الجهاز على وحدة التحكم الدقيقة AVR ATMEGA328P. جهاز المراقبة مزود بميزان حرارة رقمي DS18B20 ومقاوم ضوئي لقياس مستوى الضوء.

الخطوة 1: وصف المكونات

مكونات الوصف
مكونات الوصف
مكونات الوصف
مكونات الوصف

المكونات الأساسية لجهاز المراقبة:

  • متحكم AVR «ATMEGA328P»
  • شاشة LCD رسومية أحادية اللون «NOKIA 5110»
  • الدقة القابلة للبرمجة ميزان حرارة رقمي بسلك واحد «DS18B20»
  • مقاوم يعتمد على الضوء
  • الأسلاك

متحكم AVR «ATMEGA328P»

يستخدم جهاز المراقبة الميزات الطرفية التالية لوحدة التحكم الدقيقة:

  1. عداد 16 بت / مقاطعة عداد
  2. 8 قنوات 10 بت ADC
  3. الواجهة التسلسلية للماجستير / الرقيق SPI

شاشة LCD رسومية أحادية اللون «NOKIA 5110»

تحديد:

  1. شاشة عرض LCD مقاس 48 × 84 نقطة
  2. واجهة ناقل تسلسلي بسرعة عالية قصوى تبلغ 4 ميجابت / ثانية
  3. وحدة تحكم / برنامج تشغيل داخلي «PCD8544»
  4. الاضاءة الخلفية
  5. تشغيل بجهد 2.7-5 فولت
  6. انخفاض استهلاك الطاقة انها مناسبة لتطبيقات البطارية
  7. تتراوح درجة الحرارة من -25 درجة مئوية إلى +70 درجة مئوية
  8. دعم إدخال إشارة CMOS

معالجة عنوان LCD (عنونة):

ترتيب عنوان الذاكرة الذي يظهر على شاشة LCD (DDRAM) هو المصفوفة التي تتكون من 6 صفوف (Y Address) من Y-Address 0 إلى Y-Address 5 و 84 عمودًا (X Address) من X-Address 0 إلى X- العنوان 83. إذا أراد المستخدم الوصول إلى موضع عرض النتيجة على شاشة LCD ، فيجب عليه الرجوع إلى العلاقة بين X-Address و Y-Address.

البيانات التي سيتم إرسالها للعرض هي 8 بت (1 بايت) وسيتم ترتيبها كخط عمودي ؛ في هذه الحالة ، ستكون Bit MSB أقل وستكون Bit LSB أعلى كما هو موضح في الصورة.

الدقة القابلة للبرمجة ميزان حرارة رقمي بسلك واحد DALLAS «DS18B20»

سمات:

  1. تتطلب واجهة 1-Wire® الفريدة فقط دبوس منفذ واحد للاتصال
  2. قلل عدد المكونات باستخدام مستشعر درجة الحرارة المدمج و EEPROM
  3. يقيس درجات الحرارة من -55 درجة مئوية إلى + 125 درجة مئوية (-67 درجة فهرنهايت إلى + 257 درجة فهرنهايت)
  4. دقة ± 0.5 درجة مئوية من -10 درجة مئوية إلى +85 درجة مئوية
  5. دقة قابلة للبرمجة من 9 بت إلى 12 بت
  6. لا توجد مكونات خارجية مطلوبة
  7. يتطلب وضع الطاقة الطفيلية دبابيسين فقط للتشغيل (DQ و GND)
  8. يبسط تطبيقات استشعار درجة الحرارة الموزعة مع إمكانية التقطيع المتعدد
  9. يحتوي كل جهاز على رمز تسلسلي فريد 64 بت مخزن في ذاكرة القراءة فقط
  10. تحدد إعدادات التنبيه غير المتطايرة (NV) المرنة التي يمكن تحديدها من قِبل المستخدم مع أمر بحث التنبيه الأجهزة ذات درجات الحرارة خارج الحدود المبرمجة

التطبيقات:

  1. ضوابط ثرموستاتية
  2. الأنظمة الصناعية
  3. منتجات المستهلك
  4. موازين الحرارة
  5. الأنظمة الحساسة حرارياً

مقاوم يعتمد على الضوء

المقاوم المعتمد على الضوء (LDR) هو محول الطاقة الذي يغير مقاومته عندما يتغير الضوء على سطحه.

عادةً ما يكون LDR واحدًا من ميغا أوم إلى ميغا أوم في الظلام الدامس ، من عشرة إلى عشرين كيلو أوم عند عشرة لوكس ، من اثنين إلى خمسة كيلو أوم عند 100 لوكس. تتناقص المقاومة بين جهتي اتصال المستشعر مع شدة الضوء أو زيادة التوصيل بين جهتي اتصال للمستشعر.

استخدم دائرة مقسم الجهد لتحويل التغيير في المقاومة لتغيير الجهد.

الخطوة 2: رمز البرنامج الثابت للمتحكم الدقيق

#ifndef F_CPU # حدد F_CPU 16000000UL // إخبار وحدة التحكم بتردد الكريستال (16 ميجا هرتز AVR ATMega328P) #endif

// SPI INTERFACE DEFINES #define MOSI 3 // MOSI it's PORT B، PIN 3 #define MISO 4 // MISO it's PORT B، PIN 4 #define SCK 5 // SCK it's PORT B، PIN 5 #define SS 2 // SS إنه PORT B ، PIN 2

// RESET THE DISPLAY #define RST 0 // RESET it's PORT B، PIN 0

// DISPLAY MODE SELECT - أدخل لتحديد إما الأمر / العنوان أو إدخال البيانات. #define DC 1 // DC it's PORT B ، PIN 1

// مصفوفة رموز إشارة سالبة غير موقعة char neg [4] = {0x30، 0x30، 0x30، 0x30}؛

// مجموعة رموز من الأرقام [0..9] ثابت ثابت غير موقعة char font6x8 [10] [16] = {{0xFC، 0xFE، 0xFE، 0x06، 0x06، 0xFE، 0xFE، 0xFC، 0x01، 0x03، 0x03، 0x03 ، 0x03 ، 0x03 ، 0x03 ، 0x01} ، // 0 {0x00 ، 0x00 ، 0x18 ، 0x1C ، 0xFE ، 0xFE ، 0xFC ، 0x00 ، 0x00 ، 0x00 ، 0x00 ، 0x00 ، 0x01 ، 0x03 ، 0x01 ، 0x00} ، // 1 { 0x0C، 0x8E، 0xCE، 0xE6، 0xE6، 0xBE، 0x9E، 0x0C، 0x01، 0x03، 0x03، 0x03، 0x03، 0x03، 0x03، 0x01}، // 2 {0x00، 0x04، 0x06، 0x26، 0x76، 0xFE، 0xDE ، 0x8C ، 0x00 ، 0x01 ، 0x03 ، 0x03 ، 0x03 ، 0x03 ، 0x03 ، 0x01} ، // 3 {0x3C ، 0x3E ، 0x7C ، 0x60 ، 0x60 ، 0xFC ، 0xFE ، 0xFC ، 0x00 ، 0x00 ، 0x00 ، 0x00 ، 0x00 ، 0x01 ، 0x03 ، 0x01} ، // 4 {0x1C ، 0x3E ، 0x3E ، 0x36 ، 0x36 ، 0xF6 ، 0xF6 ، 0xE4 ، 0x01 ، 0x03 ، 0x03 ، 0x03 ، 0x03 ، 0x03 ، 0x03 ، 0x01} ، // 5 {0xFC ، 0xFE ، 0xFE ، 0x36 ، 0x36 ، 0xF6 ، 0xF6 ، 0xE4 ، 0x01 ، 0x03 ، 0x03 ، 0x03 ، 0x03 ، 0x03 ، 0x03 ، 0x01} ، // 6 {0x04 ، 0x06 ، 0x06 ، 0x86 ، 0xE6 ، 0xFE ، 0x7E ، 0x1C ، 0x00 ، 0x00 ، 0x00 ، 0x01 ، 0x03 ، 0x01 ، 0x00 ، 0x00} ، // 7 {0xCC ، 0xFE ، 0xFE ، 0x36 ، 0x36 ، 0xFE ، 0xFE ، 0xCC ، 0x01 ، 0x03 ، 0x03 ، 0x03 ، 0x03 ، 0x03 ، 0 × 0 3 ، 0x01} ، // 8 {0x3C ، 0x7E ، 0x7E ، 0x66 ، 0x66 ، 0xFE ، 0xFE ، 0xFC ، 0x01 ، 0x03 ، 0x03 ، 0x03 ، 0x03 ، 0x03 ، 0x03 ، 0x01} // 9} ؛

// مجموعة رموز للكلمة "TEMP:" ثابت ثابت حرف TEMP_1 [165] = {0x02 ، 0x06 ، 0x06 ، 0xFE ، 0xFE ، 0xFE ، 0x06 ، 0x06 ، 0x02 ، 0x00 ، 0xFC ، 0xFE ، 0xFE ، 0x26 ، 0x26 ،: 0x00، 0x00، 0x00، 0x01، 0x03، 0x01، 0x00، 0x00، 0x00، 0x00، 0x01، 0x03، 0x03، 0x03، 0x03، 0x01، 0x00، 0x01، 0x03، 0x01، 0x00، 0x00، 0x00، 0x00، 0x00، 0x01، 0x03، 0x01، 0x00، 0x01، 0x03، 0x01، 0x00، 0x00، 0x00، 0x00، 0x00، 0x00، 0x01، 0x01، 0x0C، 0x1E، 0x33، 0x33، 0x1E، 0x0C، 0x00، 0xF8، 0xFC، 0x0C، 0x9C ، 0x98 ، 0x00 ، 0x00 ، 0x00 ، 0x00 ، 0x00 ، 0x00 ، 0x00 ، 0x01 ، 0x03 ، 0x03 ، 0x03 ، 0x01 ،} ؛

// مجموعة رموز للكلمة "LUX:" const أحرف غير موقعة TEMP_2 [60] = {0xFC ، 0xFE ، 0xFC ، 0x00 ، 0x00 ، 0x00 ، 0x00 ، 0x00 ، 0x00 ، 0xFC ، 0xFE ، 0xFC ، 0x00 ، 0x00 ، 0xFC ، 0xFE ، 0xFC ، 0x00 ، 0x04 ، 0x8E ، 0xDE ، 0xFC ، 0xF8 ، 0xFC ، 0xDE ، 0x8E ، 0x04 ، 0x00 ، 0x8C ، 0x8C ، 0x01 ، 0x03 ، 0x03 ، 0x03 ، 0x03 ، 0x03 ، 0x03 ، 0x01 ، 0x00 ، 0x01 ، 0x03 ، 0x03 ، 0x03 ، 0x03 ، 0x03 ، 0x03 ، 0x01 ، 0x00 ، 0x01 ، 0x03 ، 0x03 ، 0x01 ، 0x00 ، 0x01 ، 0x03 ، 0x03 ، 0x01 ، 0x00 ، 0x01 ، 0x01} ؛

#يشمل

# تضمين # تضمين

// Port Initializationvoid Port_Init () {DDRB = (1 << MOSI) | (1 << SCK) | (1 << SS) | (1 << RST) | (1 << DC) ؛ // Set MOSI ، SCK ، SS ، RST ، DC كإخراج ، كل المدخلات الأخرى PORTB | = (1 << RST) ؛ // تعيين دبوس RST على ارتفاع PORTB | = (1 << SS) ؛ // تعيين SS pin على ارتفاع - العرض هو تعطيل DDRC = 0xFFu ؛ // تعيين كافة دبابيس PORTC كإخراج. DDRC & = ~ (1 << 0) ؛ // يجعل أول دبوس من PORTC كـ Input PORTC = 0x00u ؛ // ضبط جميع دبابيس PORTC منخفضة مما يؤدي إلى إيقاف تشغيله. }

// ADC Initialization void ADC_init () {// Enable ADC، sampling freq = osc_freq / 128 set prescaler to max value، 128 ADCSRA | = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0) ؛ ADMUX = (1 << REFS0) ؛ // حدد مرجع الجهد لـ ADC // حدد القناة صفر افتراضيًا باستخدام سجل ADC Multiplexer Select (ADC0). }

// وظيفة لقراءة نتيجة التحويل التناظري إلى الرقمي uint16_t get_LightLevel () {_delay_ms (10) ؛ // انتظر بعض الوقت حتى يتم تحديد القناة ADCSRA | = (1 << ADSC) ؛ // ابدأ تحويل ADC عن طريق ضبط بت ADSC. اكتب 1 إلى ADSC بينما (ADCSRA & (1 << ADSC)) ؛ // انتظر حتى يكتمل التحويل // يصبح ADSC 0 مرة أخرى حتى ذلك الحين ، تشغيل حلقة مستمرة _delay_ms (10) ؛ العودة (ADC) ؛ // إرجاع نتيجة 10 بت}

// SPI Initialization void SPI_Init () {SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR0)؛ // Enable SPI، Set as Master، Set Prescaler as Fosc / 16 in SPI control تسجيل }

// تهيئة 16 بت Timer1 ، المقاطعة والمتغير الفراغ TIMER1_init () {// إعداد المؤقت باستخدام مقياس مسبق = 256 ووضع CTC TCCR1B | = (1 << WGM12) | (1 << CS12) ؛ // تهيئة العداد TCNT1 = 0 ؛ // تهيئة قيمة المقارنة - 1 ثانية OCR1A = 62500 ؛ // تمكين مقارنة المقاطعة TIMSK1 | = (1 << OCIE1A) ؛ // تمكين المقاطعات العالمية sei () ؛ }

// Display Enable void SPI_SS_Enable () {PORTB & = ~ (1 << SS) ؛ // تمكين SS pin to logic 0}

// Display Disable void SPI_SS_Disable () {PORTB | = (1 << SS) ؛ // تعطيل SS pin to logic 1}

// وظيفة لإرسال البيانات إلى SPI_Tranceiver باطل المخزن المؤقت (بيانات char غير الموقعة) {SPDR = data ؛ // تحميل البيانات في المخزن المؤقت أثناء (! (SPSR & (1 << SPIF))) ؛ // انتظر حتى اكتمال الإرسال}

// إعادة ضبط العرض في بداية فراغ التهيئة Display_Reset () {PORTB & = ~ (1 << RST) ؛ _delay_ms (100) ؛ بورتب | = (1 << RST) ، }

// أمر الكتابة باطل Display_Cmnd (بيانات char غير الموقعة) {PORTB & = ~ (1 << DC) ؛ // قم بعمل دبوس DC إلى المنطق 0 لعملية الأمر SPI_Tranceiver (البيانات) ؛ // إرسال البيانات على سجل البيانات PORTB | = (1 << DC) ؛ // جعل دبوس DC إلى منطق مرتفع لتشغيل البيانات}

// تهيئة عرض باطل Display_init () {Display_Reset () ؛ // إعادة تعيين العرض Display_Cmnd (0x21) ؛ // تعيين الأمر في وضع الإضافة Display_Cmnd (0xC0) ؛ // اضبط الجهد بإرسال C0 يعني VOP = 5V Display_Cmnd (0x07) ؛ // ضبط درجة الحرارة. معامل إلى 3 Display_Cmnd (0x13) ؛ // مجموعة قيمة Display_Cmnd لنظام التحيز للجهد (0x20) ؛ // تعيين الأمر في الوضع الأساسي Display_Cmnd (0x0C) ؛ // عرض النتيجة في الوضع العادي}

// امسح باطل العرض Display_Clear () {PORTB | = (1 << DC) ؛ // اجعل طرف DC إلى المنطق مرتفعًا لتشغيل البيانات لـ (int k = 0 ؛ k <= 503 ؛ k ++) {SPI_Tranceiver (0x00) ؛} PORTB & = ~ (1 << DC) ؛ // جعل دبوس DC إلى منطق صفر لعملية الأمر}

// اضبط العمود والصف على موضع عرض النتيجة على شاشة عرض LCD باطلة Display_SetXY (حرف x غير مُوقَّع ، حرف غير مُوقَّع) {Display_Cmnd (0x80 | x) ؛ // عمود (0-83) Display_Cmnd (0x40 | ص) ؛ // صف (0-5)}

// وظيفة لعرض باطل الإشارة السالبة Display_Neg (حرف غير موقّع) {Display_SetXY (41، 0) ؛ // قم بتعيين عنوان الموضع المعروض لـ (int index = 0 ؛ index0) {SPDR = 0x30 ؛} // تحميل البيانات في المخزن المؤقت للعرض (عرض العلامة السلبية) وإلا {SPDR = 0x00 ؛} // تحميل البيانات في المخزن المؤقت للعرض (إشارة سلبية واضحة) بينما (! (SPSR & (1 << SPIF))) ؛ // انتظر حتى يكتمل الإرسال _delay_ms (100) ؛ }}

// Function to clear the digital sign void Off_Dig (char x غير الموقعة، char y غير الموقعة) {Display_SetXY (x، y)؛ // تعيين عنوان الموضع على الشاشة (الصف العلوي) لـ (int index = 0؛ index <8؛ index ++) {SPI_Tranceiver (0)؛} // تحميل البيانات في المخزن المؤقت للعرض (امسح الجزء العلوي من العلامة الرقمية) ذ ++ ؛ Display_SetXY (x، y)؛ // تعيين عنوان الموضع على الشاشة (الصف السفلي) لـ (int index = 0؛ index <8؛ index ++) {SPI_Tranceiver (0)؛} // تحميل البيانات في المخزن المؤقت للعرض (مسح الجزء السفلي من العلامة الرقمية)}

// وظيفة لعرض فراغ الإشارة الرقمية Display_Dig (int dig ، غير موقعة char x ، غير موقعة char y) {Display_SetXY (x ، y) ؛ // تعيين عنوان الموضع المعروض (الصف العلوي) لـ (int index = 0 ؛ index <16؛ index ++) {if (index == 8) {y ++؛ Display_SetXY (x، y)؛} // تعيين عنوان الموضع على الشاشة (الصف السفلي) SPI_Tranceiver (font6x8 [dig] [index]) ؛ // تحميل مجموعة رموز من بيانات الأرقام في المخزن المؤقت للعرض _delay_ms (10) ؛ }}

// تهيئة DS18B20 حرف غير موقّع DS18B20_init () {DDRD | = (1 << 2) ؛ // تعيين دبوس PD2 من PORTD كإخراج PORTD & = ~ (1 << 2) ؛ // تعيين PD2 pin منخفض _delay_us (490) ؛ // توقيت التهيئة DDRD & = ~ (1 << 2) ؛ // تعيين دبوس PD2 من PORTD كمدخل _delay_us (68) ؛ // التوقيت OK_Flag = (PIND & (1 << 2)) ؛ // get sensor pulse _delay_us (422) ؛ إرجاع OK_Flag ؛ // return 0-ok sensor is plug، 1-error sensor is unplug}

// وظيفة لقراءة البايت من DS18B20 char غير موقعة read_18b20 () {unsigned char i، data = 0؛ لـ (i = 0 ؛ i <8 ؛ i ++) {DDRD | = (1 << 2) ؛ // تعيين دبوس PD2 من PORTD كإخراج _delay_us (2) ؛ // Timing DDRD & = ~ (1 1 ؛ // البتة التالية إذا (PIND & (1 << 2)) البيانات | = 0x80 ؛ // وضع البتة في البايت _delay_us (62) ؛} إرجاع البيانات ؛}

// وظيفة لكتابة بايت إلى DS18B20 void write_18b20 (بيانات char غير الموقعة) {unsigned char i؛ لـ (i = 0 ؛ i <8 ؛ i ++) {DDRD | = (1 << 2) ؛ // تعيين دبوس PD2 من PORTD كإخراج _delay_us (2) ؛ // التوقيت إذا (البيانات & 0x01) DDRD & = ~ (1 << 2) ؛ // إذا أردنا كتابة 1 ، فقم بتحرير السطر الآخر DDRD | = (1 1 ؛ // البتة التالية _delay_us (62) ؛ // Timing DDRD & = ~ (1 << 2) ؛ // تعيين PD2 دبوس من PORTD كمدخل _delay_us (2) ؛}}

// وظيفة لعرض مستوى الضوء باطل Read_Lux () {uint16_t buffer ؛ غير موقعة int temp_int_1 ، temp_int_2 ، temp_int_3 ، temp_int_0 ؛ // أرقام مفردة ، أرقام مزدوجة ، أرقام ثلاثية ، مخزن مؤقت بأربعة أرقام = get_LightLevel () ؛ // قراءة نتيجة التحويل التناظري إلى الرقمي مستوى الضوء temp_int_0 = المخزن المؤقت ٪ 10000/1000 ؛ // ربع رقم temp_int_1 = المخزن المؤقت٪ 1000/100 ؛ // ثلاثي الأرقام temp_int_2 = المخزن المؤقت٪ 100/10 ؛ // مزدوج الرقم temp_int_3 = المخزن المؤقت٪ 10 ؛ // رقم مفرد إذا (temp_int_0> 0) // إذا كانت النتيجة رقم ربع رقم {Display_Dig (temp_int_0، 32، 2)؛ // عرض رقم واحد من مستوى الضوء Display_Dig (temp_int_1 ، 41 ، 2) ؛ // عرض رقمين من مستوى الضوء Display_Dig (temp_int_2 ، 50 ، 2) ؛ // عرض 3 أرقام من مستوى الضوء Display_Dig (temp_int_3 ، 59 ، 2) ؛ // عرض 4 أرقام من مستوى الضوء} else {if (temp_int_1> 0) // إذا كانت النتيجة عبارة عن رقم مكون من ثلاثة أرقام {Off_Dig (32، 2)؛ // مسح 1 علامة رقم Display_Dig (temp_int_1 ، 41 ، 2) ؛ // عرض رقم واحد من مستوى الضوء Display_Dig (temp_int_2 ، 50 ، 2) ؛ // عرض رقمين من مستوى الضوء Display_Dig (temp_int_3 ، 59 ، 2) ؛ // عرض 3 أرقام من مستوى الضوء} else {if (temp_int_2> 0) // إذا كانت النتيجة رقمًا مزدوجًا {Off_Dig (32، 2)؛ // مسح 1 علامة من الرقم Off_Dig (41 ، 2) ؛ // مسح 2 علامة رقم Display_Dig (temp_int_2 ، 50 ، 2) ؛ // عرض رقم واحد من مستوى الضوء Display_Dig (temp_int_3، 59، 2) ؛ // عرض رقمين من مستوى الضوء} آخر // إذا كانت النتيجة رقمًا واحدًا {Off_Dig (32، 2)؛ // مسح 1 علامة من الرقم Off_Dig (41 ، 2) ؛ // مسح 2 علامة من الرقم Off_Dig (50 ، 2) ؛ // مسح 3 علامة من رقم Display_Dig (temp_int_3 ، 59 ، 2) ؛ // عرض رقم واحد من مستوى الضوء}}}}

// وظيفة لعرض درجة حرارة الفراغ Read_Temp () {عازلة int غير موقعة ؛ غير موقعة int temp_int_1 ، temp_int_2 ، temp_int_3 ؛ // أرقام مفردة ، أرقام مزدوجة ، أرقام ثلاثية ، ربع أرقام غير موقعة char Temp_H ، Temp_L ، OK_Flag ، temp_flag ؛ DS18B20_init () ، // تهيئة DS18B20 write_18b20 (0xCC) ؛ // تحقق من رمز المستشعر write_18b20 (0x44) ؛ // بدء تحويل درجة الحرارة _delay_ms (1000) ؛ // تأخير استطلاع الاستشعار DS18B20_init () ؛ // تهيئة DS18B20 write_18b20 (0xCC) ؛ // تحقق من رمز المستشعر write_18b20 (0xBE) ؛ // الأمر لقراءة محتويات Sensor RAM Temp_L = read_18b20 () ؛ // قراءة أول اثنين بايت Temp_H = read_18b20 () ؛ temp_flag = 1 ؛ // 1-درجة حرارة موجبة ، 0 درجة حرارة سالبة // احصل على درجة حرارة سالبة إذا (Temp_H & (1 << 3)) // Sign Bit Check (إذا تم ضبط البت - درجة حرارة سالبة) {موقع int temp؛ temp_flag = 0 ؛ // تم ضبط العلم على 0 - درجة الحرارة السالبة = (Temp_H << 8) | Temp_L ؛ درجة الحرارة = -temp ؛ // تحويل الكود الإضافي في Temp_L المباشر = temp ؛ Temp_H = temp >> 8 ؛ } المخزن المؤقت = ((Temp_H 4) ؛ temp_int_1 = المخزن المؤقت٪ 1000/100 ؛ // ثلاثي الأرقام temp_int_2 = المخزن المؤقت٪ 100/10 ؛ // مزدوج الرقم temp_int_3 = المخزن المؤقت٪ 10 ؛ // رقم واحد

// إذا كانت درجة الحرارة علامة عرض سلبية لدرجة الحرارة ، وإلا فقم بالوضوح

if (temp_flag == 0) {Display_Neg (1)؛} else {Display_Neg (0)؛} if (temp_int_1> 0) // إذا كانت النتيجة عبارة عن رقم مكون من ثلاثة أرقام {Display_Dig (temp_int_1، 45، 0) ؛ // عرض رقم واحد من درجة الحرارة Display_Dig (temp_int_2 ، 54 ، 0) ؛ // عرض رقمين من درجة الحرارة Display_Dig (temp_int_3 ، 63 ، 0) ؛ // عرض 3 أرقام من درجة الحرارة} else {if (temp_int_2> 0) // إذا كانت النتيجة رقمًا مزدوجًا {Off_Dig (45، 0)؛ // مسح 1 علامة رقم Display_Dig (temp_int_2 ، 54 ، 0) ؛ // عرض رقم واحد من درجة الحرارة Display_Dig (temp_int_3 ، 63 ، 0) ؛ // عرض رقمين من درجة الحرارة} else // إذا كانت النتيجة رقمًا واحدًا {Off_Dig (45، 0)؛ // مسح 1 علامة من الرقم Off_Dig (54 ، 0) ؛ // مسح 2 علامة رقم Display_Dig (temp_int_3 ، 63 ، 0) ؛ // عرض رقم واحد من درجة الحرارة}}}

// يتم تشغيل ISR عند حدوث تطابق في عدد المؤقت مع قيمة المقارنة (كل ثانية واحدة) ISR (TIMER1_COMPA_vect) {// القراءة وعرض درجة الحرارة ومستوى الضوء Read_Temp () ؛ Read_Lux () ، }

// دالة لعرض الكلمات "TEMP" و "LUX" باطلة Display_label () {// Word "TEMP" Display_SetXY (0 ، 0) ؛ // تعيين عنوان الموضع على الشاشة (الصف العلوي) لـ (int index = 0؛ index <105؛ index ++) {if (index == 40) {Display_SetXY (0، 1)؛} // تعيين عنوان الموضع على الشاشة (الصف السفلي) إذا (الفهرس == 80) {Display_SetXY (72 ، 0) ؛} // تعيين عنوان الموضع على الشاشة (الصف العلوي) إذا (الفهرس == 92) {Display_SetXY (72، 1) ؛ } // تعيين عنوان الموضع على الشاشة (الصف السفلي) SPDR = TEMP_1 [index] ؛ // تحميل بيانات صفيف الرموز في المخزن المؤقت للعرض أثناء (! (SPSR & (1 << SPIF))) ؛ // انتظر حتى يكتمل الإرسال _delay_ms (10) ؛ } // Word "LUX" Display_SetXY (0، 2) ؛ // تعيين عنوان الموضع على الشاشة (الصف العلوي) لـ (int index = 0 ؛ index <60 ؛ index ++) {if (index == 30) {Display_SetXY (0، 3)؛} // تعيين عنوان الموضع على الشاشة (الصف السفلي) SPDR = TEMP_2 [فهرس] ؛ // تحميل بيانات صفيف الرموز في المخزن المؤقت للعرض أثناء (! (SPSR & (1 << SPIF))) ؛ // انتظر حتى يكتمل الإرسال _delay_ms (10) ؛ }}

int main (باطل)

{Port_Init () ، // تهيئة المنفذ ADC_init () ؛ // تهيئة ADC SPI_Init () ؛ // SPI تهيئة SPI_SS_Enable () ؛ // عرض تمكين DS18B20_init () ؛ // تهيئة DS18B20 Display_init () ؛ // عرض التهيئة Display_Clear () ؛ // عرض واضح Display_label () ؛ // عرض الكلمات "TEMP" و "LUX" TIMER1_init () ؛ // تهيئة Timer1. ابدأ المراقبة. الحصول على المعلمات كل ثانية واحدة. // الحلقة اللانهائية (1) {}}

الخطوة 3: تفليش البرنامج الثابت إلى متحكم دقيق

تحميل ملف HEX في ذاكرة فلاش المتحكم الدقيق. شاهد الفيديو مع وصف تفصيلي لحرق ذاكرة فلاش متحكم دقيق: حرق ذاكرة فلاش متحكم دقيق …

الخطوة 4: مراقبة مجموعة دوائر الجهاز

مجموعة دائرة جهاز المراقبة
مجموعة دائرة جهاز المراقبة
مجموعة دائرة جهاز المراقبة
مجموعة دائرة جهاز المراقبة

قم بتوصيل المكونات وفقًا للرسم التخطيطي.

قم بتوصيل الطاقة وهي تعمل!

موصى به: