Thông báo

Collapse
No announcement yet.

Thắc mắc về ngắt trong 8051

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Thắc mắc về ngắt trong 8051

    tình hình là mình đang lam đồ án , mà sắp tới hạn báo cáo rồi ...
    mình có 1 thắc mẳc là ngắt timer trong 8051 dùng như thế nào

    đề tài của mình là mach giao thông , có 4 chế độ , ban ngày , ban đêm , cao điểm ( số thời gian thay đổi dài hơn ) , và chỉnh tay .
    mình có tham khảo 1 bài trên diễn đàn một mạch , nhưng mạch đó chỉ có 2 chế độ là ban ngày và ban đêm .
    mình đã dùng ngắt ngoài một và ngắt ngoài 0 rồi , không biết dùng ngắt timer ntn để khi bấm sw thì đèn xanh và đèn đỏ bên kia sáng @@
    code mình nè :
    Code:
    #include<AT89X51.h>
    unsigned char thoi_gian0,thoi_gian1,thoi_gian2,thoi_gian3,thoi_gian4;
    unsigned int over=0;
    unsigned char ma[10]={192,249,164,176,153,146,130,248,128,144};
    
    void delay(unsigned int time)
    {    
        unsigned char x,y;
        for(x=0;x<time;x++)
        {
            for(y=0;y<100;y++);
    		{}
        }
    }
    
    
    
    void h_thi0() // quet led trai
    {
    	unsigned char chuc,donvi;
    	donvi=thoi_gian0%10;
        chuc=thoi_gian0/10;
            
    	P2=ma[donvi];
    	P0_0=1;
    	delay(1);
    	P0_0=0;
    	delay(1);
    
    	P2=ma[chuc];
    	P0_1=1;
    	delay(1);
    	P0_1=0;
    	delay(1);
    }
    
    
    
    void h_thi1()		// quet led phai
    {
        unsigned char chuc,donvi;
        donvi=thoi_gian1%10;
        chuc=thoi_gian1/10;
            
    	P2=ma[donvi];
    	P0_2=1;
    	delay(1);
    	P0_2=0;
    	delay(1);
    
    	P2=ma[chuc];
    	P0_3=1;
    	delay(1);
    	P0_3=0;
    	delay(1);
    }
    
    void h_thi2()  //quet led phai
    {
        unsigned char chuc,donvi;
        donvi=thoi_gian2%10;
        chuc=thoi_gian2/10;
            
    	P2=ma[donvi];
    	P0_2=1;
    	delay(1);
    	P0_2=0;
    	delay(1);
    
    	P2=ma[chuc];
    	P0_3=1;
    	delay(1);
    	P0_3=0;
    	delay(1);
    }
    
    
    void h_thi3()  ///quet led trai
    {
        unsigned char chuc,donvi;
        donvi=thoi_gian3%10;
        chuc=thoi_gian3/10;
            
    	P2=ma[donvi];
    	P0_0=1;
    	delay(1);
    	P0_0=0;
    	delay(1); 
    
    	P2=ma[chuc];
    	P0_1=1;
    	delay(1);
    	P0_1=0;
    	delay(1);
    }
    
    void bandem(void) interrupt 2 using 0 // dung ngat ngaoi 1 su dung bank 0; 
    {
    P0=0;
    P1=0xD2;
    delay(240);
    P1=0x00;
    delay(240);
    return;
    }
    
    
    void giay() interrupt 3 using 0	  // ngat timer
    {                         
        over++;
        if(over==4900)        //gia tri tinh chinh de delay 1s
        {
            over=0;
            thoi_gian0--;
            thoi_gian1--;
            thoi_gian2--;
            thoi_gian3--;
        }        
    }
    
    
    							    
    void main()
    {
        TMOD=0x20;        //timer0 1 che do 2 tu nap lai
        TH1=54;        //gia tri nap lai
        TR1=1; 
    	ET1=1;
    	EX1=1;
        EA=1;    	  // bit cho phep ngat
    while(1)
    {
    thoi_gian0=24;
    thoi_gian1=30;
    
        do
        {
        P1=0x8c;
        h_thi0();
        h_thi1();
        }
        while(thoi_gian0!=-1);
    
    thoi_gian0=5;
    thoi_gian1=5;
        do
        {
        P1=0x8a;
        h_thi0();
        h_thi1();
        }
        while(thoi_gian0!=-1);
    
        thoi_gian2=24;
        thoi_gian3=30;
    
        do
        {
    
        P1=0x61;
        h_thi2();
        h_thi3();
        }
        while(thoi_gian2!=-1);
    
        thoi_gian2=5;
        thoi_gian3=5;
        do
        {
        P1=0x51;
        h_thi2();
        h_thi3();
        }
        while(thoi_gian2!=-1);
    }
    }
    thanks các bác nhé , ai biết thì cứu em , huhu
    Last edited by trantiena10; 25-03-2013, 09:37.

  • #2
    bác có thể mở rộng ngắt ra bằng cách:giả sử dùng ngắt INT0;
    bác nối 4SW vào 4 pin của P1(P1.0; P1.1; P1.2; P1.3) đồng thời nối 4 pin của P1 này vào chân INT0(tất nhiên phải nối qua cổng AND trước rồi mới nối vào INT0).như vậy sau khi có ngắt xảy ra thì bác chỉ cần kiểm tra giá trị của P1 xem SW nào được nhấn thì sẽ thực hiện chưong trình cho từng SW đó.

    Comment


    • #3
      Nguyên văn bởi trantiena10 Xem bài viết
      tình hình là mình đang lam đồ án , mà sắp tới hạn báo cáo rồi ...
      mình có 1 thắc mẳc là ngắt timer trong 8051 dùng như thế nào

      đề tài của mình là mach giao thông , có 4 chế độ , ban ngày , ban đêm , cao điểm ( số thời gian thay đổi dài hơn ) , và chỉnh tay .
      mình có tham khảo 1 bài trên diễn đàn một mạch , nhưng mạch đó chỉ có 2 chế độ là ban ngày và ban đêm .
      mình đã dùng ngắt ngoài một và ngắt ngoài 0 rồi , không biết dùng ngắt timer ntn để khi bấm sw thì đèn xanh và đèn đỏ bên kia sáng @@
      code mình nè :
      ....

      thanks các bác nhé , ai biết thì cứu em , huhu
      Nguyên văn bởi voiviqua Xem bài viết
      bác có thể mở rộng ngắt ra bằng cách:giả sử dùng ngắt INT0;
      bác nối 4SW vào 4 pin của P1(P1.0; P1.1; P1.2; P1.3) đồng thời nối 4 pin của P1 này vào chân INT0(tất nhiên phải nối qua cổng AND trước rồi mới nối vào INT0).như vậy sau khi có ngắt xảy ra thì bác chỉ cần kiểm tra giá trị của P1 xem SW nào được nhấn thì sẽ thực hiện chưong trình cho từng SW đó.
      Mình thật sự không hiểu vấn đề mà hai người bạn này đang bàn bạc...
      Hôm nay trời nắng chang chang.
      Mèo con đi học chẳng mang thứ gì.
      Chỉ mang một cái bút chì.
      Và mang một mẩu bánh mì con con.

      Comment


      • #4
        Nguyên văn bởi Acxen_lupine Xem bài viết
        Mình thật sự không hiểu vấn đề mà hai người bạn này đang bàn bạc...
        ý mình là mình đã sài INT0 và INT1 , giờ làm sao để dùng ngắt khác ấy


        đây là mạch mô phỏng của mình


        có file protues luôn da1.DSN

        Comment


        • #5
          Nguyên văn bởi voiviqua Xem bài viết
          bác có thể mở rộng ngắt ra bằng cách:giả sử dùng ngắt INT0;
          bác nối 4SW vào 4 pin của P1(P1.0; P1.1; P1.2; P1.3) đồng thời nối 4 pin của P1 này vào chân INT0(tất nhiên phải nối qua cổng AND trước rồi mới nối vào INT0).như vậy sau khi có ngắt xảy ra thì bác chỉ cần kiểm tra giá trị của P1 xem SW nào được nhấn thì sẽ thực hiện chưong trình cho từng SW đó.
          mạch mình các port đều dùng hết rùi bạn ơi , giờ phải làm sao ?

          Comment


          • #6
            Nguyên văn bởi trantiena10 Xem bài viết
            mạch mình các port đều dùng hết rùi bạn ơi , giờ phải làm sao ?
            hình của bác còn nhiều PIN thừa đó.tận dụng nó được mà.

            Comment


            • #7
              Nguyên văn bởi Acxen_lupine Xem bài viết
              Mình thật sự không hiểu vấn đề mà hai người bạn này đang bàn bạc...
              vấn đề của chủ top chỉ là muốn mở rộng ngắt ngoài thôi mà.

              Comment


              • #8
                Muốn mở rộng nữa thì dùng 8255. Mà led & đoạn bạn dùng IC giải mã BCD 74LS247 thì dư lại đc 4 chân VDK đấy.
                Email:
                Phone: 0969 226 539

                Comment


                • #9
                  Nguyên văn bởi voiviqua Xem bài viết
                  hình của bác còn nhiều PIN thừa đó.tận dụng nó được mà.
                  bác có ví dụ cho em dễ hình không bác , em chẳng biết mở rộng thế nào cả

                  Comment


                  • #10
                    Nguyên văn bởi vantrinh0902 Xem bài viết
                    Muốn mở rộng nữa thì dùng 8255. Mà led & đoạn bạn dùng IC giải mã BCD 74LS247 thì dư lại đc 4 chân VDK đấy.
                    lại phải nghiên cứu thêm con 8255 hở bác

                    Comment


                    • #11
                      mở rộng ngắt theo kiểu này

                      Code:
                      #include <REGX51.H>
                      
                      void EX0ISR(void) interrupt 2 using 0
                      {
                      if(!P3_4)P1_4=!P1_4;
                      if(!P3_5)P1_5=!P1_5;
                      if(!P3_6)P1_6=!P1_6;
                      if(!P3_7)P1_7=!P1_7;
                      }
                      void main ()
                      {
                      EA=1;
                      EX1=1;
                      IT1=1;
                      while(1);
                      }

                      Comment


                      • #12
                        cảm ơn anh chung1608 đã giúp đỡ em . nhưng nhờ anh giải thích giùm em đoạn code này ... tại em mới học C tren con 8051 , nên em ga mờ lắm
                        void EX0ISR(void) interrupt 2 using 0
                        {
                        if(!P3_4)P1_4=!P1_4;
                        if(!P3_5)P1_5=!P1_5;
                        if(!P3_6)P1_6=!P1_6;
                        if(!P3_7)P1_7=!P1_7;
                        }

                        Comment


                        • #13
                          Nguyên văn bởi trantiena10 Xem bài viết
                          cảm ơn anh chung1608 đã giúp đỡ em . nhưng nhờ anh giải thích giùm em đoạn code này ... tại em mới học C tren con 8051 , nên em ga mờ lắm
                          đơn giản nếu như bạn bấm nút ở p3.4 thì khi nhảy vào ngắt nó sẽ làm công việc ở hàm if thứ nhát rồi thoát ra, nếu bấm p3.5 thì nó sẽ làm công việc ở hàm if thứ 2.....

                          Comment


                          • #14
                            Nguyên văn bởi chung1608 Xem bài viết
                            đơn giản nếu như bạn bấm nút ở p3.4 thì khi nhảy vào ngắt nó sẽ làm công việc ở hàm if thứ nhát rồi thoát ra, nếu bấm p3.5 thì nó sẽ làm công việc ở hàm if thứ 2.....
                            cảm ơn anh đã nhiệt tình chỉ , giờ a có thể giúp em làm thế nào để tính delay trong C ví dụ nhứ hàm
                            void delay(unsigned int time)
                            {
                            unsigned char x,y;
                            for(x=0;x<time;x++)
                            {
                            for(y=0;y<100;y++);
                            {}
                            }
                            }
                            tại vì trong mô phỏng delay chạy khác với thục tế ... thật khó hiểu @@

                            Comment


                            • #15
                              Nguyên văn bởi trantiena10 Xem bài viết
                              cảm ơn anh đã nhiệt tình chỉ , giờ a có thể giúp em làm thế nào để tính delay trong C ví dụ nhứ hàm

                              tại vì trong mô phỏng delay chạy khác với thục tế ... thật khó hiểu @@
                              bạn có thể dùng keilC để debug, bên góc phải phía dưới có hiện thời gian chương trình chạy hết bao lâu.

                              Comment

                              Về tác giả

                              Collapse

                              trantiena10 Tìm hiểu thêm về trantiena10

                              Bài viết mới nhất

                              Collapse

                              Đang tải...
                              X