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 đó…
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.
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:
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
Bảng mã hiển thị led 7 thanh Cathode chung
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
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:
- Kết quả mô phỏng trên Proteus:
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)
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
- Màn hình sẽ xuất hiện một bảng:
Để 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
Chúng ta để ý nhé, trong bảng có hiển thị cho chữ số Hexa:
- Như vậy, code hiển thị số 0 của chúng ta sẽ thành:
Để 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:
- 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
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:
- Xuất ra mã hiển thị.
- Cấp nguồn cho LED muốn hiển thị.
- Trễ 1 khoảng thời gian để duy trì sáng.
- 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:
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
Ở đâ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
- 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
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:
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ố:
Đ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ự:
Đâ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é!!!