فهرست مطالب:

مانیتور دما و سطح نور با نمایش روی LCD NOKIA 5110: 4 مرحله
مانیتور دما و سطح نور با نمایش روی LCD NOKIA 5110: 4 مرحله

تصویری: مانیتور دما و سطح نور با نمایش روی LCD NOKIA 5110: 4 مرحله

تصویری: مانیتور دما و سطح نور با نمایش روی LCD NOKIA 5110: 4 مرحله
تصویری: نه کاری که نمیدونستی گوشیت انجام میده | 9 کاربرد مخفی گوشی 2024, جولای
Anonim
Image
Image

سلام به همگی!

در این بخش ما یک دستگاه الکترونیکی ساده برای نظارت بر دما و سطح نور می سازیم. اندازه گیری این پارامترها بر روی LCD NOKIA 5110 نمایش داده می شود. این دستگاه بر اساس میکروکنترلر AVR ATMEGA328P ساخته شده است. دستگاه مانیتورینگ مجهز به دماسنج دیجیتال DS18B20 و مقاومت در برابر نور برای اندازه گیری سطح نور است.

مرحله 1: توضیحات اجزا

توضیحات اجزاء
توضیحات اجزاء
توضیحات اجزاء
توضیحات اجزاء

اجزای اساسی دستگاه نظارت:

  • میکروکنترلر AVR «ATMEGA328P»
  • LCD گرافیکی تک رنگ «NOKIA 5110»
  • دماسنج دیجیتال رزولوشن 1 سیمی «DS18B20»
  • مقاومت وابسته به نور
  • سیم ها

میکروکنترلر AVR «ATMEGA328P»

دستگاه مانیتورینگ از ویژگی های جانبی زیر میکروکنترلر استفاده می کند:

  1. تایمر 16 بیتی/وقفه شمارنده
  2. ADC 8 کانالی 10 بیتی
  3. رابط سریال Master/slave SPI

LCD گرافیکی تک رنگ «NOKIA 5110»

مشخصات فنی:

  1. صفحه نمایش LCD 48 * 84 نقطه
  2. رابط اتوبوس سریال با حداکثر سرعت بالا 4 مگابیت بر ثانیه
  3. کنترل کننده داخلی/درایور «PCD8544»
  4. چراغ عقب LED
  5. با ولتاژ 2.7-5 ولت اجرا کنید
  6. مصرف برق کم ؛ برای برنامه های باتری مناسب است
  7. محدوده دما از -25 تا 70 درجه سانتیگراد
  8. سیگنال پشتیبانی از ورودی CMOS

مدیریت آدرس LCD (آدرس دهی):

آرایش آدرس حافظه ای که روی صفحه نمایش LCD (DDRAM) نشان داده می شود ، ماتریسی است که شامل 6 ردیف (آدرس Y) از آدرس Y تا آدرس Y تا آدرس 5 و 84 ستون (آدرس X) از آدرس X تا 0 است. آدرس 83. اگر کاربر می خواهد به موقعیت نمایش نتیجه در صفحه نمایش LCD دسترسی پیدا کند ، باید به رابطه بین آدرس X و آدرس Y مراجعه کند.

داده هایی که برای نمایش ارسال می شوند 8 بیتی (1 بایت) هستند و به صورت خط عمودی مرتب می شوند. در این حالت ، Bit MSB پایین تر و Bit LSB بالا خواهد بود همانطور که در تصویر نشان داده شده است.

دماسنج دیجیتال 1-سیم با وضوح قابل برنامه ریزی DALLAS «DS18B20»

امکانات:

  1. رابط منحصر به فرد 1-Wire® برای برقراری ارتباط فقط به یک پین پورت نیاز دارد
  2. کاهش تعداد اجزاء با سنسور دمای یکپارچه و EEPROM
  3. اندازه گیری دما از -55 تا 125 درجه سانتیگراد (-67 درجه فارنهایت تا 257 درجه فارنهایت)
  4. ± 0.5 ° C دقت از -10 ° C تا +85 ° C
  5. وضوح قابل برنامه ریزی از 9 بیت تا 12 بیت
  6. اجزای خارجی مورد نیاز نیست
  7. حالت قدرت انگلی فقط 2 پین برای عملیات نیاز دارد (DQ و GND)
  8. برنامه های سنجش درجه حرارت توزیع شده با قابلیت چند قطره را ساده می کند
  9. هر دستگاه دارای یک کد سریال 64 بیتی منحصر به فرد است که در ROM داخلی ذخیره می شود
  10. تنظیمات هشدار قابل انعطاف غیر قابل فرار (NV) قابل تنظیم توسط کاربر با فرمان جستجوی زنگ هشدار ، دستگاه های دارای دما خارج از محدودیت های برنامه ریزی شده را شناسایی می کند

