Friday, April 18, 2014

// // 2 comments

010.Một số bài tập sử dụng ngắt ngoài INT0, INT1

Ví dụ 5:

            Giả sử chân INT1 được nối đến công tắc bình thường ở mức cao. Mỗi khi nó  ấn xuống thấp phải bật một đèn LED ở chân P1.3 (bình thường Led tắt), khi nó được bật lên nó phải sáng vài giây. Chừng nào công tắc được giữ ở trạng thái thấp đèn LED phải sáng liên tục.

Chúng ta có thể mắc mạch mô phỏng đơn giản như hình:





#include<regx52.h>         
//Khai báo thư viện cho MCU
main()                                               
//Chương trình chính
{
            IE=0x84;                  
 //cho phép ngắt ngoài 1(10000100: EA và Ex1=1)
}
void nutbam(void) interrupt 2         
//Khai báo trình phục vụ ngắt ngoài 1(interupt "2" tương ứng với ngắt ngoài 1: xem lại lý thuyết)
{                                                         
//(mặc định là ngắt theo mức thấp nên không cần khai báo cờ IT1)
            int a=50000;                        
//Biến đếm trễ
            P1_3=0;                                
//Cho Led sáng
            while(a--){}                         
//Trễ cho Led sáng vài giây, bằng cách thay đổi a để tăng hay giảm thời gian sáng
            P1_3=1;                                 
//Tắt Led
}


     Để hiểu rõ sự khác biệt của ngắt theo sườn xuống, ta xét ví dụ 6. Chú ý rằng sự khác nhau duy nhất giữa ví dụ 6 và ví dụ 5 là ở lệnh chuyển ngắt INT1 về kiểu ngắt theo sườn. Khi sườn âm của tín hiệu được cấp đến chân INT1 thì đèn LED sẽ bật lên một lúc. Trong ví dụ 5 do bản chất ngắt theo mức của ngắt thì đèn LED còn sáng chừng nào tín hiệu ở chân INT1 vẫn còn ở mức thấp. Nhưng trong ví dụ 6 này để bật lại đèn LED thì xung ở chân INT1 phải được đưa lên cao rồi sau đó bị hạ xuống thấp để tạo ra một sườn âm làm kích hoạt ngắt.

Ví Dụ 6:

#include<regx52.h>         
//Khai báo thư viện cho MCU
main()                                               
//Chương trình chính
{
            IE=0x84;                  
 //cho phép ngắt ngoài 1(10000100: EA và Ex1=1)
            IT1=1;
//Khai báo ngắt theo kiểu sườn xuống
}
void nutbam(void) interrupt 2         
//Khai báo trình phục vụ ngắt ngoài 1(interupt "2" tương ứng với ngắt ngoài 1: xem lại lý thuyết)
{                                                         
            int a=50000;                        
//Biến đếm trễ
            P1_3=0;                                
//Cho Led sáng
            while(a--){}                         
//Trễ cho Led sáng vài giây, bằng cách thay đổi a để tăng hay giảm thời gian sáng
            P1_3=1;                                 
//Tắt Led
}


  Như vậy chỉ với một câu lệnh khai báo kiểu ngắt theo sườn xuống chúng ta đã giải quyết được vấn đề nêu ra ở ví dụ 6 rồi.

Ví dụ 7:
Chỉ sử dụng 1 ngắt ngoài điều khiển 4 nút bấm riêng biệt bật tắt LED

       Để chỉ dùng một chân MCU để điều khiển ta cần một cổng AND 4 đầu vào để khi có ít nhất 1 phím được bấm, tín hiệu sẽ gửi vào chân 13 INT1 của 8051

       Mắc mạch mô phỏng Proteus như hình vẽ:
Pick:
  • AT89C52
  • BUTTON
  • LED-RED
  • 4082 hoặc AND_4



#include<regx52.h>   
void delay(unsigned int t)
//ham delay
{
            unsigned int x,y;
            for(x=0;x<t;x++)
            {
                        for(y=0;y<t;y++);
            }
}
main()                                                
//Chuong trình chính
{
            IE=0x84;
                                    //khai bao ngat ngoai 1
                                    IT1=1;
                                    //khai bao ngat theo suon xuong
                                    P2=0;
                                    //cho LED mac dinh tat
                                    while(1)                    
            {
                        PCON |=0x01;
            //khai bao POWER SAVING MODE             
}                  
}
void ngatngoai(void) interrupt 2         
{
            delay(20);
            //chong doi phim
            if(!P1_0)// Neu phim 1 duoc bam
            {
                        P2_0=!P2_0;
                        while(!P1_0);
            }
            if(!P1_1)// Neu phim 2 duoc bam
            {
                        P2_1=!P2_1;
                        while(!P1_1);
            }
            if(!P1_2)// Neu phim 3 duoc bam
            {
                        P2_2=!P2_2;
                        while(!P1_2);
            }
            if(!P1_3)// Neu phim 4 duoc bam
            {
                        P2_3=!P2_3;
                        while(!P1_3);
            }

}      

Ở những ví dụ trên mình không khai báo kết nối mà làm gọn code bằng cách gọi chân vi điều khiển chứ không khai báo LED_PIN hay KEY để đỡ tốn công gõ. Nhưng đối với những project lớn, chúng ta nên đặt tên cho từng PIN kết nối để dễ lập trình cũng như sửa lỗi đỡ nhầm lẫn. Bài viết hôm nay dừng lại ở đây. Ở bài viết tiếp theo, chúng ta sẽ cùng nhau quay lại LED7 SEG để làm Project đồng hồ Stop watch số đơn giản nhé~

Thân
Phong'S

2 comments:

  1. Chia sẻ của bạn thú vị quá, các bạn có tò mò muốn biết công ty nào thi công nội thất uy tín không? mời bạn ghé trang mình Thi công nội thất để biết thêm thông tin nha! Chúc một ngày vui vẻ.

    ReplyDelete
  2. Caesars Casino & Resort review and opening hours
    With 화성 출장안마 more than 경상남도 출장안마 900 slot machines and 강원도 출장마사지 table games, the Caesars 양산 출장마사지 Resort in Las Vegas is one of the premier 울산광역 출장샵 destinations for players who love table

    ReplyDelete