Thông báo

Collapse
No announcement yet.

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

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

  • 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.

  • #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


    • #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


      • #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
        {
        DEM1++;
        if(DEM1==20)
        {
        DEM1=0;
        GIAY1++;
        se1=GIAY1;
        }
        if(GIAY1==60)
        {
        GIAY1=0;
        PHUT1++;
        munit1=PHUT1;
        }
        if(PHUT1==60)
        {PHUT1=0;} 
        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


        • #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


          • #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


            • #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


              • #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


                • #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


                  • #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


                    • #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


                      • #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


                        • #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...
                          X