Thông báo

Collapse
No announcement yet.

Cách khai báo 2 timer cùng 1 lúc

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

  • Cách khai báo 2 timer cùng 1 lúc

    Chào các bác ạ, em đang làm cái bài như sau. Dùng 2 timer. Dùng để sau 1 thời gian t nhất định, thì sẽ gửi 1 ký tự qua RS232 lên vi tính. Nhưng cái khổ là giờ, nếu dùng 2 timer thì cái TMOD lúc đầu sẽ khai báo là ntn ạ? Em chưa hiểu đoạn này, các bác giúp em, em xin cảm ơn các bác.

  • #2
    thanh ghi TMOD có các bit dành riêng cho hai timer mà, sao phải lăn tăn là không config cùng một lúc cho hai timer cùng một lúc được nhỉ.

    Comment


    • #3
      Eg: TMOD=0x12 // timer 1 mode 1 16bit và timer 0 mode 2 8bit tự nạp lại.
      ngoài ra còn có timer2 nữa.
      làm như trên là đã khởi tạo 1 lúc 2 timer rồi
      Website chính thức đổi địa chỉ website thành
      Mời các bạn ghé thăm !!!

      Comment


      • #4
        Nguyên văn bởi qwerty68 Xem bài viết
        Chào các bác ạ, em đang làm cái bài như sau. Dùng 2 timer. Dùng để sau 1 thời gian t nhất định, thì sẽ gửi 1 ký tự qua RS232 lên vi tính. Nhưng cái khổ là giờ, nếu dùng 2 timer thì cái TMOD lúc đầu sẽ khai báo là ntn ạ? Em chưa hiểu đoạn này, các bác giúp em, em xin cảm ơn các bác.
        Đồng chí này không đọc kỹ về ngắt à? 2 timer đó có liên quan gì tới nhau đâu, nên khai báo cả 2 timer luôn chứ sao!

        Comment


        • #5
          Nguyên văn bởi Ck33spkt Xem bài viết
          Đồng chí này không đọc kỹ về ngắt à? 2 timer đó có liên quan gì tới nhau đâu, nên khai báo cả 2 timer luôn chứ sao!
          Khổ nỗi em khai báo cả 2 timer thì nó không chạy ấy ạ. Cắm vào thì PC chả nhận được tín hiệu gì cả. Đây code đây các bác xem thử :
          Code:
          #include <REGX51.H>
          #include<string.h> 
          
          
          
          void send(unsigned char a);           //khai báo nguyên m?u hàm g?i 1 ký t?
          void sendchuoi(char *a);                //khai báo nguyên m?u hàm g?i 1 chu?i
          void number(unsigned int i);
          
          void main(void)                                                            //Chuong trình chính
          {
          		EA=1;
          	
          		ET0=1;
              TMOD=0x20;                       //Ch?n Timer1, ch? d? 2
          		TMOD=0x01;
          		SCON=0x50;
          		TH0=0xf6;
          		TL0=0x36;
                      TH1=0xFD;                           //Cài d?t t?c d? 9600 baud
                                                          //0101 0000: Ch?n ch? d? 1, Cho phép nh?n
                      TR1=1;                                   //Kh?i d?ng Timer1
          						TR0=1;
          						
          						
          
                      while(1)                                 //Vòng l?p vô h?n
                      {
          							
          							;
          			
          							
          }
          }
          
          void send(unsigned char a)                        //Ð?nh nghia hàm g?i 1 ký t?
          {
                      SBUF=a;                                //Ghi 1 byte d? li?u vào thanh ghi SBUF
                      while(TI==0){}                    //vòng l?p d? d?i c? truy?n TI lên 1
                      TI=0;                                      //Xóa c? truy?n TI sau khi truy?n xong
          }
          void sendchuoi(unsigned char *a)                 //Ð?nh nghia hàm g?i 1 chu?i ký t?
          {
                      int i,n;                                     //Khai báo bi?n c?c b? s? nguyên: i,n
                      n=strlen(a);                           //Tính d? dài c?a chu?i *a, luu vào bi?n n
                      for(i=0;i<n;i++)                   //Vòng l?p d? g?i l?n lu?t t?ng ký t? lên,
                      {                                              //cho d?n khi h?t chu?i *a (ký t? th? n-1).
                                  send(a[i]);                 //G?i hàm g?i 1 ký t?.
                      }         
          }
          void number(unsigned int i)
          {
          	unsigned char a,b,c,d,e;
          	e=i%10;
          	i=i/10;
          	d=i%10;
          	i=i/10;
          	c=i%10;
          	i=i/10;
          	b=i%10;
          	a=i/10;
          	send(a+48);
          	send(b+48);
          	send(c+48);
          	send(d+48);
          	send(e+48);
          }
          void timer(void) interrupt 1
          {
          	TF0=0;
          	TH0=0xf6;
          	TL0=0x36;
          	j++;
          	//lcdcontrol(0x87);
          	
          	if(j==1000)
          	{
          		number(7);
          		send(10);
          		
          		j=0;
          		
          		//i=0;
          		
          	}
          	
          	
          }

          Comment


          • #6
            Nguyên văn bởi qwerty68 Xem bài viết
            Code:
                TMOD=0x20;                       //Ch?n Timer1, ch? d? 2
            		TMOD=0x01;
            		
            }
            lệnh TMOD sau sẽ thay đổi giá trị trước đó của thanh ghi TMOD. đọc lại kỹ thuật AND, OR bit.

            Comment


            • #7
              Nguyên văn bởi hoadang Xem bài viết
              lệnh TMOD sau sẽ thay đổi giá trị trước đó của thanh ghi TMOD. đọc lại kỹ thuật AND, OR bit.
              Thế thì phải làm thế nào để khai báo được cả 2 cái TMOD cho 2 cái timer cùng 1 lúc ạ?

              Comment


              • #8
                hoặc bạn dùng set/clear từng bit. trong header file của chip có định nghĩa các bit cho thanh ghi TMOD rồi.
                hoặc như mình nói dùng AND hoặc OR các giá trị với nhau.
                hoặc cách nữa là viết giá trị cho từng bit của TMOD trên giấy, rồi ghép lại được giá trị TMOD, sau đó gán giá trị đó co TMOD là được.

                Comment


                • #9
                  Nguyên văn bởi hoadang Xem bài viết
                  hoặc bạn dùng set/clear từng bit. trong header file của chip có định nghĩa các bit cho thanh ghi TMOD rồi.
                  hoặc như mình nói dùng AND hoặc OR các giá trị với nhau.
                  hoặc cách nữa là viết giá trị cho từng bit của TMOD trên giấy, rồi ghép lại được giá trị TMOD, sau đó gán giá trị đó co TMOD là được.
                  Bạn có thể làm mẫu cho mình cái này được không hả bạn? Hay bạn gửi cho mình tài liệu cũng được. Chứ thực sự do mình cũng không học điện tử, mà chỉ làm ngành có liên quan mà thôi, nên nhiều cái không biết bạn ạ. Thank bạn nhiều.

                  Comment


                  • #10
                    vậy chế độ timer 1 và timer 2, bạn muốn dùng chế độ thứ mấy?

                    Comment


                    • #11
                      Nguyên văn bởi hoadang Xem bài viết
                      vậy chế độ timer 1 và timer 2, bạn muốn dùng chế độ thứ mấy?
                      Mình dùng timer0 chế độ 1 để sau 1 khoảng thời gian nhất định, thì sẽ gửi biến ra được.
                      Còn timer1 thì ở chế độ 2 để kết nối nối tiếp với máy tính qua cổng RS232 bạn ạ.

                      Comment


                      • #12
                        đầu tiên mình xin lỗi vì nói các bit của TMOD được định nghĩa trong header file. Nhớ lộn, TMOD không nằm trong phần bit addressable.
                        timer 0 dùng ở chế độ 1, timer 1 dùng ở chế độ 2:
                        - TMOD=0b00100001; (gọn hơn thì viết TMOD=0x21H;
                        - hoặc: timer 0 mode 1: TMOD=0x01;
                        timer 1 mode 2: TMOD=0x20;
                        => vậy giá trị của TMOD để config cho hai timer với các chế độ như trên sẽ là TMOD=0x01 | 0x20;
                        - hoặc trong header file có định nghĩa

                        /*------------------------------------------------
                        TMOD Bit Values
                        ------------------------------------------------*/
                        #define T0_M0_ 0x01
                        #define T0_M1_ 0x02
                        #define T0_CT_ 0x04
                        #define T0_GATE_ 0x08
                        #define T1_M0_ 0x10
                        #define T1_M1_ 0x20
                        #define T1_CT_ 0x40
                        #define T1_GATE_ 0x80

                        #define T1_MASK_ 0xF0
                        #define T0_MASK_ 0x0F

                        vậy để dùng các timer với các mode như trên thì TMOD=T0_M0 | T1_M1;

                        Comment


                        • #13
                          Nguyên văn bởi hoadang Xem bài viết
                          đầu tiên mình xin lỗi vì nói các bit của TMOD được định nghĩa trong header file. Nhớ lộn, TMOD không nằm trong phần bit addressable.
                          timer 0 dùng ở chế độ 1, timer 1 dùng ở chế độ 2:
                          - TMOD=0b00100001; (gọn hơn thì viết TMOD=0x21H;
                          - hoặc: timer 0 mode 1: TMOD=0x01;
                          timer 1 mode 2: TMOD=0x20;
                          => vậy giá trị của TMOD để config cho hai timer với các chế độ như trên sẽ là TMOD=0x01 | 0x20;
                          - hoặc trong header file có định nghĩa

                          /*------------------------------------------------
                          TMOD Bit Values
                          ------------------------------------------------*/
                          #define T0_M0_ 0x01
                          #define T0_M1_ 0x02
                          #define T0_CT_ 0x04
                          #define T0_GATE_ 0x08
                          #define T1_M0_ 0x10
                          #define T1_M1_ 0x20
                          #define T1_CT_ 0x40
                          #define T1_GATE_ 0x80

                          #define T1_MASK_ 0xF0
                          #define T0_MASK_ 0x0F

                          vậy để dùng các timer với các mode như trên thì TMOD=T0_M0 | T1_M1;
                          Mình xin chân thành cảm ơn bạn. Mình chỉ thay thế 2 dòng kia thành 1 dòng TMOD=0x01 | 0x20; là nó đã chạy được rồi. Thank bạn rất nhiều.

                          Comment


                          • #14
                            timer hoạt động độc lập với ct mà bạn.set nó lên rồi khi nào dc gọi thì nó làm việc thôi.

                            Comment

                            Về tác giả

                            Collapse

                            qwerty68 Trịnh Ngọc Duy Tìm hiểu thêm về qwerty68

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

                            Collapse

                            • bqviet
                              Trả lời cho Đấu tắt điện cho máy tính bảng
                              bởi bqviet
                              Bqv cáo lỗi vì chưa đủ khả năng diễn giải để người đọc hiểu. Người làm kỹ thuật sâu đôi khi như thế đó. Về việc nạp pin không vào dù cell mới, khả năng cái mạch quản lý đó đã hỏng - cũng chính là nguyên nhân đám cell cũ hỏng từ đầu.
                              06-12-2025, 17:17
                            • nguyendinhvan
                              Trả lời cho Xin hỏi về mạch thu FM/AM trong catsette
                              bởi nguyendinhvan
                              Theo tôi, nó chỉ là cái Tuy- ê - nơ, hoặc là khối Trung Văn Tần, nó một phần trong cái Da đì ô thôi. Vì có thấy một chỗ có ba chân hàn, giiống như chân Cờ rít sờ tăng 455 ki nô hẹc. Còn khối Tuy ê nơ thì không nhìn thây cái Di ốt Va di cáp...
                              05-12-2025, 19:59
                            • afrendly
                              Trả lời cho Đấu tắt điện cho máy tính bảng
                              bởi afrendly
                              Có vẻ ngoài hiểu biết của mình rồi. Cuối cùng mình quyết định tìm mua 2 pin trên Shopee, giá 200K thay vào. Tuy nhận pin được 1%, sạc mãi không vào nhưng cũng mở được máy lên. Vậy cũng tạm. Cảm ơn bạn đã hỗ trợ nhé....
                              04-12-2025, 01:27
                            • nick22
                              Trả lời cho Máy điện châm ?
                              bởi nick22
                              Đúng như bạn nói, máy điện châm hiện nay trên thị trường đã khá đa dạng về mẫu mã, chức năng và giá thành.
                              01-12-2025, 13:23
                            Đang tải...
                            X