Thông báo

Collapse
No announcement yet.

giúp em về mạch đếm sự kiện dùng AT89s52! Hiển thị trên LED 7SEG!

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

  • giúp em về mạch đếm sự kiện dùng AT89s52! Hiển thị trên LED 7SEG!

    Các anh các chị cho em hỏi.Em có một đoạn CODE về mạch đếm sản phẩm như sau:

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    // khai bao Header
    #include<reg52.h>
    #include<stdio.h>

    #define m 2
    sbit start = P1^4;
    sbit Led1 = P1^0;
    sbit Led2 = P1^1;
    sbit Led3 = P1^2;
    sbit Led4 = P1^3;
    sbit note = P3^6;

    unsigned char M[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x9 0};
    unsigned long int result;
    unsigned char thousand,hundred,tens,unit;


    void delay_ms(unsigned int time)
    {
    unsigned int i;
    unsigned int j;
    for(i = time;i>0;i--)
    for(j=0;j<300;j++);
    }

    void clear_led(void)
    {
    P1=0xff;
    P2=0xff;
    }

    void Display(void)
    {

    thousand = result/1000;

    if (thousand == 0)
    clear_led();
    else
    { Led4 = 0; Led3 = 1; Led2=1; Led1 = 1;
    P2=M[thousand];
    delay_ms(m);
    clear_led();
    }

    hundred =(result%1000)/100;

    if ((thousand == 0)&&(hundred == 0))
    clear_led();
    else
    { Led4 = 1; Led3 = 0; Led2=1; Led1 = 1;
    P2=M[hundred];
    delay_ms(m);
    clear_led();
    }

    tens = ((result%1000)%100)/10;

    if ((thousand == 0)&&(hundred == 0)&&(tens == 0))
    clear_led();
    else
    { Led4 = 1; Led3 = 1; Led2=0; Led1 = 1;
    P2=M[tens];
    delay_ms(m);
    clear_led();
    }

    unit = ((result%1000)%100)%10;
    Led4 = 1; Led3 = 1; Led2=1; Led1 = 0;
    P2=M[unit];
    delay_ms(m);
    clear_led();
    }


    void init(void)
    {
    TMOD=0x01;
    IE=0x86;
    IP=0x04;
    TH0=-5000/256; // Tre 1s
    TL0=-5000%256;
    result = 0;
    clear_led(); // Xoa LED
    IT1=1;
    TF0=1;
    TR0=1;
    }

    void Outdata(void) interrupt 1
    {
    TR0=0;
    Display();
    TH0=-5000/256;
    TL0=-5000%256;
    TR0=1;
    }
    // Ham dem su dung ngat ngoai
    void Count(void) interrupt 2
    {

    EA=0;
    result++;
    if(result >= 9999)
    {note=1;
    result=0;}
    delay_ms(10);
    EA=1;
    }

    void main(void)
    {
    EA = 0;
    init();
    delay_ms(100);
    while(start);
    EA = 1;
    result = 0;
    while(1)
    {
    }
    }

    ///////////////////////////////////////////////////////

    Giờ em muốn phát triển chương trình đó là:"Có một nút nhấn ,nhấn lần một thì tất cả các LED đều sáng con số 9999,nhấn lần 2 thì mới bắt đầu đếm và khi đếm tới 9999 thì đưa ra cảnh báo ra LED hoặc ra Loa CHIP". Em làm mãi mà vẫn không được.Xin các anh các chị chỉ giúp.Cảm ơn các anh chị nhiều!

  • #2
    hình như u viết code chưa đc hay
    1) k ai lồng hàm delay vào ngắt timer . Nếu làm thế có nghĩa chưa hiểu rõ bản chất ngắt timer . Mục đích của ngắt timer là thay thế cho delay .
    2) u dùng ngắt ngoài để tăng biến result , thế cái j tác động vào chân ngắt ngoài thế u ? công tắc hành trình CTHT ? led thu hồng ngoại ...? Theo như tui hiểu thì hình như u chỉ mún dùng để tăng biến result thui thì phải . Vì nếu có tác động ngoài vào chân ngắt thì trong hàm ngắt (vd CTHT hoặc phím nhấn), u phải chờ cho qua nảy phím oy mới tăng biến result .
    3) hàm main chẳng làm j cả . Phí vô cùng .

    Theo tui nhá .
    Code:
    + khai báo ngắt timer0 làm hàm định thời 1s tăng biến result . 
    + hàm main 
    while(1) 
    {- quét led
     - Nếu có nút nhấn (lần 1), cho biến so_lan=1 thì biến result =9999.
     - Nếu có nút nhấn (lần 2), cho biến so_lan=2  biến result =0 . bật ngắt timer0
    }

    Comment


    • #3
      Nguyên văn bởi Zz_Bi_zZ Xem bài viết
      hình như u viết code chưa đc hay
      1) k ai lồng hàm delay vào ngắt timer . Nếu làm thế có nghĩa chưa hiểu rõ bản chất ngắt timer . Mục đích của ngắt timer là thay thế cho delay .
      2) u dùng ngắt ngoài để tăng biến result , thế cái j tác động vào chân ngắt ngoài thế u ? công tắc hành trình CTHT ? led thu hồng ngoại ...? Theo như tui hiểu thì hình như u chỉ mún dùng để tăng biến result thui thì phải . Vì nếu có tác động ngoài vào chân ngắt thì trong hàm ngắt (vd CTHT hoặc phím nhấn), u phải chờ cho qua nảy phím oy mới tăng biến result .
      3) hàm main chẳng làm j cả . Phí vô cùng .

      Theo tui nhá .
      Code:
      + khai báo ngắt timer0 làm hàm định thời 1s tăng biến result . 
      + hàm main 
      while(1) 
      {- quét led
       - Nếu có nút nhấn (lần 1), cho biến so_lan=1 thì biến result =9999.
       - Nếu có nút nhấn (lần 2), cho biến so_lan=2  biến result =0 . bật ngắt timer0
      }
      Em làm mạch đếm là dùng hồng ngoại đưa vào chân INT1 dựa vào ngắt ngoài để biến result tăng lên 1.nhờ anh sửa lại code giùm em,vì em sửa mãi vẫn không được.Cảm ơn anh nha!

      Comment


      • #4
        Quét Led nên vứt vào ngắt, vứt trong main mỗi lần ấn nút sẽ bị ảnh hưởng.
        Code hơi ngổn ngang nên lười đọc quá

        Comment

        Về tác giả

        Collapse

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

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

        Collapse

        Đang tải...
        X