Агуулгын хүснэгт:

NOKIA 5110: 4 алхамтай LCD дэлгэц дээр харуулсан температур ба гэрлийн түвшний хяналт
NOKIA 5110: 4 алхамтай LCD дэлгэц дээр харуулсан температур ба гэрлийн түвшний хяналт

Видео: NOKIA 5110: 4 алхамтай LCD дэлгэц дээр харуулсан температур ба гэрлийн түвшний хяналт

Видео: NOKIA 5110: 4 алхамтай LCD дэлгэц дээр харуулсан температур ба гэрлийн түвшний хяналт
Видео: debounce - bounce filtering - seribu satu jalan ke roma (Subtittled) 2024, Долдугаар сарын
Anonim
Image
Image

Бүгдээрээ сайн уу!

Энэ хэсэгт бид температур, гэрлийн түвшинг хянах энгийн электрон төхөөрөмж хийдэг. Эдгээр параметрүүдийн хэмжилтийг NOKIA 5110 LCD дэлгэц дээр харуулав. Энэхүү төхөөрөмж нь AVR ATMEGA328P микроконтроллер дээр суурилсан болно. Хяналтын төхөөрөмж нь гэрлийн түвшинг хэмжих DS18B20 дижитал термометр, фоторезистороор тоноглогдсон болно.

Алхам 1: Бүрэлдэхүүн хэсгүүдийн тайлбар

Тодорхойлолтын бүрэлдэхүүн хэсгүүд
Тодорхойлолтын бүрэлдэхүүн хэсгүүд
Тодорхойлолтын бүрэлдэхүүн хэсгүүд
Тодорхойлолтын бүрэлдэхүүн хэсгүүд

Хяналтын төхөөрөмжийн үндсэн бүрэлдэхүүн хэсгүүд:

  • AVR "ATMEGA328P" микроконтроллер
  • Monochrome Graphic LCD "NOKIA 5110"
  • Програмчлагдах нарийвчлал 1 утастай дижитал термометр "DS18B20"
  • Хөнгөн хамааралтай резистор
  • Утас

AVR "ATMEGA328P" микроконтроллер

Хяналтын төхөөрөмж нь микроконтроллерийн дараах дагалдах функцийг ашигладаг.

  1. 16 битийн таймер/тоолуурын тасалдал
  2. 8 сувгийн 10 битийн ADC
  3. Мастер/боолын SPI цуваа интерфэйс

Monochrome Graphic LCD "NOKIA 5110"

Үзүүлэлтүүд:

  1. 48 x 84 цэгийн LCD дэлгэц
  2. Цуваа автобусны интерфэйс нь хамгийн дээд хурд нь 4 Mbits/S
  3. Дотоод хянагч/жолооч "PCD8544"
  4. LED арын гэрэл
  5. 2.7-5 вольтын хүчдэл дээр ажиллуулна
  6. Бага эрчим хүчний хэрэглээ; Энэ нь батерейны хэрэглээнд тохиромжтой
  7. Температурын хүрээ -25˚С -аас +70˚С хүртэл
  8. CMOS оролтын дохиог дэмждэг

LCD хаягтай харьцах (хаяглах):

LCD дэлгэц (DDRAM) дээр харуулсан санах ойн хаягийн зохион байгуулалт нь Y хаягаас 0-ээс Y-хаягийн 5 хүртэлх 6 мөр (Y хаяг), X-хаягаас 0-ээс X хүртэлх 84 баганаас (X хаяг) бүрдэх матриц юм. Хаяг 83. Хэрэв хэрэглэгч LCD дэлгэц дээр үр дүнг харуулах байрлалд хандахыг хүсвэл X-Address ба Y-Address-ийн хамаарлыг анхаарч үзэх ёстой.

Дэлгэц рүү илгээх өгөгдөл нь 8 бит (1 байт) бөгөөд үүнийг босоо шугам хэлбэрээр байрлуулах болно; энэ тохиолдолд Bit MSB нь доод талд байх ба LSB дээр байх болно.

Програмчлагдах нарийвчлал 1 утастай дижитал термометр DALLAS «DS18B20»

