ในบทช่วยสอนก่อนหน้านี้เราได้เรียนรู้เกี่ยวกับการกะพริบ LED โดยใช้ไมโครคอนโทรลเลอร์ PIC และสร้างวงจรเดียวกันบนบอร์ด Perf จากนั้นเราใช้PICkit 3, ICSP และ MPLAB IPEเพื่อทิ้งโปรแกรมลงบนบอร์ด Perf ของเรา ตอนนี้ในบทช่วยสอนนี้เราจะพัฒนาตนเองไปสู่การใช้พินเพิ่มเติมบนไมโครคอนโทรลเลอร์ PIC เราจะใช้เอาต์พุต 7 ตัว (LED) และหนึ่งอินพุต สำหรับบทช่วยสอนนี้เราจะใช้บอร์ด Perf รุ่นเก่า (แสดงด้านล่าง) และจะเพิ่มแท่ง Berg เพื่อดึงหมุดที่ต้องการลงบนบอร์ด LED ตัวที่สอง ในตอนท้ายของบทช่วยสอนนี้เราจะสร้างลำดับของไฟ LED ที่กะพริบโดยใช้ไมโครคอนโทรลเลอร์ PIC PIC16F877Aและจะเรียนรู้วิธีการใช้อินพุตและเอาต์พุตหลายตัวข้อมูลพื้นฐานเกี่ยวกับการเรียกลูปและฟังก์ชัน 'สำหรับ'
บอร์ด LED ไม่มีอะไรนอกจากบอร์ด perf อีกตัวซึ่งเราจะบัดกรี LED ด้วยตัวต้านทาน จำกัด กระแส (แสดงด้านล่าง) นอกจากนี้เราจะเพิ่มปุ่มกดเพื่อเริ่มการกะพริบ LED ตามลำดับ
แผนภูมิวงจรรวม:
PIC ไมโครคอนโทรลเลอร์ PIC16F877A LED กะพริบลำดับรหัสและคำอธิบายการทำงาน:
Complete Code ได้รับด้านล่าง (ตรวจสอบในตอนท้าย) ที่นี่เราจะได้รับมันทีละบรรทัด รหัสนี้จะเริ่มติดสว่าง LED ในลักษณะตามลำดับเมื่อกดปุ่มกด เพื่อให้เข้าใจลำดับโปรดดูวิดีโอในตอนท้ายของบทช่วยสอน ฉันขอแนะนำให้คุณเปรียบเทียบผลลัพธ์ที่แสดงในวิดีโอกับโค้ดด้านล่างและพยายามทำความเข้าใจโปรแกรม
ลองดูโค้ดทีละบรรทัด สองสามบรรทัดแรกมีไว้สำหรับการตั้งค่าบิตการกำหนดค่าซึ่งอธิบายไว้ในบทช่วยสอนก่อนหน้านี้ดังนั้นฉันจึงข้ามไปก่อน วิธีที่ดีที่สุดในการทำความเข้าใจโปรแกรมใด ๆ คือการเริ่มต้นจากฟังก์ชันmain ( void main () ) ดังนั้นลองทำดู
TRISB0 = 1; // สั่ง MCU ว่าใช้ PORTB พิน 0 เป็นอินพุตสำหรับปุ่ม TRISD = 0x00; // สั่ง MCU ว่าพินทั้งหมดเป็นเอาต์พุต PORTD = 0x00; // เริ่มต้นพินทั้งหมดเป็น 0
คำว่าTRISใช้เพื่อกำหนดว่าพินถูกใช้เป็นอินพุต / เอาต์พุตหรือไม่และคำว่าPORTใช้เพื่อสร้างพินสูง / ต่ำ บรรทัด TRISB0 = 1 จะทำให้พินที่ 0 ของ PORT B เป็นอินพุต นี้จะเป็นของเราปุ่มกดเส้น TRISD = 0x00; PORTD = 0x00; จะทำให้พินทั้งหมดของพอร์ต D เป็นเอาต์พุตและกำหนดค่าเริ่มต้นของ LOW ให้กับพินเหล่านั้น
เนื่องจากเราบอกว่าใช้ B0 เป็นอินพุตเราจะเชื่อมต่อปลายด้านหนึ่งของปุ่มกดเข้ากับพิน B0 และปลายอีกด้านหนึ่งกับพื้น เมื่อใดก็ตามที่เรากดปุ่มหมุดจะถูกยึดไว้กับพื้นดังแสดงในแผนภาพการเชื่อมต่อด้านบน แต่ในการทำให้สิ่งนี้เกิดขึ้นเราต้องใช้ตัวต้านทานแบบดึงขึ้นเพื่อให้พินอยู่สูงเมื่อไม่ได้กดปุ่ม ตัวต้านทานแบบดึงขึ้นเป็นแบบนี้
แต่ PIC MCU ของเรามีตัวต้านทานแบบดึงขึ้นที่อ่อนแอภายในซึ่งสามารถเปิดใช้งานได้โดยซอฟต์แวร์ซึ่งช่วยประหยัดความยุ่งยากได้มาก (เมื่อต้องเชื่อมต่อปุ่มเพิ่มเติม)
ตัวต้านทานแบบดึงขึ้นอ่อนคืออะไร?
มีสองประเภทของการดึงขึ้นต้านทานเป็นหนึ่งอ่อนแอดึงขึ้นและอื่น ๆ ที่เป็นแรงดึงตัวต้านทานแบบดึงขึ้นที่อ่อนแอมีค่าสูงดังนั้นจึงทำให้กระแสไฟฟ้าอ่อนไหลผ่านได้และตัวต้านทานแบบดึงขึ้นที่แข็งแกร่งมีค่าต่ำจึงทำให้กระแสไฟฟ้าไหลแรงได้ MCU ทั้งหมดส่วนใหญ่ใช้ตัวต้านทานแบบดึงขึ้นที่อ่อนแอ ในการเปิดใช้งานสิ่งนี้ใน PIC MCU ของเราเราต้องดูในเอกสารข้อมูลของเราสำหรับOPTION_REG (ทะเบียนตัวเลือก) ดังที่แสดงในภาพรวมด้านล่าง
ตามที่แสดงบิต 7 เกี่ยวข้องกับตัวต้านทานแบบดึงขึ้นที่อ่อนแอ ควรทำให้เป็นศูนย์เพื่อเปิดใช้งาน นี้จะกระทำโดย OPTION_REG <7> = 0 สิ่งนี้เกี่ยวข้องโดยเฉพาะกับบิต 7 ที่ปล่อยให้บิตอื่น ๆ เป็นค่าเริ่มต้น ด้วยสิ่งนี้เราจะเข้าสู่ while loop ซึ่งจะตรวจสอบว่าปุ่มถูกกดหรือไม่โดยใช้ if (RB0 == 0) หากเงื่อนไขเป็นที่พอใจเราจะเรียกใช้ฟังก์ชันของเราด้วยพารามิเตอร์ 1, 3, 7 และ 15
sblink (1); // FUNCTION CALL 1 พร้อมพารามิเตอร์ 1 sblink (3); // FUNCTION CALL 3 พร้อมพารามิเตอร์ 3 sblink (7); // FUNCTION CALL 7 พร้อมพารามิเตอร์ 7 sblink (15); // FUNCTION CALL 4 พร้อมพารามิเตอร์ 15
ทำไมเราจึงใช้ฟังก์ชัน?
มีการใช้ฟังก์ชันเพื่อลดจำนวนบรรทัดในโค้ดของเรา นี่คือสิ่งที่พวกเราส่วนใหญ่จะรู้จัก แต่ทำไมเราต้องลดจำนวนบรรทัดโดยเฉพาะอย่างยิ่งเมื่อพูดถึงการเขียนโปรแกรม MCU เหตุผลเป็นพื้นที่ จำกัด ในหน่วยความจำโปรแกรมของเรา หากเราไม่ปรับแต่งโค้ดให้เหมาะสมเราอาจใช้พื้นที่หน่วยความจำหมด สิ่งนี้จะมีประโยชน์เมื่อเราเขียนโค้ดยาว ๆ
ฟังก์ชันใด ๆ จะมีฟังก์ชัน Definition ( sblink (int get) ในกรณีของเรา) และฟังก์ชัน Call ( sblink (1) ในกรณีของเรา) เป็นทางเลือกที่จะมีการประกาศฟังก์ชันเพื่อหลีกเลี่ยงไม่ได้ฉันได้วางนิยามฟังก์ชันของฉันไว้ก่อนที่จะเรียกฟังก์ชันดังกล่าวเป็นฟังก์ชันหลักของฉัน
พารามิเตอร์ฟังก์ชันคือค่าที่จะส่งผ่านจากการเรียกฟังก์ชันไปยังนิยามฟังก์ชัน ในกรณีของเราค่าจำนวนเต็ม (1, 3, 7, 15) คือพารามิเตอร์ที่ส่งผ่านจากการเรียกใช้ฟังก์ชันและตัวแปร "get" จะรับค่าของพารามิเตอร์ลงในนิยามฟังก์ชันเพื่อประมวลผล ฟังก์ชันสามารถมีได้มากกว่าหนึ่งพารามิเตอร์
เมื่อเรียกใช้ฟังก์ชันแล้วบรรทัดด้านล่างในนิยามฟังก์ชันจะดำเนินการ
สำหรับ (int i = 0; i <= 7 && RB0 == 0; i ++) {PORTD = get << i; // LED เลื่อนไปทางซ้าย __delay_ms (50); } สำหรับ (int i = 7; i> = 0 && RB0 == 0; i--) {PORTD = get << i; // LED เลื่อนไปทางซ้าย __delay_ms (50); }
ตอนนี้บรรทัดนี้ดูเหมือนจะแปลก: PORTD = get << i . ฉันจะอธิบายสิ่งที่เกิดขึ้นที่นี่
"<<" เป็นตัวดำเนินการเลื่อนซ้ายซึ่งจะเลื่อนบิตทั้งหมดไปที่ตำแหน่งซ้าย ตอนนี้เมื่อเราเรียก ฟังก์ชัน sblink (int get) ด้วยพารามิเตอร์ '1' เป็น sblink (1) มันจะทำให้ค่า 'get' เป็น 1 ซึ่งในไบนารีคือ 0b00000001 ดังนั้นสายนี้จะเป็นเช่น PORTD = 0b00000001 << ฉัน
ค่าของ "i" จะแตกต่างกันไปตั้งแต่ 0 ถึง 7 เนื่องจากเราใช้ 'for loop' สำหรับ (int i = 0; i <= 7 && RB0 == 0; i ++) ค่าของ 'i' อยู่ที่ 0 ถึง 7 จะเปลี่ยนผลลัพธ์ดังนี้:
อย่างที่คุณเห็นเราได้เปิดไฟ LED ทีละหนึ่งครั้ง (จากซ้ายไปขวา) โดยปิดส่วนที่เหลือไว้ 'for loop' ถัดไป สำหรับ (int i = 7; i> = 0 && RB0 == 0; i--) ก็จะทำเช่นเดียวกัน แต่คราวนี้ LED จะเปิดจากขวาไปซ้ายตามลำดับ เมื่อเราเริ่มจาก 7 และลงไปที่ 0 เราใช้การหน่วงเวลา 200ms เพื่อให้เราเห็นภาพ LED ที่เปิดและปิด
ตอนนี้เมื่อเราส่งค่า 3 ใน ฟังก์ชัน sblink (int get) ดังนั้นฟังก์ชัน sblink (3) จะถูกเรียกใช้งานซึ่งทำให้ค่าของ 'get' เป็น 0b00000011 ดังนั้นผลลัพธ์ของ PORTD จะเป็น:
ตอนนี้ไฟ LED สองดวงจะเปิดขึ้นในเวลาใดก็ได้โดยใช้ sblink (3) ในทำนองเดียวกันสำหรับ sblink (7) และ sblink (15) ไฟ LED สามและสี่ดวงจะ ติดตาม ลำดับ ครั้งนี้เสร็จสมบูรณ์เราจะทำให้ทุก LED ที่จะเกี่ยวกับการใช้เส้นPORTD = 0xFF ตรวจสอบวิดีโอด้านล่างสำหรับการสาธิตฉบับเต็ม
หวังว่าคุณจะเข้าใจรหัสและได้เรียนรู้วิธีใช้ฟังก์ชัน 'for' และ 'while' loopเพื่อให้ได้ผลลัพธ์ที่คุณต้องการ ตอนนี้คุณสามารถปรับแต่งโค้ดเพื่อให้ไฟ LED กะพริบตามลำดับที่แตกต่างกันได้ รวบรวมโค้ดของคุณและถ่ายโอนข้อมูลลงใน MCU ของคุณและเพลิดเพลินไปกับผลลัพธ์ คุณสามารถใช้ส่วนความคิดเห็นหากคุณติดขัดที่ไหนสักแห่ง ฉันได้แนบไฟล์จำลองและโปรแกรมไว้ที่นี่ด้วย
สำหรับตอนนี้ในบทช่วยสอนครั้งต่อไปเราจะเรียนรู้วิธีใช้ตัวจับเวลา PIC16F877Aแทนการใช้ฟังก์ชันหน่วงเวลา คุณสามารถเรียกดูบทแนะนำเกี่ยวกับไมโครคอนโทรลเลอร์ PIC ทั้งหมดได้ที่นี่