Thông báo

Collapse
No announcement yet.

Giúp e làm sao quét led từ P0--->P3 32 cổng at89c52

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

  • Giúp e làm sao quét led từ P0--->P3 32 cổng at89c52

    mấy a sư hunh chỉ dùm e làm thế nào quét led chạy từ chân P0.0 đến p3.7 ạ. đây là code của e

    #include <regx51.h>
    #define led P2
    #define XUNG P1_0 //LAY XUNG TU 555
    unsigned char quay;
    unsigned char x;
    unsigned char m=0x55;
    void delay_555()
    {
    while(XUNG==1)
    {
    if(m==0xaa)//?????????????????
    {
    break;
    }
    }
    while(XUNG==0)
    {
    if(m==0xaa)//?????????????????
    {
    break;
    }
    }
    }
    //************************
    void delay(unsigned int ms)
    {
    unsigned int i;
    unsigned char j;
    for(i=0;i<ms;i++)
    {
    for(j=0;j<125;j++)
    {
    }
    }
    }
    //******************************
    void chon_xung()
    {
    if(m==0x55)
    {
    delay_555();
    }
    else
    {
    delay(300);
    }
    }
    /////////////////**********mang*************//////////
    unsigned char code a2[]={0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x01,0x02,0x0 4,0x08,0x10,0x20,0x40,0x80,
    0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
    //********chon xung 555 hay xung noi***********
    void int0_ISR
    (void) interrupt 0
    {
    m=~m;
    }

    main()
    {
    EX0=1;
    EA=1;
    IT0=1;
    while(1)
    {
    for(x=0;x<23;x++)
    {
    led=a2[x];
    {
    chon_xung();
    }
    }
    }
    }
    Last edited by lenhoc91; 13-05-2012, 15:11.

  • #2
    code ko có chút logic nào và mình đọc cũng ko hiểu j lun, sai lun từ chính mấy chương trình delay cơ bản, chả bít hoạt động ra sao
    delay kiểm tra xung 555
    (void) interrupt 0
    {
    m=~m;
    } thì làm sao m nó tăng đc, cái này là m =0 thì m =1 và ngược lại
    ngoài ra sai ngay từ cái khai báo đầu tiên
    #define led P0,P2
    1 biến, tham số chỉ định nghĩa cho 1 phần tử bất kỳ, vừa khai báo P0 vừa khai báo P2 là sao
    Website chính thức đổi địa chỉ website thành
    Mời các bạn ghé thăm !!!

    Comment


    • #3
      Nguyên văn bởi mast090 Xem bài viết
      code ko có chút logic nào và mình đọc cũng ko hiểu j lun, sai lun từ chính mấy chương trình delay cơ bản, chả bít hoạt động ra sao
      delay kiểm tra xung 555
      (void) interrupt 0
      {
      m=~m;
      } thì làm sao m nó tăng đc, cái này là m =0 thì m =1 và ngược lại
      ngoài ra sai ngay từ cái khai báo đầu tiên
      #define led P0,P2
      1 biến, tham số chỉ định nghĩa cho 1 phần tử bất kỳ, vừa khai báo P0 vừa khai báo P2 là sao
      cái #define led P0,P2 này là e viết thử để quét từ P0.0-->P2.7 ma ko được wen xóa đó.
      xóa P0 or P2 là f7 được ah. e mo phỏng thấy chạy được mà

      Comment


      • #4
        4 port = 32 bit
        sử dụng 1 biến long 32 bit
        thao tác trên biến này
        rồi tách biến này ra thành các byte
        xuất các byte này ra 4 port
        hehe
        Be quan. Plz contact through email:

        Comment


        • #5
          thế thao tác làm sao a e chi cho e rõ

          Comment


          • #6
            Thế này nhé s:
            giả sử e có 1 biến 32 bit - khai báo kiểu long nhé
            ví dụ: a khai báo thằng x ở dưới



            đây là các macro định nghĩa e sẽ lấy được các byte riêng trong đó BYTE 1 là byte thấp nhất ( tí nữa ta xuất ra port0)

            #define BYTE1(v) ((unsigned char) (v))
            #define BYTE2(v) ((unsigned char) (((unsigned long) (v)) >> 8))
            #define BYTE4(v) ((unsigned char) (((unsigned long) (v)) >> 16))
            #define BYTE4(v) ((unsigned char) (((unsigned long) (v)) >> 24))

            long x;

            void xuat (void) {
            p0 = BYTE1(x);
            p1 = BYTE1(x);
            p2 = BYTE1(x);
            p3 = BYTE1(x);

            }



            void main(void)

            {

            em làm gì đó với biến x 32 bit ( quét như w muốn)

            sau đó gọi hàm xuất ở trên
            xuat();



            }
            Be quan. Plz contact through email:

            Comment


            • #7
              #define BYTE1(v) ((unsigned char) (v))
              #define BYTE2(v) ((unsigned char) (((unsigned long) (v)) >> 8))
              #define BYTE4(v) ((unsigned char) (((unsigned long) (v)) >> 16))
              #define BYTE4(v) ((unsigned char) (((unsigned long) (v)) >> 24))

              macro này la sao a? e ko hiểu

              a cho e vidu đi

              Comment


              • #8
                tự hiểu đi e
                >> là toán tử dịch bit sang phải
                8:ta lấy được byte thứ 2 sau khi dịch 8 lần
                16 : ta lấy được byte thứ 2 sau khi dịch 16 lần
                24 : ta lấy được byte thứ 2 sau khi dịch 24 lần
                Be quan. Plz contact through email:

                Comment


                • #9
                  hjc. thank a

                  Comment


                  • #10
                    khổ quá : 'hic' của em làm a sợ đó
                    tức là giả sử e có 1 biến 32 bit kiểu long nha gọi nó là x

                    giả sử trạng thái của nó là: x = 00000000111111110000000011111111 được chưa ( đếm coi có đủ 23 bit ko ^^) ( a viết kiểu nhị phân)


                    #define BYTE1(v) ((unsigned char) (v))
                    #define BYTE2(v) ((unsigned char) (((unsigned long) (v)) >> 8))
                    #define BYTE4(v) ((unsigned char) (((unsigned long) (v)) >> 16))
                    #define BYTE4(v) ((unsigned char) (((unsigned long) (v)) >> 24))


                    sau đó e gọi :

                    void xuat (void) {
                    p0 = BYTE1(x);
                    p1 = BYTE1(x);
                    p2 = BYTE1(x);
                    p3 = BYTE1(x);
                    }

                    trình biên dịch thực hiện lệnh p0 = BYTE1(x);
                    đến đấy nó ko hiểu BYTE1(x) là gì
                    nó chạy lên đầu và nhìn vào khai báo
                    #define BYTE1(v) ((unsigned char) (v))
                    nó thấy à thì ra BYTE1(biến) tức lấy được 8 bit thấp nhất của byte đó ; luc này 8 bit thấp nhất của x là 1111111 và đưa ra p1 nhé
                    tuơng tự
                    đến dòng:
                    p2 = BYTE2(x)
                    nó chạy lên đầu thấy khai báo:
                    #define BYTE2(v) ((unsigned char) (((unsigned long) (v)) >> 8))

                    nó hiểu à thì ra đầu tiên ta dịch biến x đi 8 lần sang phải: e thấy sau khi dịch 8 lần x lúc này là :
                    x = 00000000111111110000000011111111 ( ban đầu)
                    dịch 8 lần x = (00000000 - 8 bit số 0 được dịch vào)(00000000)(11111111)(00000000) còn 8 bit 1 cuối cùng của bị đầy ra ngoài và đưa vào 8 bit số 0 a ghi ở đầu đó
                    sau khi dịch e thấy ta sẽ lấy 8 bit thấp nhất = 00000000 và đưa ra p2

                    tương tự nha
                    Be quan. Plz contact through email:

                    Comment


                    • #11
                      Nguyên văn bởi mast090 Xem bài viết
                      code ko có chút logic nào và mình đọc cũng ko hiểu j lun, sai lun từ chính mấy chương trình delay cơ bản, chả bít hoạt động ra sao
                      delay kiểm tra xung 555
                      (void) interrupt 0
                      {
                      m=~m;
                      }
                      thì làm sao m nó tăng đc, cái này là m =0 thì m =1 và ngược lại
                      ngoài ra sai ngay từ cái khai báo đầu tiên
                      #define led P0,P2
                      1 biến, tham số chỉ định nghĩa cho 1 phần tử bất kỳ, vừa khai báo P0 vừa khai báo P2 là sao
                      cơ bản bạn chẳng hiểu gì về C cả m=~m; là như thế sao

                      Comment


                      • #12
                        lệnh hồ giải thích dễ hiểu quá
                        mấy cái đó là cơ bản trong lập trình C mà
                        bạn nên hiểu thêm về ASM, C và cách biểu diễn số trên máy tính

                        nhưng tôi vẫn nghĩ là dùng 4 biến 1 byte chạy nhanh hơn (theo quan điểm cá nhân thôi nhé)

                        Comment


                        • #13
                          em thấy code bạn ấy viết m=~m;là lấy phần bù theo bit của m,theo khai báo ban đầu của tác giả thì ban đầu m=0x55;sau lệnh gán m=~m;thì m=0xaa;em chỉ hiểu như vậy không biết nó có sai thật không mong được các huynh chỉ giáo.

                          Comment


                          • #14
                            đúng đó em
                            Be quan. Plz contact through email:

                            Comment


                            • #15

                              thì m=~m là lấy số bù 1
                              cái tay mast chả hiểu gì dám phán nếu m=0 thì sau lệnh trên nó thành 1 và ngược lại

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X