Онцлог:

  1. Өвөрмөц 1-Wire® интерфэйс нь зөвхөн нэг порт холболт шаарддаг
  2. Температурын нэгдсэн мэдрэгч ба EEPROM ашиглан бүрэлдэхүүн хэсгүүдийн тоог бууруулна уу
  3. Температурыг -55 ° C -аас +125 ° C (-67 ° F -аас +257 ° F) хүртэл хэмждэг.
  4. ± 0.5 ° C -10 ° C -аас +85 ° C хүртэл нарийвчлал
  5. 9 битээс 12 бит хүртэл програмчлагдах нарийвчлал
  6. Гадаад бүрэлдэхүүн хэсэг шаардлагагүй
  7. Шимэгчдийн тэжээлийн горимд ажиллахын тулд зөвхөн 2 зүү шаардлагатай (DQ ба GND)
  8. Multidrop чадвартай температур хуваарилах програмуудыг хялбаршуулдаг
  9. Төхөөрөмж бүр ROM дээр хадгалагдсан өвөрмөц 64 битийн цуваа кодтой байдаг
  10. Хэрэглэгчээр тодорхойлогддог уян хатан бус уян хатан (NV) дохиоллын тохиргоо нь дохиолол хайх командыг ашиглан програмчлагдсан хязгаараас гадуур температуртай төхөөрөмжийг тодорхойлдог.

Хэрэглээ:

  1. Термостатик хяналт
  2. Аж үйлдвэрийн систем
  3. Хэрэглээний бүтээгдэхүүн
  4. Термометр
  5. Дулаан мэдрэмтгий систем

Хөнгөн хамааралтай резистор

Гэрлийн хамааралтай резистор (LDR) нь гадаргуу дээр гэрэл унах үед эсэргүүцлийг өөрчилдөг хувиргагч юм.

Ихэвчлэн LDR нь бүрэн харанхуйд нэг мегаОм -аас хоёр мегаОм, арван LUX -д арваас хорин килоОм, 100 LUX -д хоёроос таван килоом хүртэл байдаг. Хоёр мэдрэгчийн контактуудын хоорондох эсэргүүцэл нь гэрлийн эрч хүчээр буурдаг эсвэл мэдрэгчийн хоёр контакт хоорондын дамжуулалт нэмэгддэг.

Эсэргүүцлийн өөрчлөлтийг хүчдэлийн өөрчлөлтөөс хөрвүүлэхийн тулд хүчдэл хуваагчийн хэлхээг ашиглана уу.

Алхам 2: Микроконтроллерийн програм хангамжийн код

#ifndef F_CPU #тодорхойлох F_CPU 16000000UL // хянагчийн болор давтамжийг хэлдэг (16 MHz AVR ATMega328P) #endif

// SPI INTERFACE тодорхойлдог #MOSI 3 -ийг тодорхойлдог // MOSI бол PORT B, PIN 3 #MISO 4 -ийг тодорхойлох // MISO бол PORT B, PIN 4 #SCK 5 -ийг тодорхойлох // SCK нь PORT B, PIN 5 #SS2 -ийг тодорхойлох // SS бол PORT B, PIN 2

// Дэлгэцийг дахин тохируулах #RST 0 -ийг тодорхойлох // энэ нь PORT B, PIN 0 -ийг дахин тохируулна уу

// DISPLAY MODE SELECT - Оролт нь тушаал/хаяг эсвэл өгөгдөл оруулах сонголтыг сонгох болно. #decine DC 1 // DC нь PORT B, PIN 1 юм

// сөрөг тэмдэглэгээний const unsigned char neg [4] = {0x30, 0x30, 0x30, 0x30} кодын массив;

// тоонуудын массив код [0..9] static const 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, 0x00}, / 0x0C, 0x8E, 0xCE, 0xE6, 0xE6, 0xBE, 0x9E, 0x0C, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01}, // 2 {0x00, 0x04, 0x06, 0x06, 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, 0x03, 0x03 0xFE, 0xFE, 0x36, 0x36, 0xF6, 0xF6, 0xE4, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01}, // 6 {0x04, 0x06, 0x06, 0x86, 0x86, 0x86, 0x00, 0x00, 0x00, 0x01, 0x03, 0x01, 0x00, 0x00}, // 7 {0xCC, 0xFE, 0xFE, 0x36, 0x36, 0xFE, 0xFE, 0xCC, 0x01, 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:" гэсэн үгийн массивыг кодчилсон статик const тэмдэггүй TEMP_1 [165] = {0x02, 0x06, 0x06, 0xFE, 0xFE, 0xFE, 0x06, 0x06, 0x02, 0x00, 0xFC, 0xFE, 0xFE, 0x26, 0x26, 0x06 0x24, 0x00, 0xFC, 0xFE, 0xFE, 0x1C, 0x38, 0x70, 0x38, 0x1C, 0xFE, 0xFE, 0xFC, 0x00, 0xFC, 0xFE, 0xFE, 0x66, 0x66, 0x7x, 0x7C, 0x7C, 0x7C, 0x7E 0x00, 0x00, 0x00, 0x01, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x03, 0x01, 0x00, 0x01, 0x03, 0x01, 0x00, 0x00, 0x01 0x01, 0x03, 0x01, 0x00, 0x01, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x0C, 0x1E, 0x33, 0x33, 0x1x, 0x0C, 0x0C 0x9C, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x01,};

