การเชื่อมต่อ 74HC595 Serial Shift Register กับ PIC ไมโครคอนโทรลเลอร์
อิเล็กทรอนิกส์
มีความเป็นไปได้ในการออกแบบแบบฝังที่คุณมีพิน I / O ไม่เพียงพอในไมโครคอนโทรลเลอร์ อาจเป็นเพราะแอพพลิเคชั่นของคุณอาจต้องการ LED หลายอันหรือคุณต้องการใช้จอแสดงผล 7 เซกเมนต์หลายตัวแต่คุณไม่จำเป็นต้องใช้หมุด I / O ในไมโครคอนโทรลเลอร์ ที่นี่มาเป็นองค์ประกอบที่สมบูรณ์แบบลงทะเบียนเปลี่ยนแปลง Shift register ยอมรับข้อมูลอนุกรมและให้เอาต์พุตขนาน มันต้องมีเพียง3 ขาเพื่อเชื่อมต่อกับไมโครคอนโทรลเลอร์ของคุณและคุณจะได้รับมากกว่า8 พินเอาท์พุทจากมัน หนึ่งของการลงทะเบียนการเปลี่ยนแปลงที่เป็นที่นิยม74HC595 มันมีการลงทะเบียนการจัดเก็บข้อมูล 8 บิตและ8 บิตกะลงทะเบียน เรียนรู้เพิ่มเติมเกี่ยวกับการเปลี่ยนแปลงการลงทะเบียนที่นี่
คุณจะให้ข้อมูลอนุกรมกับ shift register และมันจะถูกlatchedบน register register จากนั้น storage register จะควบคุม 8 เอาต์พุต หากคุณต้องการเอาต์พุตเพิ่มเพียงเพิ่ม shift register ตัวอื่น โดยซ้อนสองกะลงทะเบียนคุณจะได้รับอีก 8 เอาท์พุทเอาท์พุท 16bit ทั้งหมด
ลงทะเบียนกะ 74HC595:
นี่คือแผนภาพ pin out ของ74HC595ตามแผ่นข้อมูล -
HC595 มี 16 พิน ถ้าเราเห็นแผ่นข้อมูลเราจะเข้าใจฟังก์ชั่นพิน -
QA เพื่อ QHจากหมายเลข PIN 1-7 และ 15ใช้เป็นเอาท์พุทบิต 8จากการลงทะเบียนการเปลี่ยนแปลงที่เป็นขา 14ถูกนำมาใช้สำหรับการรับข้อมูลแบบอนุกรม นอกจากนี้ยังมีตารางความจริงเกี่ยวกับวิธีการใช้พินอื่น ๆ และประโยชน์อื่น ๆ ของการลงทะเบียนกะ
เมื่อเราเขียนรหัสเพื่อเชื่อมต่อ74HC595เราจะใช้ตารางความจริงนี้เพื่อรับเอาท์พุทที่ต้องการ
ตอนนี้เราจะเชื่อมต่อ 74HC595 กับ PIC16F877A และควบคุมไฟ LED 8 ดวง เราได้ทำการเชื่อมโยงการลงทะเบียนการเปลี่ยนแปลง 74HC595 กับไมโครคอนโทรลเลอร์อื่น ๆ :
- การเชื่อมต่อ 74HC595 Serial Shift Register กับ Raspberry Pi
- จะใช้ Shift Register 74HC595 กับ Arduino Uno ได้อย่างไร
- เชื่อมต่อ LCD กับ NodeMCU โดยใช้ shift register
ส่วนประกอบที่จำเป็น:
- PIC16F877A
- 2 ชิ้น 33pF ตัวเก็บประจุแผ่นเซรามิก
- คริสตัล 20MHz
- ตัวต้านทาน 4.7k
- ไฟ LED 8 ชิ้น
- 1k ตัวต้านทาน -1 ชิ้น (8 ชิ้นจำเป็นต้องมีตัวต้านทาน 1k หากตัวต้านทานแยกกันในแต่ละไฟ LED จำเป็น)
- ไอซี 74HC595
- อะแดปเตอร์ติดผนัง 5V
- สภาพแวดล้อมการเขียนโปรแกรม PIC
- เขียงหั่นขนมและสายไฟ
แผนภูมิวงจรรวม:
ในแผนภาพวงจรเราได้เชื่อมต่อขาข้อมูลอนุกรม เข็มนาฬิกาและแฟลช (สลัก) ที่ขาของไมโครคอนโทรลเลอร์RB0, RB1 และ RB2ตามลำดับ ที่นี่เราใช้ตัวต้านทานหนึ่งตัวสำหรับ LED 8 ดวง ตามตารางความจริงเราเปิดใช้งานเอาต์พุตโดยเชื่อมต่อพิน 13 จาก 74HC595 กับกราวด์ QHขาเปิดทิ้งไว้ในขณะที่เราจะไม่น้ำตกอีก74HC595กับมัน เราปิดใช้งานการตั้งค่าสถานะการป้อนข้อมูลที่ชัดเจนโดยการเชื่อมต่อพิน 10 ของการลงทะเบียนกะกับ VCC
Crystal oscillator เชื่อมต่อกับพิน OSC ของไมโครคอนโทรลเลอร์ PIC16F877A ไม่มีออสซิลเลเตอร์ภายในในโครงการนี้เราจะสว่างขึ้นหนึ่งนำโดยหนึ่งจากQ0 เพื่อ Q7 ใช้ regitster
เราได้สร้างวงจรใน breadboard-
คำอธิบายรหัส:
รหัสที่สมบูรณ์สำหรับการควบคุมไฟ LED พร้อม shift register ให้ไว้ที่ท้ายบทความ และเช่นเคยเราจำเป็นต้อง ตั้งค่าบิตการกำหนดค่าในไมโครคอนโทรลเลอร์ของ PIC
#pragma config FOSC = HS // บิตตัวเลือก Oscillator (HS oscillator) #pragma config WDTE = ปิด // ตัวจับเวลา Watchdog เปิดใช้งานบิต (ปิดใช้งาน WDT) #pragma config PWRTE = ปิด // ตัวจับเวลาเปิดใช้งานพลังงาน (ปิด PWRT) # pragma config BOREN = ON // รีเซ็ต Brown-out เปิดใช้งานบิต (เปิดใช้งาน BOR) #pragma config LVP = OFF // แรงดันไฟฟ้าต่ำ (Single-Supply) การเขียนโปรแกรมแบบอนุกรมในวงจรเปิดใช้งานบิต (พิน RB3 / PGM มีฟังก์ชั่น PGM ต่ำ เปิดใช้งานการเขียนโปรแกรมไฟฟ้าแรงสูง) #pragma config CPD = ปิด // ข้อมูล EEPROM บิตการป้องกันรหัสหน่วยความจำ (การป้องกันรหัสข้อมูล EEPROM ปิด) #pragma config WRT = ปิด // โปรแกรมแฟลชเขียนหน่วยความจำเปิดใช้งานบิต (ป้องกันการเขียนออก เขียนโดย EECON control) #pragma config CP = OFF // Flash โปรแกรมการป้องกันโค้ดหน่วยความจำบิต (การป้องกันโค้ดปิด)
หลังจากที่เราประกาศความถี่คริสตัลซึ่งเป็นสิ่งจำเป็นสำหรับความล่าช้าและการประกาศขาออกสำหรับ74HC595
#include <xc.h> / * คำจำกัดความที่เกี่ยวข้องกับฮาร์ดแวร์ * / #define _XTAL_FREQ 20000000 // ความถี่คริสตัลที่ใช้ในการหน่วง #define DATA_595 PORTBbits.RB0 #define STROBE_595 PORTBbits.RB1 #define CLK_595 PORTBbits
ต่อไปเราประกาศฟังก์ชั่นsystem_init ()เพื่อเริ่มต้นทิศทางพิน
เป็นโมฆะ system_init (เป็นโมฆะ) { TRISB = 0x00; }
เราสร้างพัลส์นาฬิกาและพัลส์ล็อคโดยใช้ฟังก์ชั่นที่แตกต่างกันสองแบบ
/ * * ฟังก์ชั่นนี้จะเปิดใช้งานนาฬิกา * / void clock (void) { CLK_595 = 1; __delay_us (500); CLK_595 = 0; __delay_us (500); }
และ
/ * * ฟังก์ชั่นนี้จะใช้แฟลชและเปิดใช้งานทริกเกอร์เอาท์พุท * / void strobe (void) { STROBE_595 = 1; __delay_us (500); STROBE_595 = 0; }
หลังจากนี้ทั้งสองฟังก์ชั่นที่เราประกาศdata_submit (ข้อมูล int ไม่ได้ลงนาม)ฟังก์ชั่นในการส่งข้อมูลแบบอนุกรมกับ74HC595
เป็นโมฆะ data_submit (ข้อมูล int ที่ไม่ได้ลงชื่อ) { สำหรับ (int i = 0; i <8; i ++) { DATA_595 = (data >> i) & 0x01; นาฬิกา(); } strobe (); // ส่งข้อมูลแล้ว }
ในฟังก์ชั่นนี้เรารับข้อมูล 8 บิตและส่งแต่ละบิตโดยใช้ตัวดำเนินการสองบิตซ้ายเลื่อนและและตัวดำเนินการ ครั้งแรกที่เราเปลี่ยนข้อมูลหนึ่งโดยหนึ่งและหาบิตที่แน่นอนไม่ว่าจะเป็น 0 หรือ 1 ใช้และผู้ประกอบการที่มี 0x01แต่ละข้อมูลจะถูกจัดเก็บโดยพัลส์นาฬิกาและส่งออกข้อมูลสุดท้ายทำได้โดยใช้สลักหรือแฟลชชีพจร ในขั้นตอนนี้ส่งออกข้อมูลจะMSB (Bit ที่สำคัญที่สุด) เป็นครั้งแรก
ในฟังก์ชั่นหลักเราส่งไบนารี่และทำให้พินเอาต์พุตสูงทีละอัน
system_init (); // ระบบเตรียมพร้อม ในขณะที่ (1) { data_submit (0b00000000); __delay_ms (200); data_submit (0b10000000); __delay_ms (200); data_submit (0b01000000); __delay_ms (200); data_submit (0b00100000); __delay_ms (200); data_submit (0b00010000); __delay_ms (200); data_submit (0b00001000); __delay_ms (200); data_submit (0b00000100); __delay_ms (200); data_submit (0b00000010); __delay_ms (200); data_submit (0b00000001); __delay_ms (200); data_submit (0xFF); __delay_ms (200); } กลับมา; }
นั่นคือวิธีที่shift register สามารถใช้เพื่อรับ I / O พินได้ฟรีในไมโครคอนโทรลเลอร์ใด ๆสำหรับการเชื่อมต่อเซ็นเซอร์มากขึ้น
รหัส
/ *
* ไฟล์: main.c
* ผู้แต่ง: Sourav Gupta
* โดย: - circuitdigest.com
* สร้างเมื่อ 30 พฤษภาคม 2018, 2:26 PM
* /
* ไฟล์: main.c
* ผู้แต่ง: Sourav Gupta
* โดย: - circuitdigest.com
* สร้างเมื่อ 30 พฤษภาคม 2018, 2:26 PM
* /
// PIC16F877A การตั้งค่าบิตการกำหนดค่า
// คำสั่งการกำหนดค่าบรรทัดซอร์ส 'C'
// CONFIG
#pragma config FOSC = HS // บิตการเลือก Oscillator (HS oscillator)
#pragma config WDTE = OFF // ตัวจับเวลา Watchdog เปิดใช้งานบิต (ปิดใช้งาน WDT)
#pragma config PWRTE = OFF // ตัวจับเวลาเปิดใช้งานบิต (PWRT) ปิดใช้งาน)
#pragma config BOREN = ON // รีเซ็ต Brown-out เปิดใช้งานบิต (เปิดใช้งาน BOR)
#pragma config LVP = OFF // แรงดันไฟฟ้าต่ำ (Single-Supply) การเขียนโปรแกรมอนุกรมในวงจรเปิดใช้งานบิต (pin RB3 / PGM PGM มี PGM ฟังก์ชั่นการตั้งโปรแกรมแรงดันต่ำเปิดใช้งาน
#pragma config CPD = ปิด // ข้อมูล EEPROM บิตการป้องกันรหัสหน่วยความจำ (การป้องกันรหัส EEPROM ข้อมูลปิด)
#pragma config WRT = ปิด // โปรแกรมแฟลชหน่วยความจำเขียนเปิดใช้งานบิต (ป้องกันการเขียนออก; หน่วยความจำอาจถูกเขียนถึงโดยการควบคุม EECON)
#pragma config CP = OFF // โปรแกรมแฟลชบิตการป้องกันโค้ดหน่วยความจำ (การป้องกันโค้ดปิด)
#pragma config FOSC = HS // บิตการเลือก Oscillator (HS oscillator)
#pragma config WDTE = OFF // ตัวจับเวลา Watchdog เปิดใช้งานบิต (ปิดใช้งาน WDT)
#pragma config PWRTE = OFF // ตัวจับเวลาเปิดใช้งานบิต (PWRT) ปิดใช้งาน)
#pragma config BOREN = ON // รีเซ็ต Brown-out เปิดใช้งานบิต (เปิดใช้งาน BOR)
#pragma config LVP = OFF // แรงดันไฟฟ้าต่ำ (Single-Supply) การเขียนโปรแกรมอนุกรมในวงจรเปิดใช้งานบิต (pin RB3 / PGM PGM มี PGM ฟังก์ชั่นการตั้งโปรแกรมแรงดันต่ำเปิดใช้งาน
#pragma config CPD = ปิด // ข้อมูล EEPROM บิตการป้องกันรหัสหน่วยความจำ (การป้องกันรหัส EEPROM ข้อมูลปิด)
#pragma config WRT = ปิด // โปรแกรมแฟลชหน่วยความจำเขียนเปิดใช้งานบิต (ป้องกันการเขียนออก; หน่วยความจำอาจถูกเขียนถึงโดยการควบคุม EECON)
#pragma config CP = OFF // โปรแกรมแฟลชบิตการป้องกันโค้ดหน่วยความจำ (การป้องกันโค้ดปิด)
#include <xc.h>
/ *
คำจำกัดความที่เกี่ยวข้องกับฮาร์ดแวร์
* /
#define _XTAL_FREQ 20000000 // ความถี่คริสตัลที่ใช้ในการหน่วงเวลา
#define DATA_595 PORTBbits.RB0
#define STROBE_595 PORTBbits.RB1
#define CLK_595
PORTBbitsdits3
/ *
คำจำกัดความที่เกี่ยวข้องกับฮาร์ดแวร์
* /
#define _XTAL_FREQ 20000000 // ความถี่คริสตัลที่ใช้ในการหน่วงเวลา
#define DATA_595 PORTBbits.RB0
#define STROBE_595 PORTBbits.RB1
#define CLK_595
PORTBbitsdits3
/ *
คำจำกัดความเฉพาะอื่น ๆ
* /
void system_init (void);
คำจำกัดความเฉพาะอื่น ๆ
* /
void system_init (void);
/ *
* ฟังก์ชั่นนี้จะเปิดใช้งานนาฬิกา
* /
void clock (void) {
CLK_595 = 1;
__delay_us (500);
CLK_595 = 0;
__delay_us (500);
}
* ฟังก์ชั่นนี้จะเปิดใช้งานนาฬิกา
* /
void clock (void) {
CLK_595 = 1;
__delay_us (500);
CLK_595 = 0;
__delay_us (500);
}
/ *
* ฟังก์ชั่นนี้จะใช้แฟลชและเปิดใช้งานทริกเกอร์เอาท์พุท
* /
* ฟังก์ชั่นนี้จะใช้แฟลชและเปิดใช้งานทริกเกอร์เอาท์พุท
* /
void strobe (void) {
STROBE_595 = 1;
__delay_us (500);
STROBE_595 = 0;
}
STROBE_595 = 1;
__delay_us (500);
STROBE_595 = 0;
}
/ *
* ฟังก์ชั่นนี้จะส่งข้อมูลเพื่อเลื่อน register
* /
void data_submit (ข้อมูล int ที่ไม่ได้ลงนาม) {
สำหรับ (int i = 0; i <8; i ++ 8) {
DATA_595 = (data >> i) & 0x01;
นาฬิกา();
}
strobe (); // ส่งข้อมูลแล้ว
}
* ฟังก์ชั่นนี้จะส่งข้อมูลเพื่อเลื่อน register
* /
void data_submit (ข้อมูล int ที่ไม่ได้ลงนาม) {
สำหรับ (int i = 0; i <8; i ++ 8) {
DATA_595 = (data >> i) & 0x01;
นาฬิกา();
}
strobe (); // ส่งข้อมูลแล้ว
}
เป็นโมฆะ main (void) {
system_init (); // ระบบเตรียมพร้อม
ในขณะที่ (1) {
data_submit (0b00000000);
__delay_ms (200);
data_submit (0b10000000);
__delay_ms (200);
data_submit (0b01000000);
__delay_ms (200);
data_submit (0b00100000);
__delay_ms (200);
data_submit (0b00010000);
__delay_ms (200);
data_submit (0b00001000);
__delay_ms (200);
data_submit (0b00000100);
__delay_ms (200);
data_submit (0b00000010);
__delay_ms (200);
data_submit (0b00000001);
__delay_ms (200);
data_submit (0xFF);
__delay_ms (200);
}
กลับมา;
}
/ *
ฟังก์ชั่นนี้มีไว้สำหรับการเริ่มต้นระบบ
* /
system_init (); // ระบบเตรียมพร้อม
ในขณะที่ (1) {
data_submit (0b00000000);
__delay_ms (200);
data_submit (0b10000000);
__delay_ms (200);
data_submit (0b01000000);
__delay_ms (200);
data_submit (0b00100000);
__delay_ms (200);
data_submit (0b00010000);
__delay_ms (200);
data_submit (0b00001000);
__delay_ms (200);
data_submit (0b00000100);
__delay_ms (200);
data_submit (0b00000010);
__delay_ms (200);
data_submit (0b00000001);
__delay_ms (200);
data_submit (0xFF);
__delay_ms (200);
}
กลับมา;
}
/ *
ฟังก์ชั่นนี้มีไว้สำหรับการเริ่มต้นระบบ
* /
เป็นโมฆะ system_init (เป็นโมฆะ) {
TRISB = 0x00;
}
TRISB = 0x00;
}
วีดีโอ
ความคิดเห็น
18 มิ.ย. 2018
วันนี้ฉันทำเกือบเหมือนกัน แต่ด้วย CD4094 และการแยกวิเคราะห์เล็กน้อยฉันต้องใช้ MSB วิธีแรกเพื่อแสดง ok
คุณเลื่อนไปทางซ้ายก่อนด้วย 0 ดังนั้นอันดับแรกและการส่งคือ LSB บางทีฉันอาจไม่ถูกต้อง คุณอธิบายได้ไหม
23 มิ.ย. 2018
สวัสดีฉันอ่าน "Tuto " ของคุณแต่ฉันไม่รู้ว่าห้องสมุด"XC.h" อยู่ที่ไหน
ดังนั้นโปรดแนะนำฉัน!!
Jun 25, 2018
04 ส.ค. 2018
ฉันคิดว่ามันจะง่ายต่อการเปลี่ยนรหัสเมื่อฉันต้องการใช้ shift shift หลายตัว
คุณสามารถให้เบาะแสเกี่ยวกับวิธีการใช้หลายทะเบียน