Thông báo

Collapse
No announcement yet.

Không quét LED được

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

  • Không quét LED được

    Em dùng 89C2051 làm 1 cái đồng hồ và có vấn đề sau:
    Chân P1.0 --> SDA
    Chân P1.1 --> SCL
    Các chân P1.2...P1.5 dùng để quét LED (mạch chỉ hiển thị giờ-phút)
    Chương trình viết bằng Keil C.Giao tiếp với ds1307 được nhưng đến phần hiển thị thì không quét LED được.Tức là các bit P1.2;P1.3;P1.4;P1.5 lúc nào cũng mức 1(trong khi chương trình em cho 1 bit 0 dịch chuyển liên tục từ bit P1.2..P1.5)
    ......................
    Code:
    // Ham hien thi thoi gian
    void hienthi()
    	{
    	   unsigned char i;
    	 P1=0x0FD;
    	  for (i=0;i<=3;i++)
    		{
    		   	P1=P1<<1;
    		   	P3=maled[so[i]];
    			delay_ht(1);
    		 }
    	}
    // Ham tach so de hien thi
    void giatri_led()
    	{
    	   so[0]=(time[1] & 0x0F);         	// Phut don vi
           so[1]=(time[1] & 0xF0)>>4;    	// phut chuc
           so[3]=time[2] & 0x0F;         	// gio don vi
           so[2]=(time[2] & 0xF0)>>4;    	// gio chuc
          
    	}
    ............................
    không biết em viết như vậy có đúng ko,mong các anh chỉ giúp (em chỉ là new member của 89 thôi).
    Last edited by VNarmy; 27-07-2007, 21:50.
    Gotta go my Own ways, no matter what they said!

  • #2
    Nguyên văn bởi ayda Xem bài viết
    P1=P1<<1;//đoạn này lời khuyên nênn chuuyển
    Vì lệnh này bản thân nó là lệnh đọc dữ liệu tại chân vi điều khiển.Gây nhập nhằng đấy.
    Nên thay bằng 1 đoạn tra bảng như sau
    Code:
    void hienthi()
    {
    unsigned char i;
    unsigned char P1_temp;
    P1_temp=0xFD;
    for (i=0;i<=3;i++)
    {
    P1_temp<<=1;
    P1=P1_temp;
    P3=maled[so[i]];
    delay_ht(1);
    }

    Sông dài, Thuyền lớn, Biển rộng bao la.
    Tháo neo ngôn ngữ, lèo lái con thuyền kiến thức nhân loại.

    Comment


    • #3
      Chương trình này đầy đủ hay bạn chỉ trích đoạn????

      Comment


      • #4
        Nguyên văn bởi quoc_thaibk Xem bài viết
        Code:
        Nguyên văn bởi ayda  
        P1=P1<<1;//đoạn này lời khuyên nênn chuuyển
        Vì lệnh này bản thân nó là lệnh đọc dữ liệu tại chân vi điều khiển.Gây nhập nhằng đấy.
        Nên thay bằng 1 đoạn tra bảng như sau
        Trong lập trình ngôn ngữ C, P1 được xem như 1 biến cho phép bạn thao tác trên các phép toán, không như trong lập trình hợp ngữ.
        Do đó, câu lệnh trên vẫn đúng. Chúng ta sẽ không gặp nhập nhằng gì ở đây cả.

        Comment


        • #5
          Nguyên văn bởi MicroDuyphi Xem bài viết
          Trong lập trình ngôn ngữ C, P1 được xem như 1 biến cho phép bạn thao tác trên các phép toán, không như trong lập trình hợp ngữ.
          Do đó, câu lệnh trên vẫn đúng. Chúng ta sẽ không gặp nhập nhằng gì ở đây cả.
          đây là đoạn mã dịch từ C ra ASM của Keil anh coi giùm nhé-->chức năng dissassembly window trogn debug.
          Đúng là làm phép toán nhưng là trên thanh ghi A và trước đó là lệnh đọc chân vi điều khiển.
          Nguyên tắc của 8051
          Ghi chốt
          Đọc chân
          Trường hợp mà chân của vi điều khiển lúc này là ở bên ngoài không xác định rõ là bao nhiêu
          đúng là lệnh P1=0xFD có set cho bit P1.1=0;
          nhưng điều e muốn nói là những bit còn lại thì sao-->không rõ ràng.
          Bởi vậy lời khuyên là dùng hằng số tra.
          Đúng không nhỉ

          Code:
             114:                 P1=P1<<1; 
             115: //            P3=maled[so[i]]; 
          C:0x03A1    E590     MOV      A,P1(0x90)
          C:0x03A3    25E0     ADD      A,ACC(0xE0)
          C:0x03A5    F590     MOV      P1(0x90),A

          Sông dài, Thuyền lớn, Biển rộng bao la.
          Tháo neo ngôn ngữ, lèo lái con thuyền kiến thức nhân loại.

          Comment


          • #6
            Cảm ơn các anh đã chỉ giúp,để em về thử lại xem. À, còn phần nút ấn chỉnh giờ em còn lủng củng lắm.Các anh chỉ cho em nhé :
            P3.0...P3.3 dùng để đưa dữ liệu ra 74LS47 ---> LED 7 đoạn
            P3.4 = OUT (OK): Thoát khỏi chỉnh giờ hoác chuyển đến chỉnh giá trị khác sau khi đã chỉnh xong 1 LED. Đến LED giờ chục mà gặp OUT thì thoát hẳn chỉnh giờ
            P3.5 = SET : tức là phím vào chỉnh giờ,khi ấn liên tục sẽ cho phép điều chỉnh cho tùng giá trị phút đơn vị, phút chục, giờ đơn vị,giờ chục.Ấn liên tục (nếu ko có tác động gì lên giá trị hiện tại) thì chỉ thoát khỏi hẹn giờ nếu phím OUT (=OK) được ấn.Nếu đã chỉnh giá trị rồi mà ấn OUT thì sẽ chuyển sang chỉnh giá trị tiếp theo...
            P3.7 = INC (tăng lên 1) : tăng giá trị thời gian lên 1 (vẫn đảm bảo thời gian hợp lệ, phút ko quá 59 (=60 thì trở về 0),giờ (mode 24h) ko quá 23h (nếu = 23 thì trở về 0).
            -----------------------
            Giải thuật của em như vậy các anh xem có ổn ko?
            Em còn lóng ngóng ở khâu hiển thị LED trong lúc chỉnh giờ (tức là các LED đều chớp tắt trong 1 s nhưng vấn hiển thị giờ hiện tại).
            Gotta go my Own ways, no matter what they said!

            Comment


            • #7
              Về giao diện thì việc điều chỉnh thế nào là tuỳ cậu.
              Mình nghĩ là hiện thực theo những cái đồng hồ điện tử đeo tay cũng là 1 kiến.
              Còn vấn đề chớp tắt led trong lúc chỉnh thì mình nghĩ là cậu nên phân chương trình vào trong ngắt timer.
              -1 Timer lo việc quét led ở tần số thích hợp.
              -1 Timer thứ 2 lo việc chớp tắt led quản lý việc đóng mở timer thứ 1.
              -Khi muốn chớp tắt led thì cứ bật timer 2 đó lên Còn không thì tắt timer 2 đi.
              Ở đây mình nói là timer thứ nhé tuỳ bạn chọn timer nào trong vđk của bạn.

              Sông dài, Thuyền lớn, Biển rộng bao la.
              Tháo neo ngôn ngữ, lèo lái con thuyền kiến thức nhân loại.

              Comment


              • #8
                Nguyên văn bởi quoc_thaibk Xem bài viết
                đây là đoạn mã dịch từ C ra ASM của Keil anh coi giùm nhé-->chức năng dissassembly window trogn debug.
                Đúng là làm phép toán nhưng là trên thanh ghi A và trước đó là lệnh đọc chân vi điều khiển.
                Nguyên tắc của 8051
                Ghi chốt
                Đọc chân
                Trường hợp mà chân của vi điều khiển lúc này là ở bên ngoài không xác định rõ là bao nhiêu
                đúng là lệnh P1=0xFD có set cho bit P1.1=0;
                nhưng điều e muốn nói là những bit còn lại thì sao-->không rõ ràng.
                Bởi vậy lời khuyên là dùng hằng số tra.
                Đúng không nhỉ

                Code:
                   114:                 P1=P1<<1; 
                   115: //            P3=maled[so[i]]; 
                C:0x03A1    E590     MOV      A,P1(0x90)
                C:0x03A3    25E0     ADD      A,ACC(0xE0)
                C:0x03A5    F590     MOV      P1(0x90),A
                Sao lại không rõ ràng? Nếu P1=0xFD thì P1.1=0 còn các bit còn lại sẽ bằng 1
                Còn nếu muốn setb riêng P1.1 thì chỉ việc đặt P1_1=1 là xong. Ngoài ra còn một cách nữa để setb là OR với 1 còn clr là AND với 0.
                AVR đã quay trở lại: ATMEGA32: 66k, ATMEGA8A: 30k, ATMEGA48: 30k.
                Xem thêm tại Online Store ---> Click here
                Mob: 0982.083.106

                Comment


                • #9
                  bit còn lại không phải là 1.
                  Mà là trở kéo lên 1.Mà trở kéo lên 1 thì tùy ngõ nhập.
                  Cấu trúc port của 8051 nó vậy.

                  Sông dài, Thuyền lớn, Biển rộng bao la.
                  Tháo neo ngôn ngữ, lèo lái con thuyền kiến thức nhân loại.

                  Comment

                  Về tác giả

                  Collapse

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

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

                  Collapse

                  Đang tải...
                  X