Giúp với, đang học lập trình

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • mykhanh
    Thành viên mới
    • Feb 2014
    • 28

    #1

    Giúp với, đang học lập trình

    #include <REGX51.H>
    #include <stdio.H>
    #include <intrins.H>

    sbit dvgiay1 = P1^0;
    sbit chucgiay1 = P1^1;
    sbit dvphut1 = P1^2;
    sbit chucphut1 = P1^3;
    sbit staa = P3^5;
    unsigned int DEM1;
    unsigned int PHUT1,GIAY1;
    unsigned int munit1, se1;
    unsigned int DV_PHUT1,CH_PHUT1,DV_GIAY1,CH_GIAY1;

    unsigned int MA[10] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90 }; //P0.1.2.3.4.5.6 A. B. C. D. E. F. G

    void delay(unsigned int ms)
    {
    unsigned int i;
    for(i=0;i<ms;i++);
    }

    void time0_int(void) interrupt 1
    {
    DEM1++;
    TH0=0x3C;
    TL0=0xB0;
    TF0=0;
    }


    void hex_bcd(void)
    {
    CH_PHUT1 = munit1/10;
    DV_PHUT1 = munit1%10;
    CH_GIAY1 = se1/10;
    DV_GIAY1 = se1%10;

    }
    void hienthi(void)
    {
    unsigned int k;
    for(k=0;k<100;k++);

    { P0=MA[CH_PHUT1];
    chucphut1=0;
    delay(100);
    chucphut1=1;

    P0=MA[DV_PHUT1];
    dvphut1=0;
    delay(100);
    dvphut1=1;

    P0=MA[CH_GIAY1];
    chucgiay1=0;
    delay(100);
    chucgiay1=1;

    P0=MA[DV_GIAY1];
    dvgiay1=0;
    delay(100);
    dvgiay1=1;
    }



    void main(void)
    {
    TH0 = 0X3C;
    TL0 = 0XB0;
    TMOD = 0X01;
    IE = 0X87;
    TR0 = 1;

    while(!staa)
    {
    if(DEM1==20)
    {
    DEM1=0;
    GIAY1++;
    se1=GIAY1;
    }
    if(GIAY1==60)
    {
    GIAY1=0;
    PHUT1++;
    munit1=PHUT1;
    }
    if(PHUT1==60)
    {PHUT1=0;}
    hex_bcd();
    hienthi1();
    }



    }
    }




    hỏi là có cách nào để mỗi khi ấn staa (của mình là P3.5) chương trình chạy nhưng chạy tiếp chứ không chạy từ đầu không? mình đã lưu biến phụ là se1 và munit1 vào vùng nhớ idata rồi nhưng biến đó không được lưu mà lại về 0 khi điều kiện "!staa " đảm bảo. cảm ơn mọi người.
  • hoi_8051
    Thành viên mới
    • Feb 2008
    • 33

    #2
    void main(void)
    {
    TH0 = 0X3C;
    TL0 = 0XB0;
    TMOD = 0X01;
    IE = 0X87;
    TR0 = 1;

    while(1)
    {
    while(!staa)
    {
    if(DEM1==20)
    {
    DEM1=0;
    GIAY1++;
    se1=GIAY1;
    }
    if(GIAY1==60)
    {
    GIAY1=0;
    PHUT1++;
    munit1=PHUT1;
    }
    if(PHUT1==60)
    {PHUT1=0;}
    hex_bcd();
    hienthi1();
    }



    }

    }
    }
    |

    Comment

    • mykhanh
      Thành viên mới
      • Feb 2014
      • 28

      #3
      không được bạn ơi! mình đã thử dùng while(1) rồi, nhưng biến không được lưu, mỗi lần điều kiện xảy ra nó lại chạy từ đầu (tất cả các biến chạy từ 0 trở đi)

      Comment

      • thientanvt
        Thành viên tích cực
        • Mar 2010
        • 234

        #4
        Đếm thời gian thì phải kiểm tra trong ngắt chứ để ở main là chạy sai rồi.
        Code:
        void time0_int(void) interrupt 1
        {
        [COLOR=#FF0000]DEM1++;
        if(DEM1==20)
        {
        DEM1=0;
        GIAY1++;
        se1=GIAY1;
        }
        if(GIAY1==60)
        {
        GIAY1=0;
        PHUT1++;
        munit1=PHUT1;
        }
        if(PHUT1==60)
        {PHUT1=0;} [/COLOR]
        hex_bcd();
        TH0=0x3C;
        TL0=0xB0;
        TF0=0;
        }
        
        
        
        
        void main(void)
        {
        TH0 = 0X3C;
        TL0 = 0XB0;
        TMOD = 0X01;
        IE = 0X87;
        TR0 = 1;
        
        While(1) // phải có while(1) thì mới đúng cấu trúc.
        {
        while(!staa)
        {
        
        hienthi1();
        } 
        }
        Phần đỏ là còn sai đó nhe.

        Comment

        • mykhanh
          Thành viên mới
          • Feb 2014
          • 28

          #5
          mình hiểu ý bạn rồi nhưng ý của mình không phải như vậy, ý của mình là while(!staa) thì mới đếm thời gian, còn khi staa=1 thì thời gian không chạy nhưng vẫn hiển thị được thời gian trước khi staa=1. thank very much!

          Comment

          • thientanvt
            Thành viên tích cực
            • Mar 2010
            • 234

            #6
            Chết chưa hỏi mà cũng không rõ ràng, vậy thì:
            Code:
            void main(void) {
            TH0 = 0X3C;
            TL0 = 0XB0;
            TMOD = 0X01;
            IE = 0X87;
            While(1)
            {
            if(staa == 0)TR0 = 1; // chạy timer
            else TR0 = 0; // dừng timer
            hienthi1();
            }
            }

            Comment

            • mykhanh
              Thành viên mới
              • Feb 2014
              • 28

              #7
              hay quá cảm ơn bạn thientanvt rất rất nhiều, giúp mình vỡ được nhiều thứ quá. mình muốn hỏi bạn thêm 1 chút nữa, mình muốn chạy 2 timer, mỗi điều kiện chạy 1 timer. điều kiện 1 thì giống như trên, điều kiện 2 gọi là stab đi, vậy khi (!stab) cho chạy 1 timer nữa, sao cho khi mỗi điều kiện xuất hiện thì chạy tiếp timer đó, mình định dùng thêm 2 ngắt ngoài nữa, bạn thấy như vậy có tối ưu không. hay có cách khác hay hơn, mong các bạn giúp đỡ.

              Comment

              • thientanvt
                Thành viên tích cực
                • Mar 2010
                • 234

                #8
                Muốn dùng bao nhiêu timer cũng được, công việc mỗi cái không ảnh hưởng nhau thì chẳng sao cả.

                Comment

                • mykhanh
                  Thành viên mới
                  • Feb 2014
                  • 28

                  #9
                  như vậy mỗi một timer mình phải dùng 1 ngắt à (vì phải đưa khởi tạo timer vào trong điều kiện chạy). mình muốn hỏi bạn có cách nào đếm 2 hoặc 3 timer và vẫn dùng 1 ngắt (mình thích dùng timer0) cảm ơn bạn về những thắc mắc trên của mình.

                  Comment

                  • thientanvt
                    Thành viên tích cực
                    • Mar 2010
                    • 234

                    #10
                    Nếu không dùng ngắt thì phải viết trong main hết, kiểm tra từng timer xem cái nào chạy cái nào over thì nhảy vào làm việc đấy.

                    Comment

                    • mykhanh
                      Thành viên mới
                      • Feb 2014
                      • 28

                      #11
                      ok bạn. mình đã hiểu ý tưởng rồi (không biết là bạn hay là em hoặc anh, nhưng cứ xung hô như vậy mong bạn thông cảm) mình sẽ thử nếu có vấn đề gì không đúng như mình hình dung thì mình hỏi bạn tiếp nhé. cảm ơn bạn nhiều lắm. mong được bạn giúp đỡ nhiều trong tương lai.

                      Comment

                      • mykhanh
                        Thành viên mới
                        • Feb 2014
                        • 28

                        #12
                        bạn ơi, giúp mình tý nữa với.
                        phần lập trình của mình như sau:
                        #include &lt;REGX51.H&gt;
                        #include &lt;stdio.H&gt;
                        #include &lt;intrins.H&gt;

                        sbit dvphut1 = P1^0;
                        sbit chucphut1 = P1^1;
                        sbit dvgio1 = P1^2;
                        sbit chucgio1 = P1^3;
                        sbit dvngay1 = P1^4;
                        sbit chucngay1 = P1^5;
                        sbit dvthang1 = P1^6;
                        sbit chucthang1 = P1^7;
                        sbit dvphut2 = P2^0;
                        sbit chucphut2 = P2^1;
                        sbit dvgio2 = P2^2;
                        sbit chucgio2 = P2^3;
                        sbit dvngay2 = P2^4;
                        sbit chucngay2 = P2^5;
                        sbit dvthang2 = P2^6;
                        sbit chucthang2 = P2^7;
                        sbit nc2 = P3^2;
                        sbit nc1 = P3^3;
                        sbit stab = P3^4;
                        sbit staa = P3^5;
                        sbit chamht1 = P3^0;
                        sbit chamht2 = P3^1;
                        sbit dong1 = P3^7;
                        sbit dong2 = P3^6;
                        bit set=1;



                        unsigned int CHAM1,CHAM2,DEM,DEM1,DEM2;
                        unsigned int THANG1,NGAY1,GIO1,PHUT1,GIAY1;
                        unsigned int THANG2,NGAY2,GIO2,PHUT2,GIAY2;
                        unsigned int DV_GIO1,CH_GIO1,DV_PHUT1,CH_PHUT1,DV_GIAY1,CH_GIAY 1,CH_NGAY1,DV_NGAY1,CH_THANG1,DV_THANG1;
                        unsigned int DV_GIO2,CH_GIO2,DV_PHUT2,CH_PHUT2,DV_GIAY2,CH_GIAY 2,CH_NGAY2,DV_NGAY2,CH_THANG2,DV_THANG2;
                        unsigned int MA[10] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90 }; //P0.1.2.3.4.5.6 A. B. C. D. E. F. G

                        void delay(unsigned int ms)//hàm này ta.o ?o^. tre^~ tho+`i gian, do+n vi. là ms
                        {
                        unsigned int i;
                        for(i=0;i&lt;ms;i++);
                        }

                        void time0_int(void) interrupt 1
                        {
                        DEM++;
                        DEM1++;


                        if(DEM1==2)
                        {
                        DEM1=0;
                        GIAY1++;
                        }
                        if(GIAY1==60)
                        {
                        GIAY1=0;
                        PHUT1++;
                        }
                        if(PHUT1==60)
                        {PHUT1=0;
                        GIO1++;
                        }
                        if(GIO1==24)
                        {GIO1=0;
                        NGAY1++;
                        }
                        if(NGAY1==30)
                        {NGAY1=0;
                        THANG1++;
                        }
                        if(THANG1==99)
                        {THANG1=0;}

                        TH0=0x3C;
                        TL0=0xB0;
                        TF0=0;
                        }
                        void time1_int(void) interrupt 3
                        {
                        DEM++;
                        DEM2++;
                        if(DEM2==2)
                        {
                        DEM2=0;
                        GIAY2++;
                        }
                        if(GIAY2==60)
                        {
                        GIAY2=0;
                        PHUT2++;
                        }
                        if(PHUT2==60)
                        {
                        PHUT2=0;
                        GIO2++;
                        }
                        if(GIO2==24)
                        {
                        GIO2=0;
                        NGAY2++;
                        }
                        if(NGAY2==30)
                        {
                        NGAY2=0;
                        THANG2++;
                        }
                        if(THANG2==99)
                        {
                        THANG2=0;
                        }

                        TH1=0x3C;
                        TL1=0xB0;
                        TF1=0;
                        }

                        void hex_bcd(void)
                        {
                        CH_GIO1 = GIO1/10;
                        DV_GIO1 = GIO1%10;
                        CH_PHUT1 = PHUT1/10;
                        DV_PHUT1 = PHUT1%10;
                        CH_GIAY1 = GIAY1/10;
                        DV_GIAY1 = GIAY1%10;
                        CH_NGAY1 = NGAY1/10;
                        DV_NGAY1 = NGAY1%10;
                        CH_THANG1 = THANG1/10;
                        DV_THANG1 = THANG1%10;



                        CH_GIO2 = GIO2/10;
                        DV_GIO2 = GIO2%10;
                        CH_PHUT2 = PHUT2/10;
                        DV_PHUT2 = PHUT2%10;
                        CH_GIAY2 = GIAY2/10;
                        DV_GIAY2 = GIAY2%10;
                        CH_NGAY2 = NGAY2/10;
                        DV_NGAY2 = NGAY2%10;
                        CH_THANG2 = THANG2/10;
                        DV_THANG2 = THANG2%10;


                        }
                        void hienthi1(void)
                        {
                        P0=MA[CH_THANG1];
                        if(CH_THANG1==0)
                        chucthang1=1;
                        else
                        chucthang1=0;
                        delay(100);
                        chucthang1=1;

                        P0=MA[DV_THANG1];
                        if((DV_THANG1==0)&amp;&amp;(CH_THANG1==0))
                        dvthang1=1;
                        else
                        dvthang1=0;
                        delay(100);
                        dvthang1=1;

                        P0=MA[CH_NGAY1];
                        if((CH_NGAY1==0)&amp;&amp;(DV_THANG1==0)&amp;&amp; (CH_THANG1==0))
                        chucngay1=1;
                        else
                        chucngay1=0;
                        delay(100);
                        chucngay1=1;

                        P0=MA[DV_NGAY1];
                        if((DV_NGAY1==0)&amp;&amp;(CH_NGAY1==0)&amp;&amp;( DV_THANG1==0)&amp;&amp;(CH_THANG1==0))
                        dvngay1=1;
                        else
                        dvngay1=0;
                        delay(100);
                        dvngay1=1;

                        P0=MA[DV_GIO1];
                        if((DV_GIO1==0)&amp;&amp;(CH_GIO1==0)&amp;&amp;(DV _NGAY1==0)&amp;&amp;(CH_NGAY1==0)&amp;&amp;(DV_THA NG1==0)&amp;&amp;(CH_THANG1==0))
                        dvgio1=1;
                        else
                        dvgio1=0;
                        delay(100);
                        dvgio1=1;

                        P0=MA[CH_GIO1];
                        if((CH_GIO1==0)&amp;&amp;(DV_NGAY1==0)&amp;&amp;(C H_NGAY1==0)&amp;&amp;(DV_THANG1==0)&amp;&amp;(CH_T HANG1==0))
                        chucgio1=1;
                        else
                        chucgio1=0;
                        delay(100);
                        chucgio1=1;

                        P0=MA[CH_PHUT1];
                        if((CH_PHUT1==0)&amp;&amp;(DV_GIO1==0)&amp;&amp;(C H_GIO1==0)&amp;&amp;(DV_NGAY1==0)&amp;&amp;(CH_NGA Y1==0)&amp;&amp;(DV_THANG1==0)&amp;&amp;(CH_THANG1 ==0))
                        chucphut1=1;
                        else
                        chucphut1=0;
                        delay(100);
                        chucphut1=1;

                        P0=MA[DV_PHUT1];
                        if((DV_PHUT1==0)&amp;&amp;(CH_PHUT1==0)&amp;&amp;( DV_GIO1==0)&amp;&amp;(CH_GIO1==0)&amp;&amp;(DV_NGA Y1==0)&amp;&amp;(CH_NGAY1==0)&amp;&amp;(DV_THANG1= =0)&amp;&amp;(CH_THANG1==0))
                        dvphut1=1;
                        else
                        dvphut1=0;
                        delay(100);
                        dvphut1=1;


                        if(DEM1&lt;1)
                        {
                        P0=0xff;
                        chamht1=0;
                        delay(100);
                        P0=0xff;
                        chamht1=1;
                        }
                        else
                        { chamht1=0;
                        }
                        }

                        void hienthi2(void)
                        {
                        P0=MA[CH_NGAY2];
                        if((CH_NGAY2==0)&amp;&amp;(DV_THANG2==0)&amp;&amp; (CH_THANG2==0))
                        chucngay2=1;
                        else
                        chucngay2=0;
                        delay(100);
                        chucngay2=1;

                        P0=MA[DV_NGAY2];
                        if((DV_NGAY2==0)&amp;&amp;(CH_NGAY2==0)&amp;&amp;( DV_THANG2==0)&amp;&amp;(CH_THANG2==0))
                        dvngay2=1;
                        else
                        dvngay2=0;
                        delay(100);
                        dvngay2=1;

                        P0=MA[CH_THANG2];
                        if(CH_THANG2==0)
                        chucthang2=1;
                        else
                        chucthang2=0;
                        delay(100);
                        chucthang2=1;

                        P0=MA[DV_THANG2];
                        if((DV_THANG2==0)&amp;&amp;(CH_THANG2==0))
                        dvthang2=1;
                        else
                        dvthang2=0;
                        delay(100);
                        dvthang2=1;

                        P0=MA[DV_GIO2];
                        if((DV_GIO2==0)&amp;&amp;(CH_GIO2==0)&amp;&amp;(DV _NGAY2==0)&amp;&amp;(CH_NGAY2==0)&amp;&amp;(DV_THA NG2==0)&amp;&amp;(CH_THANG2==0))
                        dvgio2=1;
                        else
                        dvgio2=0;
                        delay(100);
                        dvgio2=1;

                        P0=MA[CH_GIO2];
                        if((CH_GIO2==0)&amp;&amp;(DV_NGAY2==0)&amp;&amp;(C H_NGAY2==0)&amp;&amp;(DV_THANG2==0)&amp;&amp;(CH_T HANG2==0))
                        chucgio2=1;
                        else
                        chucgio2=0;
                        delay(100);
                        chucgio2=1;

                        P0=MA[CH_PHUT2];
                        if((CH_PHUT2==0)&amp;&amp;(DV_GIO2==0)&amp;&amp;(C H_GIO2==0)&amp;&amp;(DV_NGAY2==0)&amp;&amp;(CH_NGA Y2==0)&amp;&amp;(DV_THANG2==0)&amp;&amp;(CH_THANG2 ==0))
                        chucphut2=1;
                        else
                        chucphut2=0;
                        delay(100);
                        chucphut2=1;

                        P0=MA[DV_PHUT2];
                        if((DV_PHUT2==0)&amp;&amp;(CH_PHUT2==0)&amp;&amp;( DV_GIO2==0)&amp;&amp;(CH_GIO2==0)&amp;&amp;(DV_NGA Y2==0)&amp;&amp;(CH_NGAY2==0)&amp;&amp;(DV_THANG2= =0)&amp;&amp;(CH_THANG2==0))
                        dvphut2=1;
                        else
                        dvphut2=0;
                        delay(100);
                        dvphut2=1;

                        if(DEM2&lt;1)
                        {
                        P0=0xff;
                        chamht2=0;
                        delay(100);
                        P0=0xff;
                        chamht2=1;
                        }
                        else
                        { chamht2=0;
                        }
                        }



                        void main(void)
                        {
                        TH0 = 0X3C;
                        TL0 = 0XB0;
                        TMOD = 0X11;
                        TH1 = 0X3C;
                        TL1 = 0XB0;
                        IE = 0x8A;


                        chamht1=0;
                        chamht2=0;
                        dong1=1;
                        dong2=1;


                        while(1)
                        {
                        if(!staa)
                        { TR1 = 1;
                        hex_bcd();
                        hienthi1();
                        hienthi2();
                        }
                        else
                        { TR1=0;
                        hex_bcd();
                        hienthi1();
                        hienthi2();
                        }
                        if(!stab)
                        {TR0 = 1;
                        hex_bcd();
                        hienthi1();
                        hienthi2();
                        }
                        else
                        {TR0=0;
                        hex_bcd();
                        hienthi1();
                        hienthi2();
                        }
                        set=0;
                        if((!nc1)&amp;&amp;(!nc2)&amp;&amp;(set))
                        {delay(50000);
                        dong1=1;
                        set=!set;
                        }
                        else if((!nc1)&amp;&amp;(nc2)&amp;&amp;(!set))
                        {delay(50000);
                        dong2=0;
                        set=!set;
                        }
                        else break;
                        }
                        }



                        mô tả như sau:
                        nếu không có ngắt timer0 và timer1 xảy ra thì sẽ kiểm tra chân P3.2 và P3.3 nếu cả 2 chân này đều được nối xuống gnd thì trễ 5 giây và đưa P3.7 lên mức cao, sau đó kiểm tra điều kiện, nếu điều kiện vẫn còn thì đưa P3.6 lên mức cao, cứ lặp lại như vậy đến khi điều kiện được loại trừ,
                        Vấn đề ở đây là mình hỏi về ngắt, mình đã không dùng ngắt ngoài (into0 và into1) bằng cách chọn điều kiện trong thanh ghi IE = 0x8A rồi, nhưng sao khi P3.2 và P3.3 =0 thì vẫn nhảy vào ngắt và làm các timer chạy loạn xạ. cách loại trừ triệt để ngắt ngoài để P3,2 và P3.3 đơn thuần chỉ là ngõ vào ra bình thường, và nếu dùng timer0 và timer 1 rồi thì có dùng được các ngắt ngoài để các ngắt chạy độc lập nhau không.

                        Comment

                        • thientanvt
                          Thành viên tích cực
                          • Mar 2010
                          • 234

                          #13
                          Ngắt ngoài của 89xxx chỉ đơn giản là set bit EX0 hay EX1 là chạy còn không set thì không ăn thua gì hết.
                          Sai ở đây là phần viết trong main cũng như là giải thuật cho bài này không đúng. và mấy cái &amp là ý nghĩa gì vậy.

                          Comment

                          Về tác giả

                          Collapse

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

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

                          Collapse

                          Đang tải...