Thông báo

Collapse
No announcement yet.

Thiết lập timer toàn cục

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

  • Thiết lập timer toàn cục

    Mình đang tập lập trình C cho VDK 8051
    Thầy ra yêu cầu là phải thiết lập timer toàn cục ko đc làm cục bộ
    Mình code ra và test thử trên Proteus nhưng hầu như nó ko theo cái hàm delay_ms với delay_s minh mún
    hầu như nó chỉ chạy theo thanh ghi timer
    Mọi người xem rồi góp ý cho mình với
    Code:
    #include <REG51F.H>
    int duration;
    void init_timer0(){
        IE &= ~(0x82); // enable timer0
        IE |= 0x82;
        TMOD &= ~(0x02); // setup timer0
        TMOD |= 0x02;
        TH0 = (-10000/256); //10ms
        TL0 = (-10000%256);    
    }
    void timer0_isr() interrupt 1{
        TR0=0;//stop timer0
        TH0 = (-10000/256);//reinitalize 
        TL0 = (-10000%256);
        if( duration!=0){
            duration--;
        }
        TR0=1;
    }
    void start_timer0(){
        TR0=1;
    }
    void stop_timer0(){
        TR0=0;
    }
    void delay_ms(int time){
        duration=time;
        while(duration!=0)
            {}
    }
    void delay_s(int time){
        duration=time*1000;
        while (duration!=0)
            {}
    }
    void main(){
        init_timer0();
        while (1){
            P1=0xAA;
            delay_s(100);
            P1=0x55;
            delay_s(100);
        }
    }
    Last edited by kenk11; 08-05-2013, 17:13.

  • #2
    hiểu gì chết liền

    Comment


    • #3
      Nguyên văn bởi chung1608 Xem bài viết
      hiểu gì chết liền
      ý tưởng của mình là
      - đầu tiên sẽ thiết lập timer 0 chạy với độ chia 10ms
      - khi mà đủ 10ms thì nó sẽ tạo 1 interrupt vào timer0_isr để làm delay
      - còn hàm delay thì truyền giá trị của time cho duration để có thể chạy delay

      Comment


      • #4
        Code:
        #include <REG51F.H>
        int duration;
        void init_timer0(){
            IE = 0x82;
            TMOD = 0x01;
            TH0 = (-10000/256); //10ms
            TL0 = (-10000%256);    
        }
        void timer0_isr() interrupt 1{
            duration--;
            TH0 = (-10000/256);//reinitalize 
            TL0 = (-10000%256);
        }
        void start_timer0(){
            TR0=1;
        }
        void stop_timer0(){
            TR0=0;
        }
        void delay_ms(int time){
            duration=time;
        start_timer0();
            while(duration!=0);
        stop_timer0();
        }
        void delay_s(int time){
            duration=time*100;
        start_timer0();
            while(duration!=0);
        stop_timer0();
        }
        void main(){
            init_timer0();
            while (1){
                P1=0xAA;
                delay_s(100);
                P1=0x55;
                delay_s(100);
            }
        }

        Comment


        • #5
          Nguyên văn bởi chung1608 Xem bài viết
          Code:
          #include <REG51F.H>
          int duration;
          void init_timer0(){
              IE = 0x82;
              TMOD = 0x01;
              TH0 = (-10000/256); //10ms
              TL0 = (-10000%256);    
          }
          void timer0_isr() interrupt 1{
              duration--;
              TH0 = (-10000/256);//reinitalize 
              TL0 = (-10000%256);
          }
          void start_timer0(){
              TR0=1;
          }
          void stop_timer0(){
              TR0=0;
          }
          void delay_ms(int time){
              duration=time;
          start_timer0();
              while(duration!=0);
          stop_timer0();
          }
          void delay_s(int time){
              duration=time*100;
          start_timer0();
              while(duration!=0);
          stop_timer0();
          }
          void main(){
              init_timer0();
              while (1){
                  P1=0xAA;
                  delay_s(100);
                  P1=0x55;
                  delay_s(100);
              }
          }
          mình mún hỏi thêm là, có cách nào để ko phải can thiệp vào timer trong hàm delay ko
          vì nếu dung 2 3 delay thì nó sẽ chồng chéo nhau, ko chính xác,
          giống như kiểu bài toán, truyền dữ liệu từ P1 sang P0 và chọn 1 chân của VDK nối với led nhấp nháy mỗi 1s
          theo bài toán trên thì timer cứ chạy khi nào đủ 1 s thì nó sẽ dừng lại đảo giá trị của led
          Mình đang mún làm timer toàn cục theo hướng đó

          Comment


          • #6
            ai bít giúp mình với

            Comment


            • #7
              ý của bạn là 2 chương trình chạy độc lập với nhau : trong khi vẫn truyền xuất dữ liệu ở P1 thì led ở P2.0 chẳng hạn vẫn nhấp nháy với tần số là 1 Hz ?
              chỉ có tâm hồn là nơi duy nhất: có thể biến thiên đường thành địa ngục và ngược lại có thể biến địa ngục hóa thiên đường
              Everything should be made as simple as possible, but not simpler

              Comment


              • #8
                Nguyên văn bởi daohuytien Xem bài viết
                ý của bạn là 2 chương trình chạy độc lập với nhau : trong khi vẫn truyền xuất dữ liệu ở P1 thì led ở P2.0 chẳng hạn vẫn nhấp nháy với tần số là 1 Hz ?
                đúng vậy đó bạn, mình ko mún hàm delay nó can thiệp vào timer

                Comment


                • #9
                  Code:
                  #include <regx51.h>
                  
                  void init_timer0()
                  {
                  	TMOD=0x01; // thanh ghi chế độ của timer
                  	TH0=0;
                  	TL0=0;
                  	TR0=1;
                  	ET0=1;
                  	EA=1;
                  }
                  void timer0_isr() interrupt 1
                  {
                          TR0=0;//stop timer0
                           ///bạn  làm gì ở đây thì làm nó sẽ độc lập với chương trình chính. chú ý không lên để 
                  thời gian trễ dài trong đây
                  	TH0=0;// nạp lại các giá trị của TH0 và TL0 và khởi động lại timer0
                  	TL0=0;
                          TR0=1;
                  }
                  void delay(int time)
                  {     
                           int n;
                           for(n=0;n<time*100;n++);
                  }
                  
                  void main()
                  {
                       init_timer0();
                       while (1)
                      {
                           P1=0xff;
                           delay(1000);
                           P1=0;
                           delay(1000);
                      }
                  }
                  bạn xem thử code này nhé
                  chỉ có tâm hồn là nơi duy nhất: có thể biến thiên đường thành địa ngục và ngược lại có thể biến địa ngục hóa thiên đường
                  Everything should be made as simple as possible, but not simpler

                  Comment


                  • #10
                    Nguyên văn bởi daohuytien Xem bài viết
                    Code:
                    #include <regx51.h>
                    
                    void init_timer0()
                    {
                    	TMOD=0x01; // thanh ghi chế độ của timer
                    	TH0=0;
                    	TL0=0;
                    	TR0=1;
                    	ET0=1;
                    	EA=1;
                    }
                    void timer0_isr() interrupt 1
                    {
                            TR0=0;//stop timer0
                             ///bạn  làm gì ở đây thì làm nó sẽ độc lập với chương trình chính. chú ý không lên để 
                    thời gian trễ dài trong đây
                    	TH0=0;// nạp lại các giá trị của TH0 và TL0 và khởi động lại timer0
                    	TL0=0;
                            TR0=1;
                    }
                    void delay(int time)
                    {     
                             int n;
                             for(n=0;n<time*100;n++);
                    }
                    
                    void main()
                    {
                         init_timer0();
                         while (1)
                        {
                             P1=0xff;
                             delay(1000);
                             P1=0;
                             delay(1000);
                        }
                    }
                    bạn xem thử code này nhé
                    cái hàm delay sao nó ko có liên quan đến timer vậy cậu, vậy nó sẽ tính theo timer hay chu kỳ máy vậy ?

                    Comment


                    • #11
                      Nguyên văn bởi kenk11 Xem bài viết
                      cái hàm delay sao nó ko có liên quan đến timer vậy cậu, vậy nó sẽ tính theo timer hay chu kỳ máy vậy ?
                      cái này tính theo dạng chu kỳ máy thôi. bạn muốn có hàm delay tính theo timer thì đây nhé :
                      Code:
                      void delay() // hàm delay này có độ trễ 500us
                      {	
                      	TMOD=0x11;
                      	TH0=0xfe;
                      	TL0=0x0c;
                      	TR0=1;
                      	while(TF0==0)
                      	{}
                      	TR0=0;
                      	TF0=0;
                      }
                      void init_timer1()
                      {
                      	TMOD=0x11;
                      	TH1=0;
                              TL1=0;
                      	TR1=1;
                      	ET1=1;
                      	EA=1;
                      }
                      chỉ có tâm hồn là nơi duy nhất: có thể biến thiên đường thành địa ngục và ngược lại có thể biến địa ngục hóa thiên đường
                      Everything should be made as simple as possible, but not simpler

                      Comment

                      Về tác giả

                      Collapse

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

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

                      Collapse

                      Đang tải...
                      X