Lập trình 8051 quét Led 7 thanh

Trong bài này chúng ta sẽ học lập trình 8051 quét led 7 thanh, đây cũng là một linh kiện rất thường gặp trong các mạch điện tử. Làm sao có thể hiển thị các số theo ý muốn, tất cả sẽ có trong bài này.

Bài 6 trong Serie Học lập trình 8051 từ A tới Z

Giới thiệu về led 7 thanh

Trong các thiết bị, để báo trạng thái hoạt động của thiết bị đó cho người sử dụng với thông số chỉ là các dãy số đơn thuần, thường người ta sử dụng “LED 7 thanh”. Chẳng hạn khi muốn hiển thị nhiệt độ phòng, hiển thị số lượng sản phẩm được kiểm tra sau một công đoạn nào đó…

 

word image 8349 1 word image 8349 2

Cấu tạo Led 7 thanh

– LED 7 thanh có cấu tạo bao gồm 7 led đơn có dạng thanh xếp theo hình dạng số 8 [dùng để biểu thị được tất cả các số từ 0 đến 9] và có thêm một led đơn hình tròn nhỏ thể hiện dấu chấm tròn ở góc dưới [dùng để biểu thị dấu thập phân].

– Do mỗi thanh là một led đơn, nên ta sẽ có 2 cách nối led. 8 led đơn trên LED 7 thanh có Anode (cực +) hoặc Cathode (cực -) được nối chung với nhau vào một điểm. Nếu LED 7 thanh có Anode (cực +) chung, điểm chung này được nối với VCC, led chỉ sáng khi tín hiệu điều khiển ở các chân điều khiển trạng thái sáng tắt của các led đơn ở mức 0. Nếu LED 7 thanh có Cathode (cực -) chung, điểm chung này được nối với Ground (hay Mass), led chỉ sáng khi tín hiệu điều khiển ở các chân điều khiển trạng thái sáng tắt của các led đơn ở mức 1.

word image 8349 3

Vì LED 7 thanh chứa bên trong các led đơn, do đó khi kết nối cần đảm bảo dòng qua mỗi led đơn trong khoảng 10mA-20mA để bảo vệ led. Nếu kết nối với nguồn 5V có thể hạn dòng bằng điện trở 330 Ohm trước các chân nhận tín hiệu điều khiển. Sơ đồ vị trí các led được trình bày như hình dưới:

 

word image 8349 4

word image 8349 5

 

Cách kết nối với vi điều khiển

Ngõ nhận tín hiệu của led 7 thanh có 8 đường, vì vậy có thể dùng 1 Port nào đó của vi điều khiển để điều khiển để điều khiển led 7 thanh . Như vậy led 7 thanh nhận một dữ liệu 8 bit từ vi điều khiển để điều khiển hoạt động của từng led đơn trong nó, dữ liệu được xuất ra điều khiển led 7 thanh được gọi là “mã hiển thị led 7 thanh”.

Có hai kiểu mã hiển thị led 7 thanh: mã dành cho led 7 thanh Anode chung và mã dành cho led 7 thanh Cathode chung. Chẳng hạn, để hiển thị số 1 cần làm cho các led ở vị trí b và c sáng, nếu sử dụng led 7 thanh có Anode chung thì phải  đặt vào hai chân b và  c điện áp 0V (mức 0), các chân còn lại phải đặt lên mức 5V (mức 1), nếu sử dụng led 7 thanh Cathode chung thì hoàn toàn ngược lại.

Nếu kết nối mỗi một Port của Vi điều khiển với 1 led 7 thanh thì tối đa kết nối được 4 led 7 thanh. Mặt khác nếu kết nối như trên sẽ hạn chế khả năng thực hiện các công việc khác của Vi điều khiển. Cho nên cần phải kết nối, điều khiển nhiều led 7 thanh với số lượng chân điều khiển từ vi điều khiển càng ít càng tốt. Có hai giải pháp: một là sử dụng các IC chuyên dụng cho việc hiển thị led 7 thanh, hai là kết nối nhiều led 7 thanh vào cùng một đường xuất tín hiệu hiển thị.

Bảng mã hiện thị LED 7 thanh

Để thuận tiện, phần cứng được kết nối với 1 Port bất kì của vi điều khiển theo thứ tự sau: Px.0 nối chân a, Px.1 nối chân b, lần lượt cho đến chân Px.7 nối chân h.

Dữ liệu xuất ra có dạng nhị phân sau: hgfedcba

