Phần 2: Lập trình LED 7 thanh với 8051.Bài trước chúng ta học lập trình giao tiếp để điều khiển Output LED theo Pin và theo Port.. Ở bài này chúng ta sẽ áp dụng những kiến thức đó để thự
Trang 1Phần 2: Lập trình LED 7 thanh với 8051.
Bài trước chúng ta học lập trình giao tiếp để điều khiển Output (LED) theo Pin và theo Port Ở bài này chúng ta sẽ áp dụng những kiến thức đó để thực hiện lập trình điều khiển hiển thị trên LED 7 thanh theo để hiển thị theo ý mình
Sau đây là hình ảnh và chi tiết về 1 con LED 7 thanh và bảng dữ liệu mã hóa với các số từ 0-9 theo kiểu LED sử dụng Anot chung
Hãy lập bảng các giá trị từ 0 - 9 cho LED 7 thanh sử dụng Cathode chung.
Trang 2Chúng ta sẽ lần lượt thực hiện những bài mô phỏng sau:
Bài 1: Điều khiển 1 LED 7 thanh.
Để thực hiện bài tập này, hãy vẽ mạch mô phỏng như hình Linh kiện cần thêm cho bài này là Led 7 cạnh, Anode chung Hãy search từ “7SEG-COM_ANODE”
Hãy tạo 1 folder riêng tên là Bai_TH2, trong đó chứa file mô phỏng của Proteus,
chứa file Project mới của KeilC và chứa file main.c của project mới Sau đây là
chương trình điều khiển hiển thị lần lượt các số từ 0 đến 9 trên LED 7 thanh Code đoạn code sau vào trong file main.c:
#include <REGX52.H>
unsigned char LED7SEG[10] =
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
void Fn_Delay (unsigned int Time){
while(Time ); }
Trang 3int main (){
unsigned char i;
while(1){
for(i = 0; i < 10; i++){ //Giải thích ý nghĩa vòng lặp FOR
P2 = LED7SEG[i];
Fn_Delay(50000);
} }
return 0;
}
Ở đây chúng ta thực hiện lưu mảng dữ liệu LED 7 thanh ở bảng trên vào một mảng Khi đó phần tử LED7SEG[i] chứa dữ liệu hiển thị của số i trên LED thanh ở trên mạch với điều kiện i nằm từ 0-9 Ở vòng lặp for, chúng ta thực hiện đẩy dữ liệu ra chân Port P2 lần lượt theo các mã của các số từ 0 đến 9 ra Chạy mô phỏng chúng ta sẽ thấy các số này lần lượt hiển thị trên LED 7 thanh
Trang 4Muốn hiển thị các số chẵn hoặc lẻ, thứ tự tăng hoặc giảm thì làm ntn?
Dùng LED 7 thanh Cathode chung, lặp lại các mô phỏng trên.
Bài 2: Điều khiển nhiều LED 7 thanh.
Ở 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 Hãy thử nghịch để xem hiện tượng bóng ma xảy ra khi nào? Quá trình quét LED chuẩn được thực hiện theo các bước sau:
1 Xuất ra số muốn hiển thị
2 Cấp nguồn cho L7S muốn hiển thị
3 Trễ 1 khoảng thời gian ngắn để duy trì sáng
4 Cắt nguồn LED vừa hiển thị Lặp lại quy trình 4 bước với đèn L7S tiếp theo Sau đây là một đoạn chương trình hiển thị các số từ 00-99:
#include<REGX52.H>
sbit L7S1 = P3^0;
sbit L7S2 = P3^1;
Trang 5unsigned char LED7SEG[10] =
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; void Fn_Delay (unsigned int _vrui_Time){
while(_vrui_Time );
}
int main () {
unsigned char i;
unsigned int j;
L7S1 = 0;
L7S2 = 0;
while(1){
for(i = 0; i < 100; i++){
for (j = 0; j < 200; j++) {
P2 = LED7SEG[i/10];
L7S1 = 1;
Fn_Delay(100);
L7S1 = 0;
P2 = LED7SEG[i%10];
L7S2 = 1;
Fn_Delay(100);
L7S2 = 0;
} }
}
return 0;
}
Trang 6Mô phỏng bài tập 2 với những câu hỏi như bài tập 1 Chú ý giải thích từng dòng code Ý nghĩa của L7S1 và L7S2
Yêu cầu: Giải thích ý nghĩa các biến i, j, giá trị của hàm Fn_Delay() Tìm xem giới hạn xuất hiện bóng ma khi nào?
Bài 3: Thực hiện hiển thị 4 LED 7 thanh hiển thị
lần lượt các số từ 0000-9999.
Chọn LED 7 thanh, loại 4 số Sử dụng đoạn code sau để mô phỏng Yêu cầu hiểu rõ từng dòng code và giải thích nguyên lí hoạt động của nó.
#include <REGX52.H>
sbit L7S1 = P3^0;
sbit L7S2 = P3^1;
sbit L7S3 = P3^2;
sbit L7S4 = P3^3;
unsigned char LED7SEG[10] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
void Fn_Delay (unsigned int _vrui_Time){
while(_vrui_Time );
}
Trang 7int main (){
unsigned char i;
unsigned int j;
L7S1 = 0;
L7S2 = 0;
L7S3 = 0;
L7S4 = 0;
while(1){
for(i = 0; i < 10000; i++){
for (j = 0; j < 400; j++){
P2 = LED7SEG[i/1000];
L7S1 = 1; Fn_Delay(100); L7S1 = 0; P2 = LED7SEG[(i%1000)/100]; L7S2 = 1; Fn_Delay(100); L7S2 = 0; P2 = LED7SEG[(i%100)/10];
L7S3 = 1; Fn_Delay(100); L7S3 = 0;
P2 = LED7SEG[i%10];
L7S4 = 1; Fn_Delay(100); L7S4 = 0; }
} }
return 0;
}
Trang 8Hãy thay đổi tốc độ hiển thị của các con số Thực hiện lại các yêu cầu như 2 bài tập trên
Mô phỏng lại, sử dụng Led7Seg Cathode chung.