• 7 Segment Display Interfacing with PIC Microcontroller- Giao diện hiển thị 7 phân đoạn với Vi điều khiển PIC

QC

7 Segment Display Interfacing with PIC Microcontroller- Giao diện hiển thị 7 phân đoạn với Vi điều khiển PIC

 


Đây là hướng dẫn thứ 8 của chúng tôi về Học vi điều khiển PIC sử dụng MPLAB và XC8. Chúng tôi đã đưa ra tất cả các cách từ cài đặt MPLABX đến sử dụng màn hình LCD với PIC MCU. Nếu bạn là người mới ở đây, hãy xem các hướng dẫn trước đây, nơi bạn có thể tìm hiểu bộ hẹn giờ, đèn LED nhấp nháy, màn hình LCD giao diện, v.v. Bạn có thể tìm thấy tất cả các Hướng dẫn PIC của chúng tôi tại đây. Trong hướng dẫn cuối cùng của chúng tôi, chúng tôi đã xem cách chúng tôi có thể tạo các ký tự Tùy chỉnh với màn hình LCD 16 * 2, bây giờ chúng ta hãy tự trang bị cho mình một loại mô-đun hiển thị khác được gọi là màn hình 7 đoạn và giao diện nó với Vi điều khiển PIC.

Mặc dù màn hình LCD 16x2 thoải mái hơn nhiều so với màn hình 7 đoạn nhưng có rất ít trường hợp mà màn hình 7 đoạn sẽ thuận tiện hơn màn hình LCD. LCD có nhược điểm là có kích thước ký tự thấp và sẽ quá mức cần thiết cho dự án của bạn nếu bạn chỉ định hiển thị một số giá trị số. 7-phân đoạn cũng có lợi thế trong điều kiện ánh sáng kém và có thể được xem từ các góc độ bằng màn hình LCD thông thường. Vì vậy, chúng ta hãy bắt đầu biết nó.

7-Segment and 4-Digit 7-Segment Display Module:

7 Hiển thị phân đoạn có bảy phân đoạn trong đó và mỗi phân đoạn có một đèn LED bên trong để hiển thị các con số bằng cách chiếu sáng các phân đoạn tương ứng. Giống như nếu bạn muốn phân đoạn 7 hiển thị số "5" thì bạn cần làm phát sáng phân đoạn a, f, g, c và d bằng cách làm cao các chân tương ứng của chúng. Có hai loại màn hình 7 đoạn: Cathode chung và Anode chung, ở đây chúng tôi đang sử dụng màn hình 7 đoạn Cathode chung




Bây giờ chúng ta biết cách hiển thị ký tự số mong muốn trên một màn hình 7 đoạn. Nhưng, rõ ràng là chúng ta sẽ cần nhiều hơn một màn hình 7 phân đoạn để truyền tải bất kỳ thông tin nào có nhiều hơn một chữ số. Vì vậy, trong hướng dẫn này, chúng tôi sẽ sử dụng Mô-đun hiển thị 7 phân đoạn gồm 4 chữ số như được hiển thị bên dưới.





Như chúng ta thấy có Bốn Màn hình Bảy Phân đoạn được kết nối với nhau. Chúng tôi biết rằng mỗi mô-đun 7 đoạn sẽ có 10 chân và đối với 4 màn hình bảy đoạn sẽ có tổng cộng 40 chân và sẽ rất bận rộn cho bất kỳ ai hàn chúng trên bảng chấm, vì vậy tôi thực sự khuyên mọi người nên mua một mô-đun hoặc tạo PCB của riêng bạn để sử dụng màn hình 7 đoạn 4 chữ số. Sơ đồ kết nối cho cùng một được hiển thị bên dưới:






Để hiểu cách hoạt động của mô-đun 4 chữ số bảy phân đoạn, chúng ta phải xem xét các sơ đồ trên, như thể hiện các chân A của cả bốn màn hình được kết nối để tập hợp lại thành một A và giống nhau cho B, C .... cho đến DP. Vì vậy, về cơ bản nếu kích hoạt A được bật, thì cả bốn chữ A sẽ tăng cao phải không?