Bảng mã hiển thị led 7 thanh Anode chung

word image 8349 6

 

Bảng mã hiển thị led 7 thanh Cathode chung


word image 8349 7

Phương pháp quét led 7 thanh

Quét LED 7 thanh không khó như các bạn từng nghĩ, để quét được led 7 thanh thì trong chương trình không được sử dụng delay quá cao là ok, còn muốn tạo delay một khoảng thời gian nào đó thì lên sử dụng câu điều kiện if else và 1 biến đếm.

VD:

dem++;//dem tự tăng

if(dem>time_delay){//Set khoảng thời gian cần time_delay

//code cần delay

dem=0;

}

OK, nguyên lý quét led 7 thanh như sau: Khi ta cấp điện áp vào số nào thì đồng thời dữ liệu của số cần hiển thị sẽ được xuất ra rồi cho delay nho nhỏ để nó sáng dạng xung PWM sau đó tắt led và chuyển sang số tiếp theo…v..v..

Có 2 cách quét led 7 là Quét A chung và K chung tương ứng mảng data phải ngược lại thì led 7 mới sáng dc VD: A chung thì để sáng số 0 thì ta phải xuất ra logic 0 ứng với các cạnh của số 0

Còn scan nút nhấn thì chúng ta chỉ cần sử dụng câu điều kiện kiểm tra logic là ok, thêm vòng lặp while để cho vi điều khiển không làm gì khi giữ nút.

Lập trình 8051 quét led 7 thanh

Điều khiển 1 LED 7 thanh đếm từ 0 → 9.

Để viết chương trình trên phần mềm KEIL C, chúng ta tạo một Project mới và làm tương tự như trong bài lập trình với LED đơn trước đó.

Nguyên lý hoạt động rất đơn giản:

Ở đây chúng ta đang sử dụng LED dương chung, chân dương được nối với nguồn, các chân âm của các thanh LED được nối lần lượt tử P0.0 đến P0.6

word image 8349 8

Ví dụ: chúng ta muốn hiển thị số 0 thì thanh G phải được tắt, tương ứng với chân P0.6 =1 và các chân khác đều bằng 0:

word image 8349 9

  • Kết quả mô phỏng trên Proteus:

word image 8349 10

Tương tự với các số còn lại từ 1 → 9, các bạn có thể tính toán và lập trình tương tự. Tuy nhiên nhược điểm là nó khá dài.

Chúng ta có thể sử dụng cách thứ 2: sử dụng toàn bộ cổng P0 để gán giá trị:

B1: Chọn Start/Stop Debug Session (Ctrl + F5)

word image 8349 11

B2: Chọn Peripherals →I/O-Ports. Ở đây, chúng ta kết nối với P0 nên chọn là Port 0

word image 8349 12

  • Màn hình sẽ xuất hiện một bảng:

word image 8349 13

Để hiển thị số 0, thì chỉ có P0.6 = 1, các chân còn lại bằng 0, nên ta chỉ để lại P0.6 thôi

word image 8349 14

Chúng ta để ý nhé, trong bảng có hiển thị cho chữ số Hexa:

word image 8349 15

  • Như vậy, code hiển thị số 0 của chúng ta sẽ thành:

word image 8349 16

Để hiển thị ra được lần lượt các số từ 0 đến 9, ta tiến hành lập trình như sau:

word image 8349 17

  • Tuy nhiên, code vẫn khá dài nên thông thường ta sẽ đưa các mã hex vào một mảng để quản lý cho gọn gàng hơn

Note: P0 = so[0] ; // P0 = so[0] = 0x40;

Code tương ứng

word image 8349 18

Dưới đây là chương trình điều khiển LED hiển thị từ 0 đến 9 và ngược lại:

#include <REGX51.H>

char so[] = {
  0x40,
  0x79,
  0x24,
  0x30,
  0x19,
  0x12,
  0x02,
  0x78,
  0x00,
  0x10
};

char i;

void delay(int time) {

  while (time--);

}

void main() {

  while (1) {

    for (i = 0; i <= 9; i++) {

      P0 = so[i];

      delay(30000);

    }

    delay(30000);

    for (i = 9; i >= 0; i--) {

      P0 = so[i];

      delay(30000);

    }

  }

}

 

Kỹ thuật quét led 7 thanh để điều khiển 2 LED 7 thanh đếm từ 00 → 99

