Bài 1:Cấu trúc cơ bản lập trình

30 Th10

 ►Cấu trúc chương trình C cho vi điều khiển


a.         Phần đầu tiên là liệt kê các header file mà ta dùng bằng từ khóa
#include”tên header file”
hoặc
#include< tên header file>
Khi ta viết theo cách thứ nhất thì trình biên dịch sẽ tìm kiếm file .h hoặc .c này trong thư mục hiện tại chứa dự án, nếu không có thì sẽ tìm kiếm trong thư mục Inc trong thư mục cài đặt KeilC.
Viết theo cách thứ hai thì trình biên dịch sẽ tìm luôn trong thư mục /INC luôn.
Để có thể sử dụng đúng các file .h cho các vi điều khiển của mình thì ta mở thư mục /inc trong thư mục này có các thư mục con như tên của hãng sản xuất. Ví dụ như của Atmel thì tìm trong thư mục /Atmel thì sẽ thấy được file regx51.h
b.         Định nghĩa các macro cho chương trình sáng sủa. Việc định nghĩa này được dùng bằng từ khóa #define
Ví dụ: Định nghĩa led1 là P1_0 tức là led1 được nối với chân 0 của Port 1.
#define led1 P1_0
c. Các hàm ngắt như ngắt timer0, timer1, ngắt nối tiếp, ngắt ngoài:
Ví dụ dùng ngắt nối tiếp là ngắt 4 trong bảng vector ngắt thì hàm sẽ có dạng như sau:
void inter_4(void) interrupt 4 using 2
{
// làm gì thì làm ở đây
}
Cú pháp các ngắt khác cũng tương tự chỉ thay số 4 bằng số thứ tự của ngắt trong bảng vector ngắt.
d.  Các hàm con như Delay, khởi tạo,.. như:
void delay( unsigned char time)
{
//code viết ở đây
}
e. Chương trình chính:
void main(void)
{
// viết mã ở đây
}
Đối tượng của chương trình là vi điều khiển nên hàm main không có giá trị trả về và không có tham số đưa vào.
Kết luận, chương trình của chúng ta sẽ có dạng như sau:
// liệt kê header file
#inlucde”tên header file”
// các marco
#define led1 P1_0
// các hàm ngắt
void inter_1 interrupt 1 using 3{
}
// các hàm bình thường
void delay( unsigned char time){
}
// chương trình chính
void main(void){
//lenh      
}

 ►Về hàm ngắt:

Trong 8051 có 5 nguyên nhân sinh ra ngắt: ngắt ngoài 0, timer0, ngắt ngoài 1, timer1, ngắt nối tiếp.
Địa chỉ của ngắt trong bảng vector ngắt = 8 * số thứ tự ngắt + 3, số thứ tự ngắt = 0,1,2,3,4 như kí hiệu trong file đó. Như vậy địa chỉ trong RAM từ 0x03 đến 0x30 là dành cho bảng vector ngắt.
Cú pháp của hàm thực hiện ngắt như sau, hàm này không có tham số, không có kiểu trả về nên là dạng
void tenham(void)
Cú pháp chính như sau:
void inter0(void) interrupt 0 using 1{
}  // ngắt ngoài 0, dùng bank 1
Tương tự với các ngắt khác.Ta thay số 0 bằng số thứ tự các ngắt tương ứng các ngắt tương ứng.
void inter1(void) interrupt 1 using 1{
}
void inter2(void) interrupt 2 using 1{
}
Tiếp tục với 2 ngắt còn lại.
Chúng ta lưu ý là để vdk nhảy đến bảng vector ngắt thì cần phải enable ngắt đó.
Ví dụ: Muốn ngắt nối tiếp thì phải cho như sau:
EA = 1;// cho phép dùng ngắt
ES = 1;// dùng ngắt nối tiếp
Hàm ngắt là một hàm không có tham số, không có kiểu trả về. Vì thực chất các biến mà hàm này thao tác chính là các biến toàn cục (các thanh ghi, các port).
Cấu trúc một hàm ngắt như sau:
void tenham(void) interrupt a using b{
// code
}
Tên hàm: tùy chọn.
: là thứ tự của ngắt trong bảng vector ngắt
a = 0 : ngắt ngoài 0
a = 1 : ngắt timer0
a = 2 : ngắt ngoài 1
a = 3 : ngắt timer1
a = 4 : ngắt nối tiếp
b: là bank được chọn dùng để thực hiện hàm ngắt. Do 8051 có 4 bank là bank 0, 1, 2, 3. Do đó : b có thể là một trong các giá trị 0,1,2,3.
Lưu ý: nếu không viết thêm using b thì mặc định là hàm ngắt thực hiện tại bank0.
Do đó, một thí dụ về hàm ngắt nối tiếp sẽ có dạng như sau:
void inter4(void) interrupt 4 using 2{
// mã thực hiện hàm
}
Và sau đây là một đoạn chương trình tạo một xung ở chân P1.0 và khi nhận được dữ liệu nối tiếp thì chuyển sang port P2. Tần số thạch anh là 11.0592 MHz. Dùng AT89C51
# include “regx51.h”
// ham gay tre
void delay(int time){
            while(time–){
                        unsigned char j = 122;
                        while(j–);
            };
}
// ham thiet lap ban dau
void init(){
            EA = 1; // cho phep dung ngat
            ES = 1; // dung ngat noi tiep
            // Thiet lap tan so bus
            TMOD = 0x02; // dung timer1, che do 8 bit tu nap lai
            TH1 = 253;  // chon tan so bus = 9600
            TR1 = 1 ; // khoi dong timer1
}
// Ham ngat
void inter4(void) interrupt 4 using 2{
            if (RI){  // kiem tra co tran nhan RI.
                        P2 = SBUF;  // lay du lieu tu SBUF
                        RI = 0; // xoa co ngat
                        };
}
// ham main
void main(){
            // tao xung tren chan P1.0
            init();
            while(1){
                        P1_0 = 1; 
                        delay(500);
                        P1_0 = 0;
                        delay(500);
            }
}


Theo forum.duytan.edu.vn

Advertisements

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s

%d bloggers like this: