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

                              Đang tải...
                              X