Friday, April 18, 2014

// // 2 comments

009. Một số bài tập sử dụng ngắt Timer0, Timer1

Ví dụ về nạp giá trị cho Timer:


Những loại thạch anh phổ biến nhất được liệt kê trong bảng sau:
Tần số thạch anh
Tần số Timer
Chu kỳ Timer
20MHz
20MHz/12=1,6666MHz
1/1,6666MHz=0,6us
12MHz
12MHz/12=1MHz
1/1MHz=1us
11,0592MHz
11,0592MHz/12=0,9216MHz
1/0,9216MHz=1,085us

Các bước thực thực hiện tìm giá trị cần nạp:

1.      Chia thời gian trễ cần thiết cho 1.085ms2.      Thực hiện 65536 – n với n là giá trị thập phân nhận được từ bước 1 (hoặc lấy -n rồi đổi sang Hex luôn)
3.      Chuyển đổi kết quả ở bước 2 sang số Hex: ta có YYXX là giá trị Hexa ban đầu cần phải nạp vào các thanh ghi Timer.
4.      Đặt TL = XX và TH = YY.

Ví dụ 1:

            Giả sử tần số XTAL = 11.0592MHz. Hãy tìm các giá trị cần được nạp vào các thanh ghi vào các thanh ghi TH và TL nếu ta muốn độ thời gian trễ là 5ms.

            Vì tần số XTAL = 11.0592MHz nên bộ đếm tăng sau mỗi chu kỳ 1.085ms. Để có thời gian trễ là 5ms ta cần lặp n nhịp và n = 5ms/ 1.085ms = 4608 nhịp. Để nhận được giá trị cần được nạp vào TL và TH thì ta tiến hành lấy 65536 - 4608 = 60928. Ta đổi số này ra số hex thành EE00H (hoặc lấy -n đổi sang Hex ta cũng có kết quả tương tự). Do vậy, giá trị nạp vào TH là EE Và TL là 00.

void delay(void)                        //định nghĩa hàm delay
{
                        TMOD=0x01;      //chọn timer0 chế độ 1 16Bit
                        TL0=0x00;       //nạp giá trị cho TL0
                        TH0=0xEE;       //nạp giá trị cho TH0
                        TR0=1;          //khởi động timer0
                        while(!TF0){}   //vòng lặp kiểm tra cờ TF0
                        TR0=0;          //ngừng timer0
                        TF0=0;          //xóa cờ TF0
}

Ví dụ 2:

            Giả sử ta có tần số XTAL là 11,0592MHz. Hãy tìm các giá trị cần được nạp vào các thanh ghi TH và TL để tạo ra một xung vuông tần số 2kHz.

Xét các bước sau:
1. T = 1/f = 1/2KHz = 500us là chu kỳ của sóng vuông.
2.  Khoảng thời gian phần cao và phần thấp là: T/2 = 250ms.
3.      Số nhịp cần trong thời gian đó là:250us/1,085us = 230. Giá trị cần nạp vào các thanh ghi cần tìm là 65536 – 230 = 65306 và ở dạng hex là FF1AH.
4.      Giá trị nạp vào TL là 1AH, TH là FFH.
Chương trình cần viết là:

void delay(void)                        //định nghĩa hàm delay
{
                        TMOD=0x01;      //chọn timer0 chế độ 1 16Bit
                        TL0=0x00;       //nạp giá trị cho TL0
                        TH0=0xEE;       //nạp giá trị cho TH0
                        TR0=1;          //khởi động timer0
                        while(!TF0){}   //vòng lặp kiểm tra cờ TF0
                        TR0=0;          //ngừng timer0
                        TF0=0;          //xóa cờ TF0
}

Ví dụ 3:

       Viết chương trình tạo xung vuông chu kỳ 200us trên chân P2.1 Sử dụng bộ Timer0 8bit để tạo ra xung vuông, tần số XTAL = 12MHz.

Chu kỳ 200us, vậy nửa chu kỳ là 100us.
Ta có: n=100us/1us=100
Suy ra giá trị cần nạp cho timer0 là: -100 hay 9Ch. Ta sử dụng Timer0 8 bit.

#include<regx52.h>                     
//khai báo thu viện cho VÐK 89C52
main()
{
            TMOD=0x02;         
//chọn timer0, chế độ 2, 8Bit tự nạp lại
            TL0=0x64;           
//nạp giá trị cho TL0
            TH0=0x64;           
//nạp giá trị cho TH0
            TR0=1;                   
//khởi động timer0
            IE=0x82;                 
//cho phép ngắt timer0
}
void xungvuong(void) interrupt 1   
//Khai báo trình phục vụ ngắt cho Timer0
{
            TR0=0;                       
//Ngừng Timer0
            P2_1=~P2_1;             
//Đảo trạng thái chân P2_1.
            TR0=1;                       
//Khởi động timer0
                                              
//Không cần xóa cờ TF0, 8051 tự động xóa.
}

Ví dụ 4:

        Hãy viết lại chương trình ở ví dụ 2 để tạo sóng vuông với mức cao kéo dài 1085ms và mức thấp dài 15ms với giả thiết tần số XTAL = 11.0592MHz. Hãy sử dụng Timer1.

            Vì 1085ms/1.085ms=1000 nên ta cần sử dụng chế độ 1 của Timer1.
Các giá trị cần nạp cho Timer1 là:
1085/1.085=1000 , -1000 -> FC18H
15/1.085=14 , -14 -> FFF2H

#include<regx52.h>
bit a=0;                                
//khai báo bit kiểm tra
main()
{
            TMOD=0x10;          
//chọn timer1, chế độ 1, 16Bit
            TL1=0x18;               
 //nạp giá trị cho TL1
            TH1=0xFC;             
 //nạp giá trị cho TH1
            TR1=1;                   
 //khoi dong timer1
            IE=0x88;                 
 //cho phép ngat timer1 
            while(1)                   
//vòng lặp vô hạn
            {
                        P1=~P0;        
//Cập nhật cổng P1
            }
}
void songvuong(void) interrupt 3    
//Khai báo trình phục vụ ngắt timer1
{
            TR1=0;                                  
//Dừng timer1           
            if(a==0)                                 
 //Nếu Xung vuông đang ở mức thấp
            {
                        P2_1=1;                    
//Bật xung vuông lên cao
                        a=1;                          
//Đặt lại bit kiểm tra
                        TL1=0x18;                
//Nạp lại TL1: Ứng với mức trễ phần cao
                        TH1=0xFC;               
//Nạp lại TH1
            }
            Else                                       
//Nếu Xung vuông đang ở mức cao
            {         
                        P2_1=0;                   
 //Lật xung xuống thấp
                        a=0;                          
//Đặt lại bit kiểm tra
                        TL1=0xF2;              
 //Nạp lại TL1: Ứng với mức trễ phần thấp                       
                        TH1=0xFF;        
 //Nạp lại TH1
            }
            TR1=1;                                   
 //Khởi động lại timer1
                                                          
//Không cần xóa cờ TF1, 8051 tự động xóa
}




Thân

Phong'S









2 comments:

  1. b1: Chia thời gian trễ cần thiết cho chu kì

    ReplyDelete
  2. tính tần số xung tràn để được 0.5s biết tần số thạch anh dùng 16Mhz bộ chia tần 64 timer0

    ReplyDelete