Thông báo

Collapse
No announcement yet.

điều khiển chương trình con dùng ngắt ngoài

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

  • điều khiển chương trình con dùng ngắt ngoài

    ai biết giúp mình chương trình này với, mình đọc qua nhiều luồng nói về cái này rồi nhưng mà chẳng làm đc.

    Ở đây mình muốn nhấn nút lần 1 thì led D1 sáng, ấn nút lần 2 thì led D2 sáng..
    (cụ thể hơn đó là nhấn lần 1 thì chương trình con 1 chạy, nhấn lần 2 thì chương trình con 2 chạy.)
    Click image for larger version

Name:	Capture.JPG
Views:	2
Size:	103.7 KB
ID:	1414483

  • #2
    cám ơn bạn chjpchjp, bạn hiểu rồi thì viết lại code C cho mình xem với hj, chương trình con của mình viết theo C hết cả rồi.!

    Comment


    • #3
      bạn tham khảo nhé
      Code:
      #include <regx51.h>
      #define led1 P1_0
      #define led2 P1_1
      char mode;
      void init();
      void EX1_ISR();
      
      void proc1();
      void proc2();
      
      void main() {
      	init();
      	while(1);
      }
      
      void init() {
      	mode=0;
      	EA=1;//cho phep ngat
      	EX1=1;//ngat ngoai 1
      	IT1=1;//ngat theo suon
      }
      
      void EX1_ISR() interrupt IE1_VECTOR {
      	if(!mode) {
      		mode=1;
      		proc1();
      	} else {
      		mode=0;
      		proc2();
      	}
      }
      
      void proc1() {
      	led2=1;
      	led1=0;
      }
      
      void proc2() {
      	led1=1;
      	led2=0;
      }

      Comment


      • #4
        Nguyên văn bởi chjpchjp1991
        Bạn Kidteam viết hàm này mình thấy khó hiểu void EX1_ISR() interrupt IE1_VECTOR { hic hic
        đó là hàm ngắt đó bạn
        @chip: mình mới hoàn thành cái compiler asm đó
        bạn tham khảo test giúp mình
        có lỗi gì mình fix luôn

        Comment


        • #5
          #include "reg52.h"
          #define led1 P1_0
          #define led2 P1_1
          int k=0;
          main()
          {
          IE=0x81;
          while(1)
          {
          if(k%2) {led1=1; led2=0;}
          else {led1=0; led2=1;}
          }
          }
          void ngat0() interrupt 0
          {
          //if(k=100) k=0; ///cai nay viet them cho khoi bi tran bien k
          while(P3==0xfb);
          k++;
          }
          cậu xem cái này nhá.
          mình viết luôn chưa test đâu.. nhưng chắc k sai
          Last edited by tan0710; 08-10-2012, 09:34.

          Comment


          • #6
            Nguyên văn bởi chjpchjp1991
            Bạn Kidteam viết hàm này mình thấy khó hiểu void EX1_ISR() interrupt IE1_VECTOR { hic hic
            ko khó hiểu đâu bạn. cái này chỉ là biến đã được định nghĩa giá trị thôi. bạn open file.h của 8051 lên tìm tới mục các vecto ngắt sẽ tìm thấy giá trị của ie_vector
            #define IE1_VECTOR 2 /* 0x13 External Interrupt 1 */ //được định nghĩa sẵn
            @kidteam: void EX1_ISR(); đoạn khai báo chương trình con này k cần thiết, các hàm ngắt ko cần khai báo trước main.
            Website chính thức đổi địa chỉ website thành
            Mời các bạn ghé thăm !!!

            Comment


            • #7
              Nguyên văn bởi mast090 Xem bài viết
              ko khó hiểu đâu bạn. cái này chỉ là biến đã được định nghĩa giá trị thôi. bạn open file.h của 8051 lên tìm tới mục các vecto ngắt sẽ tìm thấy giá trị của ie_vector
              #define IE1_VECTOR 2 /* 0x13 External Interrupt 1 */ //được định nghĩa sẵn
              @kidteam: void EX1_ISR(); đoạn khai báo chương trình con này k cần thiết, các hàm ngắt ko cần khai báo trước main.
              cảm ơn bạn
              chỉ là do thói quen thôi bạn à (mình quen trước khi sử dụng cái gì thì khai báo cái đó mặc dù biết là trường hợp này là không cần khai báo)

              Comment


              • #8
                Nguyên văn bởi kidteam Xem bài viết
                bạn tham khảo nhé
                Code:
                #include <regx51.h>
                #define led1 P1_0
                #define led2 P1_1
                char mode;
                void init();
                void EX1_ISR();
                
                void proc1();
                void proc2();
                
                void main() {
                	init();
                	while(1);
                }
                
                void init() {
                	mode=0;
                	EA=1;//cho phep ngat
                	EX1=1;//ngat ngoai 1
                	IT1=1;//ngat theo suon
                }
                
                void EX1_ISR() interrupt IE1_VECTOR {
                	if(!mode) {
                		mode=1;
                		proc1();
                	} else {
                		mode=0;
                		proc2();
                	}
                }
                
                void proc1() {
                	led2=1;
                	led1=0;
                }
                
                void proc2() {
                	led1=1;
                	led2=0;
                }
                bạn cho mình hỏi, với cái code của bạn thì mình thấy khi proc1 chạy xong, nhấn nút thì mới chuyển qua proc2.
                Ở đây mình đặt 1 vòng lặp cho proc1 lặp vô hạn, nếu khi nào nhấn nút thfi chuyển qua proc2 cũng lặp vô hạn...cứ như thế proc2-->proc1-->proc2...
                bạn sửa lại code giúp mình đc k.?
                ví dụ ở đây proc1 là 2 led nháy xem kẽ, proc2 là 2 led nháy tắt đồng thời.!

                Comment


                • #9
                  Code:
                  #include <regx51.h>
                  
                  #define led1 P1_0
                  #define led2 P1_1
                  
                  unsigned char mode;
                  
                  void proc1();
                  void proc2();
                  void init();
                  void EX1_ISR();
                  void Delay_Ms(unsigned char uMs);
                  
                  void main() {
                  	init();
                  	while(1) {
                  		if(!mode)
                  			proc1();
                  		else
                  			proc2();
                  	}
                  }
                  
                  void init() {
                  	mode=0;
                  	EA=1;
                  	EX1=1;
                  	IT1=1;	
                  }
                  
                  void EX1_ISR() interrupt IE1_VECTOR {
                  	if(mode)
                  		mode=0;
                  	else
                  		mode=1;
                  }
                  
                  void proc1() {
                  	led1=1;
                  	led2=0;
                  	Delay_Ms(100);
                  	led1=0;
                  	led2=1;
                  	Delay_Ms(100);
                  }
                  
                  void proc2() {
                  	led1=led2=0;
                  	Delay_Ms(100);
                  	led1=led2=1;
                  	Delay_Ms(100);
                  }
                  
                  void Delay_Ms(unsigned char uMs) {
                  	//lam gi do
                  }

                  Comment


                  • #10
                    thanks bạn kidteam nhiều.!

                    Comment


                    • #11
                      Nguyên văn bởi kidteam Xem bài viết
                      Code:
                      #include <regx51.h>
                      
                      #define led1 P1_0
                      #define led2 P1_1
                      
                      unsigned char mode;
                      
                      void proc1();
                      void proc2();
                      void init();
                      void EX1_ISR();
                      void Delay_Ms(unsigned char uMs);
                      
                      void main() {
                      	init();
                      	while(1) {
                      		if(!mode)
                      			proc1();
                      		else
                      			proc2();
                      	}
                      }
                      
                      void init() {
                      	mode=0;
                      	EA=1;
                      	EX1=1;
                      	IT1=1;	
                      }
                      
                      void EX1_ISR() interrupt IE1_VECTOR {
                      	if(mode)
                      		mode=0;
                      	else
                      		mode=1;
                      }
                      
                      void proc1() {
                      	led1=1;
                      	led2=0;
                      	Delay_Ms(100);
                      	led1=0;
                      	led2=1;
                      	Delay_Ms(100);
                      }
                      
                      void proc2() {
                      	led1=led2=0;
                      	Delay_Ms(100);
                      	led1=led2=1;
                      	Delay_Ms(100);
                      }
                      
                      void Delay_Ms(unsigned char uMs) {
                      	//lam gi do
                      }
                      bạn có thể mở rộng cho mình lên 3 hoặc 4 chương trình con k.?

                      Comment


                      • #12
                        Code:
                        #include <regx51.h>
                        
                        #define led1 P1_0
                        #define led2 P1_1
                        
                        unsigned char mode;
                        
                        void proc1();
                        void proc2();
                        void proc3();
                        void proc4();
                        //================================
                        //co the dat nhieu hon nua v.v.
                        void init();
                        void EX1_ISR();
                        void Delay_Ms(unsigned char uMs);
                        
                        void main() {
                        	init();
                        	while(1) {
                        		switch(mode) {
                        		case 0:
                        			proc1();
                        			break;
                        		case 1:
                        			proc2();
                        			break;
                        		case 2:
                        			proc3();
                        			break;
                        		case 3:
                        			proc4();
                        			break;
                        		}
                        	}
                        }
                        
                        void init() {
                        	mode=0;
                        	EA=1;
                        	EX1=1;
                        	IT1=1;	
                        }
                        
                        void EX1_ISR() interrupt IE1_VECTOR {
                        	++mode;
                        	if(mode==4)
                        		mode=0;
                        }
                        
                        void proc1() {
                        	led1=1;
                        	led2=0;
                        	Delay_Ms(100);
                        	led1=0;
                        	led2=1;
                        	Delay_Ms(100);
                        }
                        
                        void proc2() {
                        	led1=led2=0;
                        	Delay_Ms(100);
                        	led1=led2=1;
                        	Delay_Ms(100);
                        }
                        
                        void proc3() {
                        	//lam gi do tuy ban
                        }
                        
                        void proc4() {
                        	//lam gi la tuy o ban
                        }
                        void Delay_Ms(unsigned char uMs) {
                        	//lam gi do do ban nhe
                        }

                        Comment


                        • #13
                          Nguyên văn bởi kidteam Xem bài viết
                          Code:
                          #include <regx51.h>
                          
                          #define led1 P1_0
                          #define led2 P1_1
                          
                          unsigned char mode;
                          
                          void proc1();
                          void proc2();
                          void proc3();
                          void proc4();
                          //================================
                          //co the dat nhieu hon nua v.v.
                          void init();
                          void EX1_ISR();
                          void Delay_Ms(unsigned char uMs);
                          
                          void main() {
                          	init();
                          	while(1) {
                          		switch(mode) {
                          		case 0:
                          			proc1();
                          			break;
                          		case 1:
                          			proc2();
                          			break;
                          		case 2:
                          			proc3();
                          			break;
                          		case 3:
                          			proc4();
                          			break;
                          		}
                          	}
                          }
                          
                          void init() {
                          	mode=0;
                          	EA=1;
                          	EX1=1;
                          	IT1=1;	
                          }
                          
                          void EX1_ISR() interrupt IE1_VECTOR {
                          	++mode;
                          	if(mode==4)
                          		mode=0;
                          }
                          
                          void proc1() {
                          	led1=1;
                          	led2=0;
                          	Delay_Ms(100);
                          	led1=0;
                          	led2=1;
                          	Delay_Ms(100);
                          }
                          
                          void proc2() {
                          	led1=led2=0;
                          	Delay_Ms(100);
                          	led1=led2=1;
                          	Delay_Ms(100);
                          }
                          
                          void proc3() {
                          	//lam gi do tuy ban
                          }
                          
                          void proc4() {
                          	//lam gi la tuy o ban
                          }
                          void Delay_Ms(unsigned char uMs) {
                          	//lam gi do do ban nhe
                          }
                          sao mình viết chương trình con dài thì khi bấm không quay lại liền được bạn,,,bạn có thể giúp mình đựuoc không

                          Comment

                          Về tác giả

                          Collapse

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

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

                          Collapse

                          Đang tải...
                          X