برنامه های کاربردی:

  1. کنترل های ترموستاتیک
  2. سیستم های صنعتی
  3. محصولات مصرفی
  4. دماسنج ها
  5. سیستم های حساس به حرارت

مقاومت وابسته به نور

مقاومت وابسته به نور (LDR) یک مبدل است که وقتی نور روی سطح آن تغییر می کند ، مقاومت خود را تغییر می دهد.

معمولاً یک LDR از یک مگا اهم تا دو مگا اهم در تاریکی مطلق ، از ده تا بیست کیلو اهم در ده LUX ، از دو تا پنج کیلو اهم در 100 LUX خواهد داشت. مقاومت بین دو تماس سنسور با شدت نور کاهش می یابد یا رسانایی بین دو تماس سنسور افزایش می یابد.

از مدار تقسیم ولتاژ برای تبدیل تغییر مقاومت به تغییر ولتاژ استفاده کنید.

مرحله 2: کد سیستم عامل میکروکنترلر

#ifndef F_CPU #define 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 PORT B، PIN 4 #define SCK 5 // SCK it PORT B، PIN 5 #define SS 2 // SS آن PORT B ، PIN 2 است

// بازنشانی نمایشگر #تعریف RST 0 // بازنشانی پورت B ، پین 0

// DISPLAY MODE SELECT - ورودی برای انتخاب فرمان یا آدرس یا داده های ورودی. #تعریف DC 1 // DC آن PORT B ، PIN 1 است

// آرایه کدهای منفی signstatic const unsigned char neg [4] = {0x30 ، 0x30 ، 0x30 ، 0x30} ؛

// آرایه ارقام [0..9] const stat uns unsigned 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، 0x001، {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، 0x0 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، 0x24، مقدار 0x00، 0xFC، 0xFE، 0xFE، 0x1C، 0x38، 0x70، 0x38، 0x1C، 0xFE، 0xFE، 0xFC، مقدار 0x00، 0xFC، 0xFE، 0xFE، 0x66، 0x66، 0x7E، 0x7E، 0x3C، مقدار 0x00، 0x8C، 0x8C، مقدار 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 char char char 0xFC ، 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] ؛ // تنظیم MOSI ، SCK ، SS ، RST ، DC به عنوان خروجی ، همه ورودی های دیگر PORTB | = (1 << RST) ؛ // پین RST را به عنوان PORTB بالا = = (1 << SS] ؛ // تنظیم پین SS به عنوان بالا - صفحه نمایش غیر فعال کردن DDRC = 0xFFu ؛ // همه پین های PORTC را به عنوان خروجی تنظیم کنید. DDRC & = ~ (1 << 0)؛ // اولین پین PORTC را به عنوان ورودی PORTC = 0x00u ایجاد می کند ؛ // همه پین های PORTC را کم کنید که آن را خاموش می کند. }

// ADC Initialization void ADC_init () {// ADC را فعال کنید ، نمونه گیری freq = osc_freq/128 تنظیم پیش فروشنده در حداکثر مقدار ، 128 ADCSRA | = (1 << ADEN] | (1 << ADPS2] | (1 << ADPS1] | (1 << ADPS0] ؛ ADMUX = (1 << REFS0] ؛ // مرجع ولتاژ برای ADC را انتخاب کنید // به طور پیش فرض کانال صفر را با استفاده از ADC Multiplexer Select register (ADC0) انتخاب کنید. }

// تابع برای خواندن نتیجه تبدیل آنالوگ به دیجیتال uint16_t get_LightLevel () {_delay_ms (10) ؛ // مدتی منتظر بمانید تا کانال ADCSRA | = (1 << ADSC]؛ // با تنظیم بیت ADSC تبدیل ADC را شروع کنید. نوشتن 1 به ADSC در حالی که (ADCSRA & (1 << ADSC))؛ // منتظر بمانید تا تبدیل کامل شود // تا آن زمان ADSC دوباره 0 می شود ، حلقه را به طور مداوم _delay_ms (10) اجرا کنید. بازگشت (ADC) ؛ // نتیجه 10 بیتی را برگردانید}

// SPI Initialization void SPI_Init () {SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR0]؛ // فعال کردن SPI ، تنظیم به عنوان Master ، تنظیم Prescaler به عنوان Fosc/16 در کنترل SPI ثبت نام }

// مقداردهی تایمر 16 بیتی 1 ، وقفه و متغیر خالی TIMER1_init () {// تایمر را با prescaler = 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 را در منطق 0} فعال کنید

// Display Disable void SPI_SS_Disable () {PORTB | = (1 << SS)؛ // غیرفعال کردن پین SS به منطق 1}

// تابع ارسال داده ها به بافر صفحه نمایش void SPI_Tranceiver (داده های char بدون امضا) {SPDR = data؛ // داده ها را در بافر در حالی که (! (SPSR & (1 << SPIF)))) بارگذاری کنید. // منتظر بمانید تا انتقال کامل شود}

// بازنشانی نمایشگر در ابتدای راه اندازی void Display_Reset () {PORTB & = ~ (1 << RST)؛ _delay_ms (100) ؛ PORTB | = (1 << RST) ؛ }

// دستور نوشتن تابع void Display_Cmnd (داده های char بدون امضا) {PORTB & = ~ (1 << DC]؛ // پین DC را به منطق 0 برای عملیات فرمان SPI_Tranceiver (داده) تبدیل کنید. // ارسال داده ها در ثبت داده PORTB | = (1 << DC) ؛ // برای عملکرد داده ، پین DC را به منطق بالا تبدیل کنید}

// راه اندازی اولیه Display void 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] ؛ // برای عملكرد داده برای (int k = 0؛ k <= 503؛ k ++) پین DC را به منطق بالا برسانید {SPI_Tranceiver (0x00)؛} PORTB & = ~ (1 << DC]؛ // پین DC را به منطق بسازید صفر برای عملیات فرمان}

// ستون و سطر را در موقعیت نمایش نتیجه در LCD Display void Display_SetXY قرار دهید (کاراکتر بدون علامت x ، کاراکتر بدون علامت) {Display_Cmnd (0x80 | x) ؛ // ستون (0-83) Display_Cmnd (0x40 | y) ؛ // ردیف (0-5)}

// تابع برای نمایش علامت منفی void Display_Neg (char char بدون علامت) {Display_SetXY (41 ، 0) ؛ // آدرس موقعیت روی صفحه را برای (int index = 0؛ index0) {SPDR = 0x30؛} // بارگذاری داده ها در بافر نمایشگر (نمایش علامت منفی) در غیر این صورت {SPDR = 0x00؛} // بارگذاری داده ها در بافر نمایش (علامت منفی روشن) در حالی که (! (SPSR & (1 << SPIF)))) ؛ // منتظر بمانید تا انتقال کامل _delay_ms (100)؛ }}

// تابع برای پاکسازی علامت دیجیتال void Off_Dig (char char بدون علامت ، char بدون علامت y) {Display_SetXY (x ، y) ؛ // آدرس موقعیت روی صفحه (ردیف بالا) را برای (int index = 0 ؛ index <8؛ index ++) {SPI_Tranceiver (0)؛} // بارگذاری داده ها در بافر نمایشگر (پاک کردن قسمت بالای علامت دیجیتال) y ++ ؛ Display_SetXY (x ، y) ؛ // آدرس محل نمایش روی صفحه (ردیف پایینی) را برای (int index = 0 ؛ index <8؛ index ++) {SPI_Tranceiver (0)؛} // بارگذاری داده ها در بافر نمایشگر (قسمت پایینی علامت دیجیتال)}

// تابع نمایش علامت دیجیتال void 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 char بدون علامت DS18B20_init () {DDRD | = (1 << 2] ؛ // پین PD2 PORTD را به عنوان خروجی PORTD & = ~ (1 << 2)؛ // پین PD2 را پایین _delay_us (490) تنظیم کنید ؛ // زمان شروع DDRD & = ~ (1 << 2]؛ // پین PD2 PORTD را به عنوان ورودی _delay_us (68) تنظیم کنید ؛ // زمان بندی OK_Flag = (PIND & (1 << 2))؛ // دریافت پالس حسگر _delay_us (422) ؛ بازگشت OK_Flag؛ // سنسور بازگشت 0-ok پلاگین است ، سنسور خطای 1 قطع است}

// عملکرد خواندن بایت از DS18B20 char unsigned read_18b20 () {unsigned char i، data = 0؛ برای (i = 0 ؛ i <8؛ i ++) {DDRD | = (1 << 2] ؛ // پین PD2 PORTD را به عنوان خروجی _delay_us (2) تنظیم کنید ؛ // زمان بندی 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) تنظیم کنید ؛ // زمان بندی if (data & 0x01) DDRD & = ~ (1 << 2)؛ // اگر می خواهیم 1 بنویسیم ، خط دیگر DDRD | = (1 1 ؛ // بیت بعدی _delay_us (62) ؛ // زمان بندی DDRD & = ~ (1 << 2) ؛ // تنظیم PD2 پین PORTD به عنوان ورودی _delay_us (2)؛}}

// عملکرد برای نمایش سطح نور void 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؛ // تک رقمی if (temp_int_0> 0) // اگر نتیجه عدد چهار رقمی باشد {Display_Dig (temp_int_0، 32، 2)؛ // نمایش 1 رقم سطح نور Display_Dig (temp_int_1 ، 41 ، 2) ؛ // نمایش 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) ؛ // نمایش 1 رقم سطح نور Display_Dig (temp_int_2 ، 50 ، 2) ؛ // نمایش 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) ؛ // نمایش 1 رقم سطح نور Display_Dig (temp_int_3 ، 59 ، 2) ؛ // نمایش 2 رقمی از سطح نور} else // اگر نتیجه عدد تک رقمی باشد {Off_Dig (32 ، 2) ؛ // پاک کردن 1 علامت شماره Off_Dig (41 ، 2) ؛ // پاک کردن 2 علامت شماره Off_Dig (50 ، 2) ؛ // پاک کردن علامت 3 از عدد Display_Dig (temp_int_3 ، 59 ، 2) ؛ // نمایش 1 رقم سطح نور}}}}

// تابع نمایش دما void Read_Temp () {unsigned int buffer؛ بدون امضای 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 (در صورت تنظیم بیت-دمای منفی) {sign int temp؛ temp_flag = 0؛ // پرچم 0 تنظیم شده است - دمای منفی = (Temp_H << 8) | Temp_L ؛ temp = -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) // if result is three-digit number {Display_Dig (temp_int_1، 45، 0)؛ // نمایش 1 رقم دما Display_Dig (temp_int_2، 54، 0)؛ // نمایش 2 رقمی دما 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) ؛ // نمایش 1 رقم دما Display_Dig (temp_int_3، 63، 0)؛ // نمایش 2 رقم دما} else // اگر نتیجه عدد تک رقمی باشد {Off_Dig (45، 0)؛ // پاک کردن 1 علامت شماره Off_Dig (54 ، 0) ؛ // پاک کردن علامت 2 از شماره Display_Dig (temp_int_3 ، 63 ، 0) ؛ // نمایش 1 رقم دما}}}

// این ISR هر زمان که تعداد شمارش تایمر با مقدار مقایسه (هر 1 ثانیه) ISR (TIMER1_COMPA_vect) {// خواندن ، نمایش دما و سطح نور Read_Temp () روشن می شود ، روشن می شود. Read_Lux ()؛ }

// عملکرد نمایش کلمات "TEMP" و "LUX" void Display_label () {// Word "TEMP" Display_SetXY (0، 0)؛ // آدرس موقعیت روی صفحه (ردیف بالا) را برای (int index = 0؛ index <105؛ index ++) {if (index == 40) {Display_SetXY (0، 1)؛} // تنظیم آدرس موقعیت در صفحه نمایش (ردیف پایینی) if (index == 80) {Display_SetXY (72 ، 0)؛} // آدرس موقعیت روی صفحه (بالا ردیف) if (index == 92) {Display_SetXY (72 ، 1) ؛ } // تنظیم آدرس موقعیت روی صفحه (ردیف پایین) SPDR = TEMP_1 [index]؛ // بارگذاری داده های آرایه کدها در بافر نمایش در حالی که (! (SPSR & (1 << SPIF))))؛ // منتظر بمانید تا انتقال کامل _delay_ms (10)؛ } // کلمه "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 ()؛ // Port Initialization ADC_init ()؛ // ADC Initialization SPI_Init ()؛ // SPI Initialization SPI_SS_Enable ()؛ // نمایش فعال کردن DS18B20_init ()؛ // راه اندازی DS18B20 Display_init ()؛ // مقداردهی اولیه Display_Clear ()؛ // نمایش روشن Display_label ()؛ // نمایش کلمات "TEMP" و "LUX" TIMER1_init ()؛ // Timer1 Initialization. نظارت را شروع کنید. دریافت پارامترها در هر ثانیه // حلقه بی نهایت در حالی که (1) {}}

مرحله 3: فلش کردن سیستم عامل به میکروکنترلر

بارگذاری فایل HEX در حافظه فلش میکروکنترلر. ویدیو را با شرح مفصل در مورد سوختن فلش حافظه میکروکنترلر مشاهده کنید: در حال سوختن حافظه فلش میکروکنترلر…

مرحله 4: نظارت بر مونتاژ مدار دستگاه

مونتاژ مدار دستگاه نظارت
مونتاژ مدار دستگاه نظارت
مونتاژ مدار دستگاه نظارت
مونتاژ مدار دستگاه نظارت

قطعات را مطابق نمودار شماتیک متصل کنید.

برق را وصل کنید و کار می کند!

توصیه شده: