Thông báo

Collapse
No announcement yet.

[Share-code] Mỗi ngày một bài tập về AT89S52

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

  • [Share-code] Mỗi ngày một bài tập về AT89S52

    Mình xin lập topic này, mục đích chính là share một số bài tập về At89s52. Hy vọng đây sẽ là nguồn cho các bạn tham khảo thực sự hữu ích

    BÀI TẬP SỐ 1: Chương trình điều khiển 32 led theo yêu cầu sau:
    -Sáng dồn port 0
    - 1 điểm sáng chạy từ phải sang trái
    - 2 điểm sáng chạy từ phải sang trái
    - 3 điểm sáng chạy từ phải sang trái
    - 4 điểm sáng chạy từ phải sang trái
    - 5 điểm sáng chạy từ phải sang trái
    - 6 điểm sáng chạy từ phải sang trái
    - 7điểm sáng chạy từ phải sang trái
    - 8 điểm sáng chạy từ phải sang trái
    -chớp tắt 5 lần
    -sáng dồn từ ngoài vào 32 led.
    -chớp tắt 5 lần
    -Sáng dần tắt dần từ phải sang trái, tắt đần từ phải sang trái 2 lần.
    -chớp tắt 5 lần
    -Sáng dần tắt dần từ trái sang phải, tắt đần từ trái sang phải 2 lần.
    -chớp tắt 5 lần
    -Sáng tắt dần từ ngoài vào và từ trong ra 2 lần.
    -chớp tắt 5 lần
    -Sáng dần từ phải sang trái, tắt dần từ trái sang phải 2 lần
    -chớp tắt 5 lần
    -Sáng dần từ trái sang phải, tắt dần từ phải sang trái 2 lần

    TẢI VỀ CODE VÀ FILE MÔ PHỎNG: BAI_987_32LED_TONG_HOP_2.rar
    code:
    #include<at89x52.h>
    unsigned int z,v;
    unsigned long w; signed char i,j;
    void delay(unsigned int x)
    {
    unsigned int y;
    for(y=0;y<x;y++) {}
    }
    void choptat()
    {
    for(i=0;i<5;i++)
    {
    P0=0XFF;P1=0XFF;P2=0XFF;P3=0XFF;delay(8000);
    P0=0;P1=0;P2=0;P3=0;delay(8000);
    }
    }
    void xuat4port()
    {
    P0=z;P1=(z>>8);P2=v;P3=(v>>8);
    }
    void tach16bit_xuat4port()
    {
    z=w;v=(w>>16);xuat4port();
    }
    void sangdan_tatdan(unsigned char chon1,unsigned char chon2)
    {
    for(i=0;i<2;i++)
    {
    for(j=0;j<32;j++)
    {
    if(chon1==0)
    {w=(w<<1)+1;}//sang dan phai sang trai
    else if(chon1==1)
    {w=(w>>1)+0x80000000;}//sang dan trai sang phai
    tach16bit_xuat4port(); delay(10000);
    }
    for(j=0;j<32;j++)
    {
    if(chon2==0)
    {w=(w<<1);}//tat dan phai sang trai
    else if(chon2==1)
    { w=(w>>1);} //tat dan trai sang phai
    tach16bit_xuat4port(); delay(10000);
    }
    }
    }

    void stdnv_tr_2lan()
    {
    for(i=0;i<2;i++)
    {
    for(j=0;j<16;j++)
    {
    z=(z<<1)+1;v=(v>>1)+0x8000;xuat4port();delay(10000 );
    }
    for(j=0;j<16;j++)
    {
    z=(z<<1);v=(v>>1);xuat4port();delay(10000);
    }
    for(j=0;j<16;j++)
    {
    v=(v<<1)+1;z=(z>>1)+0x8000;xuat4port();delay(10000 );
    }
    for(j=0;j<16;j++)
    {
    v=(v<<1);z=(z>>1);xuat4port();delay(10000);
    }
    }
    }
    void sangdon()
    {
    unsigned long u,t; unsigned char k;
    w=0; tach16bit_xuat4port(); delay(5000);
    {
    for(i=32;i>-1;i--)
    {
    u=w; t=0x00000001;
    for(k=0;k<i;k++)
    {
    w=u|t; tach16bit_xuat4port(); delay(5000); t=t<<1;
    }
    }
    }

    }

    void sangdon_tnv()
    {
    unsigned long ut,up,tt,tp; unsigned char k;
    for(j=0;j<2;j++)
    {
    w=0; xuat4port(); delay(5000);
    {
    for(i=16;i>-1;i--)
    {
    ut=v; tt=0x0001;up=z;tp=0x8000;
    for(k=0;k<i;k++)
    {
    v=ut|tt; z=up|tp; xuat4port(); delay(5000); tt=tt<<1;tp=tp>>1;
    }

    }
    }
    }
    }
    void diemsangchay(unsigned int q)
    {
    unsigned long u,t; unsigned char k;
    for(j=0;j<2;j++)
    {
    w=0; tach16bit_xuat4port(); delay(5000);
    {
    for(i=32;i<-1;i--)
    {
    u=w;
    switch(q)
    {
    case 1: t=0x00000001; break;
    case 2: t=0x00000003; break;
    case 3: t=0x00000007; break;
    case 4: t=0x0000000f; break;
    case 5: t=0x0000001f; break;
    case 6: t=0x0000003f; break;
    case 7: t=0x0000007f; break;
    case 8: t=0x000000ff; break;
    }
    for(k=0;k<i;k++)
    {
    w=u|t; tach16bit_xuat4port(); delay(5000); t=t<<1;
    }
    }
    }
    }
    }
    void sangdonport0()
    {
    unsigned char tam,ttcd,ttdc;
    P0=0xff;tam=0xff;delay(5000);
    for(j=8;j>0;j--)
    {
    ttcd=tam;
    ttdc=0xfe;
    for(i=0;i<j;i++)
    {
    P0=ttcd&ttdc;
    delay(5000);
    ttdc=(ttdc<<1)|0x01;
    }
    tam=P0;
    }
    }

    void main()
    {
    w=0; tach16bit_xuat4port(); delay(10000);
    while(1)
    {
    sangdonport0();
    choptat();
    diemsangchay(1);
    diemsangchay(2);
    diemsangchay(3);
    diemsangchay(4);
    diemsangchay(5);
    diemsangchay(6);
    diemsangchay(7);
    diemsangchay(8);
    choptat();
    sangdon_tnv();
    sangdon();
    choptat();
    sangdan_tatdan(0,0);//sangdan tu phai sang trai,tat dan tu phai sang trai
    choptat();
    sangdan_tatdan(1,1);//sangdan tu trai sang phai,tat dan tu trai sang phai
    choptat();
    stdnv_tr_2lan();
    choptat();
    sangdan_tatdan(0,1);//sangdan tu phai sang trai,tat dan tu trai sang phai
    choptat();
    sangdan_tatdan(1,0);//sangdan tu trai sang phai,tat dan tu phai sang trai
    choptat();
    }
    }

  • #2
    Bài tập 2

    Viết chương trình điều khiển 8 led kết nối với Port 0 và có 1 nút nhấn STA gắn vào Port 3.0. Sao cho mỗi lần nhấn nút thì sẽ thực hiện sáng dần từng led 1. Chu trình này được lập lại sau khi 8 led sáng hết.

    TẢI CODE VÀ FILE MÔ PHỎNG:
    BAI_986_8LED_SANGDAN_START_PAUSE.rar


    SHOW CODE:
    #include<at89x52.h>
    #define sta P3_0
    char i;
    void delay(unsigned int x)
    {
    unsigned int y;
    for(y=0;y<x;y++)
    {}
    }
    void main()
    {
    while(sta==1);
    while(sta==0);

    while(1)
    {
    P0=0x00;delay(5000);
    for(i=0;i<8;i++)
    {
    P0=(P0<<1)|0x01;delay(5000);
    if(sta==1)
    {
    while(sta==0);
    while(sta==1);
    while(sta==0);
    }
    else
    break;
    }
    }
    }

    Comment


    • #3
      a ơi cho em xin code 89c51 điều khiển relay được không a.
      yêu cầu : cấp nguồn relay đóng.cứ sau 3h30p relay lai ngắt 1 lần,ngắt trong 5phut.rồi cứa liên tục như vậy.cho e xin code và file mo phỏng được không.thanhk a nhiều

      Comment


      • #4
        Nguyên văn bởi halam_2170 Xem bài viết
        a ơi cho em xin code 89c51 điều khiển relay được không a.
        yêu cầu : cấp nguồn relay đóng.cứ sau 3h30p relay lai ngắt 1 lần,ngắt trong 5phut.rồi cứa liên tục như vậy.cho e xin code và file mo phỏng được không.thanhk a nhiều
        relay thì mình hok có đụng đến bao giờ nên hok có file mô phỏng nha. nhưng theo mình hẹn giờ một khoảng thời gian lâu như vậy thì bạn cần một mạch đếm thời gian riêng nha,ví dụ dùng DS1307 ,không dùng bộ đếm của AT89

        Comment


        • #5
          Bài tập 3

          Viết chương trình điều khiển 3 led 7 đoạn đếm từ 000 đến 240
          Mạch đơn giản khỏi mô phỏng nha. Led đơn vị Port 0, chục là P1, trăm là P2. Mắc theo phương pháp trực tiếp.

          Tải Về: BAI_942_DEM_000_DEN_240.rar

          Comment


          • #6
            thanks ! TIẾP TỤC PHÁT HUY BẠN NHÉ.

            Comment


            • #7
              Bài tập 4:

              Chương trình điều khiển 2 led 7 đoạn đếm từ 00 đến 25 rồi dừng tại 25
              CODE:
              #include<at89x52.h>
              const unsigned char ma7d[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x9 0};
              char dem;
              unsigned char chuc,dvi;
              void delay(unsigned int x)
              {
              unsigned int y;
              for(y=0;y<x;y++)
              {}
              }
              void main()
              {
              while(1)
              {
              for(dem=0;dem<26;dem++)
              {
              chuc=dem/10;dvi=dem%10;
              P0=ma7d[dvi];P1=ma7d[chuc];delay(10000);
              }
              while(1);
              }

              }

              TẢI VỀ FILE MÔ PHỎNG+CODE:BAI_944_DEM_0_DEN_25_DUNG.rar

              Comment


              • #8
                Bài tập 5

                Viết chương trình điều khiển 3 led 7 đoạn đếm từ 000 đến 120 có 2 nút START, STOP, khi cấp điện thì hiển thị 000, nhấn START thì mạch đếm lên, nhấn STOP thì dừng.

                Code:
                #include<at89x52.h>
                #define START P3_0
                #define STOP P3_1
                bit tt;
                unsigned char dvi,chuc,tram;
                unsigned int dem;
                const unsigned char ma7d[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x9 0};
                void delay_key(unsigned int x)
                {
                unsigned int y;
                for(y=0;y<x;y++)
                {
                if(START==0) tt=1;
                if(STOP==0) tt=0;
                }
                }
                void giaima7d(int demt)
                {
                dvi=demt%10;
                chuc=(demt/10)%10;
                tram=demt/100;
                P0=ma7d[dvi];
                P1=ma7d[chuc];
                P2=ma7d[tram];
                }
                void main()
                {
                tt=0;dem=0;
                while(1)
                {
                giaima7d(dem);delay_key(10000);
                if(tt==1) {dem++;}
                if(dem==120) {dem=0;}
                }
                }

                TẢI VỀ CODE VÀ FILE MÔ PHỎNG: BAI_938_DEMLEN_START_STOP.rar

                Comment


                • #9
                  bạn có thể chú thích ký hơn phần code ko? mình mới học c nên nhiều thuật toán của bạn mình không hiểu.

                  Comment


                  • #10
                    Nguyên văn bởi giang1880 Xem bài viết
                    bạn có thể chú thích ký hơn phần code ko? mình mới học c nên nhiều thuật toán của bạn mình không hiểu.
                    Ok. Các bài sau mình sẽ có gắn chú thích nhe. Có gì không hiểu bạn cứ hỏi mình.

                    Comment


                    • #11
                      Bài tập 6

                      Viết chương trình điều khiển 3 led 7 đoạn đếm từ 000 đến 120 có 3 nút nhấn Start, Stop, Clear. KHi cấp điện thì hiển thị 000, Khi nhấn Start thì mạch đếm lên, khi nhấn Stop thì dừng, nhấn Clear thì xóa về 000 và dừng.

                      TẢI VỀ CODE VÀ FILE MÔ PHỎNG:BAI_937_DEM_LEN_START_STOP_CLEAR.rar

                      Comment


                      • #12
                        Độ khó sẽ càng ngày càng tăng nhe. Bạn nào thấy mình post mấy bài này quá đơn giản thì thông cảm. Học lập trình phải học từ dễ tới khó.

                        Comment


                        • #13
                          Bài tập 7

                          Viết chương trình điều khiển 3 led 7 đoạn đếm từ 000 đến 120 có 2 nút nhấn Start/Stop, Clear. KHi cấp điện thì hiển thị 000, Khi nhấn Start thì mạch đếm lên, khi nhấn Stop thì dừng, nhấn Clear thì xóa về 000 và dừng.

                          TẢI VỀ CODE VÀ FILE MÔ PHỎNG: BAI_936_DEMLEN_START_STOP_CLR.rar

                          Comment


                          • #14
                            bác có bài. điều khiển 4 led 7 đoạn, mỗi led có 1 nút nhấn để tăng giá trị, 4 led tương ứng giờ và phút, nút start là bắt đầu đếm ngược, nút stop là dừng, và nút clear là xóa và dừng.

                            Comment


                            • #15
                              bạn cho bài dùng 1 nút nhấn để kích relay đi.....cấp nguồn là ko kích....nhấn lần 1 -->kích....lần 2 ko kich....lần 3-->kich..........

                              Comment

                              Về tác giả

                              Collapse

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

                              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