huyentran080789

New Member

Download miễn phí Các bước làm việc với Keil C





2/Dùng timer0,timer1,.
Cái này tôi xin phân tích sau cùng với việc giới thiệu các #include. Để có thể hệ thống hết được. Cho nó có logic. Chứ nếu tôi đưa ra luôn các bạn mới học sẽ không hiểu là nó ở đâu ra.
Tiếp tục với hàm delay() theo cách dùng bộ định thời.
Các bạn đọc bài ở trên cũng thấy được là chúng ta lập trình với các thanh ghi tương tự như trong ASM mà thôi.
TMOD là thanh ghi 8 bít dùng để thiết lập bộ định thời , các bạn xem lại thanh ghi này.
Dùng bộ định thời có 3 chế độ: chế độ 0, chế độ 1, chế độ 2. Chúng ta sẽ sử dụng chế độ khởi động bộ định thời bằng phần mềm tức TMOD.3 và TMOD.7 =0
Việc xác định chế độ nào phụ thuộc vào giá trị của 2 bit TM1 và TM0 của từng timer( các bạn xem định nghĩa từng bít trong thanh ghi TMOD)
TM1=0 , TM0 =0 chế độ 0
TM1=0, TM0 =1 chế độ 1O
TM1=1, TM0 =1 chế độ 2
 
 



Để tải bản Đầy Đủ của tài liệu, xin Trả lời bài viết này, Mods sẽ gửi Link download cho bạn sớm nhất qua hòm tin nhắn.
Ai cần download tài liệu gì mà không tìm thấy ở đây, thì đăng yêu cầu down tại đây nhé:
Nhận download tài liệu miễn phí

Tóm tắt nội dung tài liệu:

Các bước làm việc với Keil C
Các bước thực hiện. Bạn xem hình minh họa cho dễ dùng
__________________
Để có thể hiểu được những vấn đề tui viết thì yêu cầu bạn phải có kiến thức căn bản về C như hàm con, sử dụng con trỏ, các kiểu dữ liệu(int, float, double,char, unsigned char,..) tui xin đi vào bài thứ nhất. Nói về cấu trúc cho chương trình C: 1/Phần đầu tiên là liệt kê các header file mà các bạn dùng bằng từ khóa
Code:
#include"tên header file"
hay
Code:
#include
Khi bạn viết theo cách thứ nhất thì trình biên dịch sẽ tìm kiếm file .h hay .c này trong thư mục hiện tại chứa dự án của bạ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ì bạn nên 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ì bạn tìm trong thư mục /Atmel thì sẽ thấy được file reg51.h ,.. Bạn mở từng file nên mà khám phá sẽ có nhiều điều hay đấy. 2/Đị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ụ: bạn định nghĩa led1 là P1_0 tức là led1 được nối với chân 0 của Port 1.
Code:
#define led1 P1_0
3/ Các hàm ngắt như ngắt timer0, timer1, ngắt nối tiếp, ngắt ngoài. tui sẽ nói chi tiết cái này sau. Còn bây giờ tui chỉ giới thiệu sơ sơ thôi. Ví dụ bạn 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:
Code:
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. 4/ Các hàm con như Delay, khởi tạo,.. như:
Code:
void delay( unsigned char time){
//code viết ở đây
}
5/ Chương trình chính:
Code:
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. Và thực chất cũng chẳng cần biến toàn cục vì ta chỉ cần viết 1 file thôi. nên tui không đưa biến toàn cục vào đây. Kết luận, chương trình của chúng ta sẽ có dạng như sau:
Code:
// 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){
}
Hàm trễ delay()
Đáng lẽ ra tui phải giới thiệu cho các bạn các header file trước nhưng tui quên mang theo mong các bạn thông cảm. tui xin giới thiệu dùng delay trước đã. Có lẽ việc lập trình cho vi điều khiển một hàm không thể thiếu đó là trễ: như trễ khi bạn nháy led chẳng hạn( ví dụ đơn giản nhất), ... Việc gây trễ trong Keil C có thể có nhiều cách khác nhau: Hàm delay có tham số là thời gian cần gây trễ tính theo ms 1/Dùng vòng lặp while, for dùng kiểu nào thì cũng đơn giản chỉ là vòng lặp mà thôi. Trong vòng lặp này chúng ta sẽ chẳng làm gì cả nên vi điều khiển sẽ bị mất thời gian trong các vòng lặp này. Với tần số thạch anh 11.0582 MHz thì mỗi vòng lặp khi các bạn debug sẽ thấy là chúng ta mất thời gian thực khoảng 8.28 us. Do đó để có thể gây trễ 1ms thì các bạn cần dùng xấp xỉ 121 vòng lặp kiểu này. Do đó hàm sẽ như sau:
Code:
void delay(usigned char time){
while(time--){
unsigned char temp = 121;
while(temp--); // chẳng làm gì cả
};
}
Việc chuyển đổi giữa vòng for với while trong trường hợp này rất đơn giản thôi. Nhưng khi đó bạn lại phải khai báo thêm một biến đếm như thế sẽ tốn bộ nhớ. Chương trình trên là tối ưu nhất rồi. 2/Dùng timer0,timer1,.. Cái này tui xin phân tích sau cùng với việc giới thiệu các #include. Để có thể hệ thống hết được. Cho nó có logic. Chứ nếu tui đưa ra luôn các bạn mới học sẽ không hiểu là nó ở đâu ra.
Tiếp tục với hàm delay() theo cách dùng bộ định thời. các bạn đọc bài ở trên cũng thấy được là chúng ta lập trình với các thanh ghi tương tự như trong ASM mà thôi. TMOD là thanh ghi 8 bít dùng để thiết lập bộ định thời , các bạn xem lại thanh ghi này. Dùng bộ định thời có 3 chế độ: chế độ 0, chế độ 1, chế độ 2. Chúng ta sẽ sử dụng chế độ khởi động bộ định thời bằng phần mềm tức TMOD.3 và TMOD.7 =0 Việc xác định chế độ nào phụ thuộc vào giá trị của 2 bit TM1 và TM0 của từng timer( các bạn xem định nghĩa từng bít trong thanh ghi TMOD) TM1=0 , TM0 =0 chế độ 0 TM1=0, TM0 =1 chế độ 1O TM1=1, TM0 =1 chế độ 2 Chế độ 1 là chế độ 16 bít không tự nạp lại, cách sử dụng bằng cách nạp giá trị cho các thanh ghi TH1,TL1( với Timer1), hay TL0,TH0( với Timer0). Khi khởi động timer bằng cách setb TR1 hay TR0 thì nó sẽ đếm từTHTL -> 0xFFFF khi từ 0xFFFF->0x0000 thì cờ TF1 hay TF0 sẽ bật lên sau đó chúng bị xóa thành 0. Chúng ta dùng cờ này để biết khi nào chuyển qua 0x0000. Chế độ 0 là chế độ 13 bít tương tự như chế độ 1 nhưng giá trị chỉ tăng đến 0x1FFF. Chế độ 2, chế độ 8 bít tự nạp lại, chỉ cần thiết lập cho chế Tiếp theo là chúng ta tính thời gian của mỗi lần tăng bộ định thời. Tấn số của bộ định thời bằng 1/12 tần số của thạch anh, do đó với tần số 11,0592MHz thì chu kì máy bằng 1.085us. Do vậy với chế độ 1 tối đa chúng ta sẽ gây trễ được là 65536*1.085 = 71106.56 us = 71.10656 ms. Chế độ 2 max = 256 *1.085 =277.76 us Chế độ 0 bạn tự tính. Từ đó bạn tính toán nha. Chúng ta muốn trễ nhiều thì chúng ta thêm vòng lặp vào. --------------------------- tui chỉ cần gây trễ 1ms = 1000 us>277.76 nên dùng timer0( 16 bit) ở chế độ 0 thì bạn tính toán giá trị nạp cho timer0 như sau: thời gian trễ = (65536 - giá trị nạp vào TH,TL+ 1) * 1.085. Sau đó đổi giá trị ra số hex. các bạn dùng Calculator của windows để đổi. => TH0 = FC, TL0 = 67 Vậy chương trình sẽ như sau:
Code:
void delay(unsigned char time){
while(time--){
TMOD = 0x01; // dùng timer0 ở chế độ 1( 16 bit)
TH0 = 0xFC;// nạp giá trị cho timer
TL0 = 0x67;
TR0 = 1; // khởi động bộ định thời
while( TF0); // chờ khi nào cờ TF1 =1
TF0 = 0 ; // xóa cờ tràn
TR0 = 0; // dừng bộ định thời
};
}
các bạn thấy thế nào, rất là đơn giản đúng không Chúc thành công.
Có lẽ người dùng Keil C lần đầu tiên gặp trở ngại khi dùng #include đó là không biết liệt kê các header file nào cần thiết cho ứng dụng của mình. Để có thể biết được header file nào dùng cho vi điều khiển của mình thì các bạn mở thư mục cài Keil C ra, tìm đến thư mục C51/INC bạn sẽ thấy một loạt các thư mục của các hãng như Atmel,Dalas,.. tui xin lấy ví dụ một file regx51.h trong thư mục /Atmel. Bạn mở file đó lên sẽ thấy đầu đề của nó như sau: /
Code:
*--------------------------------------------------------------------------
AT89X51.H
Header file for the low voltage Flash Atmel AT89C51 and AT89LV51.
Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.
All rights reserved.
--------------------------------------------------------------------------*/
Chứng tỏ file này dùng cho con AT89C51 và AT89LV51 rồi. Khi đó bạn sẽ thêm header file này vào chương trình của mình. Còn làm thế nào để mình làm việc với các thành ghi, các port như trong ASM bây giờ. Câu trả lời ở trong file này:
Code:
#if...
 

Các chủ đề có liên quan khác

Top