Nhưng, điều đó không xảy ra. Chúng tôi có thêm bốn chân từ D0 đến D3 (D0, D1, D2 và D3) có thể được sử dụng để điều khiển màn hình nào trong số bốn chân này sẽ tăng cao. Ví dụ: Nếu tôi cần đầu ra của mình chỉ xuất hiện trên màn hình thứ hai thì chỉ D1 nên được đặt ở mức cao trong khi giữ các chân khác (D0, D2 và D3) ở mức thấp. Đơn giản, chúng ta có thể chọn màn hình nào phải hoạt động bằng cách sử dụng các chân từ D0 đến D3 và ký tự nào sẽ được hiển thị bằng các chân từ A đến DP.

Connecting 4-Digit Seven Segment Module with PIC Microcontroller:

Ở đây chúng tôi đã sử dụng vi điều khiển PIC PIC16F877A và sơ đồ cho mạch được hiển thị bên dưới.




Chúng tôi có 12 chân đầu ra từ mô-đun, trong đó 8 chân được sử dụng để hiển thị các ký tự và bốn chân được sử dụng để chọn một hiển thị trong số bốn. Do đó, tất cả 8 chân ký tự được gán cho PORTD và các chân lựa chọn hiển thị được gán cho bốn chân đầu tiên của PORTC.

Lưu ý: Chân nối đất của mô-đun cũng phải được kết nối với đất của MCU không được hiển thị ở đây.

Programming using PIC16F877A:

Bây giờ, chúng ta đã biết mô-đun này thực sự hoạt động như thế nào, chúng ta hãy tìm hiểu cách lập trình PIC16F877A để làm cho nó hiển thị một số có 4 chữ số. Hãy để chúng tôi tăng một biến từ 0 đến 1000 và in nó trên màn hình 7 đoạn. Khởi chạy chương trình MPLABX và tạo dự án mới, chúng ta hãy bắt đầu với các bit cấu hình.

#pragma config FOSC = HS        // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON       // Power-up Timer Enable bit (PWRT enabled)
#pragma config BOREN = ON       // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF        // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF        // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF        // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)

Tiếp theo, chúng ta hãy xác định các chân đầu ra để chuyển đổi giữa mỗi chữ số của màn hình.

//***Define the signal pins of all four displays***//
#define s1 RC0
#define s2 RC1
#define s3 RC2
#define s4 RC3
//***End of definition**////

Ở đây, các chân RC0, RC1, RC2 và RC3 được sử dụng để lựa chọn giữa bốn chữ số của mô-đun hiển thị 7 đoạn của chúng tôi. Các chân này được xác định lần lượt là s1, s2, s3 và s4.

Tiếp theo, chúng ta hãy chuyển sang void main (), bên trong chúng ta có khai báo biến sau:

int i = 0; //the 4-digit value that is to be displayed
int flag =0; //for creating delay
unsigned int a,b,c,d,e,f,g,h; //just variables
unsigned int seg[]={0X3F, //Hex value to display the number 0
                    0X06, //Hex value to display the number 1
                    0X5B, //Hex value to display the number 2
                    0X4F, //Hex value to display the number 3
                    0X66, //Hex value to display the number 4
                    0X6D, //Hex value to display the number 5
                    0X7C, //Hex value to display the number 6
                    0X07, //Hex value to display the number 7
                    0X7F, //Hex value to display the number 8
                    0X6F  //Hex value to display the number 9
                   }; //End of Array for displaying numbers from 0 to 9


Ở đây, các biến i và cờ được sử dụng để lưu trữ các giá trị được hiển thị và tạo độ trễ tương ứng. Các biến số nguyên không dấu từ a đến h được sử dụng để chia các số có bốn chữ số thành các chữ số duy nhất và lưu trữ chúng (sẽ được giải thích sau ở đây).

Một điều quan trọng cần lưu ý ở đây là khai báo mảng "seg []". Trong chương trình này, chúng tôi đang sử dụng một kiểu dữ liệu mới được gọi là Array. Mảng không là gì ngoài tập hợp các giá trị kiểu dữ liệu tương tự. Ở đây, chúng tôi đã sử dụng mảng này để lưu trữ tất cả các giá trị hex tương đương để hiển thị một số từ 0 đến 9.

Địa chỉ của mảng luôn bắt đầu từ số không. Vì vậy, mảng này sẽ có giá trị hex của một số (0-9) được lưu trữ trong địa chỉ giống với địa chỉ của số như hình dưới đây

Variable:seg[0]seg[1]seg[2]seg[3]seg[4]seg[5]seg[6]seg[7]seg[8]seg[9]
Hex Code:0X3F0X060X5B0X4F0X660X6D0X7C0X070X7F0X6F
Eq. Numeric number:0123456789

Vì vậy, đơn giản, nếu bạn muốn hiển thị số 0 trên đoạn 7 của mình, bạn có thể gọi seg [0], tương tự như vậy nếu bạn muốn hiển thị số 6, bạn chỉ cần sử dụng seg [6].

Để hiểu giá trị HEX thực sự được lấy như thế nào, chúng ta hãy xem bảng dưới đây. Giá trị HEX tương đương cho mỗi số thập phân được lưu trữ trong mảng để nó có thể được gọi để hiển thị một số cụ thể.





Bây giờ, chúng ta hãy chuyển sang phần tiếp theo của mã là cấu hình I / O:


//*****I/O Configuration****//
TRISC=0X00;
PORTC=0X00;
TRISD=0x00;
PORTD=0X00;
//***End of I/O configuration**///

Cấu hình I / O rất đơn giản vì tất cả các chân trên đoạn 7 của chúng tôi là chân đầu ra và các kết nối được hiển thị trong sơ đồ mạch ở trên, vì vậy chỉ cần khai báo chúng là đầu ra và khởi tạo chúng bằng 0.

Bây giờ chúng ta hãy nhảy vào vòng lặp vô hạn của chúng ta (while (1)). Ở đây chúng ta phải chia giá trị của "i" thành bốn chữ số và hiển thị chúng trên đoạn 7. Trước tiên, chúng ta hãy bắt đầu bằng cách tách giá trị trên "i"

//***Splitting "i" into four digits***//  
a=i%10;//4th digit is saved here
b=i/10;
c=b%10;//3rd digit is saved here
d=b/10;
e=d%10; //2nd digit is saved here
f=d/10;
g=f%10; //1st digit is saved here
h=f/10;
//***End of splitting***//

Bằng cách sử dụng mô đun đơn giản và phép chia, số 4 chữ số (i) được tách thành các số riêng lẻ. Trong trường hợp của chúng ta, chúng ta hãy lấy một ví dụ trong đó giá trị của "i" là 4578. Khi kết thúc quá trình này, biến g = 4, e = 5, c = 7 và a = 8. Vì vậy, bây giờ sẽ dễ dàng hiển thị từng chữ số bằng cách sử dụng biến đó.

PORTD=seg[g];s1=1; //Turn ON display 1 and print 4th digit
__delay_ms(5);s1=0;     //Turn OFF display 1 after 5ms delay
PORTD=seg[e];s2=1; //Turn ON display 2 and print 3rd digit
__delay_ms(5);s2=0;     //Turn OFF display 2 after 5ms delay
PORTD=seg[c];s3=1; //Turn ON display 3 and print 2nd digit
__delay_ms(5);s3=0;     //Turn OFF display 3 after 5ms delay
PORTD=seg[a];s4=1; //Turn ON display 4 and print 1st digit
__delay_ms(5);s4=0;     //Turn OFF display 4 after 5ms delay

Đây là nơi thực tế mà MCU nói chuyện với 7 phân đoạn. Như chúng ta biết, chúng ta chỉ có thể hiển thị một chữ số tại một thời điểm, nhưng chúng ta có bốn chữ số được hiển thị và chỉ khi tất cả bốn chữ số đó. Trên toàn bộ số có bốn chữ số sẽ hiển thị cho người dùng.

Vì vậy, làm thế nào để chúng tôi đi với điều này?

May mắn cho chúng tôi là MCU của chúng tôi nhanh hơn mắt người rất nhiều, vì vậy những gì chúng tôi thực sự làm: chúng tôi hiển thị một chữ số tại một thời điểm nhưng chúng tôi thực hiện rất nhanh như được hiển thị ở trên.

Chúng tôi chọn hiển thị một chữ số, đợi 5ms để MCU và 7 phân đoạn có thể xử lý nó, sau đó tắt chữ số đó và chuyển sang chữ số tiếp theo và làm tương tự cho đến khi chúng ta đạt đến chữ số cuối cùng. Mắt người không thể quan sát thấy độ trễ 5ms này và tất cả bốn chữ số dường như được Bật cùng một lúc.