Ở bài toán điều khiển LED 7 thanh chúng ta có thể áp dụng theo bài toán bước 1 nối mỗi con LED 7 thanh vào 8 chân data độc lập. Tuy nhiên việc này sẽ gây lãng phí số chân điều khiển LED và limit số LED có thể điều khiển (4 chiếc). Với số LED tăng lên đủ lớn số chân cần cũng tăng lên rất nhiều. Để giải quyết bài này có một kỹ thuật nêu ra là kỹ thuật “Quét LED”.  

Kỹ thuật Quét LED thực hiện theo nguyên tắc một thời điểm chỉ bật một LED 7 thanh với dữ liệu nó cần hiển thị, các LED còn lại được tắt. Việc quét LED thực hiện luôn phiên sáng các LED với yêu cầu trên. Có một hiện tượng hay xảy ra với những người mới thực hiện lập trình quét LED là hiện tượng “bóng ma” đó là hiện tượng xuất hiện các bóng mờ LED không mong muốn do quá trình điều khiển.

Quá trình quét LED chuẩn được thực hiện theo các bước sau:

  1. Xuất ra mã hiển thị.
  2. Cấp nguồn cho LED muốn hiển thị.
  3. Trễ 1 khoảng thời gian để duy trì sáng.
  4. Cắt nguồn LED vừa hiển thị.

Nguyên lý hoạt động: Do 2 LED được nối cùng một chân dữ liệu, khi ta xuất dữ liệu trên cổng P0 thì cả 2 LED này sẽ nhận được cùng một dữ liệu như nhau. Tuy nhiêu ta sẽ không cho 2 LED này sáng cùng một lúc, mà hai LED này sẽ được sáng luân phiên.

Ví dụ, chúng ta muốn hiển thị số 12 (số 1 ở LED 1 và số 2 ở LED 2). Muốn hiện số 1 thì ban đầu sẽ bật LED 1 sáng và tắt LED 2 đi, xuất dữ liệu ra thì LED 1 sẽ sáng lên số 1, còn LED 2 không có gì. Sau một khoảng thời gian trễ thì ta tiếp tục tắt LED 1 đi để LED 2 sáng, khi đó sẽ xuất hiện số 2 ở LED 2.

  • Như vậy, trong cùng một thời điểm thì 2 LED sẽ không sáng đồng thời (hay chỉ một LED sáng tại một thời điểm). Tuy nhiên, do hiệu ứng lưu ảnh của mắt, khi LED 1 đã tắt đi rồi nhưng mắt vẫn còn lưu lại hình ảnh của nó, nên khi LED 2 bật lên, chúng ta có cảm nhận như 2 LED đang sáng cùng nhau.

Chúng ta sẽ đi lập trình từng bước:

word image 8349 19

Khi chúng ta, giảm thời gian trễ xuống dần sẽ có cảm nhận được đồng thời xuất hiện hơn

Dưới đây là chương trình điều khiển LED hiển thị từ 00 đến 99: đây là một số có 2 chữ số, do đó ta cần phải tách 2 chữ số hàng chục và hàng đơn vị. Ta sẽ sử dụng 2 phép toán là chia lấy dư và chia lấy thương.

 

 

Điều khiển n LED 7 thanh.

Phân tích cách tách chữ số:

Ví dụ: số abc:

Đặt temp = abc

temp = ab*10 + c

c = temp%10 , ta gán temp = temp/10 (=ab)

temp = ab = a*10 + b

b = temp%10, ta gán temp = temp/10 (=a)

temp = a

a = temp%10, ta gán temp = temp/10 (=0)

  • Đến đây quá trình tính toán dừng lại

Tổng kết lại, chúng ta sẽ tách các chữ số từ hàng đơn vị → hàng chục → hàng trăm. Quá trình tách hoàn toàn giống nhau và lặp lại (ví dụ: với số có 3 chữ số thì lặp lại 3 lần)

Để dễ quản lý, các chữ số ta sẽ đặt vào một mảng:

 

temp = ab*10 + c

chuSo[0] = temp%10; temp = temp/10 //lưu chữ số hàng đơn vị

chuSo[1] = temp%10; temp = temp/10 //lưu chữ số hàng chục

chuSo[2] = temp%10; temp = temp/10 //lưu chữ số hàng trăm

 

Tổng quát lên, chúng ta sẽ sử dụng vòng lặp for chạy n lần

Dưới đây là full code quét n LED 7 thanh:

#include <REGX51.H>

char so[] = {
  0x40,
  0x79,
  0x24,
  0x30,
  0x19,
  0x12,
  0x02,
  0x78,
  0x00,
  0x10
};

int dem;

