Delay Dung Timer.pdf

  • Uploaded by: Lương Hiền
  • 0
  • 0
  • December 2019
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Delay Dung Timer.pdf as PDF for free.

More details

  • Words: 3,164
  • Pages: 12
ĐẠI HỌC LẠC HỒNG

GIÁO TRÌNH LẬP TRÌNH C CHO HỌ VI ĐIỀU KHIỂN 8051

CHƯƠNG 3: KHỞI TẠO CHƯƠNG TRÌNH TIMER VÀ CHƯƠNG TRÌNH NGẮT I. KHỞI TẠO CHƯƠNG TRÌNH TIMER. 1. CÁC THANH GHI ĐIỀU KHIỂN TIMER. Thanh ghi TMOD Các Timer thường được khởi tạo 1 lần ở đầu chương trình để thiết lập mode hoạt động phục vụ các ứng dụng điều khiển liên quan đến định thời hay đếm xung ngoại. Tùy thuộc vào yêu cầu cụ thể mà ta điều khiển cho Timer bắt đầu đếm, ngừng hay khởi động đếm lại từ đầu. Thanh ghi TMOD là thanh ghi đầu tiên cần phải khởi tạo để thiết lập trạng thái hoạt động cho các Timer.

8

7

6

5

4

3

2

1

Gate C/ T M1 M0 Gate C/ T M1 M0 0

0

Cho Timer 1

0

0

0

0

0

1

Cho Timer 0

Chú thích

Bit Gate

Chú thích - Khi đặt Bit Gate = 1 thì Timer0 chỉ làm việc khi các cổng vào của lệnh ngắt –INT( Bit P3.3 hay P3.2) sẽ không có tác dụng - Khi đặt Bit Gate = 1 thì Timer1 chỉ làm việc khi INT=1

C/ T

- Khi đặt ở mức áp cao thì các Timer dùng như bộ đếm xung (Counter) vào từ bên ngoài: Với Timer1 xung đếm cho vào Bit P3.5 Với Timer0 xung đếm cho vào Bit P3.4 - Khi đặt ở mức áp thấp thì các Timer dùng như đếm xung của mạch dao động, lúc đó nó có thể xem như một đồng hồ tự chạy (Timer)

Biên soạn: Nguyễn Bá Thuận

Page 1 of 12

ĐẠI HỌC LẠC HỒNG

M1

Bit chọn mode

M0

Bit chọn mode

GIÁO TRÌNH LẬP TRÌNH C CHO HỌ VI ĐIỀU KHIỂN 8051

Hai bit M0 và M1 tạo ra 4 trạng thái tương ứng vớ 4 kiểu làm việc khác nhau của Timer 0 hay Timer1

M1 M0 Mode( Kiểu) Chức năng 0

0

0

Chế độ định thời 13 bit (tương thích với họ 8048)

0

1

1

Chế độ Timer hay Counter 16 bit

1

0

2

Chế độ Timer hay Counter 8 bit, tư nạp lại Timer 0 được tách thành 2 Timer 8 bit

1

1

3

-Timer 8 bit TL0 được điều khiển bởi các bit của mode Timer0 -Timer 8 bit TH0 được điều khiển bởi các bit của mode Timer1 Timer 1 không hoạt động ở mode 3

Thanh ghi THx và TLx Các giá trị đếùm được của Timer/Counter thì được lưuu trong thanh ghi THx và TLx. Nếu ta không thiết lập giá trị bắt đầu đếm cho các thanh ghi TLx và THx là 0000h thì Timer sẽ bắt đầu đếm từ giá trị 0000H đến giá trị FFFFH. Cờ báo tràn TFx Nếu ta thiết lập giá trị bắt đầu đếm cho các thanh ghi TLx và THx là khác 0000h thì Timer sẽ bắt đầu đếm từ giá trị ta gán đến giá trị FFFFH. Nhưng khi chuyển từ giá trị FFFFh đến 0000h thì sẽ sinh ra tràn làm cho bit TFx = 1 rồi tiếp tục đếm từ giá trị 0000h. Để cho Tiner luôn bắt đầu đếm từ giá trị ta gán thì ta có thể lập trình chờ sau mỗi lần tràn ta sẽ cho xóa cờ TFx và gán lại giá trị cho TLx/THx để Timer luôn bắt đầu đếm từ giá trị khởi gán lên. Thanh ghi điều khiển TRx Thanh ghi này có tác dụng cho Timer được hay không được phép đếm xung Nếu TRx = 1 thì Timer được phép đếm xung Biên soạn: Nguyễn Bá Thuận