// "LUX:" гэсэн үгийн кодын массив 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, 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); // MOSI тохируулах, SCK, SS, RST, DC гаралт, бусад бүх хүмүүс PORTB | = (1 << RST); // RST зүүг өндөр PORTB | = (1 << SS); // SS зүүг өндөр гэж тохируулах - Дэлгэц нь DDRC = 0xFFu -г идэвхгүй болгох; // PORTC -ийн бүх зүүг гаралт болгон тохируулна уу. DDRC & = ~ (1 << 0); // PORTC -ийн эхний зүүг PORTC = 0x00u оролт болгоно; // PORTC -ийн бүх зүүг унтраа. }

// ADC эхлүүлэх void ADC_init () {// ADC -ийг идэвхжүүлээрэй, түүвэрлэлтийн freq = osc_freq/128 prescaler -ийг хамгийн их утгад тохируулна, 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 хөрвүүлэлтийг эхлүүлнэ үү. ADSC рүү 1 гэж бичих (ADCSRA & (1 << ADSC)); // хөрвүүлэлт дуусахыг хүлээнэ үү // ADSC тэр хүртэл дахин 0 болно, давталтыг тасралтгүй ажиллуулна _delay_ms (10); буцах (ADC); // 10 битийн үр дүнг буцаана уу}

// SPI эхлүүлэх void SPI_Init () {SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR0); // SPI -ийг идэвхжүүлэх, Master болгон тохируулах, SPC хяналтанд Prescaler -ийг Fosc/16 болгож тохируулах. бүртгүүлэх}

// 16 битийн Timer1 -ийг эхлүүлэх, таслах ба хувьсах void 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 SPID_SS_Disable () {PORTB | = (1 << SS); // Логик болгохын тулд SS зүүг идэвхгүй болгох 1}

// SPI_Tranceiver хоосон буфер руу өгөгдөл илгээх функц (гарын үсэг зураагүй өгөгдөл) {SPDR = өгөгдөл; // (! (SPSR & (1 << SPIF))) үед өгөгдлийг буферт ачаалах; // Дамжуулалтыг дуустал хүлээнэ үү}

// Эхлүүлэхийн эхэнд дэлгэцийг дахин тохируулах void Display_Reset () {PORTB & = ~ (1 << RST); _хойшлох_ms (100); PORTB | = (1 << RST); }

// Командын бичих функц void Display_Cmnd (тэмдэггүй char өгөгдөл) {PORTB & = ~ (1 << DC); // SPI_Tranceiver (өгөгдөл) тушаалын хувьд DC зүүг логик 0 болгох; // өгөгдлийн бүртгэлийн талаархи өгөгдлийг илгээх 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); // Voltage Bias System Display_Cmnd -ийн утгыг тохируулах (0x20); // тушаалыг Display_Cmnd (0x0C) үндсэн горимд тохируулсан; // үр дүнг хэвийн горимд харуулна}

// Дэлгэцийн хоосон байдлыг арилгах Display_Clear () {PORTB | = (1 << DC); // (int k = 0; k <= 503; k ++) {SPI_Tranceiver (0x00);} PORTB & = ~ (1 << DC); тушаалын хувьд тэг}

// багана, мөрийг үр дүнг LCD дэлгэц дээр харуулах байрлалд тохируулна уу Display_SetXY (unsigned char x, unsigned char y) {Display_Cmnd (0x80 | x); // багана (0-83) Display_Cmnd (0x40 | y); // мөр (0-5)}