unsigned char chuc, donVi;

#define led1 P2_0

#define led2 P2_1

#define sang 0

#define tat 1

char i;

void delay(int time) {

  while (time--);

}

void main() {

  led1 = led2 = tat;

  while (1) {

    for (dem = 0; dem <= 99; dem++) {

      // tach cac chu so

      chuc = dem / 10;

      donVi = dem % 10;

      led1 = sang;

      P0 = so[chuc];

      delay(10000);

      led1 = tat;

      led2 = sang;

      P0 = so[donVi];

      delay(10000);

      led2 = tat;

    }

  }

}

 

Mô phỏng trên proteus

Điều khiển 1 LED 7 thanh đếm từ 0 → 9.

Đầu tiên, ta mở phần mềm mô phỏng Proteus lên và lấy các linh kiện bao gồm AT89C51, 7seg (có rất nhiều loại, ở đây chúng ta chọn loại dương chung màu xanh: 7SEG-COM-AN-GRN), chọn điện trở hạn dòng cho LED: gõ res.

Tiếp theo ta tiến hành vẽ mạch mô phỏng trên Proteus

word image 8349 20

Ở đây, do LED không có dấu chấm ở cạnh nên ta không cần phải nối chân P0.7. Nếu các bạn chọn LED 7 thanh có dấu chấm thì cần phải nối lại nhé.

Như vậy là đã hoàn thành, ta tiến hành viết chương trình bằng phần mềm KEIL C

Điều khiển 2 LED 7 thanh đếm từ 00 → 99.

Chúng ta sẽ nối 2 LED 7 thanh vào chung một cổng điều khiển P0 để tiết kiệm chân dữ liệu

Có vẻ như để điện trở ở mức 330 Ohm quá lớn, chúng ta sẽ giảm xuống 100 Ohm

word image 8349 21

  • Nhận xét:
  • Nếu nối 2 chân cấp nguồn vào với nhau như trên thì chúng ta sẽ thấy 2 LED 7 thanh là như nhau, chắc chắn cả hai sẽ hiển thị cùng một giá trị, như thế sẽ không thể hiển thị một dải liên tục từ 00 → 99.

Do đó, trong phương pháp Quét LED, chân cấp nguồn cho LED 7 thanh sẽ không được nối cố định. Ta sẽ xóa 2 chân cấp nguồn đi.

Thay vào đó, việc cấp nguồn cho LED sẽ được điều khiển bởi chương trình thông qua các Transistor

Graphical user interface, application Description automatically generated

Chúng ta sử dụng Transistor loại PNP, chân E được nối với dương nguồn, chân C được nối với chân nguồn của LED 7 thanh, chân B được nối qua một điện trở. Khi chân B có mức là 0, ta sẽ thấy có một dòng chảy từ cực E về cực B, dẫn tới Transistor sẽ thông và nguồn từ cực E sẽ cấp cho C và cấp cho LED 7 thanh.

Ta sẽ chọn 2 chân của vi điều khiển để điều khiển việc cấp nguồn cho từng LED 7 thanh. Do đường dây dài nên ta sẽ chọn phương pháp đặt tên để nối dây (tương tự trong bài nối LED trái tim)

Chúng ta tiến hành mô phỏng:

word image 8349 23

Ngoài ra, ngay trong Proteus cũng có LED đôi, khi sử dụng sẽ giúp hiển thị đồng thời hai số:

word image 8349 24

Điều khiển n LED 7 thanh.

Hiện nay trong Proteus 8, modul LED 7 thanh tối đa có 7/8 LED. Chúng ta cùng lấy ví dụ với modul LED 7 thanh có 7 LED nhé. Trong trường hợp nhiều hơn, thì các bạn thực hành tương tự:

word image 8349 25

Đây là Loại LED dương chung, chân dữ liệu được kết nối với cổng P0

LED 7 thanh này được cấp dòng thông qua các transistor loại PNP. Mỗi transistor được điều khiển bởi một chân vi điều khiển

  • Công việc của chúng ta đơn giản chỉ là tách các chữ số để đưa vào từng LED cho phù hợp

Kết

Với bài này, các bạn đã học được cách sử dụng mảng mã Hex để hiển thị số trên led 7 thanh và các quét led 7 thanh như thế nào. Hãy tiếp tục tới những bài tiếp theo nhé!

Đừng quên gia nhập Hội Anh Em Nghiện Lập trình để giao lưu và học hỏi nhé!!!

5/5 - (2 bình chọn)

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *