Tải bản đầy đủ (.pdf) (7 trang)

Hướng dẫn sử dụng Kit 89 - Bài 3 potx

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (379.21 KB, 7 trang )

Hướng dẫn sử dụng Kit 89
Bài 3 : Điều khiển đơn giản Led 7 đoạn

Mục đích:
Nắm nguyên lý điều khiển led 7 đoạn.
Yêu cầu:
Viết chương trình nhấn nút 1 sẽ hiển thị số 0 ở led 7 đoạn ngoài cùng, nút 2 sẽ
hiện thị số 1 ở led 7 đoạn kế tiếp, v.v…

3.1 Kết nối phần cứng:
Gạt switch 2 lên ON để kích hoạt Port 3 là các nút nhấn.
Gạt switch 4 lên ON để kích hoạt Led 7 đoạn.
Port 2 dùng để chọn led 7 đoạn nào sẽ được sáng và Port 0 là dữ liệu cho led 7
đoạn đó.

P0 : Data P2 : Select
P0.0 : a P2.0 : Led 1
P0.1 : b P2.0 : Led 2
P0.2 : c P2.0 : Led 3
P0.3 : d P2.0 : Led 4
P0.4 : e P2.0 : Led 5
P0.5 : f P2.0 : Led 6
P0.6 : g P2.0 : Led 7
P0.7 : dot P2.0 : Led 8

BKIT HARDWARE CLUB – www.bkit4u.com
34
Hướng dẫn sử dụng Kit 89


Với kết nối phần cứng như vậy, để hiện thị số 5 thì dữ liệu xuất ra sẽ là 0x6D