Vậy là xong, cuối cùng chúng ta chỉ tăng giá trị của chữ số được hiển thị bằng cách sử dụng độ trễ như hình dưới đây


if(flag>=100) //wait till flag reaches 100
{
    i++;flag=0; //only if flag is hundred "i" will be incremented 
}
flag++; //increment flag for each flash
Độ trễ được sử dụng để thời gian chuyển từ số này sang số khác đủ lâu để chúng tôi nhận thấy sự thay đổi.



Hardware Setup and Testing:

Như mọi khi, hãy để chúng tôi mô phỏng chương trình bằng Proteus trước khi chúng tôi thực sự sử dụng phần cứng của mình. Nếu mô phỏng thành công, bạn sẽ thấy một cái gì đó như thế này





Dự án này không có bất kỳ thiết lập phần cứng phức tạp nào, chúng tôi lại đang sử dụng cùng một bảng Vi điều khiển PIC mà chúng tôi đã tạo trong Hướng dẫn nhấp nháy đèn LED. Chỉ cần kết nối Mô-đun 7 đoạn với bảng Vi điều khiển PIC của bạn theo sơ đồ kết nối. Khi bạn đã hoàn tất các kết nối, chỉ cần kết xuất mã bằng cách sử dụng lập trình PicKit 3 của bạn và đó là nó tận hưởng kết quả đầu ra của bạn.




// CONFIG
#pragma config FOSC = HS        // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON       // Power-up Timer Enable bit (PWRT enabled)
#pragma config BOREN = ON       // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF        // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF        // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF        // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

#include <xc.h>

//***Define the signal pins of all four displays***//
#define s1 RC0
#define s2 RC1
#define s3 RC2
#define s4 RC3
//***End of definition**////

void main()
{
unsigned int a,b,c,d,e,f,g,h; //just variables
int i = 0; //the 4-digit value that is to be displayed
int flag =0; //for creating delay

unsigned int seg[]={0X3F, //Hex value to display the number 0
                    0X06, //Hex value to display the number 1
                    0X5B, //Hex value to display the number 2
                    0X4F, //Hex value to display the number 3
                    0X66, //Hex value to display the number 4
                    0X6D, //Hex value to display the number 5
                    0X7C, //Hex value to display the number 6
                    0X07, //Hex value to display the number 7
                    0X7F, //Hex value to display the number 8
                    0X6F  //Hex value to display the number 9
                   }; //End of Array for displaying numbers from 0 to 9

//*****I/O Configuration****//
TRISC=0X00;
PORTC=0X00;
TRISD=0x00;
PORTD=0X00;
//***End of I/O configuration**///

#define _XTAL_FREQ 20000000

while(1)
{
  //***Splitting "i" into four digits***//  
a=i%10;//4th digit is saved here
b=i/10;
c=b%10;//3rd digit is saved here
d=b/10;
e=d%10; //2nd digit is saved here
f=d/10;
g=f%10; //1st digit is saved here
h=f/10;
//***End of splitting***//

PORTD=seg[g];s1=1; //Turn ON display 1 and print 4th digit
__delay_ms(5);s1=0;     //Turn OFF display 1 after 5ms delay
PORTD=seg[e];s2=1; //Turn ON display 2 and print 3rd digit
__delay_ms(5);s2=0;     //Turn OFF display 2 after 5ms delay
PORTD=seg[c];s3=1; //Turn ON display 3 and print 2nd digit
__delay_ms(5);s3=0;     //Turn OFF display 3 after 5ms delay
PORTD=seg[a];s4=1; //Turn ON display 4 and print 1st digit
__delay_ms(5);s4=0;     //Turn OFF display 4 after 5ms delay

if(flag>=100) //wait till flag reaches 100
{
    i++;flag=0; //only if flag is hundred "i" will be incremented 
}
flag++; //increment flag for each flash
}
}








Error No module Onnx opencv

 Error No module Onnx opencv Lệnh :  pip install onnx==1.9 Mã lỗi PS F:\opencv_e\2.video> & C:/Users/youtb/Anaconda3/envs/virtualenv/...