// Сөрөг тэмдэг void харуулах функц Display_Neg (unsigned char neg) {Display_SetXY (41, 0); // Дэлгэц дээрх байрлалын хаягийг (int index = 0; index0) {SPDR = 0x30;} // Дэлгэцийн буферт өгөгдлийг ачаалах (сөрөг тэмдэг харуулах) өөр {SPDR = 0x00;} // Өгөгдлийг ачаалах дэлгэцийн буфер (сөрөг тэмдгийг арилгах) while (! (SPSR & (1 << SPIF)))); // Дамжуулалтыг дуустал хүлээнэ үү _delay_ms (100); }}

// Тоон тэмдгийн хүчингүй байдлыг арилгах функц Off_Dig (unsigned char x, unsigned 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);} // Дэлгэцийн буферт өгөгдлийг ачаалах (дижитал тэмдгийн доод хэсгийг цэвэрлэх)}

// Тоон тэмдгийн хүчингүй байдлыг харуулах функц Display_Dig (int dig, unsigned char x, unsigned char y) {Display_SetXY (x, y); // Дэлгэц дээрх байрлалын хаягийг (дээд мөр) (int index = 0; index <16; индекс ++) {if (index == 8) {y ++; Display_SetXY (x, y);} // Дэлгэц дээрх байрлалын хаягийг тохируулах (доод мөр) SPI_Tranceiver (font6x8 [dig] [index]); // Цифрүүдийн өгөгдлийн кодын массивыг _delay_ms (10) дэлгэцийн буферт ачаалах; }}

// DS18B20 тэмдэггүй DS18B20_init () {DDRD | = (1 << 2) тэмдэгтийг эхлүүлэх; // PORTD -ийн PD2 зүүг PORTD & = ~ (1 << 2) гаралт болгон тохируулна уу; // PD2 зүүг бага _delay_us (490) болгож тохируулах; // Эхлүүлэх цаг DDRD & = ~ (1 << 2); // PORTD -ийн PD2 зүүг _delay_us (68) оролт болгон тохируулах; // Хугацаа OK_Flag = (PIND & (1 << 2)); // мэдрэгчийн импульс авах _delay_us (422); буцах OK_Flag; // буцах 0-OK мэдрэгч залгууртай, 1 алдаатай мэдрэгч салгагдсан байна}

// DS18B20 тэмдэггүй char read_18b20 () {unsigned char i, data = 0; for (i = 0; i <8; i ++) {DDRD | = (1 << 2); // PORTD -ийн PD2 зүүг _delay_us (2) гаралт болгон тохируулах; // Хугацаа DDRD & = ~ (1 1; // Дараагийн бит бол (PIND & (1 << 2)) өгөгдөл | = 0x80; // битийг _delay_us (62);} өгөгдлийг буцааж оруулах;}

// DS18B20 -д байт бичих функц хүчингүй бичих_18b20 (гарын үсэггүй char өгөгдөл) {unsigned char i; for (i = 0; i <8; i ++) {DDRD | = (1 << 2); // PORTD -ийн PD2 зүүг _delay_us (2) гаралт болгон тохируулах; // Хугацаа (хэрэв өгөгдөл & 0x01) DDRD & = ~ (1 << 2); // хэрэв бид 1 гэж бичихийг хүсвэл өөр мөрийг суллаарай DDRD | = (1 1; // Дараагийн бит _delay_us (62); // Хугацаа DDRD & = ~ (1 << 2); // _Delay_us (2) оролт болгон PORTD;}}

// Гэрлийн түвшний хоосон байдлыг харуулах функц Read_Lux () {uint16_t буфер; гарын үсэггүй 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 оронтой тоог харуулна} өөр {if (temp_int_1> 0) // хэрэв үр дүн нь гурван оронтой тоо байвал {Off_Dig (32, 2); // Display_Dig тооны 1 тэмдгийг арилгах (temp_int_1, 41, 2); // гэрлийн түвшний 1 оронтой тоог харуулах Display_Dig (temp_int_2, 50, 2); // гэрлийн түвшний 2 оронтой тоог харуулах Display_Dig (temp_int_3, 59, 2); // гэрлийн түвшний 3 оронтой тоог харуулна} өөр {if (temp_int_2> 0) // хэрэв үр дүн нь хоёр оронтой тоо байвал {Off_Dig (32, 2); // Off_Dig (41, 2) тооны 1 тэмдгийг арилгах; // Display_Dig тооны 2 тэмдгийг арилгах (temp_int_2, 50, 2); // гэрлийн түвшний 1 оронтой тоог харуулах Display_Dig (temp_int_3, 59, 2); // гэрлийн түвшний 2 оронтой тоог харуулна} өөр // хэрэв үр дүн нь нэг оронтой тоо байвал {Off_Dig (32, 2); // Off_Dig (41, 2) тооны 1 тэмдгийг арилгах; // Off_Dig (50, 2) тооны 2 тэмдгийг арилгах; // Display_Dig тооны 3 тэмдгийг арилгах (temp_int_3, 59, 2); // гэрлийн түвшний 1 оронтой тоог харуулна}}}}