(0110 1101). Tương tự, giá trị cho các số từ 0 đến 9 sẽ là :
unsigned char led7_data[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
3.2 Viết chương trình
3.2.1 Hàm init_main()
Do đăc điểm của phần cứng, trong hàm main, bạn phải dùng thêm hàm init_main,
để gán các Port 0,1,2 với giá trị 0x00.
void init_main()
{
P0 = 0x00;
P2 = 0x00;
P1 = 0x00;
}
Các chương trình sau này sẽ đều có hàm này.
3.2.2 Hàm main()
Hàm này sẽ gọi init_main(), sau đó xét các giá trị của Port 3 và hiển thị ra led 7
đoạn giá trị tương ứng.

void main()
{

//P0 : Data P2 : Select
//P0.0 : a P2.0 : Led 1
//P0.1 : b P2.0 : Led 2
//P0.2 : c P2.0 : Led 3
//P0.3 : d P2.0 : Led 4
BKIT HARDWARE CLUB – www.bkit4u.com
35
Hướng dẫn sử dụng Kit 89
//P0.4 : e P2.0 : Led 5
//P0.5 : f P2.0 : Led 6

//P0.6 : g P2.0 : Led 7
//P0.7 : dot P2.0 : Led 8

unsigned char led7_data[10] =
{0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};


init_main();

while(1)
{
if((P3 & 0x01) == 0) // P3 = 1111 1110
{
P0 = led7_data[0];
P2 = 0x01;
}
else if((P3 & 0x02) == 0)// P3 = 1111 1101
{
P0 = led7_data[1];
P2 = 0x02;
}
else if((P3 & 0x04) == 0)// P3 = 1111 1011
{
P0 = led7_data[2];
P2 = 0x04;
}
else if((P3 & 0x08) == 0) // P3 = 1111 0111
{
P0 = led7_data[3];
P2 = 0x08;

}
else if((P3 & 0x10) == 0) // P3 = 1110 1111
{
P0 = led7_data[4];
P2 = 0x10;
}
else if((P3 & 0x20) == 0) // P3 = 1101 1111
{
P0 = led7_data[5];
P2 = 0x20;
}
else if((P3 & 0x40) == 0) // P3 = 1011 1111
{
P0 = led7_data[6];
BKIT HARDWARE CLUB – www.bkit4u.com
36
Hướng dẫn sử dụng Kit 89
P2 = 0x40;
}
else if((P3 & 0x80) == 0) // P3 = 0111 1111
{
P0 = led7_data[7];
P2 = 0x80;
}
else
{
P0 = 0x00;
P2 = 0x00;
}


}

}

Các bước dịch và nạp chương trình bạn xem lại ở bài trước. Code mẫu của bài thí
nghiệm này bạn có thể tham khảo ở thư mục Bài 3 đính kèm trong CD này.
3.3 Một số lỗi quan trọng
Lỗi gọi sai hàm : Chẳng hạn bạn định nghĩa hàm là init_main(), nhưng trong hàm
main.c bạn lại gọi là initmain() (thiếu dấu _ ), thì khi nhấn F7 compile chương trình, file
hex vẫn được tạo ra, nhưng khi nạp vào chương trình chạy sai. Bạn nên lưu ý các thông
báo của compiler lúc dịch, sẽ có thông báo sau :



Khi gọi sai tên 1 hàm, compiler của KeilC sẽ vẫn tạo ra file hex, bạn nên lưu ý
các warning để khắc phục lỗi.
Không gọi hàm đã được định nghĩa : Để 1 module có thể dùng lại, thông thường
ta hiện thực nhiều hàm liên quan đến nó, nhưng trong 1 ứng dụng không gọi hết tất cả các
hàm đó, sẽ có thông báo về trường hợp này. Tuy nhiên đây không phải là lỗi, file hex
được tạo ra vẫn sẽ chạy đúng. Thông báo dạng này như
sau :

Như thông báo ở trên, hàm start_timer0() và start_timer1() không được gọi trong
bất kì hàm nào.
BKIT HARDWARE CLUB – www.bkit4u.com
37
Hướng dẫn sử dụng Kit 89
Bài 4 : Ngắt Timer
Mục đích:
Tìm hiểu ngắt timer của 89V51

Xây dựng module dành cho timer của 89V51 có thể dùng lại được.
Yêu cầu:
Viết chương trình hiển thị từ 0, sau 1 giây tăng lên 1, khi tăng đến 9 thì chuyển
sang hiển thị ở led kế tiếp, hiển thị bắt đầu lại từ 0.
4.1 Khai báo ngắt timer
Trình tự là cho phép ngắt toàn cục, cho phép ngắt timer và thiết lập chế độ hoạt
động cho timer:

IE = 0x80; //enable global interrupt

IE &= ~(0x02);// enable timer 0
IE |= 0x02;

TMOD &= ~(0x01);// setup mode for timer 0
TMOD |= 0x01;

TH0 = (-10000/256); //10 ms
TL0 = (-10000%256);

TR0 = 1;//start timer0

Hàm phục vụ ngắt sẽ được khai báo như sau:

void timer0_isr() interrupt 1
{
TR0 = 0;//stop timer 0

// reinitialize
TH0 = (-10000/256);
TL0 = (-10000%256);


//Add your code here


TR0 = 1;//start timer 0
}

BKIT HARDWARE CLUB – www.bkit4u.com
38
Hướng dẫn sử dụng Kit 89
4.2 Viết chương trình
Vì mục đích là tạo ra module Timer có khả năng dùng lại, nên chương trình sẽ
gồm group TIMER có 2 file timer.h và timer.c. File timer.h đặc tả các hàm của module
này còn file timer.c sẽ hiện thực các hàm đó. Các hàm trong timer.h bao gồm:

void init_timer0(); //init timer 0, interrupt after 10ms
void init_timer1(); //init timer 1, interrupt after 1ms

void start_timer0();
void start_timer1();

void stop_timer0();
void stop_timer1();

void delay_ms(unsigned int duration);//using timer1 to delay in ms

4.2.1 Hàm init_timer1()
Hàm này làm nhiệm vụ khởi tạo ngắt timer1 sau mỗi 1ms, khi khởi tạo ngắt
timer1 xong, ta phải hiện thực hàm phục vụ ngắt quãng cho nó, nếu không chương trình
sẽ chạy sai.

void init_timer1()
{
IE &= ~(0x08);// enable timer 1
IE |= 0x08;

TMOD &= ~(0x10);// setup mode for timer 1
TMOD |= 0x10;

TH1 = (-1000/256); //1 ms
TL1 = (-1000%256);

TR1 = 1; //start timer1

}
4.2.2 Hàm start_timer1()
void start_timer1()
{
TR1 = 1;
}
4.2.3 Hàm timer1_isr()
Đây là hàm phục vụ ngắt quãng của timer1, được khai báo và định nghĩa như sau:


BKIT HARDWARE CLUB – www.bkit4u.com
39
Hướng dẫn sử dụng Kit 89
void timer1_isr() interrupt 3
{

TR1 = 0;//stop timer 1


// reinitialize
TH1 = (-1000/256);
TL1 = (-1000%256);

//Add your code here
if(counter1!= 0)
{
counter1 ;
}
//End your code

TR1 = 1;//start timer 1
}
4.2.4 Hàm delay_ms(unsigned int duration)
Hàm này chỉ cần cài đặt giá trị cho biến counter1, giá trị này sẽ tự động giảm nhờ
đoạn code trong hàm phục vụ ngắt quãng của timer1. Vòng lặp while để chờ cho đến khi
counter1 bằng 0.
void delay_ms(unsigned int duration)
{
counter1 = duration;
while(counter1 !=0)
{
}
}
4.2.5 Hàm stop_timer1()
void stop_timer1()
{
TR1 = 0;
}


Phần hiện thực các bạn xem trong project Bai 4 để biết thêm chi tiết.
BKIT HARDWARE CLUB – www.bkit4u.com
40

×