Để các bạn dễ dàng lập trình trong một số ứng dụng nên trước khi post các ứng dụng mình sẽ viết trước một bài về " Ngắt và timer"
Trong này mình sẽ hướng dẫn các bạn cách dùng và các ứng dụng trong các ví dụ cụ thể để các bạn tiện theo dõi .
Đây chỉ là Bài mang tính chất hướng dẫn cho người mới bắt đầu, Có gì anh em chém nhè nhẹ thôi nhé!
// ok do sáng nay có việc bận nên bây giờ mới viết tiếp đc
1. Giới thiệu về Timer( Bộ Định thời)
Chắc anh em đã biết Timer đc sử dụng rất rộng rãi trong các ứng dụng đo lường và điều khiển. có thể hiểu thế này timer giống như một bộ đếm.
Timer n bit như là bộ đếm dc tạo bởi n flip-flop mắc nối tiếp với nhau
.Đầu vào của bộ timer chính là đầu vào của flip-fop đầu tiên, đầu ra báo tràn thể hiện trạng thái tràn( Đã đếm hết của nó)
Tùy vào ứng dụng các ứng dụng khác nhau mà đầu vào nguồn xung clock như hình trên có thể lấy từ dao động nội(Bên trong vi điều khiển hoắc nguồn dao động Thạch anh bên ngoài
Nói chung mình sẽ nói về con cụ thể là AT89S52 có 3 bộ đinh thời 16 bít trong đó 2 bộ định thời timer 0 và timer 1 có 4 chế độ hoạt động. timer 2 có 3 chế độ
hoạt động.....
Nói chung là các anh em đều biết cả ( lý thuyết mà)
//===============Ứng dụng của timer -============\
Nói chung mình chỉ thấy mấy ứng dụng như sau thôi:
--Dùng để định khoảng thời gian(hẹn giờ chính là e nó quy định)
--Đếm sự kiện xảy ra bên ngoài vi điều khiển(lập trình đếm sự kiện)
--Thiết lập tốc độ baud cho cổng nối tiếp (Cổng Com đó) dùng cho truyền thông giữa vi điều khiển và máy tính
//============Bắt đầu nha=====================
Để bắt Đầu lập trình đc chúng ta hãy xem qua các thanh ghi của các bộ định thời nhé! nơi chứa các thao tác điều khiển
*============Nhớ nhé- Tất cả là ngôn ngữ lập trình C=====
*Các thanh ghi của timer0 và timer 1
Đầu tiên sẽ là thanh ghi chế độ định thời (TMOD)
Thanh ghi TMOD chứa 2 nhóm(mỗi nhóm 4 bít) dùng để đặt chế độ cho timer 0 và timer 1
4 BÍT Cao là dùng để thiết lập cho timer1 bốn bít thấp thiets lập cho timer 0
Nói chung 2 nhóm như nhau:
Minh xin sơ qua thế này
Bit GATE1 là bít mở cổng cho timer1 .Nếu đặt bít này bằng `1 thì timer1 chỉ chạy khi chân INT1 ở mức cao.Nếu đặt bằng 0 thì hoạt động của timer1 ko bị ảnh hưởng bởi chân (INT1).ok
như vậy bây giờ các bạn sẽ để là GATE1=0;
bÍT C/T1 : chon chế độ nếu bằng 1 (C) đếm sự kiện(lấy xung từ bên ngoài qua chaanTx t1,t2,t0)
Bằng 0 (t) dùng để định khoảng thời gian(lấy xung trong từ vdk)
M1M0 chon chế độ : 00 : timer13bit
01: timer16 bít
10: 8 bít tự nạp lại
11 chế độ 3 tách timer.
Tương tự với 4 bít thấp của thanh ghi TMOD dùng cho timer 0 cũng tương tự
// Thanh ghi điều khiển timer TCON
Trong đóbít TF1 cờ báo tràn của timer1 khi bộ dếm bị tràn,đc xóa bởi phần mềm hoặc phần cứng khi VDK chỉ đến chương trình phục vụ ngắt
--Bít TR1 thiết lập timer1 bắt đầu chạy
IT1 : cờ ngắt do timer1
IE1: cờ ngắt do ngắt ngoài 1
Tương tự với timer 0 nha.
//===Các thanh ghi của bộ timer2===========
hehe Nói chung cái này mình đọc trong datasheet chưa hiểu nên ko post anh e nào hiểu thì bổ xung nha!Hix
//====Cách tính toán Giá trị nạp vào timer thì các bạn xem lại sách ====
mình ko đề cập nữa vì nó cũng ko khó.Nếu bạn nào có nhu cầu cung cấp sách tham khảo thì pm cho mình nhé! Mình sẽ cho mượn và photo(Cấu trúc và lập trình cho VĐK 8051 Nguyễn Tăng Cường
//=========Bây giờ bắt đâu làm việc nhé----------
Ví dụ 1:Tạo xung có tần số 10khz trên chân P2.0.Biết thạch anh dùng là 12Mhz.
Các bạn xem xét nhé!
10khz => T=0.1ms
Suy ra số cần nạp là 65536-0,1ms/1us=65536-100=65436;
bạn có thẻ dùng timer1 và timer 0 thoải mái.ok
Bây giờ chúng ta sẽ dùng timer để tạo trễ.
Thông thường thì các bạn hay dùng vòng lặp for để tạo trễ. Nhưng điều đó đôi khi không chính xác cho những ứng dụng yêu cầu độ chính xác thời gian sai lệch nhỏ.
khi đó timer là giải pháp đc coi là chính xác hơn cả.
//chúng ta bắt đầu nhé!
Timer của 8051 tối đa 16 bít ở chế dộ 1 do đó có thể đếm tối đa là
2^16(65536) giá trị đếm. Nếu như dùng tần số thạch anh 12M gì thời gian để timer tràn là 65536x1us=65,536ms;
Do đó các bạn nếu muốn tạo trễ dài hơn thì phải dunf thêm 1 vòng for ben ngoài.
// hãy làm ví dụ sau
Hãy tạo trễ 1 phút
như vậy mình sẽ lấy thời gian timer tràn là 50ms tương ứng giá trị đếm là 50000
vậy giá trị nạp ban đầu vào timer sẽ là 65536-50000=15536;
và mình sẽ cho vòng for chạy 20 lần như code ở dưới
Cũng như tại trễ ta dùng tần số thạch anh. khi đếm sự kiện
ta chỉ cần đặt bít C/T lên mức 1 là ok.
khi đó bộ đếm sẽ nhận xung ngoài từ chân (T0 hoặc T1) vói từng timer.
xem code duoi dAY
=================================================
Về ngắt hôm nay chúng ta sẽ xét ngắt của 8051
để sử dụng ngắt
Trong này mình sẽ hướng dẫn các bạn cách dùng và các ứng dụng trong các ví dụ cụ thể để các bạn tiện theo dõi .
Đây chỉ là Bài mang tính chất hướng dẫn cho người mới bắt đầu, Có gì anh em chém nhè nhẹ thôi nhé!
// ok do sáng nay có việc bận nên bây giờ mới viết tiếp đc
1. Giới thiệu về Timer( Bộ Định thời)
Chắc anh em đã biết Timer đc sử dụng rất rộng rãi trong các ứng dụng đo lường và điều khiển. có thể hiểu thế này timer giống như một bộ đếm.
Timer n bit như là bộ đếm dc tạo bởi n flip-flop mắc nối tiếp với nhau
.Đầu vào của bộ timer chính là đầu vào của flip-fop đầu tiên, đầu ra báo tràn thể hiện trạng thái tràn( Đã đếm hết của nó)
Tùy vào ứng dụng các ứng dụng khác nhau mà đầu vào nguồn xung clock như hình trên có thể lấy từ dao động nội(Bên trong vi điều khiển hoắc nguồn dao động Thạch anh bên ngoài
Nói chung mình sẽ nói về con cụ thể là AT89S52 có 3 bộ đinh thời 16 bít trong đó 2 bộ định thời timer 0 và timer 1 có 4 chế độ hoạt động. timer 2 có 3 chế độ
hoạt động.....
Nói chung là các anh em đều biết cả ( lý thuyết mà)
//===============Ứng dụng của timer -============\
Nói chung mình chỉ thấy mấy ứng dụng như sau thôi:
--Dùng để định khoảng thời gian(hẹn giờ chính là e nó quy định)
--Đếm sự kiện xảy ra bên ngoài vi điều khiển(lập trình đếm sự kiện)
--Thiết lập tốc độ baud cho cổng nối tiếp (Cổng Com đó) dùng cho truyền thông giữa vi điều khiển và máy tính
//============Bắt đầu nha=====================
Để bắt Đầu lập trình đc chúng ta hãy xem qua các thanh ghi của các bộ định thời nhé! nơi chứa các thao tác điều khiển
*============Nhớ nhé- Tất cả là ngôn ngữ lập trình C=====
*Các thanh ghi của timer0 và timer 1
Đầu tiên sẽ là thanh ghi chế độ định thời (TMOD)
Thanh ghi TMOD chứa 2 nhóm(mỗi nhóm 4 bít) dùng để đặt chế độ cho timer 0 và timer 1
GATE1 | C/#T1 | M1 | M0 | GATE0 | C/#T0 | M1 | M0 |
4 BÍT Cao là dùng để thiết lập cho timer1 bốn bít thấp thiets lập cho timer 0
Nói chung 2 nhóm như nhau:
Minh xin sơ qua thế này
Bit GATE1 là bít mở cổng cho timer1 .Nếu đặt bít này bằng `1 thì timer1 chỉ chạy khi chân INT1 ở mức cao.Nếu đặt bằng 0 thì hoạt động của timer1 ko bị ảnh hưởng bởi chân (INT1).ok
như vậy bây giờ các bạn sẽ để là GATE1=0;
bÍT C/T1 : chon chế độ nếu bằng 1 (C) đếm sự kiện(lấy xung từ bên ngoài qua chaanTx t1,t2,t0)
Bằng 0 (t) dùng để định khoảng thời gian(lấy xung trong từ vdk)
M1M0 chon chế độ : 00 : timer13bit
01: timer16 bít
10: 8 bít tự nạp lại
11 chế độ 3 tách timer.
Tương tự với 4 bít thấp của thanh ghi TMOD dùng cho timer 0 cũng tương tự
// Thanh ghi điều khiển timer TCON
TF1 | TR1 | TF0 | TR0 | IT1 | IE1 | IT0 | IE0 |
Trong đóbít TF1 cờ báo tràn của timer1 khi bộ dếm bị tràn,đc xóa bởi phần mềm hoặc phần cứng khi VDK chỉ đến chương trình phục vụ ngắt
--Bít TR1 thiết lập timer1 bắt đầu chạy
IT1 : cờ ngắt do timer1
IE1: cờ ngắt do ngắt ngoài 1
Tương tự với timer 0 nha.
//===Các thanh ghi của bộ timer2===========
hehe Nói chung cái này mình đọc trong datasheet chưa hiểu nên ko post anh e nào hiểu thì bổ xung nha!Hix
//====Cách tính toán Giá trị nạp vào timer thì các bạn xem lại sách ====
mình ko đề cập nữa vì nó cũng ko khó.Nếu bạn nào có nhu cầu cung cấp sách tham khảo thì pm cho mình nhé! Mình sẽ cho mượn và photo(Cấu trúc và lập trình cho VĐK 8051 Nguyễn Tăng Cường
//=========Bây giờ bắt đâu làm việc nhé----------
Ví dụ 1:Tạo xung có tần số 10khz trên chân P2.0.Biết thạch anh dùng là 12Mhz.
Các bạn xem xét nhé!
10khz => T=0.1ms
Suy ra số cần nạp là 65536-0,1ms/1us=65536-100=65436;
bạn có thẻ dùng timer1 và timer 0 thoải mái.ok
- Code:
// chuong trinh tao xung tren chan P2.0
// HAND IN HAND
//dtvtk7a---cntt Thai Nguyen
#include<reg52.h>
sbit xung = P2^0;
void main(void)
{
TMOD=0x01;// chon timer 0 16 bit
TH0=65436/256; // nap gia tri *** ban dau cho timer
TL0=65436%256;
TR0=1;// chay timer0
while(!TF0); kiem tra khi co bao bị tran thi xoa
TF0=0;
TR0=0;
xung=~xung; // va dao muc tin hieu o chan P2.0
}
Bây giờ chúng ta sẽ dùng timer để tạo trễ.
Thông thường thì các bạn hay dùng vòng lặp for để tạo trễ. Nhưng điều đó đôi khi không chính xác cho những ứng dụng yêu cầu độ chính xác thời gian sai lệch nhỏ.
khi đó timer là giải pháp đc coi là chính xác hơn cả.
//chúng ta bắt đầu nhé!
Timer của 8051 tối đa 16 bít ở chế dộ 1 do đó có thể đếm tối đa là
2^16(65536) giá trị đếm. Nếu như dùng tần số thạch anh 12M gì thời gian để timer tràn là 65536x1us=65,536ms;
Do đó các bạn nếu muốn tạo trễ dài hơn thì phải dunf thêm 1 vòng for ben ngoài.
// hãy làm ví dụ sau
Hãy tạo trễ 1 phút
như vậy mình sẽ lấy thời gian timer tràn là 50ms tương ứng giá trị đếm là 50000
vậy giá trị nạp ban đầu vào timer sẽ là 65536-50000=15536;
và mình sẽ cho vòng for chạy 20 lần như code ở dưới
- Code:
void tre_1_phut(void)
{
int i;
for(i=0;i<20;i++)
{
TMOD=0x01;// timer 0 che do 1(16 bit)
TH0=15536/256;
TL0=15536%256;
TR0=1;
while(!TF0);
TF0=0;
TR0=0;
}
}
Cũng như tại trễ ta dùng tần số thạch anh. khi đếm sự kiện
ta chỉ cần đặt bít C/T lên mức 1 là ok.
khi đó bộ đếm sẽ nhận xung ngoài từ chân (T0 hoặc T1) vói từng timer.
xem code duoi dAY
- Code:
#include<stdio.h>
#includ<reg52.h>
sbit xung = P3^4; // chan T0
void main(void)
{
while(1)
{
TMOD=0x05;// 00000101 *** su kien timer 0
TH0=65530/256;
TL0=65530%256;
xung=1;
TR0=1;
while(TF0=1)
P2=TL0;
TF0=0;
TR0=0;
}
}
// *** O CHAN T0 VA HIENT HI RA P2
=================================================
Về ngắt hôm nay chúng ta sẽ xét ngắt của 8051
để sử dụng ngắt
- Attachments
- demxung.zip
- demxung
- You don't have permission to download attachments.
- (16 Kb) Downloaded 20 times
Được sửa bởi langtuvotinh ngày Sun Nov 06, 2011 10:42 am; sửa lần 16.