// Температурын хоосон байдлыг харуулах функц 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 бичих_18b20 (0xCC) -ийг эхлүүлэх; // Мэдрэгчийн кодыг шалгах_1_1b20 (0x44); // Температурын хөрвүүлэлтийг эхлүүлэх _delay_ms (1000); // Мэдрэгчээс санал авах хугацааг хойшлуулах DS18B20_init (); // DS18B20 бичих_18b20 (0xCC) -ийг эхлүүлэх; // Мэдрэгчийн кодыг шалгах_1_1b20 (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_L = temp болгон хөрвүүлэх; Temp_H = температур >> 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);} өөр {Display_Neg (0);} if (temp_int_1> 0) // хэрэв үр дүн нь гурван оронтой тоо байвал {Display_Dig (temp_int_1, 45, 0); // температурын 1 оронтой тоог харуулах Display_Dig (temp_int_2, 54, 0); // температурын 2 оронтой тоог харуулах Display_Dig (temp_int_3, 63, 0); // температурын 3 оронтой тоог харуулна} өөр {if (temp_int_2> 0) // хэрэв үр дүн нь хоёр оронтой тоо байвал {Off_Dig (45, 0); // Display_Dig (temp_int_2, 54, 0) тооны 1 тэмдгийг арилгах; // температурын 1 оронтой тоог харуулах Display_Dig (temp_int_3, 63, 0); // температурын 2 оронтой тоог харуулна} өөр // хэрэв үр дүн нь нэг оронтой тоо байвал {Off_Dig (45, 0); // Off_Dig (54, 0) тооны 1 тэмдгийг арилгах; // Display_Dig тооны 2 тэмдгийг арилгах (temp_int_3, 63, 0); // температурын 1 оронтой тоог харуулна}}}

// Энэ ISR нь харьцуулсан утгатай таймерын тооллогын тааралдах тохиолдол бүрт (1 секунд тутамд) 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);} // Байршлын хаягийг тохируулах дэлгэц дээр (доод мөр) if (index == 80) {Display_SetXY (72, 0);} // Дэлгэц дээрх байрлалын хаягийг тохируулна уу (дээд мөр) if (index == 92) {Display_SetXY (72, 1); } // Дэлгэц дээрх байрлалын хаягийг тохируулах (доод мөр) SPDR = TEMP_1 [индекс]; // (! (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 (); // Порт эхлүүлэх ADC_init (); // ADC эхлүүлэх SPI_Init (); // SPI эхлүүлэх SPI_SS_Enable (); // Дэлгэцийг идэвхжүүлэх DS18B20_init (); // DS18B20 Display_init () -ийг эхлүүлэх; // Дэлгэцийг эхлүүлэх Display_Clear (); // Дэлгэцийг тодорхой харуулах Display_label (); // "TEMP" ба "LUX" TIMER1_init () үгсийг харуулах; // Таймер1 эхлүүлэх. Хяналтыг эхлүүлэх. Параметрүүдийг секунд тутамд авах. // Infinity loop байхад (1) {}}

Алхам 3: Микроконтроллер руу анивчдаг програм хангамж

HEX файлыг микроконтроллерийн флаш санах ойд байршуулж байна. Микроконтроллерийн флаш санах ойн шаталтын дэлгэрэнгүй тайлбар бүхий видеог үзээрэй: Микроконтроллерийн флаш санах ой шатаж байна …

Алхам 4: Хяналтын төхөөрөмжийн хэлхээний угсралт

Хяналтын төхөөрөмжийн хэлхээний угсралт
Хяналтын төхөөрөмжийн хэлхээний угсралт
Хяналтын төхөөрөмжийн хэлхээний угсралт
Хяналтын төхөөрөмжийн хэлхээний угсралт

Схемийн дагуу бүрэлдэхүүн хэсгүүдийг холбоно уу.

Залгуурыг залгаарай, энэ нь ажиллаж байна!

Зөвлөмж болгож буй: