RP Store Tìm linh kiện theo mã, gửi BOM nhận báo giá Gửi BOM

Đồng hồ số dùng 4 LED 7 đoạn

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts

  • legosse
    replied
    Nguyên văn bởi nguyenyeu
    cac bac oi!
    phan mem thi co ve dc roi nhung con phan cung thi sao.co ai giup em e cai so do nguyen ly dc ko?em dang can de lam thu?
    Bác đang nói về sơ đồ nguyên lí của mạch j?

    Leave a comment:


  • legosse
    replied
    Nguyên văn bởi chinh_cover Xem bài viết
    cần j mà phức tạp vậy bạn.Chỉ cần vẽ xong test lại thử các chân rồi giải mã lại là được thôi mà.
    Test chân thì thấy sai rồi,(không hiểu nữa vì sơ đô nguyên lí rõ ràng chân của LED đúng rồi mà).Giải mã là làm j bạn, nói rõ thêm xí được không

    Nhân tiện cho mình hỏi làm cách nào tạo được file pdf của sơ đồ nguyên lí (có màu đẹp vậy)
    Mình vào File->Print thì chỉ tạo được file *.mdi mà lại đen trắng, chỉ có con 89 là có màu xanh
    Last edited by legosse; 17-05-2009, 22:44.

    Leave a comment:


  • legosse
    replied
    Sao a e vào nhiều mà không thấy chỉ giúp mình với, mình loay hoay mãi mà chưa xử lí được chân cẳng của cái con LED đó, không sữa chân được đâu làm j tiếp được đâu, mấy bác giúp em đi

    Leave a comment:


  • chinh_cover
    replied
    cần j mà phức tạp vậy bạn.Chỉ cần vẽ xong test lại thử các chân rồi giải mã lại là được thôi mà.

    Leave a comment:


  • legosse
    replied
    Mình hiểu về điều kiện if(key==0) rồi
    Chương trình vậy là ổn
    H cho mình hỏi về cái mạch
    Khi chuyên qua layout các chân của Port 0 không nối đúng với các chân của LED 7 đoạn theo thứ tự P0_0 -> a,....P0_6 ->g
    mà lại P0_0 -> chân số 5 của LED là b ,...
    mặc dù mình đã sửa lại các chân trong sơ đồ nguyên lí đúng thứ tự là a-4,b-5,....
    Với lại cái LED nó nằm không đúng
    10 9 8 7 6
    1 2 3 4 5
    Đáng lẽ là
    1 2 3 4 5
    10 9 8 7 6
    Mình dùng lệnh xoay ngang(H) xoạy dọc (V) đều không được
    Mọi người xem hình vẽ cho dễ hiểu
    Sơ đồ nguyên lí
    Layout
    Last edited by legosse; 17-05-2009, 20:45.

    Leave a comment:


  • Multi System
    replied
    Mình biết đấy là mã font của 7-Seg rồi, nhưng trong code của bạn có chứa dấu Space, mình đã sửa lại và gạch chân cho bạn thấy.
    Còn về câu điều kiện:
    Khi key được ấn, tức là nó được nối xuống 0, vậy thì điều kiện đúng ở đây là nó bằng 0 chứ không phải là khác 0.
    Còn bạn muốn dùng cấu trúc phủ định (not) trong câu điều kiện thì bạn có thể viết như sau:
    PHP Code:
    //Ham quet phim
    void quet_phim_h1(void)
    { 
      if(!key1) //Neu phim duoc an key1=0
         { 
             while(!key1); //Chong nay phim
             delay(30); //Chong soc dien
             hour++;
             if(hour>23) hour=0;
          }
    }
    void quet_phim_h2(void)
    {
        if(!key2) //Neu phim duoc an key2=0
            {
               while(!key2); //Chong nay phim
               delay(30); //Chong soc dien
               hour--;
               if(hour<0) hour=23;
            }
    } 
    

    Leave a comment:


  • legosse
    replied
    Sửa xong không báo lỗi j nữa rồi bạn à, như thế là có thể nạp cho chip để chạy được chưa bạn nhỉ
    Nhận tiện bạn giải thích if(!key1-1) cho mình với đc không,mình đọc thứ tự ưu tiên các phép tính trong C thấy - trước !
    Như vậy khi nút 1 được ấn thì key1=0 => key1-1=-1 => !(-1)=? (một số khác 0) vậy thì if(!key1-1) là 1 điều kiện đúng => mình nghĩ là vẫn được chứ bạn nhỉ
    Last edited by legosse; 17-05-2009, 19:09.

    Leave a comment:


  • legosse
    replied
    Nguyên văn bởi Multi System Xem bài viết
    // Thứ 2:
    if(!key1-1); là sao hả bạn ?
    Bạn phải thay là:
    PHP Code:
    //Ham quet phim
    void quet_phim_h1(void)
    { 
      if(key1==0) //Neu phim duoc an key1=0
         { 
             while(key1==0); //Chong nay phim
             delay(30); //Chong soc dien
             hour++;
             if(hour>23) hour=0;
          }
    } 
    
    Mình cũng đang thắc mắc điểm này,mình đi học ông thầy viết thế,bảo là giải ra thì chính là key1=0
    Mình cũng không biết giải thế nào cả

    Nguyên văn bởi Multi System Xem bài viết
    //Thứ nhất:
    unsigned char code bang_ma[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
    [/PHP]
    0x90 là mã của số 9 đó bạn
    Pt g f e d c b a
    1 0 0 1 0 0 0 0 => 0x90

    Leave a comment:


  • Multi System
    replied
    //Thứ nhất:
    unsigned char code bang_ma[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};

    // Thứ 2:
    if(!key1-1); là sao hả bạn ?
    Bạn phải thay là:
    PHP Code:
    //Ham quet phim
    void quet_phim_h1(void)
    { 
      if(key1==0) //Neu phim duoc an key1=0
         { 
             while(key1==0); //Chong nay phim
             delay(30); //Chong soc dien
             hour++;
             if(hour>23) hour=0;
          }
    }
    void quet_phim_h2(void)
    {
        if(key2==0) //Neu phim duoc an key2=0
            {
               while(key2==0); //Chong nay phim
               delay(30); //Chong soc dien
               hour--;
               if(hour<0) hour=23;
            }
    }
    void quet_phim_m1(void)
    {
          if(key3==0) //Neu phim duoc an key3=0
               {
                  while(key3==0); //Chong nay phim
                  delay(30); //Chong soc dien
                  minute++;
                  if(minute>59) minute=0;
               }
    }
    void quet_phim_m2(void)
    {
        if(key4==0) //Neu phim duoc an key4=0
            {
                 while(key4==0); //Chong nay phim
                 delay(30); //Chong soc dien
                 minute--;
                 if(minute<0) minute=59;
              }
    } 
    
    Last edited by Multi System; 17-05-2009, 14:25. Lý do: thêm code

    Leave a comment:


  • legosse
    replied
    Nguyên văn bởi thinhminhhb Xem bài viết
    khuyên chân thành với bạn là sài con realtime ds1307. đừng nghe mấy bác kia rùi đồng hồ chạy sai cho mà xem
    Các bác xem dùm cái lỗi error C193: '-' : bad operand type
    Đây là chương trình = C
    #include <AT89x51.h>
    #include <intrins.h>
    //Dinh nghia I/O
    #define LED_DATA P0
    #define key1 P2_0
    #define key2 P2_1
    #define key3 P2_2
    #define key4 P2_3
    #define LED1 P2_4
    #define LED2 P2_5
    #define LED3 P2_6
    #define LED4 P2_7
    //Khai bao cac chuong trinh con
    void setup_timer1(void);
    void setup_timer0(void);
    void quet_phim_h1(void);
    void quet_phim_h2(void);
    void quet_phim_m1(void);
    void quet_phim_m2(void);
    void delay(unsigned int number);
    //Khai bao bien
    unsigned char code bang_ma[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x9 0};
    unsigned char count1,count2,sec,h1,h2,m1,m2,hour,minute;
    //Ham khai bao dung ngat timer1
    void setup_timer1(void)
    { TMOD=0x10;
    TH1=0x3C;
    TL1=0xAF;
    ET1=1;
    EA=1;
    TF1=0;
    TR1=1;
    }
    //Ham khai bao dung ngat timer0
    void setup_timer0(void)
    { TMOD=0x01;
    TH0=0x3C;
    TL0=0xAF;
    ET0=1;
    EA=1;
    TF0=0;
    TR0=1;
    }
    //Ham ngat timer1 dung de tao clock
    void T0_ISR(void) interrupt 1
    { TR0=0;
    TH0=0x3C;
    TL0=0xAF;
    count1++;
    if(count1==20)
    { count1=0;
    sec++;
    }
    if(sec==60)
    { sec=0;
    minute++;
    if(minute==60)
    { minute=0;
    hour++;
    if(hour==24) hour=0;
    }
    }
    TF0=0;
    TR0=1;
    }
    //Ham ngat timer0 dung de quet
    void T1_ISR(void) interrupt 3
    { TR1=0;
    TH1=0xEC; //5000us
    TL1=0x77;
    count2++;
    LED1=1;
    LED2=1;
    LED3=1;
    LED4=1;
    if(count2==1)
    { LED_DATA=bang_ma[h1];
    LED1=0;
    }
    if(count2==2)
    { LED_DATA=bang_ma[h2];
    LED2=0;
    }
    if(count2==3)
    { LED_DATA=bang_ma[m1];
    LED3=0;
    }
    if(count2==4)
    { LED_DATA=bang_ma[m2];
    LED4=0;
    count2=0; //Khoi dong lai bien dem
    }
    TF1=0;
    TR1=1;
    }
    //Ham quet phim
    void quet_phim_h1(void)
    { if(!key1-1) //Neu phim duoc an key1=0
    { while(!key1-1); //Chong nay phim
    delay(30); //Chong soc dien
    hour++;
    if(hour>23) hour=0;
    }
    }
    void quet_phim_h2(void)
    { if(!key2-1) //Neu phim duoc an key2=0
    { while(!key2-1); //Chong nay phim
    delay(30); //Chong soc dien
    hour--;
    if(hour<0) hour=23;
    }
    }
    void quet_phim_m1(void)
    { if(!key3-1) //Neu phim duoc an key3=0
    { while(!key3-1); //Chong nay phim
    delay(30); //Chong soc dien
    minute++;
    if(minute>59) minute=0;
    }
    }
    void quet_phim_m2(void)
    { if(!key4-1) //Neu phim duoc an key4=0
    { while(!key4-1); //Chong nay phim
    delay(30); //Chong soc dien
    minute--;
    if(minute<0) minute=59;
    }
    }
    //Dinh nghia ham delay
    void delay(unsigned int number)
    { unsigned char j;
    unsigned char i;
    for(i=0;i<=number;i++)
    { for(j=0;j<=1000;j++)
    {}
    }
    }
    //Chuong trinh chinh
    void main(void)
    { count1=0;
    count2=0;
    sec=0;
    hour=0;
    minute=0;
    setup_timer1();
    setup_timer0();
    while(1)
    {h1=hour/10;
    h2=hour%10;
    m1=minute/10;
    m2=minute%10;
    quet_phim_h1();
    quet_phim_h2();
    quet_phim_m1();
    quet_phim_m2();
    }
    }
    Last edited by legosse; 17-05-2009, 12:46.

    Leave a comment:


  • thinhminhhb
    replied
    khuyên chân thành với bạn là sài con realtime ds1307. đừng nghe mấy bác kia rùi đồng hồ chạy sai cho mà xem

    Leave a comment:


  • hoang_tuan
    replied
    ai bảo là 8051 không thể tạo ra thời gian chính xác được.mình có thể tính toán dwuwocj mừ.
    - theo tôi nhất định phải dùng một timer để định thời gian cho chuẩn,mình đã biết được tần số của thạch anh rùi như vậy sẽ tính ra đươc chu kỳ máy và mói lẹnh của 8051 sẽ thực hiện trong bao chu kỳ may mình cũng đã bít như vậy là có thể tính toán được chính xác đến 99,99 rùi

    Leave a comment:


  • legosse
    replied
    Biến toàn cục chứ bạn

    Leave a comment:


  • Multi System
    replied
    Hàm ngắt không có tham số, và cũng không có kiểu trả về.
    Vì các biến bạn dùng là các biến toàn cục rồi, các thanh ghi, các port.
    bạn tham khảo về cấu trúc hàm ngắt đi.
    Last edited by Multi System; 17-05-2009, 10:50.

    Leave a comment:


  • legosse
    replied
    Nguyên văn bởi Toan.Lv Xem bài viết
    1/Không nhất thiết phải dùng timer0 cho clock, timer1 để quét LED vì đây là 2 ngoại vi độc lập với nhau của 8051. Tuy nhiên nếu bạn dùng cả ngắt timer0 và ngắt timer1 thì nên chú ý đến vấn đề ưu tiên của 2 ngắt này.
    2/Nếu các biến chứa giá trị về giờ phút nếu được khai báo là biến toàn cục, thì khi ra khỏi chương trình ngắt giá trị của nó không bị mất đi. Nhưng nếu bạn khai báo nó là biến cục bộ trong chương trình phục vụ ngắt thì khi thoát khỏi ngắt, giá trị của nó không còn.
    3/Không nhất thiết phải dùng 2 timer cho công việc này. Chỉ cần 1 timer để đếm tăng thời gian. Phần quét LED bạn có thể đưa vào vòng lặp while(1).
    4/Mạch của bạn dùng làm mạch đếm thời gian để chơi thôi, không phải là mạch đồng hồ thời gian thực. Vì timer của VDK không thể cho ta thời gian thực. Muốn có thời gian thực thì phải sử dụng các loại RTC như DS12887,DS1307...
    Quét LED bằng while mình không rành lắm, co phải dùng hàm delay(..) thay cho timer phải không bạn?
    Với lại timer 0 dùng cho đếm thời gian mình khai báo
    void T0_ISR(void) interrupt 1
    có đúng không bạn?
    Mấy cái hàm ngắt này luôn luôn void ... (void) ? Vì mình thử thay là
    void T0_ISR(unsigned char h1,...) interrupt 1 nó máy lỗi là "may not receive or return..."
    Mình nghĩ về 2 cái timer đó như sau k biết thế nào
    chọn timer 0 :đồng hồ, timer 1: quét -> quét chạy bình thường, nhưng khi đủ 60s thì lại xảy ra ngắt do timer 0, do được ưu tiên nên quét bị dừng lại, vào hàm ngắt timer 0, thay đổi phút, giờ rồi thoát ra -> quét tiếp.
    chọn timer 1 :đồng hồ, timer 0: quét -> đồng hồ chạy bình thương,xuất ra các giá trị phút giờ,nhưng cứ sau 5000us(do mình đặt)thì ngắt timer 0 xảy ra, đồng hồ bị dừng lại, hàm ngắt timer 0 thực hiện quét LED.
    Như vậy:
    +nếu chọn theo cách thứ 2, đồng hồ sẽ bị ngắt nhiều lần (cả triệu lần) so với cách 1
    +ngắt quét không ảnh hường nhiều vì trong thời gian ngắn như vậy hầu như sẽ không ảnh hưởng tới quét
    còn clock bị ngắt nhiều sẽ ảnh hưởng tới việc đếm thời gian (dù ngắt trong thời gian nhỏ nhưng tích tiểu thành đại,sau vài ngày chắc cũng lêch 1s
    => chọn theo cách 1,đúng không mấy bác

    1 í nữa, lập trình xong báo lỗi bad operand type nghĩa là sao bạn, có phải do mình chon sai kiểu dữ liệu unsigned char không, hay là có phép tính nào đó sai?

    Để mình làm được cái này đã rồi sang tim hiểu thời gian thực cho biết, h nge bạn noi RTC mà có biết đâu
    Last edited by legosse; 17-05-2009, 10:43.

    Leave a comment:

Về tác giả

Collapse

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

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

Collapse

Đang tải...