Page 2 of 12

ĐẠI HỌC LẠC HỒNG

GIÁO TRÌNH LẬP TRÌNH C CHO HỌ VI ĐIỀU KHIỂN 8051

Nếu TRx = 0 thì timer không được phép đếm xung 2. CÁCH KHỞI TẠO TIMER. void delay_1() { TMOD=0x01;

//khởi tạo timer 0 chế độ 16 bit

TH0=0xC350;

//Nạp giá trị cần đếm cho timer 0

TL0=0xC350; TR0=1;

// cho phép timer 0 hoạt động

while(!TF0);

// kiểm tra cờ tràn TF0 ở mức 0

TF0=0;

//xóa cờ tràn

TR0=0;

//không cho phép timer 0 hoạt động.

} Qua chương trình con Delay_1 trên ta nhận thấy timer 0 hoạt động đếm từ 0 đến giá trị C350H (50000 số thập phân) mà một lệnh diễn ra 1 miro giây (thạnh anh giao động chọn 12Mhz) vậy ta được timer 50ms. Như vậy để làm timer có sự trì hoãn nhiều hơn nữa ta dùng cách như sau: void delay_1() { unsigned int t;

//tạo biến t theo kiểu unsigned int

for(t=0;t<20;t++) //tạo vòng lập for làm 20 lần { TMOD=0x01; TH0=0xC350; TL0=0xC350; TR0=1; while(!TF0); TF0=0; TR0=0; } } Chương trình trên cho thấy điều kiện vòng lập for sẽ tăng từ 0 đến 20 và cứ mỗi lần như vậy thì làm delay 50ms một lần. Vì vậy ta có một delay làm đi làm lại 50ms 20 lần, vậy ta có delay 1s. Nếu cần làm delay 1 phút hay nhiều hơn nữa ta làm như sau: Biên soạn: Nguyễn Bá Thuận

Page 3 of 12

ĐẠI HỌC LẠC HỒNG

GIÁO TRÌNH LẬP TRÌNH C CHO HỌ VI ĐIỀU KHIỂN 8051

void delay_1(s)

//khởi tạo thêm biến s có thể thay đổi được tại delay_1

{ unsigned int f,t;

//khởi tạo hai biến f và t theo kiểu unsigned int

for(f=0;f<s;f++)

//vòng lập for phụ thuộc giá trị của biến s

for(t=0;t<20;t++) { TMOD=0x01; TH0=0xC350; TL0=0xC350; TR0=1; while(!TF0); TF0=0; TR0=0; } } Như vậy ta thấy chương trình delay 1s đã có bởi vòng lập for theo biến t và giá trị so sánh 20, muốn tăng thời gian lên lúc này sẽ phụ thuộc vào vòng lặp theo biến f mà giá trị so sánh ở đây có thể thay đổi được là biến s. giả sử muốn có delay 5 giây lúc này ta chỉ cần gọi delay_1(5) tức là thay biến s bởi số 5. ví dụ ứng dụng sẽ cho thấy rõ. #include //bao gồm thư viện của at89c51xd2.h sbit led=P0^0;

//gán định nghĩa led chính là bit P0^0

void delay_1(s)

//khởi tạo thêm biến s có thể thay đổi được tại delay_1

{ unsigned int f,t;

//khởi tạo hai biến f và t theo kiểu unsigned int

for(f=0;f<s;f++)

//vòng lập for phụ thuộc giá trị của biến s

for(t=0;t<20;t++) { TMOD=0x01; TH0=0xC350; TL0=0xC350; TR0=1; while(!TF0); TF0=0; Biên soạn: Nguyễn Bá Thuận

Page 4 of 12

ĐẠI HỌC LẠC HỒNG

GIÁO TRÌNH LẬP TRÌNH C CHO HỌ VI ĐIỀU KHIỂN 8051

TR0=0; } } main()

//chương trình chính

{ while(1)

//vòng lập vô tận

{ led=0;

//cho led ở mức 0

delay_1(5);

//delay 5 giây

led=1;

//cho led ở mức 1

delay_1(2);

//delay 2 giây

} } 3. BÀI TẬP ỨNG DỤNG. -

Hãy viết chương trình con delay 50 miro giây.

-

Hãy viết chương trình con delay 20ms.

-

Hãy viết chương trình con delay 2h.

-

Hãy viết chương trình con delay 1day.

II. KHỞI TẠO CHƯƠNG TRÌNH NGẮT. 1. CÁC THANH GHI ĐIỀU KHIỂN NGẮT Tổ chức ngắt của 8051: -

8051 có 5 nguồn ngắt: 2 ngắt bên ngoài (INT0 và INT1), 2 ngắt Timer, 1 ngắt

Port nối tiếp. 2 ngắt bên ngoài có thể được lập trình để kích ngắt bằng cạnh xuống hoặc bằng mức thấp. - Việc tranh chấp giữa các nguồn ngắt được giải quyết bằng mạch ưu tiên ngắt bên trong 8051. Có 2 thanh ghi điều khiển ngắt: Thanh ghi cho phép ngắt IE và thanh ghi ưu tiên ngắt IP. Thanh ghi cho phép ngắt IE (Interrupt Enable) : Có địa chỉ Byte là 0A8H Bit

Symbol Bit Address Description ( 1 : cho phép; 0 : không cho phép) Cấm tất cả các ngắt, nếu EA = 0.

IE.7 EA

AFH

Nếu EA = 1, mỗi nguồn ngắt được cho phép hoặc cấm bằng set hoặc clear các bit tương ứng

IE.6 -

AEH

Biên soạn: Nguyễn Bá Thuận

Không dùng Page 5 of 12

ĐẠI HỌC LẠC HỒNG

GIÁO TRÌNH LẬP TRÌNH C CHO HỌ VI ĐIỀU KHIỂN 8051

IE.5 -

ADH

Cho phép ngắt bộ định thời 2 (TIMER 2)

IE.4 ES

ACH

Cho phép ngắt Port nối tiếp

IE.3 ET1

ABH

Cho phép ngắt TIMER1

IE.2 EX1

AAH

Cho phép ngắt ngoài 1

IE.1 ET0

A8H

Cho phép ngắt TIMER0

IE.0 EX0

A9H

Cho phép ngắt ngoài 0

Các thanh ghi cho phép ngắt IP (Interrupt Priority): Có địa chỉ Byte là 0B8H Bit

Symbol Bit Address Description (1 = Mức cao, 0 = Mức thấp)

IP.7 -

-

Không dùng

IP.6 -

-

Không dùng

IP.5 PT2

0BDH

Ưu tiên cho phép ngắt bộ định thời 2

IP.4 PS

0BCH

Ưu tiên cho phép ngắt Port nối tiếp

IP.3 PT1

0BBH

Ưu tiên cho phép ngắt TIMER 1

IP.2 PX1

0BAH

Ưu tiên cho phép ngắt ngoài 1

IP.1 PT0

0B9H

Ưu tiên cho phép ngắt TIMER 0

IP.0 PX0 0B8H Ưu tiên cho phép ngắt ngoài 0 Nếu 2 ngắt cùng mức ưu tiên xảy ra đồng thời thì thứ tự ưu tiên như sau: PS, PT1, PX1, PX0. Ngắt Timer: Ngắt Timer xảy ra khi cờ TFx được xét (bộ đếm tràn). Cờ TFx được clear bằng bằng phần mềm hoặc khi vi điều khiển thực hiện chương trình con phục vụ ngắt Timer Ngắt ngoài: -

Ngắt ngoài xảy ra khi có mức thấp hoặc cạnh âm trên chân INT0 (bit P3.2) hoặc

INT1 (bit P3.3) của 8051

+ Khi chân INT0 nhân được tín hiệu điều khiển ( với mức áp thấp ), nó sẽ dừng ngay chương trình đang chạy và nhảy tới địa chỉ 0003H của bộ nhớ EEPROM và cho thi hành chương trình đã có ở địa chỉ này. + Khi chân INT1 nhân được tín hiệu điều khiển ( với mức áp thấp ), nó sẽ dừng ngay chương trình đang chạy và nhảy tới địa chỉ 0013H của bộ nhớø EEPROM và cho thi hành chương trình đã có ở địa chỉ này. - Kích bằng cạnh hay kích bằng mức được lựa chọn bằng hai bit IT0 hoặc IT1 trong thanh ghi SCON .

Biên soạn: Nguyễn Bá Thuận

Page 6 of 12

ĐẠI HỌC LẠC HỒNG

GIÁO TRÌNH LẬP TRÌNH C CHO HỌ VI ĐIỀU KHIỂN 8051

+ Nếu IT1=0 ngắt ngoài 1 được kích khởi mức bởi việc phát hiện mức áp thấp tại chân INT1

+ Nếu IT1=1 ngắt ngoài 1 được kích khởi cạnh bởi việc phát hiện mức áp thấp tại chân INT1

-

Có hai bit IE0 và IE1 trong TCON chỉ ra trạng thái có hay không có ngắt ngoài

(phát hiện cạnh xuống tại chân INT0 hay INT1 ) . Ngắt dùng RESET Có thể xem tác dụng Reset (cho bit tại chân số 9 lên 1) cũng là một ngắt đặt biệt. Khi tín hiệu Reset xuất hiện, nó sẽ dừng ngay chương trình chính và nhảy về địa chỉ gốc 0000h của bộ nhớ EEPROM và cho chạy chương trình bắt đầu bằng địa chỉ này. 2. CÁCH KHỞI TẠO CHƯƠNG TRÌNH NGẮT. a. Khởi tạo ngắt timer

Void Tênhàm(void) interrupt nguồn ngắt using băng thanhghi { // chương trình phục vụ ngắt ơ đây } Chú ý về hàm ngắt: + Hàm ngắt không được phép trả lại giá trị hay truyền biến vào hàm. + Tên hàm bất kì. + interrupt là từ khóa phân biệt hàm ngắt với hàm thường. + Nguồn ngắt từ 0 tới 5 theo bảng vector ngắt. + Băng thanh ghi trên ram chọn từ 0 đến 3. Tựy theo bạn viết hàm ngắt cho nguồn nào bạn chọn nguồn ngắt từ bảng sau: Interrupt

Flag

Vector Address

System Reset

RST

0000H

External 0

IE 0

0003H

Timer 0

TF 0

000BH

External 1

IE 1

0013H

Timer 1

TF 1

001BH

Serial Port

R1 or T1

0023H

Timer 2 TF2 or EXF2 002BH Riêng ngắt Reset không tính, bắt đầu đếm từ 0 và từ ngắt ngoài 0. Ví dụ: tôi cần viết hàm ngắt cho bộ định thời timer 1 hàm ngắt sẽ là. Biên soạn: Nguyễn Bá Thuận

Page 7 of 12

ĐẠI HỌC LẠC HỒNG

GIÁO TRÌNH LẬP TRÌNH C CHO HỌ VI ĐIỀU KHIỂN 8051

void timer1_isr(void) interrupt 3 using 0 { // lệnh cần thực hiện. } - Về using 0: Có 4 băng thanh ghi bạn có thể chọn cho chương trình phục vụ ngắt, cái này cũng không quan trọng. Trong hàm ngắt các bạn có thể bỏ đi từ using 0, khi đó vi điều khiển sẽ tự sắp xếp là dùng băng thanh ghi nào. - Hàm ngắt khác hàm bình thường chỗ nào. Hàm bình thường ví dụ hàm delay, cứ khi bạn gọi nó thì nó sẽ được thực hiện, có nghĩa là nó có vị trí cố định trong tiến trình hàm main, có nghĩa là bạn biết nó xảy ra khi nào. Còn hàm ngắt thì không có tiến trình cố định, điều kiện ngắt có thể xảy ra bất kì lúc nào trong tiến trình hàm main và cứ khi nào có điều kiện ngắt thì hàm ngắt sẽ được gọi tự động. Bắt đầu chương trình có ngắt: -Trước khi bắt đầu cho chạy chương trình ta phải cho phép ngắt toàn cục được xảy ra bằng cách gán EA(Enable All interrupt) bằng 1, thì ngắt mới xảy ra. -Thường thì ngay vào đầu chương trình(hàm main) trước vòng while(1) chúng ta đặt công việc khởi tạo, cấu hình và cho phép kiểm tra ngắt. Ví dụ với bộ định thởi timer ta gán các giá trị phù hợp cho thanh ghi TCON( Timer CONtrol). TCON

Điều khiển bộ đinh thời Cờ tràn của bộ định thời 1. Cờ này được set bởi phần

TCON.7

TCON.6

TF1

TR1

cứng khi có tràn, được xoá bởi phần mềm, hoặc bởi phần cứng khi bộ vi xử lý trỏ đến trình phục vụ ngắt Bit điều khiển hoạt động của bộ định thời 1. Bit này được set hoặc xoá bởi phần mềm để điều khiển bộ định thời hoạt động hay ngưng

TCON.5

TF0

Cừ tràn của bộ định thời 0

TCON.4

TR0

Bit điều khiển hoạt động của bộ định thời 0

TCON.3

IE1

TCON.2

IT1

TCON.1

IE0

TCON.0

IT0

Biên soạn: Nguyễn Bá Thuận

Cừ ngắt bên ngoài 1 (kích khởi cạnh). Cờ này được trên chân INT1, được xoá bởi phần mềm. Cờ ngắt bên ngoài 1 (kích khởi cạnh hoặc mức). này được set hoặc xoá bởi phần mềm khi xảy ra cạnh Cờ ngắt bên ngoài 0 (kích khởi cạnh) Cờ ngắt bên ngoài 0 ( kích khởi cạnh hoặc mức)

Page 8 of 12

ĐẠI HỌC LẠC HỒNG

GIÁO TRÌNH LẬP TRÌNH C CHO HỌ VI ĐIỀU KHIỂN 8051

Ví dụ để chạy bộ định thời timer 1 ta dùng câu lệnh: TR1=0; TR1(Timer Run 1). Còn bạn nào thích khó thì:TCON=0xxx; Còn các loại ngắt khác quá trình tương tự. Sau khi khởi tạo xong và cho ngắt timer 1 chạy thì điều gì xảy ra? Khi bắt đầu cho timer 1 chạy thì bộ đếm của timer sẽ đếm dao động của thạch anh, cứ 12 dao động của thạch anh(1 chu kì máy), bộ đếm của timer 1 TL1(Timer Low1) sẽ tăng 1,có thể nói timer 1 đếm số chu kì máy. Đối với chế độ 8 bít. TL1 là 1 thanh ghi 8 bít, là bộ đếm của bộ định thời rõ rồi. Nó đếm được từ 0, đến 255. Nếu nó đếm đến 256 thì bộ đếm tràn, TL1 quay vòng lại bằng 0, và cờ ngắt TF1(Timer Flag 1) tự động được gán lên 1(bằng phần cứng của vi điều khiển) như 1 công tắc tự động bật, và ngắt xảy ra. Còn với chế độ 16 bít, bộ đếm của bộ định thời còn 1 thanh ghi 8 bít nữa là TH1(Timer high 1), nếu cấu hình cho timer 1 hoạt động ở chế độ 16 bit thì khi TL1 tràn nó sẽ đếm sang TH1(TH1 sẽ tăng 1). Như vậy ta có thể đếm: 216 chu kì máy( 2 thanh ghi 8+8=16 bít). Chú ý là khi bộ đếm tràn ngắt sẽ xảy ra. Nếu ta cần đếm 256 chu kì máy thì khi khởi tạo ta cho TL1=0; , còn nếu không muốn đếm 256 chu kì mày mà ta chỉ cần đếm 100 thôi ngắt đã xảy ra rồi thì ta fải làm như sau: 256-100 = 156; và khi khởi tạo ta gán : TL1=155; vì đếm từ 155 đến 255 là đủ 100 lần thì ngắt xảy ra. Chương trình khởi tạo timer 0. void khoitaotimer0(void) // Hàm khởi tạo { EA=0; // Cam ngat toan cuc TMOD=0x02; // Timer 0 che do 2 8 bit auto reload TH0=0x9B; // Gia tri nap lai 155 doi ra so hex TL0=0x9B; // Gia tri khoi tao 155 doi ra so hex ET0=1; // Cho phep ngat timer 0 EA=1; // Cho phep ngat toan cuc TR0=1; // Chay timer 0 bat dau dem so chu ki may } Ví dụ ứng dụng. Ứng dụng ngắt timer để tạo chương trình phát xung nhấp nháy tại chân p0^0. #include sbit led=P0^0; void timer0()interrupt 1 { led=~led; } void khoitaotimer0() { Biên soạn: Nguyễn Bá Thuận

Page 9 of 12

ĐẠI HỌC LẠC HỒNG

GIÁO TRÌNH LẬP TRÌNH C CHO HỌ VI ĐIỀU KHIỂN 8051

EA=0; TMOD=0X02; TH0=0x9B; TL0=0x9B; ET0=1; EA=1; TR0=1; } main() { khoitaotimer0(); }

Chương trình đã được lập trình và mô phỏng

Biên soạn: Nguyễn Bá Thuận

Page 10 of 12

ĐẠI HỌC LẠC HỒNG

GIÁO TRÌNH LẬP TRÌNH C CHO HỌ VI ĐIỀU KHIỂN 8051

b. Khởi tạo ngắt ngoài. Chương trình khởi tạo ngắt ngoài 0. Void ngatngoai0(void) //khởi tạo hàm ngắt ngoài 0 { EA=1;

//cho phép ngắt toàn cục.

EX0=1;

//cho phép ngắt ngoài 0

IT0=1;

//cho phép tác động cạnh tại chân P3^2

} Ví dụ ứng dụng Ứng dụng ngắt ngoài để điều khiển đảo port 0 khi có tác động ngắt ngoài 0 tại chân P3^0. #include void ngatngoai0()interrupt 0 { P0=~P0; } void khoitaongatngoai0() { EA=1; EX0=1; IT0=1; } main() { khoitaongatngoai0(); }

Biên soạn: Nguyễn Bá Thuận

Page 11 of 12

ĐẠI HỌC LẠC HỒNG

GIÁO TRÌNH LẬP TRÌNH C CHO HỌ VI ĐIỀU KHIỂN 8051

Chương trình đã được lập trình và mô phỏng 3. BÀI TẬP ỨNG DỤNG. - Hãy khởi tạo ngắt timer 1. - Hãy lập trình một ứng dụng khi dùng ngắt timer. - Hãy khởi tạo ngắt ngoài 1. - Hãy lập trình một ứng dụng khi dùng ngắt ngoài 1.

Biên soạn: Nguyễn Bá Thuận

Page 12 of 12

Related Documents

Delay Dung Timer.pdf
December 2019 8
Delay
July 2020 11
Tugas Delay
June 2020 6
Dung
November 2019 22
Gate Delay
May 2020 8
Delay-notice-faz.docx
April 2020 8

More Documents from "ishtiyaq"

October 2019 27
Ocean City.docx
December 2019 27
Screen Hidra-model.pdf
April 2020 11