Mạch Khóa Số Điện Tử Mạch Đếm Sản Phẩm Mạch Đèn giao thông Ngã Tư Mạch Trái Tim Final Mạch Trái Tim Final Mạch Trái Tim I Love U

October 30, 2011

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

 ►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

0 comments:

Post a Comment

Bạn đọc hãy giúp chúng tôi xây dựng cộng đồng bằng cách để lại bình luận, chúng tôi luôn đón nhận mọi ý kiến của các bạn:
» Bình luận nghiêm túc và không chứa các liên kết quảng cáo.
» Vui lòng không Spam nhận xét với mọi hình thức.
» Rất mong bạn đề tên cho nhận xét của chính mình - Bằng cách chọn vào Tên/URL và điền tên bạn vào (Phần URL có thể bỏ trống ).

- Bạn có thể chèn Link nhạc (NCT), video(Youtube),Hình ảnh vào comment bằng cú pháp:
+ [youtube] Link video Youtube [/youtube].
+ [img] Link ảnh( định dạng PNG, JPG,GIF) [/img]
+Chèn link liên kết: <a href="LINK" rel="nofollow">Name</a>
-Bạn copy mã bên cạnh biểu tượng chèn vào nhận xét để bày tỏ cảm xúc!!

:) :( :)) :(( =)) =D> :D :P